Posty bez odpowiedzi |oraz Aktywne tematy Dzisiaj jest 2024-11-25, 02:00x



Odpowiedz w temacie  [ Posty: 8 ] 
Problem z szybkością raportu 
Autor Wiadomość

Rejestracja: 2010-02-10, 21:24
Posty: 260
Pomógł: 4
Post 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
Wyświetl profil
Autor Wiadomość
 



Rejestracja: 2010-02-10, 21:24
Posty: 260
Pomógł: 4
Post Re: Problem z szybkością raportu
Aha program HMP 2012 - zapomniałem o tym wspomnieć


2013-03-19, 07:25
Wyświetl profil
Ekspert
Ekspert

Rejestracja: 2007-11-16, 15:08
Posty: 4000
Pomógł: 448
Post 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.

_________________
Skontaktuj się z Ekspertem | Zamów dodatek

tel. 22 7 538 538
ekspert@mojaSymfonia.pl
http://www.mojaSymfonia.pl


2013-03-19, 10:49
Wyświetl profil

Rejestracja: 2010-02-10, 21:24
Posty: 260
Pomógł: 4
Post 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
Wyświetl profil
Ekspert
Ekspert

Rejestracja: 2007-11-16, 15:08
Posty: 4000
Pomógł: 448
Post 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")

[...]

_________________
Skontaktuj się z Ekspertem | Zamów dodatek

tel. 22 7 538 538
ekspert@mojaSymfonia.pl
http://www.mojaSymfonia.pl


2013-03-19, 15:27
Wyświetl profil

Rejestracja: 2010-02-10, 21:24
Posty: 260
Pomógł: 4
Post 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
Wyświetl profil
Ekspert
Ekspert

Rejestracja: 2007-11-16, 15:08
Posty: 4000
Pomógł: 448
Post 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.

_________________
Skontaktuj się z Ekspertem | Zamów dodatek

tel. 22 7 538 538
ekspert@mojaSymfonia.pl
http://www.mojaSymfonia.pl


2013-03-20, 12:40
Wyświetl profil

Rejestracja: 2010-02-10, 21:24
Posty: 260
Pomógł: 4
Post 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
Wyświetl profil
Wyświetl posty nie starsze niż:  Sortuj wg  
Odpowiedz w temacie   [ Posty: 8 ] 
   Podobne tematy   Autor   Odpowiedzi   Odsłony   Ostatni post 
Na tym forum nie ma nowych nieprzeczytanych postów. problem z zawartością raportu PIT-2

w Programy Kadrowo Płacowe

Artie100

4

2634

2011-09-01, 12:45

Artie100 Wyświetl najnowszy post

Na tym forum nie ma nowych nieprzeczytanych postów. Problem z orientacją wydruku raportu

w Programy Księgowe

MałaKsięgowa

4

2451

2013-12-10, 10:51

MałaKsięgowa Wyświetl najnowszy post

Na tym forum nie ma nowych nieprzeczytanych postów. Załączniki Problem z drukowaniem raportu Start Handel 2.0

w Programy Handlowe

unikal

1

2130

2018-12-05, 10:17

gregg Wyświetl najnowszy post

Na tym forum nie ma nowych nieprzeczytanych postów. KDP 2014.a - problem przy wykonywaniu raportu Z - 3

w Programy Kadrowo Płacowe

pawel__z

1

2051

2013-10-10, 10:51

ka_m Wyświetl najnowszy post



Kto jest online

Użytkownicy przeglądający to forum: Nie ma żadnego zarejestrowanego użytkownika i 3 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

Szukaj:
Przejdź do:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Support forum phpbb by phpBB Assistant