mojaSymfonia FORUM https://forum.mix-soft.pl/ |
|
Problem z szybkością raportu https://forum.mix-soft.pl/viewtopic.php?f=15&t=4816 |
Strona 1 z 1 |
Autor: | wojtek [ 2013-03-19, 07:11 ] |
Tytuł: | Problem z szybkością raportu |
Raport wykonywany jest z okna towarów. Potrzebuję informacje o całkowitej sprzedaży towaru kontrahentom (wraz z ich danymi adresowymi) . Kluczowa pętla programu porusz się w obrębie tabeli DP ale zapisów jest tam kilkaset tysięcy i wykonanie raportu na "końcówce" trwa dość długo. Czy można jakoś przyspieszyć działanie kodu?? Albo napisać raport winny sposób by osiągnąć cel opisany powyżej. Poniżej wolno działająca pętla. Pozostałe funkcjonalności kodu działają OK Kod: while errtw idTw = GetLineId() SetKey ( tw,"id" ) SetKeySeg( tw,"id",idtw ) GetRec(tw,EQ) s_kodTw = getfield(tw,"kod") SetKey ( dp,"tw" ) SetKeySeg( dp,"idtw",idtw ) errdp = GetRec(dp,GE) while !errDp u+=1 popup(0,"Trwa wykonanie raportu...") popup(1,(using "%i",u)) if Getfield(dp,"idtw") == idtw then I_ilosc = Getfield(dp,"ilosc") idkh = Getfield(dp,"idkh") s_kodTw= Getfield(dp,"kod") s_data_sp = Getfield(dp,"data") if datavalid(s_data_sp) == 1 then if k.index((using "%l",idkh)) then i_ilosc_2 = k.get((using "%l",idkh)) + i_ilosc k.set((using "%l",idkh), i_ilosc_2) l.set((using "%l",idkh),idkh) m.set((using "%l",idkh),idtw) n.set((using "%l",idkh),s_kodTw) else k.set((using "%l",idkh),i_ilosc) l.set((using "%l",idkh),idkh) m.set((using "%l",idkh),idtw) n.set((using "%l",idkh),s_kodTw) endif endif endif errdp = GetRec(dp,NX) wend errtw = SetTaggedPos(NX) wend |
Autor: | wojtek [ 2013-03-19, 07:25 ] |
Tytuł: | Re: Problem z szybkością raportu |
Aha program HMP 2012 - zapomniałem o tym wspomnieć |
Autor: | rafal [ 2013-03-19, 10:49 ] |
Tytuł: | Re: Problem z szybkością raportu |
Teraz będzie dużo szybciej. Kod: idTw = GetLineId() SetKey ( tw,"id" ) SetKeySeg( tw,"id",idtw ) GetRec(tw,EQ) s_kodTw = getfield(tw,"kod") SetKey ( dp,"tw" ) SetKeySeg( dp,"idtw",idtw ) errdp = GetRec(dp,GE) while !errDp && Getfield(dp,"idtw") == idtw u+=1 popup(0,"Trwa wykonanie raportu...") popup(1,(using "%i",u)) //if Getfield(dp,"idtw") == idtw then I_ilosc = Getfield(dp,"ilosc") idkh = Getfield(dp,"idkh") s_kodTw= Getfield(dp,"kod") s_data_sp = Getfield(dp,"data") if datavalid(s_data_sp) == 1 then if k.index((using "%l",idkh)) then i_ilosc_2 = k.get((using "%l",idkh)) + i_ilosc k.set((using "%l",idkh), i_ilosc_2) l.set((using "%l",idkh),idkh) m.set((using "%l",idkh),idtw) n.set((using "%l",idkh),s_kodTw) else k.set((using "%l",idkh),i_ilosc) l.set((using "%l",idkh),idkh) m.set((using "%l",idkh),idtw) n.set((using "%l",idkh),s_kodTw) endif endif //endif errdp = GetRec(dp,NX) wend errtw = SetTaggedPos(NX) wend Ja bym pominął deklarację zmiennych do przechowywania wartości z GetField Teraz masz tak Kod: string s_kodTw [...] s_kodTw= Getfield(dp,"kod") [...] n.set((using "%l",idkh),s_kodTw) A możesz mieć Kod: n.set((using "%l",idkh), Getfield(dp,"kod") ) Kod będzie krótszy i bardziej czytelny Jeszcze nie trzyma się kupy użycie MapValue k, l, m, n. W efekcie w K masz ilość wszystkich zaznaczonych towarów, w L - listę kontrahentów którzy kupowali te towary, w M - listę zaznaczonych towarów (id) w N - listę zaznaczonych towarów (kod). o to Ci chodziło? Przy wykonaniu tego raportu dla więcej niż 1 towaru dane są chyba mało przydatne. |
Autor: | wojtek [ 2013-03-19, 15:10 ] |
Tytuł: | Re: Problem z szybkością raportu |
Dziękuję za pomoc. Co do MapValue też zorientowałem się już po fakcie że raport staje się bezużyteczny przy analizie kilku towarów. Będę musiał wymyślić jakiś inny sposób agregacji danych. Może jakieś pomocne sugestie ? Z góry dziękuję |
Autor: | rafal [ 2013-03-19, 15:27 ] |
Tytuł: | Re: Problem z szybkością raportu |
Jeżeli chcesz zbierać informacje ile czego i komu sprzedałeś to możesz za pomocą jednego obiektu MapValue Kod: MapValue mvAnaliza mvAnaliza.Type ( float ) [...] mvAnaliza.Get( (using "%6.6l%6.6l",GetField(dp,"idkh"),GetField(dp,"idtw")), 0) += GetField(dp,"ilosc") [...] |
Autor: | wojtek [ 2013-03-20, 11:24 ] |
Tytuł: | Re: Problem z szybkością raportu |
Dzieki - wszytsko zaczęło działać. Ale jedno pytanie mi sie pojawiło : Kod : Kod: while !errDp && Getfield(dp,"idtw") == idtw if Getfield(dp,"subtypi") == 0 then u+=1 popup(0,"Trwa wykonanie raportu...") popup(1,(using "%i",u)) I_ilosc = Getfield(dp,"ilosc") idkh = Getfield(dp,"idkh") s_kodTw= Getfield(dp,"kod") s_data_sp = Getfield(dp,"data") if datavalid(s_data_sp) == 1 then if k.index((using "%l%l",idtw,idkh)) then i_ilosc_2 = k.get((using "%l%l",idtw,idkh)) + i_ilosc k.set((using "%l%l",idtw,idkh), i_ilosc_2) // l.set((using "%l%l",idtw,idkh),idkh) // m.set((using "%l%l",idtw,idkh),idtw) // n.set((using "%l%l",idtw,idkh),s_kodTw) else k.set((using "%l%l",idtw,idkh),i_ilosc) l.set((using "%l%l",idtw,idkh),idkh) m.set((using "%l%l",idtw,idkh),idtw) n.set((using "%l%l",idtw,idkh),s_kodTw) endif endif endif errdp = GetRec(dp,NX) wend Daje prawidłowe rezultaty, ale chciałem sprawę jeszcze przyspieszyć: Kod: while !errDp && Getfield(dp,"idtw") == idtw && Getfield(dp,"subtypi") == 0 u+=1 popup(0,"Trwa wykonanie raportu...") popup(1,(using "%i",u)) I_ilosc = Getfield(dp,"ilosc") idkh = Getfield(dp,"idkh") s_kodTw= Getfield(dp,"kod") s_data_sp = Getfield(dp,"data") if datavalid(s_data_sp) == 1 then if k.index((using "%l%l",idtw,idkh)) then i_ilosc_2 = k.get((using "%l%l",idtw,idkh)) + i_ilosc k.set((using "%l%l",idtw,idkh), i_ilosc_2) // l.set((using "%l%l",idtw,idkh),idkh) // m.set((using "%l%l",idtw,idkh),idtw) // n.set((using "%l%l",idtw,idkh),s_kodTw) else k.set((using "%l%l",idtw,idkh),i_ilosc) l.set((using "%l%l",idtw,idkh),idkh) m.set((using "%l%l",idtw,idkh),idtw) n.set((using "%l%l",idtw,idkh),s_kodTw) endif endif errdp = GetRec(dp,NX) wend Ten daje złe rezultaty |
Autor: | rafal [ 2013-03-20, 12:40 ] |
Tytuł: | Re: Problem z szybkością raportu |
No bo dodanie nic Ci nie przyśpieszy. Dlaczego to dadałeś? No i pamiętaj w MapValue o %.6.6l zamiast %l (bo później będziesz musiał rozdzielić idkh od idtw. |
Autor: | wojtek [ 2013-03-20, 13:03 ] |
Tytuł: | Re: Problem z szybkością raportu |
Dzięki jeszcze raz , raport działa teraz naprawdę szybko. Jeśli chodzi o "%l%l" to nie ma to znaczenia w moim przypadku bo idtw i idkh przechowuję w odrębnych elementach: l.set((using "%l%l",idtw,idkh),idkh) m.set((using "%l%l",idtw,idkh),idtw) być może niepotrzebnie ale jest mi tak wygodniej, więc zlepek idtwidkh jest jednoznacznie określony i mogę zgromadzić sumę sprzedaży określonego towaru dla określonego kontrahenta (w każdym razie tak to działa w testach) Dalsza część kodu do pobierania info o kh : Kod: for j = 1 to j>k.size() i+=1 idkh = l.Get(j) SetKey ( kh,"id" ) SetKeySeg( kh,"id",idkh ) GetRec(kh,EQ) s_KodKh= Getfield(kh,"kod") s_nazwaKh = Getfield(kh,"nazwa") s_miejscowosc = Getfield(kh,"miejscowosc") s_ulica = Getfield(kh,"ulica") s_nrDom = Getfield(kh,"dom") s_lokal = Getfield(kh,"lokal") s_kodPocz = Getfield(kh,"kodpocz") s_NIP = Getfield(kh,"NIP") s_pesel = Getfield(kh,"pesel") s_tel1 = Getfield(kh,"tel1") s_tel2 = Getfield(kh,"tel2") s_email = Getfield(kh,"email") s_ilosc = using "%i",k.Get(j) s_kodTw = n.Get(j) if i_czy_excel then ws.cells(i,1)= s_KodTw ws.cells(i,3)= s_ilosc ws.cells(i,2)= s_KodKh ws.cells(i,4)= s_nazwaKh ws.cells(i,5)= s_kodPocz ws.cells(i,6)= s_miejscowosc ws.cells(i,7)= s_ulica ws.cells(i,8)= s_nrDom ws.cells(i,9)= s_lokal ws.cells(i,10)= s_tel1 ws.cells(i,11)= s_tel2 ws.cells(i,12)= s_email ws.cells(i,13)= s_NIP ws.cells(i,14)= s_pesel else tabela #Tabb kolumna 1, s_KodTw kolumna 2,s_ilosc kolumna 3,s_KodKh kolumna 4,s_nazwaKh kolumna 5,s_kodPocz kolumna 6,s_miejscowosc kolumna 7,s_ulica kolumna 8,s_nrDom kolumna 9,s_lokal kolumna 10,s_tel1 kolumna 10,s_tel2 kolumna 12, s_email kolumna 13,s_NIP kolumna 14,s_pesel koniec endif next j |
Strona 1 z 1 | Strefa czasowa UTC+1godz. [letni] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |