Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/64: Рейтинг темы: голосов - 64, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 12.01.2009
Сообщений: 246

Поиск в List

15.07.2010, 11:40. Показов 11694. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть свойство для подсчета элементов списка по критерию

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Property Get DocInfoCollCount(ExType As Integer, ByForm As String, ExKind As String, StopAtFirst As Boolean) As Long ---- ExType - вид исполнителя, ByForm - форма
Dim c As Long
c=0
 
If ExType>CONST_ALLEXTYPE Then
If Not CheckExistingListTag("ExType") Then Print Getthreadinfo(1)&". Не сработал подсчет по типу исполнителя. Из-за отсутствия ExType":Goto ex
End If
 
If ByForm<>CONST_ALLFORM Then
If Not CheckExistingListTag("form") Then Print Getthreadinfo(1)&". Не сработал подсчет по форме исполнителя. Из-за отсутствия form":Goto ex
End If
 
If ExKind>CONST_ALLEXKIND Then
If Not CheckExistingListTag("ExIsCorr") Then Print Getthreadinfo(1)&". Не сработал подсчет по виду исполнителя. Из-за отсутствия ExIsCorr":Goto ex
End If
 
If ExKind=CONST_KINDEXECUTOR Or ExKind=CONST_KINDCORRESPONDENT Then
If ExType=CONST_INNER Or ExType=CONST_OUTER Then-------------------------- Внутренние
If ExType=CONST_INNER Then tempType="InnerExecutors" Else tempType="OuterExecutors"
If ByForm=CONST_ALLFORM Then    ---- Все формы
Forall DI In DocInfoColl
If DI.Field("ExIsCorr")=ExKind And DI.Field("ExType")=tempType Then c=c+1: If StopAtFirst Then Goto ex
End Forall
Else----------------------------------------------- По заданной форме
Forall DI In DocInfoColl
If DI.Field("ExIsCorr")=ExKind And DI.Field("ExType")=tempType And DI.Field("form")=ByForm Then c=c+1: If StopAtFirst Then Goto ex
End Forall
End If
Else
If ByForm=CONST_ALLFORM Then---- Все формы
Forall DI In DocInfoColl
If I.Field("ExIsCorr")=ExKind Then c=c+1: If StopAtFirst Then Goto ex
End Forall
Else----------------------------------------------- По заданной форме
Forall DI In DocInfoColl
If DI.Field("ExIsCorr")=ExKind And DI.Field("form")=ByForm Then c=c+1: If StopAtFirst Then Goto ex
End Forall
End If
End If
Else
If ExType=CONST_INNER Or ExType=CONST_OUTER Then-------------------------- Внутренние
If ExType=CONST_INNER Then tempType="InnerExecutors" Else tempType="OuterExecutors"
If ByForm=CONST_ALLFORM Then    ---- Все формы
Forall DI In DocInfoColl
If DI.Field("ExType")=tempType Then c=c+1: If StopAtFirst Then Goto ex
End Forall
Else----------------------------------------------- По заданной форме
Forall DI In DocInfoColl
If DI.Field("ExType")=tempType And DI.Field("form")=ByForm Then c=c+1: If StopAtFirst Then Goto ex
End Forall
End If
Else
If ByForm=CONST_ALLFORM Then---- Все формы
Forall DI In DocInfoColl
c=c+1
If StopAtFirst Then Goto ex
End Forall
Else----------------------------------------------- По заданной форме
Forall DI In DocInfoColl
If DI.Field("form")=ByForm Then c=c+1: If StopAtFirst Then Goto ex
End Forall
End If
End If
End If
ex: DocInfoCollCount=c
End Property
Хотел не копипастить циклы, а закинуть в процедурку, так условие не знаю как передать в качестве "параметра"
Нуждаюсь в рефакторинге
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.07.2010, 11:40
Ответы с готовыми решениями:

Поиск в List<List<string>>: поиск по части строки
Здравствуйте. Надо реализовать поиск по части строки. Т.е. у меня есть List объектов List&lt;string&gt;, по введенной строке надо...

Конвертировать один элемент из List<List<Class>> в list и string
Как можно перевести один выбранный элемент из List&lt;List&lt;Data&gt;&gt; myList в list и string? Например, myList. Сейчас я могу с помощью...

Поиск в List
Доброго времени суток дорогие форумчане! Имеется List data1 с датами приведенный к массиву. В переменной peremennia типа string...

6
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
15.07.2010, 12:23
зависит от задачи, можно колекцию получать через DbSearch
можно формировать List по ключам, элементом будет массив с рефами доков...
0
0 / 0 / 0
Регистрация: 30.04.2007
Сообщений: 64
15.07.2010, 13:24
можно формировать List по ключам, элементом будет массив с рефами доков...


Если в List записать доки ваше приложение скорее всего умрет, от не хватки памяти. плохой вариант хранить нотес документы в листе.
0
0 / 0 / 0
Регистрация: 08.02.2007
Сообщений: 206
15.07.2010, 15:16
Darker, я бы разделил функцию на две: проверка того, что хоть один элемент соответствует критерию, и собственно подсчет количества элементов. Тогда не нужен будет последний параметр.
И вот что у меня получилось (писал в блокноте, не компилировал, не проверял):
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Код"</div></div><div class="sp-body"><div class="sp-content">

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
Предполагаю, что где-то объявлен класс DocInfo, экземпляры которого находядся
в списке DocInfoColl List As DocInfo, в котором и происходит поиск элементов.
 
Вспомогательные классы для проверки условий
 
Private Class Condition
Public Function match(di As DocInfo) As Boolean
match = False
End Function
End Class
 
