mojaSymfonia FORUM https://forum.mix-soft.pl/ |
|
Sortowanie w strukturze record https://forum.mix-soft.pl/viewtopic.php?f=15&t=5215 |
Strona 1 z 1 |
Autor: | wojtek [ 2013-10-11, 11:51 ] |
Tytuł: | Sortowanie w strukturze record |
Witam, Czy można w jakis sposób posortować dane w strukturze record? Chodzi mi o to, że chciałbym z pojedynczych dokumentów (np WZ) wystawić zbiorcze dokumenty WZ na kontrahenta. Informacje o dokumentach i pozycjach zbieram w strukturze record, ale ostatecznie chciałbym je posortować po kodzie kontrahenta, tak by za pomocą Bioreca wystawić w ostatnim etapie dokumenty WZ skumulowane na kontrahenta. Dokumenty WZ "źródłowe" muszą być posortowane na liście po numerze bo działa również funkcja kasująca która musi dokumenty kasować od ostatniego w serii. |
Autor: | bongos [ 2013-10-11, 12:11 ] |
Tytuł: | Re: Sortowanie w strukturze record |
jeżeli masz 'tablicę elementów typu record' to najprościej będzie użyć bąbelkowego sortowania chyba, że musisz mieć mega-wydajność i masz dużą ilość danych to pokombinuj trudniejsze algorytmy |
Autor: | wojtek [ 2013-10-11, 12:47 ] |
Tytuł: | Re: Sortowanie w strukturze record |
A co to jest bąbelkowe sortowanie? Masz jakiś przykład? |
Autor: | rafal [ 2013-10-11, 13:48 ] |
Tytuł: | Re: Sortowanie w strukturze record |
Kod: record rWZ string kod [40] long id endrec rWz wz(3) int i wz(1).kod = "WZ/003/2013" wz(1).id = 65545 wz(2).kod = "WZ/001/2013" wz(2).id = 65546 wz(3).kod = "WZ/002/2013" wz(3).id = 65547 // wypełnienie mapy sortującej (indeksu) mapValue mvSort mvSort.Type( long ) for i = 1 to i > Size( wz ) mvSort.Set( wz(i).kod, i ) // sortowanie po kod // mvSort.Set( (using "%l",wz(i).id), i ) // sortowanie po id next i mvSort.Sort() // Tablica rekordów pozostaje nie posortowana // Pobieramy z niej rekordy wg posortowanego indeksu print "Tablica wz"+lf for i = 1 to i > Size( wz ) print using "%s %l" + lf, wz( i ).kod, wz( i ).id next i print "Tablica wz wg. posortowanej mapy"+lf for i = 1 to i > Size( wz ) print using "%s %l" + lf, wz( mvSort.Get( i ) ).kod, wz( mvSort.Get( i ) ).id next i |
Autor: | wojtek [ 2013-10-11, 14:45 ] |
Tytuł: | Re: Sortowanie w strukturze record |
OOO, Dzieki :) |
Autor: | bongos [ 2013-10-11, 16:55 ] |
Tytuł: | Re: Sortowanie w strukturze record |
wojtek pisze: A co to jest bąbelkowe sortowanie? Masz jakiś przykład? to takie bardzo proste sortowanie polega na tym, że tablicę N-elem sprawdzasz od 1 do N-1 (pętlą;-)) i sprawdzasz który element (wybrane pole) jest 'cięższy' - ten niżej czy ten wyżej jak trzeba to zamieniasz je miejscami (całe rekordy) i kontynuujesz przebieg potem powtarzasz przebieg, do momentu aż nie trzeba będzie nic 'przestawiać' w ten sposób 'lżejsze' elementy w każdym przebiegu będą 'szły do góry' coś jak bąbelki w szklance z zimnym piwem o który teraz sobie pewnie każdy pomyśli aż wszystkie bąbelki wypłyną albo zabraknie piwa |
Autor: | cedaar [ 2013-10-11, 19:15 ] |
Tytuł: | Re: Sortowanie w strukturze record |
O sortowaniu bąbelkowym możesz poczytać tutaj: http://edu.i-lo.tarnow.pl/inf/alg/003_sort/0006.php |
Autor: | wrob [ 2013-10-14, 00:43 ] |
Tytuł: | Re: Sortowanie w strukturze record |
ale czemu babelki - lepiej uzyc quick sort - tak samo prosty algorytm a sporo szybszy...... tu opis - http://toyoteczka.mainrc.com/pliki/asd/quicksort.pdf PS. widzę ze kolega wojtek na zajęcia algorytmy i struktury danych to chyba nie uczęszczał ;) |
Autor: | zz [ 2018-07-13, 00:17 ] |
Tytuł: | Re: Sortowanie w strukturze record |
nie działa mi sortowanie po PocId kawałek kodu: Kod: record rFZ string PocId [25] string Quantity [25] string Amount [25] EndRec mapValue mvSort mvSort.type(int) ... if ... ... //pocz.sortowania po PocId for i=1 to i>=iItemsCount xmlPocId=xmlPocIdList.item(i) xmlQuantity=xmlQuantityList.item(i) xmlAmount=xmlAmountList.item(i) tblItems(i).Quantity=xmlQuantity.text tblItems(i).Amount=xmlAmount.text tblItems(i).PocId=xmlPocId.text grow tblItems,1 next i for i=1 to i>=size(tblItems) mvSort.Set(tblItems(i).PocId,i) next i //koniec sort. po POCid ... for j=1 to j>=size(tblItems) print tblItems(mvSort.Get(j)).PocId next j ... endif Proszę o pomoc ;) |
Autor: | szepczący [ 2018-07-13, 23:08 ] |
Tytuł: | Re: Sortowanie w strukturze record |
Po tej pętli: Kod: for i=1 to i>=size(tblItems) mvSort.Set(tblItems(i).PocId,i) next i brakuje Ci sortowania mapy: Kod: mvSort.sort() Nota bene to wcale nie jest sortowanie bąbelkowe, tylko standardowe sortowanie na niższym poziomie niż ambasic (c#? c++?). Znaczy prawdopodobnie chyba quicksort. Sortowanie bąbelkowe zwykle wygląda mniej więcej tak jak niżej (nie wiem czy to działa, pisałem z pamięci ale koncepcja zwykle tak mniej więcej wygląda), i faktycznie jest bez porównania wolniejsze, szczególnie jeśli robisz to na bardzo dużej tablicy rekordów: Kod: for i=1 to i>n-1 for j=i+1 to j>n if a(i)>a(j) then b = a(i) a(i) = a(j) a(j) = b endif next j next i |
Autor: | zz [ 2018-09-03, 12:09 ] |
Tytuł: | Re: Sortowanie w strukturze record |
Okazało się że mogą być dwa wpisy o identycznym PocId, po którym sortuję (dwie dostawy na niepełne ilości, jedna faktura) i wtedy mam w zbiorze źródłowym np. 16 pozycji a po posortowaniu 15. Czy mozna zrobić mvSort po dwóch polach? np. PocId+Quantity |
Autor: | zz [ 2018-09-03, 14:03 ] |
Tytuł: | Re: Sortowanie w strukturze record |
wystarczyło zwykłe Kod: mvSort.Set((tblItems(i).PocId+tblItems(i).Quantity),i) i chyba jest OK |
Strona 1 z 1 | Strefa czasowa UTC+1godz. [letni] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |