Re: Огромная просьба по работе с элементами списка

Пожалуйста, добавьте такие свойства как "общее кол-во строк" и "индекс текущей строки" без выделения и соответственно сделайте возможность обратиться к строке по ее индексу или какому-нибудь свойству 

Я недавно начал программировать для TCS, но отсутствие подобных вещей очень огорчает. Если в списке номенклатуры позиций очень много, то проход по всем позициям для построения общего кол-ва, займет уйму времени! А если уж я нашел нужные мне строки и провел какие-то вычисления, мне опять придется перебрать все значения до тех пор, пока я не дойду до строки с этим значением (индексом по счетчику).

Будьте добры, поправьте меня, если я не прав и такой функционал присутствует, просто от представителей Csoft`а, работающих у нас на предприятии, я внятных разъяснений не услышал, а help оставляет желать лучшего.

Re: Огромная просьба по работе с элементами списка

Может вот это решит Вашу задачу:

IDModule.Locate (PropertyGet) 

--------------------------------------------------------------------------------

Позиционирование

Синтаксис:

objectvariable.Locate( KeyProperties, KeyValues, LocateOptions )

objectvariable - IDModule 

KeyProperties - свойство или массив свойств (имеющие отображения на поля), можно передать как индекс свойства, имя или интерфейс.

KeyValues - значения свойств (если массив, то размер должен быть равен количеству KeyProperties)

LocateOptions - пока не используется

Возвращает: True - если найдено, False - если не найдено

Re: Огромная просьба по работе с элементами списка

Почитайте внимательно спецификацию SQL.
И обратите внимание что не существует понятия количества записей в выборке.

Re: Огромная просьба по работе с элементами списка

Locate не подходит, он возвращает только boolean.
А SQL здесь абсолютно не причем. Может быть я не так выразился, но чтобы поточнее объяснить, что я имел ввиду, я приведу пример Listbox`а:
Свойства ListCount, ListIndex и наконец метод List, который обращается к строкам по их индексу. Надеюсь теперь, вы поняли, что именно имелось ввиду.

Re: Огромная просьба по работе с элементами списка

Похоже это Вы совершенно не понимаете о чем говорите.
Не важно какой элемент содержит данные.
Важно как эти данные получены.
И вот в этом контексте и необходимо понимать работу SQL сервера.
Еще раз советую внимательно почитать спецификацию SQL.
И только разобравшись с принципами работы SQL, Вы сможете понять, что если даже объект(некий List) имеет возможность отдавать текущее количество, то это свойство не будет иметь никакого отношения к реальному состоянию.
Вы сможете через него узнать(В лучшем случае) сколько записей получено от сервера на текущий момент.
А сколько осталось Вы не узнаете.

Re: Огромная просьба по работе с элементами списка

Deviorian писал(а):
Locate не подходит, он возвращает только boolean.

locate не только возвращает boolean но и позиционируется на найденной строчке. Вам разве не это надо?

Re: Огромная просьба по работе с элементами списка

В том то и дело, что мне нужно значение кол-ва строк для текущих условий. 
Если вы мне можете сказать, откуда брать кол-во номенклатурных позиций, например для выбранного справочника, не перебирая их все - считайте, пол-беды вы моей уже решили. 
Объясню, для чего мне это нужно:
Мне нужно перейти по номенклатуре и для каждой позиции получить некоторые значения спецификаций, после, произвести расчет и обработать дублирующиеся позиции спецификации, которые подходят под результат расчета. Так как это дублирующиеся позиции, то Locate выберет только первую из них. + Разнообразных, дублирующихся позиций в одной номенклатуре может быть много и все их надо обработать. Именно для этого мне и нужны были эти свойства и метод.
Согласитесь, куда проще использовать (например) 

for i = 0 to ubound(somevar)
Call TCSApp.ShowProgressMessage( "Обработка: ", CStr((i*100)\ubound(somevar))&" %" )
a(i) = Spec.GetRow(somevar(i)).Properties["NMK_NOTE"].AsInteger
next
Call TCSApp.HideProgressMessage

, чем перебирать

i = 0
z = 0

do while not Spec.eof
for z = 0 to ubound(somevar)
Call TCSApp.ShowProgressMessage( "Обработка: ", CStr((z*100)\ubound(somevar))&" %" )
if i = somevar(z) then
 a(z) = Spec.Properties["NMK_NOTE"].AsInteger
