Каким Образом Можно Сделать Сортировку Коллекции

dzheyzhi

Active Member
08.12.2011
30
0
#1
Многоуважаемые программисты!!! :(
Подскажите каким образом можно сделать сортировку коллекции документов по данному коду...
Производится поиск по базе по выбранному диапазону дат С - ПО и выгружается в Excel

Код:
	searchStr$ = {(Form = "invoice") | (TypDoc = "177-СЧЕТ НА ОПЛАТУ") | (TypDoc = "СЧЕТ НА ОПЛАТУ") | (TypeDoc = "invoice") & (Date >= [} & bDT.DateOnly & {]) & (Date <= [} & eDT.DateOnly & {]) & (Trash = "")}
Set offCL = offDB.Search( searchStr$, Nothing, 0 )
Set offDOC = offCL.GetFirstDocument
While Not ( offDOC Is Nothing )

wb.Application.Range({A} & Trim(CStr(row))).Value = offDOC.punkt(0)
wb.Application.Range({B} & Trim(CStr(row))).Value = offDOC.punktDescription(0)
wb.Application.Range({C} & Trim(CStr(row))).Value = offDOC.FROMORG(0)
wb.Application.Range({D} & Trim(CStr(row))).Value = offDOC.Info(0)
wb.Application.Range({E} & Trim(CStr(row))).Value = offDOC.date(0)
wb.Application.Range({F} & Trim(CStr(row))).Value = offDOC.Summa(0)
row = row + 1

Set offDOC = offCL.GetNextDocument( offDOC )
Wend
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
31
Киров
#2
Искать нужные данные по вью getAllEntrysByKey, где они отсортированы нужным образом.

Написать свою класс коллекцию и сортировать в ней данные

что то типа того:

Код:
Class myClass
punkt as string
punktDescription as string
FROMORG as string
End Class

Class arrMyClass
arr() as myClass
End Class
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#3
Сортировать Excel'ем:
Код:
		'Set wapp = CreateObject("Excel.Application") - wapp это объект Excel
wapp.ActiveSheet.Columns("A:AB").Select
wapp.Selection.Sort wapp.Range("A2"),1, , , , , , 0, 1, False, 1, , 0, ,
По моему это по возрастанию.
 

Darkhan

Well-Known Member
Lotus team
14.12.2012
98
4
32
Astana
#6
В классе SortCollection документы помещаются в массив, что бъет по памяти (обсуждалось тут). Есть предложение использовать следующее решение
 

dzheyzhi

Active Member
08.12.2011
30
0
#7
Решил свою проблему таким способом :o

Код:
	Dim formula As String
Set curVIEW=curDB.GetView("PD")
formula = "SELECT Form = 'invoice' & StatusName = 'Счет оплачен' & date >= [" & bDT.DateOnly & "] & date <= [" & eDT.DateOnly & "]"
curVIEW.SelectionFormula = formula
curVIEW.Refresh


Set offDOC = curVIEW.GetFirstDocument
summ = 0
While Not ( offDOC Is Nothing )

punkt$ = CStr(offDOC.punkt(0))


wb.Application.Range({A} & Trim(CStr(row))).Value = offDOC.punkt(0)
wb.Application.Range({B} & Trim(CStr(row))).Value = offDOC.punktDescription(0)
wb.Application.Range({C} & Trim(CStr(row))).Value = offDOC.FROMORG(0)
wb.Application.Range({D} & Trim(CStr(row))).Value = offDOC.Info(0)
wb.Application.Range({E} & Trim(CStr(row))).Value = offDOC.date(0)
wb.Application.Range({F} & Trim(CStr(row))).Value = offDOC.Summa(0)
wb.Application.Range({G} & Trim(CStr(row))).Value = offDOC.StatusName(0)
row = row + 1
summ = offDOC.Summa(0) + summ
Set offDOC = curVIEW.GetNextDocument( offDOC )

If punkt$ = offDOC.punkt(0) Then
Else
wb.Application.Range({E} & Trim(CStr(row))).Value = "Сумма"
wb.Application.Range({F} & Trim(CStr(row))).Value = summ
summ = 0
row = row + 1
End If
Wend
И отсортировал view по пунктам

Код:
p := @Explode(punkt;".");
txt := "";
@For( i:=1; i <= @Elements( p ); i := i + 1; txt := txt + @If(@IsNumber(@ToNumber(p[i]));@Repeat("0"; 2-@Length(p[i]));"") + p[i]);
txt
Спасибо большое за советы!
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#8
dzheyzhi
Надеюсь эта вьюха служебная и больше нигде не используется, но такой способ на мой скромный взгляд - извращение...
Сортировать лучше не документы, а данные, которые потом пойдут в отчет, либо, в случае Excel сортировать уже результаты.
 

gpatron

Active Member
13.08.2009
26
0
36
Тирасполь
#9
на мой взгляд в данном случае (при выводе результатов в Excel) есть два наиболее быстрых способа сортировки:
1. как сказал savl "Сортировать Excellем"
2. перегнать нужные данные в массив, отсортировать его и потом указанному диаппазону листа Excel присвоить получившийся массив

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