* test_s6_4_transfer.prg * Headless: S6-4, transfer (tip 23) si retur transfer (tip 41). * Bloc A (structural, mereu ruleaza, 0 numere): dovedeste ca v2 nu are traseu catre crsfactura * nevid pentru 23/41 - cablare, zeroire, absenta grid/buton pe rand. * Bloc B (structural, mereu ruleaza, 0 numere): dovedeste traseul real pe v1 - But_urmator1, * ramura modala din do_adauga_articol cu gnScadereStoc=0, clasa frm_articol_factura. * Bloc D (structural, mereu ruleaza, 0 numere): asertiuni pe cele doua divergente v1/v2 cunoscute * si inca vii azi in Do Case-ul din do_initializeaza_articol - nu sunt defecte azi (tip 24 nu * apare in intervalul clasei v2, iar copierea ruteaza azi pe v1), dar sunt capcane latente * pentru ziua in care v2 ramane singurul formular. Pica daca cineva "unifica" gresit garda. * Bloc C (emitere REALA, doar pe v1, 1-2 numere tipdoc 6): condtionat de sursa de stoc gasita * in date (articolul 315554536 / gestiunea 6) sau de scriptul wip13_..._STOC_TRANSFER aplicat. * Fara sursa: se dezaloca numarul, blocul se marcheaza NEEXERCITAT, nu FAIL. * NU exista Bloc de comparatie CompDoc: nu exista niciodata document v2 pentru tip 23/41 (§5.d * din propunere) - a incerca sa emiti pe v2 ar testa cod mort, nu traseul (lectia platita de 3 * ori in acest plan). * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_4_transfer.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_4_transfer.log * Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167; * gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare. SET SAFETY OFF SET TALK OFF SET NOTIFY OFF SET TABLEPROMPT OFF SET DELETED ON SET EXACT ON SET CENTURY ON SET DATE DMY SET DECIMALS TO 4 SET NULLDISPLAY TO '' CLOSE DATABASES PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat PUBLIC gcClaseVazute, goDriverS64, gnModaleArticolInchise gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_4_transfer.log" IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" ENDIF STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) gnPass = 0 gnFail = 0 gnErr = 0 gcCaz = "" gcMockApeluri = "" gnMockRaspuns = 6 gcMockDuplicat = "" gcClaseVazute = ";" gnModaleArticolInchise = 0 gcNumere = "" gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" *-- poDate & co. declarate SI initializate la nivel de program (capcana platita: PRIVATE declarat *-- intr-o procedura si asignat in alta ramane invizibil formei) PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil poDate = NULL poGeneratorNumere = NULL poDateGestiuneDest = NULL pnTotalDiscountAvize = 0 plVizibil = .F. ON ERROR DO S64Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT TRY SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0 DO S64Log WITH 'EROARE: conectare Oracle esuata' DO S64Final ENDIF SQLSETPROP(gnHandle, "QueryTimeOut", 45) DO S64Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE SET PROCEDURE TO (gcMock) ADDITIVE IF !actualizeaza_optiuni_program() DO S64Log WITH 'EROARE: actualizeaza_optiuni_program()' DO S64Final ENDIF gnScadereStoc = 0 gnFactSeturi = 0 gnIdSucursala = 167 goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) gnIdUtil = 8 goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) DO S64Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) update_jtva_coloane([JV], [jtva_coloane_temp]) update_saft_taxtable() IF !USED('saft_tip_facturi') CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') INDEX ON cod TAG cod ENDIF *-- driver + timer: frm_articol_factura (modalul din §3.2) nu trece prin amessagebox, deci *-- mock-ul nu il acopera. Acelasi tipar de timer/driver validat la S6-2/S6-3/S8. goDriverS64 = CREATEOBJECT('driverS64') _SCREEN.AddObject('tmrS64', 'Timer') _SCREEN.tmrS64.Interval = 200 BINDEVENT(_SCREEN.tmrS64, 'Timer', goDriverS64, 'Executa') _SCREEN.tmrS64.Enabled = .T. DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC A: v2 nu are traseu (structural, 0 numere) =====' DO BlocA_V2FaraTraseu DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC B: v1 are traseu per-articol cu modal (structural, 0 numere) =====' DO BlocB_V1Traseu DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC D: divergentele v1/v2 cunoscute, latente azi (structural, 0 numere) =====' DO BlocD_DivergenteV1V2 DO S64Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSEI REALE (STOC) =====' DO AlegeSursaStoc DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC C: emitere REALA pe v1 (conditionata de sursa) =====' DO BlocC_EmitereV1 DO S64Final CATCH TO loExc DO S64Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' DO S64Final ENDTRY QUIT *================================================================================== * BLOC A: cele trei goluri de pe v2, verificate pe cod, fara sa incarce nimic. PROCEDURE BlocA_V2FaraTraseu LOCAL lcTxt, lcV2 gcCaz = '[A] ' lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") IF EMPTY(lcTxt) DO Assert WITH .F., 'FILETOSTR ofacturare.vc2 a esuat/gol' RETURN ENDIF *-- A1: cablarea do_incarca_articole (v2) nu include 23/41 in Inlist-ul catre do_adauga_tot DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9)" $ lcTxt AND ; !("Inlist(poDate.tip, 3, 4, 21, 23, 25, 28, 41, 42, 47, 8, 9)" $ lcTxt), ; 'A1: cablarea do_adauga_tot (v2) NU contine 23 sau 41 - crsfactura ramane gol dupa Incarca articole' *-- A2: do_initializeaza_articol zeroeste cantitatea pt 23/41 pe AMBELE clase DO Assert WITH OCCURS("If Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !INLIST(toArticol.opt_facturare,1,2)", lcTxt) >= 1, ; 'A2: do_initializeaza_articol (v2) zeroeste cantitatea pt grupul care include 23 si 41' *-- A3: v2 nu are But_urmator1 (buton per-rand). NU e unic in tot fisierul (frm_articole_compuse, *-- clasa nelegata, il are si el la ofacturare.vc2:4489) - scopat pe intervalul claselor v1/v2. LOCAL lnA3v1, lnA3v2, lnA3Next, lcA3v1, lcA3v2 lnA3v1 = AT('DEFINE CLASS frm_facturare_articole AS _frmbase OF "_frm_base.vcx"', lcTxt) lnA3v2 = AT('DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx"', lcTxt) lnA3Next = AT('DEFINE CLASS frm_nomrute AS frm_termin OF "_frm_child.vcx"', lcTxt) IF lnA3v1 = 0 OR lnA3v2 = 0 OR lnA3Next = 0 OR lnA3v2 <= lnA3v1 OR lnA3Next <= lnA3v2 DO Assert WITH .F., 'A3: pre-conditie - ancorele DEFINE CLASS frm_facturare_articole/2/frm_nomrute gasite si in ordine' ELSE lcA3v1 = SUBSTR(lcTxt, lnA3v1, lnA3v2 - lnA3v1) lcA3v2 = SUBSTR(lcTxt, lnA3v2, lnA3Next - lnA3v2) DO Assert WITH OCCURS("ADD OBJECT 'But_urmator1'", lcA3v1) = 1, ; 'A3a: v1 (frm_facturare_articole) are But_urmator1 (buton per-rand)' DO Assert WITH OCCURS("ADD OBJECT 'But_urmator1'", lcA3v2) = 0, ; 'A3b: v2 (frm_facturare_articole2) NU are But_urmator1 - fara echivalent per-rand' ENDIF *-- A4: linia libera (do_adauga_articol_cautat) nu verifica 23/41 (Inlist-ul de gardare) DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47) And !Thisform.do_verifica_articol" $ lcTxt, ; 'A4: garda de stoc a liniei libere (v2) nu acopera 23/41 - nici pe acolo nu exista traseu utilizabil' *-- A5: instantiere directa a v2 + Incarca articole pe un antet de transfer -> crsfactura ramane gol *-- (proba comportamentala, nu doar text - dar NU e "traseul real", e control ca A1-A4 nu mint) DO ControlComportamentalV2 ENDPROC *-- Control comportamental: cheama Incarca articole pe v2 cu poDate.tip=23, verifica ca *-- crsfactura ramane gol chiar daca crsarticole s-a umplut. Nu emite, nu consuma numar. PROCEDURE ControlComportamentalV2 LOCAL loForm, lnArt, lnFact gcCaz = '[A5] ' DO CuratieCrs poDate = CREATEOBJECT("oDateFactura", 25022, 23) poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") poDateGestiuneDest = CREATEOBJECT("oDateGestiune") poDate.id_client = 6 poDate.nume_client = 'DEPOZIT' IF TYPE('poDate.id_gestiune_init') = 'N' OR ISNULL(poDate.id_gestiune_init) poDate.id_gestiune_init = 6 ENDIF poDate.id_delegat = 39 IF EMPTY(NVL(poDate.id_fdoc, 0)) poDate.id_fdoc = 1 ENDIF poGeneratorNumere.ResetNumere() poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) IF poDate.rezultat_serii <> 3 DO Assert WITH .F., 'A5: rezultat_serii = 3 pe antet de control (transfer), e=' + TRANSFORM(poDate.rezultat_serii) DO Goleste RETURN ENDIF poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) DO S64Log WITH ' A5 control: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) IF poDate.tva_incasare = 0 SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane ELSE SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane ENDIF DO PregatesteFacturaCrsV2 loForm = CREATEOBJECT('frm_facturare_articole2') IF VARTYPE(loForm) <> 'O' DO Assert WITH .F., 'A5: Createobject frm_facturare_articole2 (control)' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Goleste RETURN ENDIF loForm.WindowType = 0 loForm.Show() DOEVENTS FORCE SET PROCEDURE TO (gcMock) ADDITIVE gcMockApeluri = '' loForm.but_incarca_articole.Click() DOEVENTS FORCE lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) DO S64Log WITH ' A5 control: dupa Click crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) DO Assert WITH lnFact = 0, ; 'A5: pe v2, transfer (tip 23), crsfactura ramane GOL dupa Incarca articole - confirma A1-A2 pe comportament' TRY loForm.Release() CATCH ENDTRY poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (A5, control, niciodata scris);' DO CuratieCrs DO Goleste ENDPROC PROCEDURE PregatesteFacturaCrsV2 DO creeaza_facturacrs WITH 'crsfactura' SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE USE IN crsfactura SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE USE IN crsfact_tmp ENDPROC *================================================================================== * BLOC B: traseul real pe v1 - buton, ramura modala, clasa frm_articol_factura. Doar text/PEMSTATUS, * nu instantiaza formularul (evita orice dialog inutil). PROCEDURE BlocB_V1Traseu LOCAL lcTxt gcCaz = '[B] ' lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") DO Assert WITH "caction = do_urmator," $ lcTxt, ; 'B1: But_urmator1 (v1) are cAction = do_urmator - butonul viu pentru adaugare per-articol' DO Assert WITH "Case (poArticol.gestionabil = 0 Or gnScadereStoc = 0 Or poDate.tip = 45)" $ lcTxt, ; 'B2: do_adauga_articol (v1) ia ramura modala necoditionat cand gnScadereStoc = 0' DO Assert WITH 'Createobject("frm_articol_factura", lnCantitate, tlImplicit)' $ lcTxt, ; 'B3: ramura modala instantiaza frm_articol_factura (nu do_alege_stoc)' DO Assert WITH "If !tlImplicit" $ lcTxt AND "ofrmadarticol.Show(1)" $ lcTxt, ; 'B4: modalul se arata (Show(1)) cand tlImplicit = .F. - cazul But_urmator1, nu Adauga tot' *-- B5: pe v1, but_urmator_tot1 NU e vizibil pentru 23/41 (spre deosebire de 3,4,8,9,21,24,25,28,42,47) DO VerificaButUrmatorTotAscunsPentruTransfer WITH lcTxt ENDPROC * Cauta blocul "Case poDate.tip = 23 ... Endcase/Case urmator" si verifica ca nu contine * "but_urmator_tot1.Visible = .T." intre el si urmatorul Case. Cautare pe text, robusta la * reformatari minore (nu presupune numar de linie). PROCEDURE VerificaButUrmatorTotAscunsPentruTransfer LPARAMETERS tcTxt LOCAL lnStart23, lnStart41, lnNextAfter23, lnNextAfter41, lcBloc23, lcBloc41 lnStart23 = AT("Case poDate.tip = 23" + CHR(13) + CHR(10), tcTxt) IF lnStart23 = 0 lnStart23 = AT("Case poDate.tip = 23", tcTxt) ENDIF lnStart41 = AT("Case poDate.tip = 41", tcTxt, 2) && a doua aparitie (dupa cea din alt context, daca exista) IF lnStart41 = 0 OR lnStart41 < lnStart23 lnStart41 = AT("Case poDate.tip = 41", tcTxt) ENDIF IF lnStart23 = 0 OR lnStart41 = 0 DO Assert WITH .F., 'B5: blocurile Case poDate.tip = 23 / 41 gasite in text (pre-conditie cautare)' RETURN ENDIF lnNextAfter23 = AT("Case poDate.tip = 41", tcTxt, 1) lcBloc23 = SUBSTR(tcTxt, lnStart23, MAX(lnNextAfter23 - lnStart23, 1)) lnNextAfter41 = AT("Case poDate.tip = 25", tcTxt, 1) lcBloc41 = SUBSTR(tcTxt, lnStart41, MAX(lnNextAfter41 - lnStart41, 1)) DO Assert WITH !("but_urmator_tot1.Visible = .T." $ LOWER(lcBloc23)), ; 'B5a: blocul Case poDate.tip=23 (v1, Init) NU seteaza but_urmator_tot1.Visible - butonul de masa ramane ascuns' DO Assert WITH !("but_urmator_tot1.Visible = .T." $ LOWER(lcBloc41)), ; 'B5b: blocul Case poDate.tip=41 (v1, Init) NU seteaza but_urmator_tot1.Visible - butonul de masa ramane ascuns' ENDPROC *================================================================================== * BLOC D: cele doua divergente v1/v2 in do_initializeaza_articol, gasite dincolo de propunere. * Verificat pe cod (ofacturare.vc2): v1 :13878/13890, v2 :19700/19712. NU sunt defecte azi - * tipul 24 (aviz retur) nu apare deloc in intervalul clasei v2 (15894-21780), iar copierea * (poDate.lCopiere) ruteaza azi pe v1 (S5c) - dar sunt capcane latente pentru ziua in care v2 * ramane singurul formular (tinta planului #13). Asertiunile pica daca cineva "unifica" garda * gresit (adica sterge divergenta fara sa decida explicit ce se intampla cu lCopiere/tip 24 pe v2). * D3 (a treia asertiune ceruta): masinaria modalului per-rand (do_adauga_articol cu tip hint * frm_articol_factura) exista SI pe v2 - lipseste doar punctul de intrare din UI (A3/B1), nu * motorul. Distinctia schimba forma reparatiei din propunere §7. PROCEDURE BlocD_DivergenteV1V2 LOCAL lcTxt gcCaz = '[D] ' lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") *-- D1: v1 (:13890) zeroeste cu exceptia suplimentara "OR poDate.lCopiere" - v2 nu o are DO Assert WITH "Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !(INLIST(toArticol.opt_facturare,1,2) OR poDate.lCopiere)" $ lcTxt, ; 'D1: v1 (ofacturare.vc2:13890) are exceptia OR poDate.lCopiere in garda de zeroire - v2 (:19712) nu o are' *-- D2: varianta cu lCopiere apare o singura data (doar v1) - daca ar aparea si pe v2, divergenta ar fi disparuta silentios DO Assert WITH OCCURS("Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !(INLIST(toArticol.opt_facturare,1,2) OR poDate.lCopiere)", lcTxt) = 1, ; 'D2: garda cu OR poDate.lCopiere exista o singura data in fisier (doar pe v1, :13890) - divergenta e inca vie azi' *-- D3: v1 (:13878) negeaza cantitatea si pentru tip 24 (aviz retur) - v2 (:19700) doar 8,9. *-- Substringul scurt "Inlist(poDate.tip,8,9,24)" apare de 8 ori in fisier (Iif/Case aiurea, *-- alte metode) - asertiunea foloseste sirul complet cu comentariul, unic garantat. *-- capcana platita aici: VFP trateaza "&&" ca inceput de comentariu chiar si in interiorul unui *-- string literal (verificat - eroarea 36 aparea si fara linie continuata) - construit din *-- CHR(38) ca sa nu apara deloc literalul "&&" in sursa .prg LOCAL lcD3Cauta lcD3Cauta = "If Inlist(poDate.tip,8,9,24) " + CHR(38) + CHR(38) + " retur lei, retur valuta, aviz retur" DO Assert WITH OCCURS(lcD3Cauta, lcTxt) = 1, 'D3: garda cu Inlist(poDate.tip,8,9,24) si comentariul aferent exista o singura data (doar pe v1, :13878) - v2 (:19700) are doar 8,9, fara 24' *-- D4: masinaria modalului per-rand (do_adauga_articol) exista pe AMBELE clase - motorul nu lipseste, doar intrarea din UI DO Assert WITH OCCURS('Local ofrmadarticol As "frm_articol_factura"', lcTxt) = 2, ; 'D4: type hint ofrmadarticol As frm_articol_factura apare de doua ori (v1 SI v2) - masinaria modalului exista si pe v2, lipseste doar But_urmator1/grd_articole (A3/B1)' ENDPROC *================================================================================== * Alege sursa reala de stoc: intai articolul/gestiunea gasite in propunere (315554536 / gestiunea 6), * verificat inca valabil; altfel scaneaza gestiunile 1,4,6,19 dupa orice articol cu stoc > 0. PROCEDURE AlegeSursaStoc PUBLIC gnArtSursa, gnGestSursa, gnGestDest, gnCantSursa gnArtSursa = 0 gnGestSursa = 0 gnGestDest = 0 gnCantSursa = 0 LOCAL lnQ lnQ = goExecutor.oExecute([select cant from stoc where id_articol=315554536 and id_gestiune=6 ] + ; [and an=] + TRANSFORM(gnAn) + [ and luna=] + TRANSFORM(gnLuna) + [ and cant>0], 'crsSondaStoc') IF lnQ >= 0 AND USED('crsSondaStoc') AND RECCOUNT('crsSondaStoc') > 0 gnArtSursa = 315554536 gnGestSursa = 6 gnGestDest = 4 gnCantSursa = crsSondaStoc.cant DO S64Log WITH ' sursa cunoscuta inca valabila: articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ' cant=' + TRANSFORM(gnCantSursa) ENDIF DO Inchide WITH 'crsSondaStoc' IF gnArtSursa = 0 lnQ = goExecutor.oExecute([select id_gestiune, id_articol, cant from stoc ] + ; [where id_gestiune in (1,4,6,19) and an=] + TRANSFORM(gnAn) + [ and luna=] + TRANSFORM(gnLuna) + ; [ and cant>0 order by cant desc], 'crsStocCand') IF lnQ >= 0 AND USED('crsStocCand') AND RECCOUNT('crsStocCand') > 0 SELECT crsStocCand GO TOP gnArtSursa = id_articol gnGestSursa = id_gestiune gnCantSursa = cant gnGestDest = IIF(gnGestSursa = 4, 1, 4) DO S64Log WITH ' sursa gasita prin scanare: articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ' cant=' + TRANSFORM(gnCantSursa) ENDIF DO Inchide WITH 'crsStocCand' ENDIF IF gnArtSursa = 0 DO S64Log WITH ' NICIO sursa de stoc gasita in gestiunile 1,4,6,19, perioada ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + ; ' - Blocul C ramane NEEXERCITAT. Vezi propunerea sectiunea 4.1 (script wip13 neaplicat).' ENDIF ENDPROC *================================================================================== * BLOC C: emitere REALA pe v1, doar daca AlegeSursaStoc a gasit o sursa. NU exista echivalent v2, * deci NU exista Compara/CompDoc aici - vezi verdictul din propunere, punctul d. PROCEDURE BlocC_EmitereV1 LOCAL oform, lcSerie, lnNract, lnIdVz gcCaz = '[C] ' IF gnArtSursa = 0 DO S64Log WITH ' C NEEXERCITAT: nicio sursa de stoc (vezi ALEGEREA SURSEI REALE de mai sus)' RETURN ENDIF DO CuratieCrs poDate = CREATEOBJECT("oDateFactura", 25022, 23) poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") poDateGestiuneDest = CREATEOBJECT("oDateGestiune") poDate.id_client = gnGestSursa poDate.nume_client = 'GESTIUNE SURSA ' + TRANSFORM(gnGestSursa) IF TYPE('poDate.id_gestiune_init') = 'N' OR ISNULL(poDate.id_gestiune_init) poDate.id_gestiune_init = gnGestSursa ENDIF poDate.id_delegat = 39 IF EMPTY(NVL(poDate.id_fdoc, 0)) poDate.id_fdoc = 1 ENDIF *-- necunoscuta #1 (propunere §6.2): mapare id_client/id_gestiune_init = ambele sursa e confirmata *-- EMPIRIC mai jos (incarca_cursor_articole a adus stocul din gestiunea 6 cu id_gestiune_init=6). *-- Blocajul real gasit la prima rulare a fost altul: poDateGestiuneDest si poDate.listaid raman *-- goale in acest test (nu trecem prin frm_date_aviz.do_cauta_gestiune_dest, calea UI normala) - *-- do_scrie_articole (ofacturare.vc2:14152/19863) foloseste poDateGestiuneDest.id_gestiune=0 in *-- pack_facturare.initializeaza_date_gestiune(), care Oracle a respins cu "Eroare la selectarea *-- gestiunii! (FACT-019)". Reparat aici cu acelasi SELECT folosit de caut_gestiune_dest() *-- (ocautare.prg:3298-3305), filtrat direct pe gnGestDest - fara picker modal, deci fara risc de *-- atarnare. LOCAL lcSqlGD, lnQGD lcSqlGD = [select distinct c.nume_gestiune,c.cgest,b.id_gestiune,d.id_tipgest,] + ; [NVL(c.cont, d.cont) as cont,NVL(c.acont, p.acont) as acont ] + ; [from gest_coresp_util_grupe a ] + ; [left join gest_coresp_grupe_gestiuni b on a.id_grupe=b.id_grupe ] + ; [left join nom_gestiuni c on b.id_gestiune=c.id_gestiune ] + ; [left join coresp_cont_tipgest d on c.nr_pag=d.id_tipgest ] + ; [left join vplcont_analitic p on NVL(c.cont, d.cont) = p.cont and p.an = ] + TRANSFORM(gnAn) + [ and p.inactiv = 0 ] + ; [where a.id_util=] + TRANSFORM(gnIdUtil) + [ and a.sters=0 and b.sters=0 and c.sters=0 and c.nr_pag in (2,4,5,6,7) and b.id_gestiune = ] + TRANSFORM(gnGestDest) lnQGD = goExecutor.oExecute(lcSqlGD, 'crsGestDest') IF lnQGD >= 0 AND USED('crsGestDest') AND RECCOUNT('crsGestDest') > 0 poDateGestiuneDest.id_gestiune = crsGestDest.id_gestiune poDateGestiuneDest.id_tipgest = NVL(crsGestDest.id_tipgest, 0) poDateGestiuneDest.Cont = NVL(crsGestDest.cont, 'XXXX') poDateGestiuneDest.acont = NVL(crsGestDest.acont, 'XXXX') poDate.listaid = TRANSFORM(crsGestDest.id_gestiune) poDate.descriere = ALLTRIM(NVL(crsGestDest.nume_gestiune, '')) DO S64Log WITH ' C: gestiune destinatie rezolvata din gest_coresp_util_grupe - id_gestiune=' + TRANSFORM(poDateGestiuneDest.id_gestiune) + ; ' id_tipgest=' + TRANSFORM(poDateGestiuneDest.id_tipgest) + ' Cont=' + poDateGestiuneDest.Cont + ' listaid=' + poDate.listaid ELSE DO S64Log WITH ' C: NICIO corespondenta gest_coresp_util_grupe pentru gnIdUtil=' + TRANSFORM(gnIdUtil) + ' si gestiunea destinatie=' + TRANSFORM(gnGestDest) + ; ' - poDateGestiuneDest ramane 0, emiterea va pica probabil la but_termin1 (FACT-019)' ENDIF DO Inchide WITH 'crsGestDest' poGeneratorNumere.ResetNumere() poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) IF poDate.rezultat_serii <> 3 DO Assert WITH .F., 'C: rezultat_serii = 3 (transfer), e=' + TRANSFORM(poDate.rezultat_serii) DO Goleste RETURN ENDIF poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) DO S64Log WITH ' C: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ; ' gestiune sursa=' + TRANSFORM(gnGestSursa) + ' articol=' + TRANSFORM(gnArtSursa) IF poDate.tva_incasare = 0 SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane ELSE SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane ENDIF *-- v1: incarca_cursor_articole INAINTE de formular (ca in factureaza(), ramura veche) LOCAL loRez loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) DO S64Log WITH ' C: incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ' lArticole=' + TRANSFORM(loRez.lArticole) + ; ' crsarticole=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'C: incarca_cursor_articole a adus articole (sursa reala)' IF !((loRez.nSucces >= 0) AND loRez.lArticole) gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (C, fara articole);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Goleste RETURN ENDIF *-- pastreaza doar articolul-sursa ales, ca sa nu deschida un modal per fiecare rand din gestiune IF USED('crsarticole') SELECT * FROM crsarticole WHERE id_articol = gnArtSursa INTO CURSOR crsarticole_filtrat READWRITE IF USED('crsarticole_filtrat') AND RECCOUNT('crsarticole_filtrat') > 0 USE IN crsarticole SELECT * FROM crsarticole_filtrat INTO CURSOR crsarticole READWRITE USE IN crsarticole_filtrat ENDIF ENDIF DO S64Log WITH ' C: crsarticole filtrat la articolul sursa, randuri=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)) *-- SIMULARE (optiunea 2 din sarcina): traseul real (grd_gestiuni/AfterRowColChange, ofacturare.vc2:4219-4232) *-- ruleaza doar pe ramura gnScadereStoc=1 (do_alege_stoc -> frm_articol_gest_factura), interzisa explicit *-- (interdictia #5). Cu gnScadereStoc=0, do_adauga_articol instantiaza frm_articol_factura de baza *-- (fara grd_gestiuni), care nu atinge deloc poArticol.id_gestiune - ramane pe sentinela -1000 din *-- do_initializeaza_articol (ofacturare.vc2:13771-13773), pe care Oracle o trateaza explicit ca "nesetat" *-- (ADAUGA_ARTICOL_FACTURA: IF V_ID_GESTIUNE <> -1000 ...), deci V_ID_GESTIUNE2 ramane NULL -> FACT-019. *-- Reparat aici imbogatind crsarticole cu exact campurile pe care AfterRowColChange le-ar seta pe poArticol, *-- citite din acelasi cursor real (pack_facturare.cursor_gestiuni_articol, apelat de do_alege_stoc:13389 - *-- verificat pe USER_SOURCE:3174-3268, doar SELECT/OPEN CURSOR, nicio scriere), nu valori inventate. LOCAL lcSqlGA, lnQGA, lnGA_idgest, lnGA_pretach, lcGA_lot, lcGA_serie, lcGA_cont, lnGA_idlucrez, lnGA_idpartrez, lnGA_pretv, lnGA_idval, lnGA_pretd lnGA_idgest = 0 lcSqlGA = [{call pack_facturare.cursor_gestiuni_articol(] + TRANSFORM(gnArtSursa) + [,] + TRANSFORM(poDate.tip) + [,] + ; TRANSFORM(gnGestSursa) + [,] + TRANSFORM(gnLuna) + [,] + TRANSFORM(gnAn) + [,] + TRANSFORM(gnIdUtil) + [,] + ; IIF(ISNULL(gnIdSucursala), [NULL], TRANSFORM(gnIdSucursala)) + [)}] lnQGA = goExecutor.oExecute(lcSqlGA, 'crsgestarticol') DO S64Log WITH ' C: crsgestarticol (cursor real de loturi, cursor_gestiuni_articol) -> nSucces=' + TRANSFORM(lnQGA) + ; ' randuri=' + IIF(USED('crsgestarticol'), TRANSFORM(RECCOUNT('crsgestarticol')), '(nedeschis)') IF lnQGA >= 0 AND USED('crsgestarticol') AND RECCOUNT('crsgestarticol') > 0 SELECT crsgestarticol LOCATE FOR id_gestiune = gnGestSursa IF !FOUND() GO TOP ENDIF lnGA_idgest = id_gestiune lnGA_pretach = Pret lcGA_lot = NVL(lot, '') lcGA_serie = NVL(serie, '') lcGA_cont = ALLTRIM(NVL(Cont, 'XXXX')) lnGA_idlucrez = NVL(id_lucrare_rez, 0) lnGA_idpartrez = NVL(id_part_rez, 0) lnGA_pretv = NVL(pretv, 0) lnGA_idval = NVL(id_valuta, 0) lnGA_pretd = NVL(pretd, 0) DO S64Log WITH ' C: crsgestarticol rand ales - id_gestiune=' + TRANSFORM(lnGA_idgest) + ' Pret=' + TRANSFORM(lnGA_pretach) + ; ' lot=[' + lcGA_lot + '] serie=[' + lcGA_serie + '] Cont=' + lcGA_cont ELSE DO S64Log WITH ' C: crsgestarticol GOL pentru articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ; ' - sursa de stoc nu suporta transferul pe acest traseu (alt verdict, nu artefact de test)' ENDIF DO Inchide WITH 'crsgestarticol' IF lnGA_idgest > 0 AND USED('crsarticole') *-- ALTER TABLE ADD COLUMN a picat cu eroare 1712 "duplicate or invalid" pe nume de camp > 10 *-- caractere (id_gestiune, pret_achizitie, ...) desi TYPE() confirma ca lipsesc - capcana VFP: *-- ALTER TABLE nu accepta nume lungi pe cursor, desi SELECT...INTO CURSOR le accepta (vezi *-- tiparul deja folosit in acest fisier, PregatesteFacturaCrsV2). Reconstruit cu SELECT+CAST. SELECT *, ; CAST(m.lnGA_idgest AS N(20)) AS id_gestiune, ; CAST(m.lnGA_pretach AS N(18,6)) AS pret_achizitie, ; CAST(m.lcGA_cont AS C(20)) AS Cont, ; CAST(m.lnGA_idlucrez AS N(20)) AS id_lucrare_rez, ; CAST(m.lnGA_idpartrez AS N(20)) AS id_part_rez, ; CAST(m.lnGA_pretv AS N(18,6)) AS pretv_orig, ; CAST(m.lnGA_idval AS N(10)) AS id_valuta_d, ; CAST(m.lnGA_pretd AS N(18,6)) AS pretd ; FROM crsarticole INTO CURSOR crsarticole_ge READWRITE IF USED('crsarticole_ge') AND RECCOUNT('crsarticole_ge') > 0 REPLACE ALL lot WITH lcGA_lot, serie WITH lcGA_serie IN crsarticole_ge USE IN crsarticole SELECT * FROM crsarticole_ge INTO CURSOR crsarticole READWRITE USE IN crsarticole_ge DO S64Log WITH ' C: crsarticole imbogatit (SELECT+CAST) cu id_gestiune/pret_achizitie/lot/serie/Cont din crsgestarticol (simulare AfterRowColChange)' ELSE DO Assert WITH .F., 'C: reconstructia crsarticole cu campurile din crsgestarticol a esuat' ENDIF ENDIF oform = CREATEOBJECT('frm_facturare_articole') IF VARTYPE(oform) <> 'O' DO Assert WITH .F., 'C: Createobject frm_facturare_articole' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Goleste RETURN ENDIF oform.WindowType = 0 oform.Show() DOEVENTS FORCE DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', ; 'C: butonul But_urmator1 duce la do_urmator (traseul real pentru transfer)' DO Assert WITH !oform.but_urmator_tot1.Visible, ; 'C: but_urmator_tot1 NU e vizibil pe transfer (confirma B5a pe instanta reala)' SET PROCEDURE TO (gcMock) ADDITIVE gcMockApeluri = '' gnModaleArticolInchise = 0 oform.but_urmator1.Click() DOEVENTS FORCE DO S64Log WITH ' C: dupa but_urmator1.Click, modale frm_articol_factura inchise de driver=' + TRANSFORM(gnModaleArticolInchise) + ; ' crsfactura=' + IIF(USED('crsfactura'), TRANSFORM(RECCOUNT('crsfactura')), '(nedeschis)') DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, ; 'C: crsfactura are cel putin o linie dupa parcurgerea modalului per-articol' *-- inchide neverificatul #1 din diagnostic (§5): valoarea reala pe care a scris-o poArticol, citita direct *-- din crsfactura (poArticol e PRIVATE, iesit din scop dupa ce do_adauga_articol s-a intors) IF USED('crsfactura') AND RECCOUNT('crsfactura') > 0 SELECT crsfactura GO TOP DO S64Log WITH ' C: crsfactura.id_gestiune dupa modal=' + TRANSFORM(NVL(id_gestiune, -99999)) + ; ' (sursa aleasa gnGestSursa=' + TRANSFORM(gnGestSursa) + ')' ENDIF IF !(USED('crsfactura') AND RECCOUNT('crsfactura') > 0) TRY oform.Release() CATCH ENDTRY poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (C, crsfactura gol);' DO CuratieCrs DO Goleste RETURN ENDIF oform.do_calculeaza_totaluri() DOEVENTS FORCE lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) lnNract = poDate.nract SET PROCEDURE TO (gcMock) ADDITIVE gcMockApeluri = '' oform.but_termin1.Click() DOEVENTS FORCE DO S64Log WITH ' C: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ; ' apeluri amessagebox=[' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) IF lnIdVz < 0 lnIdVz = 0 ENDIF DO Assert WITH lnIdVz > 0, 'C: documentul de transfer exista in VANZARI (jonctiune serie_act+numar_act), id=' + TRANSFORM(lnIdVz) IF lnIdVz > 0 gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (C, transfer real);' DO Assert WITH goExecutor.oExecute([select tip from vanzari where id_vanzare=] + TRANSFORM(lnIdVz), 'crsVzC') >= 0 ; AND USED('crsVzC') AND RECCOUNT('crsVzC') = 1 AND crsVzC.tip = 23, ; 'C: VANZARI.TIP = 23 pe documentul emis' DO Inchide WITH 'crsVzC' DO Assert WITH goExecutor.oExecute([select id_gestiune from vanzari_detalii where id_vanzare=] + TRANSFORM(lnIdVz), 'crsVdC') >= 0 ; AND USED('crsVdC') AND RECCOUNT('crsVdC') = 1 AND NVL(crsVdC.id_gestiune, -99999) = gnGestSursa, ; 'C: VANZARI_DETALII.ID_GESTIUNE = gestiunea sursa aleasa (' + TRANSFORM(gnGestSursa) + '), nu NULL si nu alta' DO Inchide WITH 'crsVdC' ELSE gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (C, nescris);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) ENDIF TRY oform.Release() CATCH ENDTRY DO CuratieCrs DO Goleste ENDPROC *================================================================================== PROCEDURE Elibereaza LPARAMETERS toForm IF TYPE('toForm') = 'O' AND !ISNULL(toForm) TRY toForm.Release() CATCH ENDTRY ENDIF DO CuratieCrs ENDPROC PROCEDURE Goleste poDate = NULL poGeneratorNumere = NULL poDateGestiuneDest = NULL ENDPROC PROCEDURE CuratieCrs DO Inchide WITH 'crsarticole' DO Inchide WITH 'crsarticole1' DO Inchide WITH 'crsarticole_filtrat' DO Inchide WITH 'crsarticole_ge' DO Inchide WITH 'crsfactura' DO Inchide WITH 'crscursuri' DO Inchide WITH 'crspolitici' DO Inchide WITH 'crscontracte' DO Inchide WITH 'crsgestiunidest' DO Inchide WITH 'crsgestarticol' DO Inchide WITH 'crsCtrTemp' DO Inchide WITH 'crsComTemp' DO Inchide WITH 'crsartselectate' DO Inchide WITH 'jtva_coloane' ENDPROC PROCEDURE Inchide LPARAMETERS tcAlias IF USED(tcAlias) USE IN (tcAlias) ENDIF ENDPROC PROCEDURE Assert LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 DO S64Log WITH 'PASS: ' + gcCaz + tcMsg ELSE gnFail = gnFail + 1 DO S64Log WITH 'FAIL: ' + gcCaz + tcMsg ENDIF ENDPROC PROCEDURE S64Log LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE S64Err LPARAMETERS tnErr, tcMsg, tcProg, tnLine gnErr = gnErr + 1 DO S64Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg ENDPROC PROCEDURE S64Final LOCAL lnI IF TYPE('_SCREEN.tmrS64') = 'O' _SCREEN.tmrS64.Enabled = .F. TRY _SCREEN.RemoveObject('tmrS64') CATCH ENDTRY ENDIF FOR lnI = _SCREEN.FormCount TO 1 STEP -1 TRY _SCREEN.Forms(lnI).Release() CATCH ENDTRY ENDFOR TRY IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ; [where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 720 order by numar_act], 'crsNrSSS') >= 0 DO S64Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):' SELECT crsNrSSS SCAN DO S64Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) ENDSCAN USE IN crsNrSSS ENDIF CATCH ENDTRY DO S64Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere DO S64Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) DO S64Log WITH 'END ' + TTOC(DATETIME()) QUIT ENDPROC *================================================================================== * driverS64: inchide automat modalul frm_articol_factura (§3.2), setand cantitatea pe controlul * clb_cantitate.Text_simplu1 si apeland do_termin() direct (acelasi tipar validat la S6-3 pentru * FRM_ALTE_DATE - apel direct pe metoda de baza, nu Release, ca sa nu sara peste procesarea din * do_termin). Trateaza si MESSAGEBOX_FORM (cmdYes/cmdOk) - nu trece prin amessagebox, deci mock-ul * nu il acopera; tipar identic cu driverMsgS8/driverS63 (capcana platita, gasita la prima rulare * aici: A5/Incarca articole pe v2 a deschis un MESSAGEBOX_FORM neprevazut in propunere si a atarnat * fara acest bloc). Nu atinge FRM_FACTURARE_ARTICOLE / FRM_FACTURARE_ARTICOLE2 in niciun fel. DEFINE CLASS driverS64 AS Custom lBusy = .F. nUltimAlteDate = 0 PROCEDURE Executa IF This.lBusy RETURN ENDIF This.lBusy = .T. IF TYPE('_SCREEN.tmrS64') = 'O' _SCREEN.tmrS64.Enabled = .F. ENDIF TRY LOCAL lnI, loArtForm, loMsgForm, loAlteDate, lcClasa loArtForm = NULL loMsgForm = NULL loAlteDate = NULL FOR lnI = 1 TO _SCREEN.FormCount lcClasa = UPPER(_SCREEN.Forms(lnI).Class) IF lcClasa == 'FRM_ARTICOL_FACTURA' loArtForm = _SCREEN.Forms(lnI) ENDIF IF 'MESSAGEBOX_FORM' $ lcClasa loMsgForm = _SCREEN.Forms(lnI) ENDIF IF lcClasa == 'FRM_ALTE_DATE' loAlteDate = _SCREEN.Forms(lnI) ENDIF IF !(lcClasa $ gcClaseVazute) gcClaseVazute = gcClaseVazute + lcClasa + ';' DO S64Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' ENDIF ENDFOR IF !ISNULL(loArtForm) TRY LOCAL lnCantSetata lnCantSetata = MAX(gnCantSursa, 1) loArtForm.clb_cantitate.Text_simplu1.Value = lnCantSetata DO S64Log WITH ' [driver articol] cantitate setata=' + TRANSFORM(lnCantSetata) loArtForm.do_termin() gnModaleArticolInchise = gnModaleArticolInchise + 1 CATCH TO loExcArt DO S64Log WITH ' [driver articol] CATCH ' + TRANSFORM(loExcArt.ErrorNo) + ' ' + loExcArt.Message TRY loArtForm.Release() CATCH ENDTRY ENDTRY ELSE IF !ISNULL(loMsgForm) TRY LOCAL lcTextMsg lcTextMsg = '' TRY lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) CATCH ENDTRY DO S64Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' DO CASE CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) DO S64Log WITH ' [driver msg] apas cmgBotones.cmdYes' loMsgForm.cmgBotones.cmdYes.Click() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) DO S64Log WITH ' [driver msg] apas cmgBotones.cmdOk' loMsgForm.cmgBotones.cmdOk.Click() ENDCASE CATCH TO loExcMsg DO S64Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message ENDTRY ELSE *-- FRM_ALTE_DATE nu apare pe traseul transferului conform propunerii §8, dar *-- confirmarea "totalul 0" de la BLOC C l-a deschis totusi (id_delegat cerut la *-- antet) - tratat identic cu driverS63 (do_termin() direct, garda 1s reintrare). IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) This.nUltimAlteDate = SECONDS() TRY DO S64Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ; TRANSFORM(NVL(poDate.id_delegat, 0)) + ')' loAlteDate.do_termin() CATCH TO loExcAD DO S64Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message ENDTRY ENDIF ENDIF ENDIF CATCH TO loExcTop DO S64Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message FINALLY IF TYPE('_SCREEN.tmrS64') = 'O' _SCREEN.tmrS64.Enabled = .T. ENDIF This.lBusy = .F. ENDTRY ENDPROC ENDDEFINE