end if
next
i = i + 1
loop
Call TCSApp.HideProgressMessage

Тем более, locate меня интересовал в первую очередь с точки зрения получения индекса.

Re: Огромная просьба по работе с элементами списка

Вы никак не хотите понять, что программа использует принципы заложенные в SQL.
И понятия проще или сложнее здесь не годятся.
Ваши пожелания понятны, но их реализация влечет множество минусов. Если хотите понять каких, то в первую очередь разберитесь что такое SQL.
Никто не будет перерабатывать программу чтобы в результате получить массу проблем.

Re: Огромная просьба по работе с элементами списка

Ну тогда будьте добры, расскажите, как сделать поиск через SQL и возврат значений в интерфейс, т.к. к сожалению, встроенный скриптовый язык работает исключительно с интерфейсом.

Re: Огромная просьба по работе с элементами списка

Здравствуйте!
К сожалению, пока не очень понятно, чего же надо добиться то в итоге...
Не могли бы Вы пояснить:


Deviorian писал(а):
Мне нужно перейти по номенклатуре и для каждой позиции получить некоторые значения спецификаций, после, произвести расчет и обработать дублирующиеся позиции спецификации, которые подходят под результат расчета. Так как это дублирующиеся позиции, то Locate выберет только первую из них. + Разнообразных, дублирующихся позиций в одной номенклатуре может быть много и все их надо обработать.


что значит "получить некоторые значения спецификаций"? параметры строки спецификации? параметры версии? или что? что в данном случае имеется в виду?

что такое "дублирующиеся позиции"? Это одна и та же номенклатура, но как разные строчки в одной версии спецификации?

и что значит "Разнообразных, дублирующихся позиций в одной номенклатуре может быть много" ?

Re: Огромная просьба по работе с элементами списка

Может быть несколько строк в спецификации с одинаковой позицией, мне то их и нужно получить, а далее, на основе расчетов - выбрать те строки спецификации, которые отвечают заданным требованиям. Я уже знаю индексы этих строк, но кроме как перебором всех строк с первой позиции, не прибегая к выделению, добраться до них не получится. Так как при переборе, метод .Next ходит по элементам интерфейса, один такой проход по всем строкам занимает ощутимое кол-во времени, а это только строки спецификации! А спецификации нужно просмотреть еще и для каждой позиции номенклатуры, поэтому я и хотел бы найти решение, которое позволит оперативно переходить по строкам модулей, не используя при этом стандартные .EOF, .First, .Next.
Вроде так.
p.s. А "Разнообразных, дублирующихся позиций в одной номенклатуре может быть много", означает, что могут быть строки с такими позициями:
1, 2, 3, 2, 4, 1, 1, 4, и т.п.
И на основе каждого повторения надо произвести расчеты.

Re: Огромная просьба по работе с элементами списка

продолжаем добираться до сути  :wink: 
Т.е. Вы хотите выбрать из версии спецификации строки с одинаковыми позициями (имеется в виду параметр позиции спецификации, под названием "позиция"). так? или не так?

Но с другой стороны, вы не хотите перебирать строки спецификации, т.к. говорите, что Вы уже знаете строки, которые Вам нужны.

Но если Вы уже знаете, какие строки Вам нужны, значит Вы знаете и ID спецификации и ID позиции спецификации?
А зачем тогда перебирать?

Re: Огромная просьба по работе с элементами списка

А когда позиции повторяются, это физически что значит? Т.е. это разная номенклатура, но с одним номером позиции на чертеже?
Это замены что ли? Или вариантные какие-то позиции, что можно одну, а можно другую?

Re: Огромная просьба по работе с элементами списка

Константин писал(а):
Но если Вы уже знаете, какие строки Вам нужны, значит Вы знаете и ID спецификации и ID позиции спецификации?
А зачем тогда перебирать?

Вот! Другой разговор! А по какому именно искать, по ID или SPEC_ID?

Но все-же, это все-равно не решает основной проблемы: времени выполнения. Как его можно максимально сократить, т.к. перебор всех позиций номенклатуры все-равно занимает приличное кол-во времени?

з.ы. Да, замены.

Re: Огромная просьба по работе с элементами списка