Private Class AndCondition As Condition
Private cond1 As Condition
Private cond2 As Condition
Public Sub new(cond1 As Condition, cond2 As Condition)
Set Me.cond1 = cond1
Set Me.cond2 = cond2
End Sub
Public Function match(di As DocInfo) As Boolean
match = cond1.match(di) And cond2.match(di)
End Function
End Class
 
Private Class OrCondition As Condition Здесь не используется, но на всякий случай оставлю
Private cond1 As Condition
Private cond2 As Condition
Public Sub new(cond1 As Condition, cond2 As Condition)
Set Me.cond1 = cond1
Set Me.cond2 = cond2
End Sub
Public Function match(di As DocInfo) As Boolean
match = cond1.match(di) Or cond2.match(di)
End Function
End Class
 
Private Class TrueCondition As Condition
Public Function match(di As DocInfo) As Boolean
match = True
End Function
End Class
 
Private Class SimpleCondition As Condition
Private field As String
Private value As String
Public Sub new(field As String, value As String)
Me.field = field
Me.value = value
End Sub
Public Function match(di As DocInfo) As Boolean
match = di.Field(field) = value
End Function
End Class
 
Ниже зарефакторенная функция Property Get DocInfoCollCount
 
Private Function createCondition(exType As Integer, byForm As String, exKind As String) As Condition
Dim typeCond As Condition
Dim formCond As Condition
Dim kindCond As Condition
 
If exType = CONST_INNER Then
Set typeCond = New SimpleCondition("ExType", "InnerExecutors")
Elseif exType = CONST_OUTER Then
Set typeCond = New SimpleCondition("ExType", "OuterExecutors")
Else
Set typeCond = New TrueCondition()
End If
 
If byForm = CONST_ALLFORM Then
Set formCond = New TrueCondition()
Else
Set formCond = New SimpleCondition("form", byForm)
End If
 
If exKind = CONST_KINDEXECUTOR Or exKind = CONST_KINDCORRESPONDENT Then
Set kindCond = New SimpleCondition("ExIsCorr", exKind)
Else
Set kindCond = New TrueCondition()
End If
 
Dim cond As New AndCondition(typeCond, formCond)
 
Set createCondition = New AndCondition(cond, kindCond)
 
End Function
 
Public Function exists(exType As Integer, byForm As String, exKind As String) As Boolean
Dim cond As Condition
exists = False
Set cond = createCondition(exType, byForm, exKind)
Forall di In DocInfoColl
If cond.match(di) Then
exists = True
Exit Function
End If
End Forall
End Function
 
Public Function getDocInfoCollCount(exType As Integer, byForm As String, exKind As String) As Long
Dim cond As Condition
Dim count As Long
count = 0
Set cond = createCondition(exType, byForm, exKind)
Forall di In DocInfoColl
If cond.match(di) Then
count = count + 1
End If
End Forall
getDocInfoCollCount = count
End Function
0
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615
15.07.2010, 15:24
Цитата Сообщение от Darker
Нуждаюсь в рефакторинге
Ну как-то так:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    Property Get DocInfoCollCount(ExType As Integer, ByForm As String, ExKind As String, StopAtFirst As Boolean) As Long ---- ExType - вид исполнителя, ByForm - форма
...  здесь проверка входных параметров
 
Dim searchCondition List As String
вид исполнителя
If ExType=CONST_INNER Then
searchCondition("ExType")="InnerExecutors"
Elseif ExType=CONST_OUTER Then
searchCondition("ExType")="OuterExecutors"
End If
форма
If ByForm<>CONST_ALLFORM Then
searchCondition("form") = ByForm
End If
 
If ExKind=CONST_KINDEXECUTOR Or ExKind=CONST_KINDCORRESPONDENT Then
searchCondition("ExIsCorr") = ExKind
End If
 
Forall DI In DocInfoColl
If isConditional( DI , searchCondition ) Then
DocInfoCollCount = DocInfoCollCount + 1
If StopAtFirst Then Exit Property
End If
End Forall
End Property
 
Private Function isConditional( DI As Variant , searchCondition List As String ) As Boolean
isConditional = True
Forall condition In searchCondition
If DI.Field( Listtag(condition) ) <> condition Then
isConditional = False
Exit Function
End If
End Forall
End Function
измените Variant на правильный тип DI.
welcome
0
0 / 0 / 0
Регистрация: 12.01.2009
Сообщений: 246
15.07.2010, 15:42
turumbay
то, что надо! Спасибо!
Yakov, работает только для двух операндов условия, а так, как концепция вполне сойдет! Спасибо тоже!
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
15.07.2010, 16:52
Если в List записать доки ваше приложение скорее всего умрет, от не хватки памяти. плохой вариант хранить нотес документы в листе.
рефы - это не обязательно сами доки (я нигде этого не утверждал), это может быть и "контролирующий" объект (кот. по юниду, или вьюшному ключу, вытащит значения из дока, или проведёт сравнение)
если посмотреть на код выше - он, возможно, так и делает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.07.2010, 16:52
Помогаю со студенческими работами здесь

Поиск в List<>
Имеются вот такие вот классы, в одном из которых создается список. class Table { private int A; private int...

Поиск в List
Доброго времени суток дорогие форумчане! Что я не так написала? Программа должна вывести то слово которое я впишу...почему так не...

Поиск в List
Добрый день! Есть List&lt;Person&gt;. public class Person implements Serializable { private String id; private String...

Поиск в List<T>
Всем привет,прошу помощи о реализации поиска. .................................... if (EnumProcessModulesEx(proc.Handle, hModule,...

Поиск в List
Подскажите пожалуйста, есть программа Нужно реализовать поиск нужной книги по автору Данные хранятся в листе List&lt;Kniga&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru