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/