Если Вы хотите последовательно выбирать во всех спецификациях строчки с повторяющимся значением "позиции", независимо от того, что это за номенклатура, то Вам по-любому придется перебирать все спецификации. Правильно? т.к. надо же как-то  проверить в каждой спецификации, есть ли в ней строчки такие с повторяющимися позициями или нет.

Если это касается только какой-то определенной номенклатуры, то проще, конечно. Тогда можно, для начала, через "где используется" выбрать только те версии спецификаций, где эта номенклатура есть, и работать дальше только с ними.

Для указания, что это замена, лучше использовать специальную галочку "замена" в спецификации. Т.к. номер позиции одинаковый - не сильно надежный способ, если честно.

А можно еще поинтересоваться - а задачу то какую решаете? Конфигурите спецификацию конкретного заказа чтоли по спецификациям, содержащим варианты замен? Или что?

Re: Огромная просьба по работе с элементами списка

Deviorian писал(а):
А по какому именно искать, по ID или SPEC_ID?

а что, сильно отличаются? ищите по ID

Re: Огромная просьба по работе с элементами списка

Я же говорил, я только недавно начал программировать на TCS, это вообще не моя основная задача, просто попросили попрограммировать, чтобы разгрузить ваших представителей от написания мелких доработок.

Задача такая: нужно пройтись по всей номенклатуре, заглянуть в спецификацию, найти строки с заменой. Если таких строк - 2, нужно инвертировать замену, если же кол-во строк больше 2х - экспортировать эту номенклатуру в Excel. Вот и вся задача.
Вот мой примерный код:

    TCSActiveModule.First  
    nomcnt = 0
    Do While Not TCSActiveModule.EOF 
        nomcnt = nomcnt + 1
    Loop 
   
    TCSActiveModule.First
    
    Do While Not TCSActiveModule.EOF                                                                                                   
        cnt = 0 
        Set Spec = TCSActiveModule.Properties("NmkSpecification").AsIDispatch  
        Spec.First                                                            
        
        Do While Not Spec.EOF 
            speccnt = speccnt + 1
        Loop 

        Call TCSApp.ShowProgressMessage( "Поиск дупликатов в " & TCSActiveModule.Properties("NOTE").AsString & " - " & TCSActiveModule.Properties("NAME").AsString, CStr((cnt*100)\nomcnt)&" %" ) ' это сообщение                           
        
        If Not (Spec Is Nothing) Then
            If Not Spec.IsEmpty Then  'Если есть Спецификация  
                Spec.First 
                
                Redim Poss(speccnt) 
                z = 0
                Do While Not Spec.Eof 
                    If Not (Spec.Properties("POSITION").IsNull) Then
                        Poss(z) = Spec.Properties("POSITION").AsInteger
                        z = z + 1                                      
                    End If
                    Spec.Next
                Loop  
                posc = 0 
                If Not z = 0 Then      
                    For i = 0 To ubound(Poss)   
                        first = -1
                        second = -1   
                        For j = 0 To ubound(Poss)
                            If(Poss(i) = Poss(j)) Then
                                posc = posc + 1    
                                If first = -1 Then first = i
                                If second = -1 And first <> -1 Then second = i
                            End If
                        Next
                        Select Case posc
                        Case 1
                            break
                        Case 2                     
                            Spec.First 
                            j = 0
                            Do While Not Spec.Eof  
                                If (j = first) Then
                                    If Not Spec.Properties("EXCLUDE_FROM_ITOGSSPEC").AsBoolean Then ' Если это не замена 
                                            Spec.Edit
                                            Spec.Properties("EXCLUDE_FROM_ITOGSSPEC").Value = True
                                            Spec.SaveChanges
                                    Else
                                            Spec.Edit                                                                    
                                            Spec.Properties("EXCLUDE_FROM_ITOGSSPEC").Value = False
                                            Spec.SaveChanges                                                                 
                                    End If  
                                End If  
                                 
                                If (j = second) Then
                                    If Not Spec.Properties("EXCLUDE_FROM_ITOGSSPEC").AsBoolean Then ' Если это не замена 
                                            Spec.Edit
                                            Spec.Properties("EXCLUDE_FROM_ITOGSSPEC").Value = True
                                            Spec.SaveChanges
                                        
                                    Else
                                            Spec.Edit
                                            Spec.Properties("EXCLUDE_FROM_ITOGSSPEC").Value = False
                                            Spec.SaveChanges                                         
                                    End If  
                                End If
                                
                                j = j + 1
                                Spec.Next
                            Loop                                           
 
                            break
                        Case 3 
                            Call TCSApp.ShowMessageBox("Export to Excel",TCSActiveModule.Properties("NOTE").AsString & " - " & TCSActiveModule.Properties("NAME").AsString)       
                            break
                        End Select   
                    Next 'i                       
                End If
            End If
        End If                
        cnt = cnt + 1 
        TCSActiveModule.Next  
     Loop
