Search  
Wednesday, May 23, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Visual FoxPro in general  Ecran incasari...
 Ecran incasari
 
 1/31/2012 8:56:20 PM
User is offlineionut_bina
6 posts


Ecran incasari
 (N/A)
Am de facut un ecran pentru incasari de la clienti. As dori sa automatizez putin procesul de distribuire a sumelor. Totalul (introdus de operator) trebuie repartizat in functie de prioritate (de ex. 1-cheltuieli, 2-dobanzi, 3-rate restante... etc). Categoriile sunt in numar de 6. Modalitatea aleasa initial a devenit un "copil" ce a crescut urat, monstruos. Deja nu-l mai pot stapani. Nu ma pot hotari ce alta modalitate sa folosesc (for...endfor, cursor, tablou). Ce ma sfatuiti?
Postez fata copilului pentru amuzament:


    if thisform.text13.value<=thisform.text12.value
        thisform.text12.value=thisform.text13.value
        thisform.text8.value=0
        thisform.text8.value=0
        thisform.text11.value=0
        thisform.text7.value=0
        thisform.text6.value=0
        thisform.text4.value=0
        thisform.text3.value=0
    else
            if thisform.text13.value>=thisform.text12.value .and. thisform.text13.value<thisform.text8.value+thisform.text12.value
            thisform.text8.value=thisform.text13.value-thisform.text12.value
            thisform.text11.value=0
            thisform.text7.value=0
            thisform.text6.value=0
            thisform.text4.value=0
            thisform.text3.value=0
            else
                if thisform.text13.value>=thisform.text12.value+thisform.text8.value .and. thisform.text13.value<thisform.text8.value+thisform.text12.value+thisform.text11.value
                thisform.text11.value=thisform.text13.value-thisform.text12.value-thisform.text8.value
                thisform.text7.value=0
                thisform.text6.value=0
                thisform.text4.value=0
                thisform.text3.value=0       
                else
                    if thisform.text13.value>=thisform.text12.value+thisform.text8.value+thisform.text11.value .and. thisform.text13.value<thisform.text8.value+thisform.text12.value+thisform.text11.value+thisform.text6.value
                    thisform.text6.value=thisform.text13.value-thisform.text12.value-thisform.text8.value-thisform.text11.value
                    thisform.text7.value=0
                    thisform.text4.value=0
                    thisform.text3.value=0
                    else
                        if thisform.text13.value>=thisform.text12.value+thisform.text8.value+thisform.text11.value+thisform.text6.value .and. thisform.text13.value<thisform.text8.value+thisform.text12.value+thisform.text11.value+thisform.text6.value+thisform.text7.value
                        thisform.text7.value=thisform.text13.value-thisform.text12.value-thisform.text8.value-thisform.text11.value-thisform.text6.value
                        thisform.text4.value=0
                        thisform.text3.value=0
                        else
                            if thisform.text13.value>=thisform.text12.value+thisform.text8.value+thisform.text11.value+thisform.text6.value+thisform.text7.value .and. thisform.text13.value<thisform.text8.value+thisform.text12.value+thisform.text11.value+thisform.text6.value+thisform.text7.value+thisform.text4.value
                            thisform.text4.value=thisform.text13.value-thisform.text12.value-thisform.text8.value-thisform.text11.value-thisform.text6.value-thisform.text7.value
                            thisform.text3.value=0
                            else
                                if thisform.text13.value>=thisform.text12.value+thisform.text8.value+thisform.text11.value+thisform.text6.value+thisform.text7.value+thisform.text4.value .and. thisform.text13.value<thisform.text8.value+thisform.text12.value+thisform.text11.value+thisform.text6.value+thisform.text7.value+thisform.text4.value+thisform.text3.value
                                thisform.text3.value=thisform.text13.value-thisform.text12.value-thisform.text8.value-thisform.text11.value-thisform.text6.value-thisform.text7.value-thisform.text4.value
                                else
                                *aici e varianta maxima---se depaseste suma de plata, se trec sume pe rate in avans-- aici m-am dezlantuit!!!
                                    if thisform.text13.value>=thisform.text8.value+thisform.text12.value+thisform.text11.value+thisform.text6.value+thisform.text7.value+thisform.text4.value+thisform.text3.value .and. thisform.text13.value<=soldcredit
                                    thisform.text7.value= thisform.text13.value-thisform.text8.value-thisform.text12.value-thisform.text11.value-thisform.text6.value-thisform.text4.value-thisform.text3.value
                                    thisform.text13.value=thisform.text8.value+thisform.text12.value+thisform.text11.value+thisform.text6.value+thisform.text7.value+thisform.text4.value+thisform.text3.value
                                    else
                                    **varianta cu rate curente+rate restante sunt mai mari decat sold imprumut. se trec diferente pe fond social -- ragetul leului e doar un mieunat patetic!!!
                                    thisform.text7.value=soldcredit-thisform.text8.value-thisform.text12.value-thisform.text11.value-thisform.text6.value-thisform.text4.value-thisform.text3.value
                                    thisform.text4.value= thisform.text13.value-thisform.text7.value
                                    endif
                                endif
                            endif
                        endif
                    endif       
                endif
            endif
    endif
thisform.text3.refresh   
thisform.text4.refresh
thisform.text5.refresh
thisform.text6.refresh
thisform.text7.refresh
thisform.text8.refresh
thisform.text9.refresh
thisform.text11.refresh
thisform.text12.refresh
 1/31/2012 9:40:39 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Ecran incasari
 (N/A)
Doar atat pot sa zic: Doamne fereste.

Cum iti inchipui ca se poate descurca cineva in thisform.text34.value+thisform.text73.value?!?!?!?!!??!?! Daca nu te descurci tu, chiar crezi ca o sa-ti poata urmari cineva codul ala?

Sfatul meu: STERGE si fa-o din nou. Si boteaza-le naibii cu nume coerente: ThisForm.txtDobanda.value, si asa mai departe.

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 1/31/2012 10:23:34 PM
User is offlineionut_bina
6 posts


Re: Ecran incasari
 (N/A)
Cam asta era si ideea. Voi sterge oricum totul. Intrebarea mea era, in situatia data, ce metoda credeti ca as putea folosi? Ma refer la repartizarea sumelor in functie de prioritate. Va multumesc.
 1/31/2012 11:34:26 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Ecran incasari
 (N/A)
Pai am putea sa-ti fim de folos daca ne-ai spune si noua despre ce e vorba. Cat se repartizeaza, cui, de ce, in ce conditii, etc. Primul lucru pe care trebuie sa-l faci e sa-ti stabilesti foarte clar algoritmul de repartizare. Codul vine de-abia dupa aia. Monstrul de mai sus e rezultatul tipic al programarii facute dupa regula "cand mai apare ceva, mai pun un if".

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 2/1/2012 12:50:27 AM
User is offlineDaniel Buduru
2332 posts
1st




Re: Ecran incasari
 (N/A) Modified By Daniel Buduru  on 2/1/2012 2:04:17 PM)
Removed

Daniel Buduru
 2/1/2012 12:24:18 PM
User is offlineionut_bina
6 posts


Re: Ecran incasari
 (N/A)
 Grigore Dolghin wrote
Pai am putea sa-ti fim de folos daca ne-ai spune si noua despre ce e vorba. Cat se repartizeaza, cui, de ce, in ce conditii, etc. Primul lucru pe care trebuie sa-l faci e sa-ti stabilesti foarte clar algoritmul de repartizare. Codul vine de-abia dupa aia. Monstrul de mai sus e rezultatul tipic al programarii facute dupa regula "cand mai apare ceva, mai pun un if".

Ecranul sugereaza un total de plata in functie de soldurile/client. In situatia in care clientul achita mai putin decat totalul de plata criteriul de repartizare este urmatorul:
1-Cheltuieli, 2-Dob. penalizare, 3-Dobanda, 4-Rata restanta, 5-Rata curenta, 6-Fond social, 7-Taxa inscriere.
In situatia in care clientul achita in avans prioritatea este aceeasi iar diferenta nerepartizata merge pe 5-Rata curenta pana la achitarea creditului.
In situatia in care Suma este chiar mai mare decat total debite+sold credit diferenta merge pe fond social indiferent de marimea acesteia.
Multam fain, in avans.
 2/1/2012 12:33:20 PM
User is offlineionut_bina
6 posts


Re: Ecran incasari
 (N/A)
 Daniel Buduru wrote
 ionut_bina wrote
Am de facut un ecran pentru incasari de la clienti. As dori sa automatizez putin procesul de distribuire a sumelor. Totalul (introdus de operator) trebuie repartizat in functie de prioritate (de ex. 1-cheltuieli, 2-dobanzi, 3-rate restante... etc). Categoriile sunt in numar de 6. Modalitatea aleasa initial a devenit un "copil" ce a crescut urat, monstruos. Deja nu-l mai pot stapani. Nu ma pot hotari ce alta modalitate sa folosesc (for...endfor, cursor, tablou). Ce ma sfatuiti?
....

Daca am intele bine ce vrei sa faci, problema e similara unei descarcari FIFO.
Solutia scalabila e utilizarea unei baze de date.
Ai nevoie de o tabela in care sa tii modul de repartizare: idbuget, buget, prioritate, barem.
O tabela pentru incasari: iddocument, idclient, suma, client, data incasarii.
O tabela pentru incasarile repartizate pe bugete: idbuget, iddocument, suma repartizata.
Vei mai avea nevoie si de alte informatii, probabil ca repartizarea asta se face periodic, va trebui sa dai mai multe explicatii.
In momentul cand se inregistreaza o incasare, se distribuie pe bugete. Pentru asta trebuie obtinuta situatia curenta

Select prioritate, bb.prioritate, bb.idbuget, bb.barem, cc.realizat, bb.barem-cc.realizat as rest, cast(0 as money) as repartizat from bugete bb ;
inner join (select idbuget, sum(suma) as realizat from repartizari group by idbuget) cc ;
on bb.idbuget=cc.idbuget  WHERE bb.barem>cc.realizat ORDER BY prioritate into cursor crsprioritati readwrite

&& Odata obtinut acest cursor, se parcurge secvential si se face repartizarea sumei:
lnSuma=incasari.suma
lcIDdocument=incasari.iddocument
Select crsprioritati
Scan all
lnrepartizat=MIN(crsprioritati.rest, lnsuma)
if lnrest=0
   exit
endif
Replace repartizat with lnRepartizat
lnSuma=lnSuma-lnRepartizat
Endscan

&& se insereaza inregistrarile in tabela cu sumele repartizate

Insert into repartizari (idbuget, iddocument, suma) select cp.idbuger, lcIddocument, cp.repartizat from crsprioritati cp where lnrepartizat>0

Cam asta ar fi algoritmul. Poti afisa cursorul crsprioritati intr-un grid.


BD exista deja cu tabelele aferente. Arhitectura (suna cam pompos) este putin diferita: clienti, imprumuturi, scadente, capital, incas si conta. Informatia este extrasa si afisata in ecranul de incasari. Pentru a preveni anumite incidente (gen sold imprumut cu minus, samd) am nevoie de o modalitate de a repartiza suma in functie de criteriul meu (si nu de alte criterii ). Algoritmul de repartizare e postat mai sus putin.
Multumesc frumos pentru sugestii.
 2/1/2012 1:02:49 PM
User is offlineDaniel Buduru
2332 posts
1st




Re: Ecran incasari
 (N/A) Modified By Daniel Buduru  on 2/1/2012 4:54:27 PM)
Criteriul tau il pui in tabela repartizari. Sorry, timpul nu-mi permite sa descifrez algoritmul tau.

Daniel Buduru
 2/4/2012 12:17:07 AM
User is offlineionut_bina
6 posts


Re: Ecran incasari
 (N/A)
 Daniel Buduru wrote
Criteriul tau il pui in tabela repartizari. Sorry, timpul nu-mi permite sa descifrez algoritmul tau.


ideea ta a fost buna. merge ceva de genul:
DIMENSION prioritati(5)
a_suma= ceva
store a to prioritati(1)
store b to prioritati(2)
store c to prioritati(3)
store d to prioritati(4)
store e to prioritati(5)
*a,b,c,d fiind sumele de incasat in ordinea prioritatii
for i=1 to 5
lnrepartizat=MIN(prioritati(i), a_suma)
prioritati(i)=lnrepartizat
if a_suma=0
   exit
endif
a_suma=a_suma-lnRepartizat
Endfor

Multumesc frumos!
 2/4/2012 8:13:04 AM
User is offlineDaniel Buduru
2332 posts
1st




Re: Ecran incasari
 (N/A)
Scade lnrepartizat din a_suma inainte de a verifica a_suma =0, altfel vei repartiza mai mult decat ai incasat.

Daniel Buduru
  Visual FoxPro  Visual FoxPro in general  Ecran incasari...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement