|
|
Strona 1 z 1
|
[ Posty: 8 ] |
|
Problem z szybkością raportu
Autor |
Wiadomość |
wojtek
Rejestracja: 2010-02-10, 21:24 Posty: 260 Pomógł: 4
|
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
|
2013-03-19, 07:11 |
|
|
Autor |
Wiadomość |
Mix-soft.pl
|
|
|
wojtek
Rejestracja: 2010-02-10, 21:24 Posty: 260 Pomógł: 4
|
Re: Problem z szybkością raportu
Aha program HMP 2012 - zapomniałem o tym wspomnieć
|
2013-03-19, 07:25 |
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
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.
|
2013-03-19, 10:49 |
|
|
wojtek
Rejestracja: 2010-02-10, 21:24 Posty: 260 Pomógł: 4
|
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ę
|
2013-03-19, 15:10 |
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
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")
[...]
|
2013-03-19, 15:27 |
|
|
wojtek
Rejestracja: 2010-02-10, 21:24 Posty: 260 Pomógł: 4
|
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
|
2013-03-20, 11:24 |
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
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.
|
2013-03-20, 12:40 |
|
|
wojtek
Rejestracja: 2010-02-10, 21:24 Posty: 260 Pomógł: 4
|
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
|
2013-03-20, 13:03 |
|
|
|
Strona 1 z 1
|
[ Posty: 8 ] |
|
Kto jest online |
Użytkownicy przeglądający to forum: Nie ma żadnego zarejestrowanego użytkownika i 20 gości |
|
Nie możesz tworzyć nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz dodawać załączników
|
|
|
|