Call TCSApp.HideProgressMessage 
End Sub

Вот что-то вроде такого. Оттестировать пока не могу, нужных данных пока нет.

Re: Огромная просьба по работе с элементами списка

Deviorian писал(а):
чтобы разгрузить ваших представителей от написания мелких доработок.


это не наши представители  :) Это представители CSoft-Москва.
CSoft-Москва является одним из дилеров, которые наше ПО (TechnologiCS) продают. Если они оказывают Вам какие-то услуги, связанные с эксплуатацией нашего ПО, то делают это исключительно по собственной инициативе, но никак не от нашего лица.
Что же касается наших представителей, то последний раз они появлялись на Вашем предприятии, по-моему, года полтора назад  :wink:


Deviorian писал(а):
Задача такая: нужно пройтись по всей номенклатуре, заглянуть в спецификацию, найти строки с заменой. Если таких строк - 2, нужно инвертировать замену, если же кол-во строк больше 2х - экспортировать эту номенклатуру в Excel. Вот и вся задача.


мдаааа.... ну если Вы просто пишите программу, а физический смысл, что она делает, Вас не интересует, то тут, конечно, вопрос не к Вам получается, а к составителю ТЗ...
Т.к. задача, которую Вы пытаетесь решить, мягко говоря, ну очень странная. Судя по вашему описанию и приведенному коду, если перевести это на "человеческий" язык, то получается примерно так:
Во всех изделиях и узлах (т.е. спецификациях), которые вообще когда-либо делали и делаем сейчас (т.е. по всей БД) если что-либо на что-либо можно заменить - то заменить. Одновременно все на все во всех изделиях! А если замена возможна не 1 к 1 то выгрузить в Excel.
Ну ладно, что с точки зрения здравого смысла это действие мягко говоря сомнительное. Так представьте что будет, если к примеру, эта процедура по каким либо причинам не дойдет с первого раза до конца... Т.е. в половине базы все замены будут "перещелкнуты", а в половине нет. Второй раз запускать процедуру, я так понимаю, не предполагается вообще, иначе в первой половине все назад же "перещелкнется". Как разбираться то потом в том что получилось?  :)

Понятно, что при разработке программы никто не думал над механизмом для быстрого решения такой задачи. Никто вообще не собирался ее решать никогда, т.к. при "штатном" режиме работы с программой, такое действие просто абсолютно бессмысленно.
Так что как резюме - если Вам все таки сильно надо именно так, то остается, по-моему, только полный перебор (по всем спецификациям по всем позициям и т.д.). Правда вот не дает покоя вопрос - зачем?

Re: Огромная просьба по работе с элементами списка

Товарищ, будучи уверенным, что любая объектно-ориентированная модель данных имеет для подобного рода объектов свойсвто типа Count и метод доступа к элементу объекта по его индексу, позволил себе не поверить, что в TCS этого нет. Решил получить консультацию из первых рук. Получил...

Re: Огромная просьба по работе с элементами списка

Товарищ, будучи уверенным, что любая объектно-ориентированная модель данных имеет для подобного рода объектов свойсвто типа Count и метод доступа к элементу объекта по его индексу, позволил себе не поверить, что в TCS этого нет. Решил получить консультацию из первых рук. Получил...

Во первых Товарищ высказал пожелание по доработке, а не получение консультации.
Во вторых упомянутые Вами свойства не является признаком "объектно-ориентированной модели данных" в третьих SQL база данных не является объектно ориентированной. И в четвертых запрос к базе данных не дает возможности узнать количество записей в выборке, и работать с записями по индексу.
Вывод - изучайте спецификации.

Re: Огромная просьба по работе с элементами списка

В том-то все и дело, что человек предполагал наличие такой модели :wink: