* test_s6_3b_v2_primul.prg * Elimina confundul din raport_s6_3_aviz_retur.md: pana acum v2 a emis INTOTDEAUNA dupa v1, in * aceeasi sesiune Oracle, iar de doua ori dupa o exceptie rollback-uita. Aici se emite EXCLUSIV pe * v2 (frm_facturare_articole2), intr-o sesiune Oracle proaspata, v2 PRIMUL: intai avizul (tip 4), * apoi returul (tip 8). Nicio emitere pe v1. * * Diferenta fata de test_s6_3_aviz_retur.prg, in afara de "doar v2": * - NICIUN bloc TRY pe traseul de emitere. Izolarea se face pe ON ERROR, iar handlerul tipareste * stiva completa cu ASTACKINFO(): obiectul de exceptie VFP nu poarta apelantul, deci * "Proc=oexecute:330" e punctul de aruncare, nu cauza (D-A, eroarea 1472). * - sursele sunt FIXATE la cele din raport, ca rularea sa fie comparabila: aviz 131 (D-A) si * factura 1115 = SSS 659 (D-C). Daca o sursa nu mai e disponibila, se spune care si de ce. * * Perechea v1 pentru CompDoc NU se reemite: se refolosesc documentele v1 deja scrise, * aviz SSS 661 (id_vanzare 1117) si retur SSS 670 (id_vanzare 1121). * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_3b_v2_primul.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3b_v2_primul.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 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 gcUltimaSerie, gnUltimulNract, goDriverS63b, gcClaseVazute, gcRaspunsMsgForm PUBLIC gnIntrebariRetur, gnAvizReturDeschis, glInEmitere, gnFatal, gnStivaTiparita gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3b_v2_primul.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 = "" gcUltimaSerie = "" gnUltimulNract = 0 gcClaseVazute = ";" gcRaspunsMsgForm = "NU" gnIntrebariRetur = 0 gnAvizReturDeschis = 0 glInEmitere = .F. gnFatal = 0 gnStivaTiparita = 0 gcNumere = "" gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" *-- sursele fixate din raportul S6-3, ca rularea sa fie comparabila cu cele cinci de dinainte *-- exceptie avizul: sursa se consuma la fiecare rulare, deci se alege la rulare (AlegeSursaAviz) PUBLIC gnSursaAviz, gnSursaRetur, gcV1SerAviz, gnV1NrAviz, gcV1SerRetur, gnV1NrRetur gnSursaAviz = 0 gnSursaRetur = 1115 gcV1SerAviz = 'SSS' gnV1NrAviz = 661 gcV1SerRetur = 'SSS' gnV1NrRetur = 670 PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil poDate = NULL poGeneratorNumere = NULL poDateGestiuneDest = NULL pnTotalDiscountAvize = 0 plVizibil = .F. *-- FARA TRY pe traseul de emitere: numai asa handlerul vede stiva reala (TRY/CATCH are prioritate *-- fata de ON ERROR si ar inghiti-o inainte sa apuce ASTACKINFO sa o citeasca). ON ERROR DO S63bErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT 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 S63bLog WITH 'EROARE: conectare Oracle esuata' DO S63bFinal ENDIF SQLSETPROP(gnHandle, "QueryTimeOut", 45) DO S63bLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS 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 S63bLog WITH 'EROARE: actualizeaza_optiuni_program()' DO S63bFinal 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 S63bLog WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ; ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ; ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + ; ' gl406=' + TRANSFORM(TYPE('gl406') = 'L' AND gl406) 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 *-- spionul de SQL: BINDEVENT pe goExecutor.oExecute, cu delegatul chemat INAINTE de metoda. *-- Nu schimba rezultatul apelului; e singurul mod de a vedea sirul REAL trimis, inclusiv cand e *-- .NULL. (concatenare cu un camp nepazit de Nvl) - caz in care oExecute cade pe This.cSql. PUBLIC goSpionSql, glSpionActiv, glOpresteLaPretdNul glSpionActiv = .F. glOpresteLaPretdNul = .F. goSpionSql = CREATEOBJECT('spionSql') BINDEVENT(goExecutor, 'oExecute', goSpionSql, 'Vede', 1) BINDEVENT(goExecutor, 'oExecuta', goSpionSql, 'Vede', 1) goDriverS63b = CREATEOBJECT('driverS63b') _SCREEN.AddObject('tmrS63b', 'Timer') _SCREEN.tmrS63b.Interval = 200 BINDEVENT(_SCREEN.tmrS63b, 'Timer', goDriverS63b, 'Executa') _SCREEN.tmrS63b.Enabled = .T. PUBLIC gnIdAvizV2, gnIdReturV2, gcSerAvizV2, gnNrAvizV2, gcSerReturV2, gnNrReturV2 PUBLIC gnIdAvizV1Ctrl, gcSerAvizV1Ctrl, gnNrAvizV1Ctrl PUBLIC gnIdReturV1Ctrl, gcSerReturV1Ctrl, gnNrReturV1Ctrl STORE 0 TO gnIdAvizV2, gnIdReturV2, gnNrAvizV2, gnNrReturV2, gnIdAvizV1Ctrl, gnNrAvizV1Ctrl STORE 0 TO gnIdReturV1Ctrl, gnNrReturV1Ctrl STORE '' TO gcSerAvizV2, gcSerReturV2, gcSerAvizV1Ctrl, gcSerReturV1Ctrl DO S63bLog WITH CHR(13) + CHR(10) + '===== DISPONIBILITATEA SURSELOR FIXATE =====' PUBLIC glAvizOk, glReturOk, gnLiniiAviz, gnLiniiRetur, gnIdPartAviz, gcNumeAviz, gcDescrAviz PUBLIC gnIdComAviz, gnIdPartRetur, gcNumeRetur, gcDescrRetur DO AlegeSursaAviz DO VerificaSursaAviz DO VerificaSursaRetur DO S63bLog WITH CHR(13) + CHR(10) + '===== EMITERE V2, PRIMA SI SINGURA (aviz tip 4, sursa ' + TRANSFORM(gnSursaAviz) + ') =====' IF glAvizOk DO EmiteAvizV2 IF gnFatal <> 0 DO DupaAbort WITH 'aviz-v2' ENDIF ELSE DO Assert WITH .F., 'aviz-v2: sursa fixata ' + TRANSFORM(gnSursaAviz) + ' inca disponibila' ENDIF *-- controlul lui D-A: sursa NU s-a consumat (v2 a esuat), deci acelasi aviz se poate incerca acum *-- pe v1, in aceeasi sesiune. Singura proba care separa "defect al lui v2" de "cod comun + date". DO S63bLog WITH CHR(13) + CHR(10) + '===== CONTROL: acelasi aviz ' + TRANSFORM(gnSursaAviz) + ' pe v1, dupa v2 =====' IF glAvizOk AND gnIdAvizV2 = 0 DO ControlAvizV1 IF gnFatal <> 0 DO DupaAbort WITH 'aviz-v1-CONTROL' ENDIF ELSE DO S63bLog WITH ' control sarit (v2 a scris documentul sau sursa nu era disponibila)' ENDIF DO S63bLog WITH CHR(13) + CHR(10) + '===== EMITERE V2 (retur tip 8, sursa ' + TRANSFORM(gnSursaRetur) + ') =====' IF glReturOk DO EmiteReturV2 IF gnFatal <> 0 DO DupaAbort WITH 'retur-v2' ENDIF ELSE DO Assert WITH .F., 'retur-v2: sursa fixata ' + TRANSFORM(gnSursaRetur) + ' inca disponibila' ENDIF *-- controlul lui D-C, simetric cu cel al lui D-A: aceeasi factura sursa, aceeasi sesiune, pe v1. *-- Sursa nu s-a consumat, fiindca v2 a esuat inainte de scriere. DO S63bLog WITH CHR(13) + CHR(10) + '===== CONTROL: acelasi retur din factura ' + TRANSFORM(gnSursaRetur) + ' pe v1, dupa v2 =====' IF glReturOk AND gnIdReturV2 = 0 DO ControlReturV1 IF gnFatal <> 0 DO DupaAbort WITH 'retur-v1-CONTROL' ENDIF ELSE DO S63bLog WITH ' control sarit (v2 a scris documentul sau sursa nu era disponibila)' ENDIF *-- Sursele fixate cad pe amandoua formele, deci nu spun nimic despre v2. Ca sa se stabileasca daca *-- v2 poate emite tip 4 / tip 8 (pana acum n-a scris niciun asemenea document), se incearca surse *-- de rezerva, sarind peste cele cu pretd NULL inainte de a arde un numar. glOpresteLaPretdNul = .T. IF gnIdAvizV2 = 0 DO S63bLog WITH CHR(13) + CHR(10) + '===== REZERVA: aviz pe v2, alte surse =====' DO IncearcaAlt WITH 'aviz', '632,683,667' ENDIF IF gnIdReturV2 = 0 DO S63bLog WITH CHR(13) + CHR(10) + '===== REZERVA: retur pe v2, alte surse =====' DO IncearcaAlt WITH 'retur', '1114,1113,1112' ENDIF glOpresteLaPretdNul = .F. DO S63bLog WITH CHR(13) + CHR(10) + '===== CompDoc (jumatatea v1 e refolosita, nu reemisa) =====' IF gnIdAvizV2 > 0 DO Compara WITH gcV1SerAviz, gnV1NrAviz, gcSerAvizV2, gnNrAvizV2, 'aviz' ELSE DO Assert WITH .F., 'aviz: v2 a scris documentul (fara el nu exista pereche de comparat)' ENDIF IF gnIdReturV2 > 0 DO Compara WITH gcV1SerRetur, gnV1NrRetur, gcSerReturV2, gnNrReturV2, 'retur' ELSE DO Assert WITH .F., 'retur: v2 a scris documentul (fara el nu exista pereche de comparat)' ENDIF DO S63bFinal *================================================================================== * Alege sursa de aviz la rulare: filtrul din caut_avize plus conditia de cantitate ramasa din * pack_facturare.cursor_avize (A.CANTITATE <> NVL(B.CANTITATE, 0)). Un id fixat nu tine: sursa se * factureaza la prima rulare si nu mai trece filtrul la a doua. PROCEDURE AlegeSursaAviz LOCAL lnQ IF gnSursaAviz > 0 RETURN ENDIF DO Inchide WITH 'crsAvLib' lnQ = goExecutor.oExecute([select a.id_vanzare from vanzari a, nom_parteneri p ] + ; [where a.id_part = p.id_part and a.sters = 0 and a.tip in (21,22,26,42) and a.facturat = 0 ] + ; [and upper(p.nume) not like '%CLIENT%' ] + ; [and exists (select 1 from vanzari_detalii d where d.id_vanzare = a.id_vanzare and d.sters = 0 ] + ; [and d.cantitate <> nvl((select sum(c.cantitate) from vanzari_cantitati c ] + ; [where c.id_vanzare_det_aviz = d.id_vanzare_det and c.sters = 0), 0)) ] + ; [order by a.id_vanzare desc], 'crsAvLib') IF lnQ >= 0 AND USED('crsAvLib') AND RECCOUNT('crsAvLib') > 0 SELECT crsAvLib GO TOP gnSursaAviz = crsAvLib.id_vanzare ENDIF DO Inchide WITH 'crsAvLib' DO S63bLog WITH ' sursa aviz aleasa la rulare: ' + TRANSFORM(gnSursaAviz) DO Assert WITH gnSursaAviz > 0, 'aviz: exista in date un aviz nefacturat cu cantitate ramasa' ENDPROC *================================================================================== * Sursa avizului: exact filtrul din caut_avize (oproceduri_facturare.prg:2038) plus id-ul ales. PROCEDURE VerificaSursaAviz LOCAL lnQ, lnLinii glAvizOk = .F. gnLiniiAviz = 0 gnIdPartAviz = 0 gcNumeAviz = '' gcDescrAviz = '' gnIdComAviz = 0 lnQ = goExecutor.oExecute([select a.id_vanzare, a.id_part, p.nume, a.serie_act, a.numar_act, a.tip, a.facturat, ] + ; [(case when a.tip in (21,42) then nvl(a.id_comanda,0) else 0 end) as id_comanda ] + ; [from vanzari a, nom_parteneri p ] + ; [where a.id_part = p.id_part and a.sters = 0 and a.id_vanzare = ] + TRANSFORM(gnSursaAviz), 'crsAvOne') IF lnQ < 0 OR !USED('crsAvOne') OR RECCOUNT('crsAvOne') = 0 DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': INEXISTENT in vanzari' RETURN ENDIF SELECT crsAvOne GO TOP DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': tip=' + TRANSFORM(tip) + ' facturat=' + TRANSFORM(facturat) + ; ' client=' + TRANSFORM(id_part) + ' [' + ALLTRIM(NVL(nume, '')) + '] doc=' + NumarDoc(serie_act, numar_act) IF !INLIST(NVL(tip, 0), 21, 22, 26, 42) OR NVL(facturat, 1) <> 0 DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': NU mai trece filtrul caut_avize (tip in 21,22,26,42 si facturat=0)' DO Inchide WITH 'crsAvOne' RETURN ENDIF gnIdPartAviz = crsAvOne.id_part gcNumeAviz = ALLTRIM(NVL(crsAvOne.nume, '')) gcDescrAviz = NumarDoc(crsAvOne.serie_act, crsAvOne.numar_act) gnIdComAviz = NVL(crsAvOne.id_comanda, 0) DO Inchide WITH 'crsAvOne' poDate = CREATEOBJECT('empty') ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(gnSursaAviz))) pnTotalDiscountAvize = 0 DO Inchide WITH 'crsSonda' lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsSonda') lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0) DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': cursor_avize -> linii=' + TRANSFORM(lnLinii) DO Inchide WITH 'crsSonda' poDate = NULL gnLiniiAviz = lnLinii glAvizOk = (lnLinii > 0) DO Assert WITH glAvizOk, 'aviz-v2: sursa fixata ' + TRANSFORM(gnSursaAviz) + ' da articole, linii=' + TRANSFORM(lnLinii) *-- diagnostic pentru D-B: ce raspunde functia Oracle INAINTE de orice scriere DO Inchide WITH 'crsRamasDiag' lnQ = goExecutor.oExecute([SELECT pack_facturare.exista_ramas_avize_lista('] + ALLTRIM(TRANSFORM(gnSursaAviz)) + ; [') AS ramas FROM dual], 'crsRamasDiag') IF lnQ >= 0 AND USED('crsRamasDiag') AND RECCOUNT('crsRamasDiag') > 0 DO S63bLog WITH ' [D-B diag] exista_ramas_avize_lista(' + TRANSFORM(gnSursaAviz) + ') INAINTE de emitere = ' + ; TRANSFORM(crsRamasDiag.ramas) ENDIF DO Inchide WITH 'crsRamasDiag' ENDPROC *================================================================================== * Sursa returului: filtrul din caut_facturi_multiple_client (oproceduri_facturare.prg:2110). PROCEDURE VerificaSursaRetur LOCAL lnQ, lnLinii glReturOk = .F. gnLiniiRetur = 0 gnIdPartRetur = 0 gcNumeRetur = '' gcDescrRetur = '' lnQ = goExecutor.oExecute([select f.id_vanzare, f.id_part, p.nume, f.serie_act, f.numar_act, f.tip, f.in_valuta ] + ; [from fact_vfacturi f, nom_parteneri p ] + ; [where f.id_part = p.id_part and f.sters = 0 and f.id_vanzare = ] + TRANSFORM(gnSursaRetur), 'crsRetOne') IF lnQ < 0 OR !USED('crsRetOne') OR RECCOUNT('crsRetOne') = 0 DO S63bLog WITH ' factura ' + TRANSFORM(gnSursaRetur) + ': INEXISTENTA in fact_vfacturi' RETURN ENDIF SELECT crsRetOne GO TOP DO S63bLog WITH ' factura ' + TRANSFORM(gnSursaRetur) + ': tip=' + TRANSFORM(tip) + ' in_valuta=' + TRANSFORM(in_valuta) + ; ' client=' + TRANSFORM(id_part) + ' [' + ALLTRIM(NVL(nume, '')) + '] doc=' + NumarDoc(serie_act, numar_act) gnIdPartRetur = crsRetOne.id_part gcNumeRetur = ALLTRIM(NVL(crsRetOne.nume, '')) gcDescrRetur = NumarDoc(crsRetOne.serie_act, crsRetOne.numar_act) DO Inchide WITH 'crsRetOne' poDate = CREATEOBJECT('empty') ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(gnSursaRetur))) ADDPROPERTY(poDate, 'in_valuta', 0) DO Inchide WITH 'crsSonda' lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}], 'crsSonda') lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0) DO S63bLog WITH ' factura ' + TRANSFORM(gnSursaRetur) + ': cursor_retur -> linii=' + TRANSFORM(lnLinii) DO Inchide WITH 'crsSonda' poDate = NULL gnLiniiRetur = lnLinii glReturOk = (lnLinii > 0) DO Assert WITH glReturOk, 'retur-v2: sursa fixata ' + TRANSFORM(gnSursaRetur) + ' da articole, linii=' + TRANSFORM(lnLinii) ENDPROC *================================================================================== PROCEDURE EmiteAvizV2 LOCAL lnId lnId = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaAviz)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v2', .T.) gnIdAvizV2 = lnId gcSerAvizV2 = gcUltimaSerie gnNrAvizV2 = gnUltimulNract ENDPROC PROCEDURE EmiteReturV2 LOCAL lnId lnId = EmiteUnu(8, ALLTRIM(TRANSFORM(gnSursaRetur)), gnIdPartRetur, gcNumeRetur, gcDescrRetur, 0, 'retur-v2', .T.) gnIdReturV2 = lnId gcSerReturV2 = gcUltimaSerie gnNrReturV2 = gnUltimulNract ENDPROC *-- Controlul lui D-A: ACEEASI sursa (aviz 131), aceeasi sesiune, DUPA incercarea pe v2 (care nu a *-- consumat-o, fiindca a esuat). Daca v1 trece pe unde v2 cade, D-A e un defect al lui v2; daca *-- v1 cade identic, cauza e in codul comun plus datele sursei, nu in v2. PROCEDURE ControlAvizV1 gnIdAvizV1Ctrl = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaAviz)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v1-CONTROL', .F.) gcSerAvizV1Ctrl = gcUltimaSerie gnNrAvizV1Ctrl = gnUltimulNract ENDPROC PROCEDURE IncearcaAlt LPARAMETERS tcFel, tcListaSurse LOCAL lnI, lnSursa, lnId FOR lnI = 1 TO GETWORDCOUNT(tcListaSurse, ',') lnSursa = VAL(GETWORDNUM(tcListaSurse, lnI, ',')) IF tcFel == 'aviz' gnSursaAviz = lnSursa DO VerificaSursaAviz IF !glAvizOk LOOP ENDIF lnId = EmiteUnu(4, ALLTRIM(TRANSFORM(lnSursa)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, ; 'aviz-v2-REZERVA-' + TRANSFORM(lnSursa), .T.) IF gnFatal <> 0 DO DupaAbort WITH 'aviz-v2-REZERVA-' + TRANSFORM(lnSursa) LOOP ENDIF IF lnId > 0 gnIdAvizV2 = lnId gcSerAvizV2 = gcUltimaSerie gnNrAvizV2 = gnUltimulNract EXIT ENDIF ELSE gnSursaRetur = lnSursa DO VerificaSursaRetur IF !glReturOk LOOP ENDIF lnId = EmiteUnu(8, ALLTRIM(TRANSFORM(lnSursa)), gnIdPartRetur, gcNumeRetur, gcDescrRetur, 0, ; 'retur-v2-REZERVA-' + TRANSFORM(lnSursa), .T.) IF gnFatal <> 0 DO DupaAbort WITH 'retur-v2-REZERVA-' + TRANSFORM(lnSursa) LOOP ENDIF IF lnId > 0 gnIdReturV2 = lnId gcSerReturV2 = gcUltimaSerie gnNrReturV2 = gnUltimulNract EXIT ENDIF ENDIF ENDFOR ENDPROC PROCEDURE ControlReturV1 gnIdReturV1Ctrl = EmiteUnu(8, ALLTRIM(TRANSFORM(gnSursaRetur)), gnIdPartRetur, gcNumeRetur, gcDescrRetur, 0, 'retur-v1-CONTROL', .F.) gcSerReturV1Ctrl = gcUltimaSerie gnNrReturV1Ctrl = gnUltimulNract ENDPROC *================================================================================== * Emiterea pe v2, pe traseul real (butonul, nu metoda). Fara TRY: o eroare cade pe ON ERROR, * care tipareste stiva si intoarce controlul in programul principal. FUNCTION EmiteUnu LPARAMETERS tnTip, tcLista, tnIdPart, tcNume, tcDescr, tnIdCom, tcEticheta, tlFormNou LOCAL lnIdVz, lcSerie, lnNract, oform, lnArt, lnFact, loRez, llOk lnIdVz = 0 lcSerie = '' lnNract = 0 gcUltimaSerie = '' gnUltimulNract = 0 gcCaz = '[' + tcEticheta + '] ' DO S63bLog WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=[' + tcLista + '] client=' + ; TRANSFORM(tnIdPart) + ' [' + tcNume + '], forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---' DO CuratieCrs poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1, tnTip) poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") poDateGestiuneDest = CREATEOBJECT("oDateGestiune") poDate.id_client = tnIdPart poDate.nume_client = tcNume poDate.listaid = tcLista poDate.descriere = tcDescr IF tnTip = 4 ADDPROPERTY(poDate, 'id_comanda_aviz', tnIdCom) ELSE poDate.text_aditional = [RETUR FACTURA ] + tcDescr 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., tcEticheta + ': rezultat_serii = 3, e=' + TRANSFORM(poDate.rezultat_serii) DO Goleste RETURN 0 ENDIF poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) lnNract = poDate.nract gcUltimaSerie = lcSerie gnUltimulNract = lnNract gcNumere = gcNumere + 'ALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ');' DO S63bLog WITH ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + lcSerie + ; ' nract=' + TRANSFORM(lnNract) + ' in_valuta=' + TRANSFORM(poDate.in_valuta) 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 IF tlFormNou DO PregatesteFacturaCrs oform = CREATEOBJECT('frm_facturare_articole2') ELSE *-- v1: incarca_cursor_articole() INAINTE de formular, ca in factureaza() (ofacturare.prg:299) pnTotalDiscountAvize = 0 loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) llOk = (loRez.nSucces >= 0) AND loRez.lArticole DO S63bLog WITH ' incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ; ' lArticole=' + TRANSFORM(loRez.lArticole) + ' crsarticole=' + ; IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') DO Assert WITH llOk, tcEticheta + ': incarca_cursor_articole a adus articole' IF !llOk gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', fara linii);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Goleste gcUltimaSerie = '' gnUltimulNract = 0 RETURN 0 ENDIF oform = CREATEOBJECT('frm_facturare_articole') ENDIF IF VARTYPE(oform) <> 'O' DO Assert WITH .F., tcEticheta + ': Createobject formular' DO Goleste RETURN 0 ENDIF oform.WindowType = 0 oform.Show() DOEVENTS FORCE SET PROCEDURE TO (gcMock) ADDITIVE gcMockApeluri = '' glInEmitere = .T. IF tlFormNou DO Assert WITH LOWER(ALLTRIM(oform.but_incarca_articole.cAction)) == 'do_incarca_articole', ; tcEticheta + ': butonul Incarca articole duce la do_incarca_articole' oform.but_incarca_articole.Click() ELSE DO Assert WITH LOWER(ALLTRIM(oform.but_urmator_tot1.cAction)) == 'do_adauga_tot', ; tcEticheta + ': butonul Adauga tot duce la do_adauga_tot' oform.but_urmator_tot1.Click() ENDIF glInEmitere = .F. DOEVENTS FORCE lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) DO S63bLog WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) DO S63bLog WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' DO Assert WITH lnFact > 0, tcEticheta + ': crsfactura populat dupa apasarea butonului, e=' + TRANSFORM(lnFact) IF lnFact = 0 gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', fara linii);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Elibereaza WITH oform DO Goleste gcUltimaSerie = '' gnUltimulNract = 0 RETURN 0 ENDIF DO DumpNuluri WITH 'crsfactura', tcEticheta *-- pe sursele de rezerva nu se mai arde un numar degeaba: pretd NULL duce garantat la 1472, *-- fiindca do_scrie_articole il concateneaza fara Nvl (ofacturare.vc2:14224 v1 / :19928 v2) IF glOpresteLaPretdNul AND PretdAreNul() DO S63bLog WITH ' ' + tcEticheta + ': crsfactura are pretd NULL - emitere anulata inainte de Termin (ar da 1472)' gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', pretd NULL);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Elibereaza WITH oform DO Goleste gcUltimaSerie = '' gnUltimulNract = 0 RETURN 0 ENDIF oform.do_calculeaza_totaluri() DOEVENTS FORCE DO S63bLog WITH ' do_calculeaza_totaluri OK, ntotalron=' + TRANSFORM(oform.ntotalron) SET PROCEDURE TO (gcMock) ADDITIVE gcMockApeluri = '' DO S63bLog WITH ' [pas] but_termin1.Click (fara TRY - o eroare cade pe ON ERROR cu ASTACKINFO)' LOCAL lnIntrInainte, lnAvRetInainte lnIntrInainte = gnIntrebariRetur lnAvRetInainte = gnAvizReturDeschis glInEmitere = .T. glSpionActiv = .T. oform.but_termin1.Click() glSpionActiv = .F. glInEmitere = .F. DOEVENTS FORCE DO S63bLog WITH ' intrebarea "avizul de retur" pe acest caz: ' + TRANSFORM(gnIntrebariRetur - lnIntrInainte) + ; '; FRM_DATE_AVIZ_RETUR deschis: ' + TRANSFORM(gnAvizReturDeschis - lnAvRetInainte) DO S63bLog WITH ' but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ; ' (santinela 9999999999 NU e dovada de scriere)' DO S63bLog WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) IF lnIdVz < 0 lnIdVz = 0 ENDIF DO S63bLog WITH ' verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNract) + ' -> id_vanzare=' + TRANSFORM(lnIdVz) DO Assert WITH lnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+numar_act), e=' + TRANSFORM(lnIdVz) IF lnIdVz > 0 gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');' ELSE gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', nescris);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) gcUltimaSerie = '' gnUltimulNract = 0 ENDIF DO Elibereaza WITH oform DO Goleste RETURN lnIdVz ENDFUNC *================================================================================== * Curatenia dupa un RETURN TO MASTER declansat din handlerul de eroare: tranzactia poate fi * deschisa, numarul alocat si nescris, formularele inca vii. PROCEDURE DupaAbort LPARAMETERS tcEticheta LOCAL lnI, lnIdVz, lcSerie, lnNr glInEmitere = .F. glSpionActiv = .F. gnFatal = 0 DO S63bLog WITH ' [abort] revenit in programul principal dupa eroare fatala in ' + tcEticheta lcSerie = gcUltimaSerie lnNr = gnUltimulNract TRY goExecutor.oExecute("ROLLBACK") CATCH ENDTRY lnIdVz = 0 IF !EMPTY(lcSerie) AND lnNr > 0 lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNr) IF lnIdVz < 0 lnIdVz = 0 ENDIF ENDIF DO S63bLog WITH ' [abort] verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNr) + ' -> id_vanzare=' + TRANSFORM(lnIdVz) DO Assert WITH .F., tcEticheta + ': emiterea a mers pana la capat fara eroare' IF lnIdVz > 0 gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNr) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');' ELSE TRY gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNr) + ' (' + tcEticheta + ', dupa eroare);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) CATCH ENDTRY gcUltimaSerie = '' gnUltimulNract = 0 ENDIF FOR lnI = _SCREEN.FormCount TO 1 STEP -1 TRY _SCREEN.Forms(lnI).Release() CATCH ENDTRY ENDFOR DO CuratieCrs DO Goleste ENDPROC *================================================================================== PROCEDURE Compara LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip LOCAL nFail gcCaz = '[CompDoc ' + tcTip + '] ' DO S63bLog WITH CHR(13) + CHR(10) + '--- CompDoc ' + tcTip + ' v1(' + tcSerie1 + ' ' + TRANSFORM(tnNr1) + ; ', refolosit) vs v2(' + tcSerie2 + ' ' + TRANSFORM(tnNr2) + ') ---' nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-3b ' + tcTip + ' v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')') DO Assert WITH nFail >= 0, tcTip + ': CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail) DO S63bLog WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ' (surse diferite - fiecare divergenta se argumenteaza in raport)' DO ComparaConfig WITH tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip ENDPROC PROCEDURE ComparaConfig LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip LOCAL nId1, nId2, lnQ nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1) nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2) IF nId1 <= 0 OR nId2 <= 0 DO Assert WITH .F., tcTip + ': jonctiune serie_act+nract gaseste ambele id_vanzare (v1=' + ; TRANSFORM(nId1) + ' v2=' + TRANSFORM(nId2) + ')' RETURN ENDIF lnQ = goExecutor.oExecute([select id_vanzare, tip, in_valuta, id_valuta, multiplicator, ] + ; [discount_evidentiat, tva_incasare, nvl(tip_factura,0) as tip_factura, nvl(tip_saft,0) as tip_saft, ] + ; [nvl(coeficient_k,0) as coeficient_k, nvl(id_delegat,0) as id_delegat, nvl(tip_incasat,0) as tip_incasat ] + ; [from vanzari where id_vanzare in (] + TRANSFORM(nId1) + [,] + TRANSFORM(nId2) + [)], 'crsCfg') IF lnQ < 0 OR RECCOUNT('crsCfg') <> 2 DO Assert WITH .F., tcTip + ': citire campuri de configuratie din VANZARI (Reccount asteptat 2)' DO Inchide WITH 'crsCfg' RETURN ENDIF LOCAL ARRAY laC1[12], laC2[12] SELECT crsCfg LOCATE FOR id_vanzare = nId1 SCATTER TO laC1 LOCATE FOR id_vanzare = nId2 SCATTER TO laC2 DO Inchide WITH 'crsCfg' LOCAL ARRAY laNume[11] laNume[1] = 'TIP' laNume[2] = 'IN_VALUTA' laNume[3] = 'ID_VALUTA' laNume[4] = 'MULTIPLICATOR' laNume[5] = 'DISCOUNT_EVIDENTIAT' laNume[6] = 'TVA_INCASARE' laNume[7] = 'TIP_FACTURA' laNume[8] = 'TIP_SAFT' laNume[9] = 'COEFICIENT_K' laNume[10] = 'ID_DELEGAT' laNume[11] = 'TIP_INCASAT' LOCAL lnI FOR lnI = 1 TO 11 DO Assert WITH CdocEgal(laC1[lnI + 1], laC2[lnI + 1]), ; tcTip + ': ' + laNume[lnI] + ' identic (configuratie, nu sursa) v1=' + TRANSFORM(laC1[lnI + 1]) + ; ' v2=' + TRANSFORM(laC2[lnI + 1]) ENDFOR ENDPROC *================================================================================== PROCEDURE PregatesteFacturaCrs 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 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 'crsfactura' DO Inchide WITH 'crscursuri' DO Inchide WITH 'crspolitici' DO Inchide WITH 'crscontracte' DO Inchide WITH 'crsgestiunidest' DO Inchide WITH 'crsCtrTemp' DO Inchide WITH 'crsComTemp' DO Inchide WITH 'crsartselectate' DO Inchide WITH 'jtva_coloane' ENDPROC *-- Campurile NULL din crsfactura sunt cauza directa a lui 1472: do_scrie_articole concateneaza *-- majoritatea coloanelor FARA Nvl (ofacturare.vc2:19918-19943), iar un singur NULL face intreg *-- lcSql .NULL. -> Empty(.NULL.) e .T. -> oExecute il inlocuieste cu This.cSql, gol. PROCEDURE DumpNuluri LPARAMETERS tcAlias, tcEticheta LOCAL lnI, lnC, lcNule, lcNume IF !USED(tcAlias) RETURN ENDIF SELECT (tcAlias) lnC = FCOUNT(tcAlias) SCAN lcNule = '' FOR lnI = 1 TO lnC lcNume = FIELD(lnI, tcAlias) IF ISNULL(EVALUATE(tcAlias + '.' + lcNume)) lcNule = lcNule + IIF(EMPTY(lcNule), '', ', ') + LOWER(lcNume) ENDIF ENDFOR DO S63bLog WITH ' [nuluri ' + tcAlias + ' rand ' + TRANSFORM(RECNO()) + '/' + TRANSFORM(RECCOUNT(tcAlias)) + ; '] ' + IIF(EMPTY(lcNule), '(niciun camp NULL)', lcNule) ENDSCAN GO TOP IN (tcAlias) ENDPROC FUNCTION PretdAreNul LOCAL llNul llNul = .F. IF !USED('crsfactura') OR TYPE('crsfactura.pretd') = 'U' RETURN .F. ENDIF SELECT crsfactura SCAN IF ISNULL(crsfactura.pretd) llNul = .T. ENDIF ENDSCAN GO TOP IN crsfactura RETURN llNul ENDFUNC PROCEDURE Inchide LPARAMETERS tcAlias IF USED(tcAlias) USE IN (tcAlias) ENDIF ENDPROC FUNCTION NumarDoc LPARAMETERS tcSerie, tnNumar LOCAL lcS lcS = ALLTRIM(NVL(tcSerie, '')) RETURN ALLTRIM(IIF(EMPTY(lcS), '', lcS + ' ') + ALLTRIM(STR(NVL(tnNumar, 0), 20, 0))) ENDFUNC PROCEDURE Assert LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 DO S63bLog WITH 'PASS: ' + gcCaz + tcMsg ELSE gnFail = gnFail + 1 DO S63bLog WITH 'FAIL: ' + gcCaz + tcMsg ENDIF ENDPROC PROCEDURE S63bLog LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC *================================================================================== * Handlerul de eroare. Singurul loc din care se poate citi stiva apelantului: obiectul de exceptie * VFP poarta doar punctul de aruncare, iar aici inca nu s-a derulat nimic. PROCEDURE S63bErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine gnErr = gnErr + 1 DO S63bLog WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + TRANSFORM(tcProg) + ':' + TRANSFORM(tnLine) + '] ' + TRANSFORM(tcMsg) DO S63bLog WITH ' MESSAGE(1)=[' + TRANSFORM(MESSAGE(1)) + '] SYS(2018)=[' + TRANSFORM(SYS(2018)) + ']' DO LogStiva IF glInEmitere gnFatal = tnErr DO S63bLog WITH ' -> eroare in timpul emiterii: RETURN TO MASTER' RETURN TO MASTER ENDIF ENDPROC PROCEDURE LogStiva LOCAL lnN, lnI, lcLin LOCAL ARRAY laS[1, 1] gnStivaTiparita = gnStivaTiparita + 1 lnN = 0 TRY lnN = ASTACKINFO(laS) CATCH ENDTRY IF lnN <= 0 DO S63bLog WITH ' ASTACKINFO indisponibil' RETURN ENDIF DO S63bLog WITH ' --- ASTACKINFO, ' + TRANSFORM(lnN) + ' niveluri (de sus in jos) ---' FOR lnI = lnN TO 1 STEP -1 lcLin = '' IF ALEN(laS, 2) >= 5 lcLin = ALLTRIM(STRTRAN(TRANSFORM(laS[lnI, 5]), CHR(9), ' ')) ENDIF DO S63bLog WITH ' #' + PADL(TRANSFORM(laS[lnI, 1]), 3) + ' ' + ; PADR(ALLTRIM(TRANSFORM(laS[lnI, 3])), 46) + ' linia ' + PADL(TRANSFORM(laS[lnI, 4]), 6) + ; ' [' + lcLin + '] <' + ALLTRIM(TRANSFORM(laS[lnI, 2])) + '>' ENDFOR DO S63bLog WITH ' --- sfarsit ASTACKINFO ---' ENDPROC PROCEDURE S63bFinal LOCAL lnI IF TYPE('_SCREEN.tmrS63b') = 'O' _SCREEN.tmrS63b.Enabled = .F. TRY _SCREEN.RemoveObject('tmrS63b') 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 S63bLog WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):' SELECT crsNrSSS SCAN DO S63bLog WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) ENDSCAN USE IN crsNrSSS ENDIF CATCH ENDTRY DO S63bLog WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere DO S63bLog WITH 'STIVE TIPARITE: ' + TRANSFORM(gnStivaTiparita) DO S63bLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) DO S63bLog WITH 'END ' + TTOC(DATETIME()) QUIT ENDPROC *================================================================================== * spionSql: tipareste fiecare SQL trimis prin goExecutor in timpul emiterii. TYPE-ul e tiparit * explicit, pentru ca un lcSql .NULL. arata la fel ca unul gol in log, dar are alt efect: * Empty(.NULL.) e .T., deci oExecute il inlocuieste cu This.cSql (oproceduri_comune.prg:198-202). DEFINE CLASS spionSql AS Custom nOrdine = 0 PROCEDURE Vede LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect IF !glSpionActiv RETURN ENDIF This.nOrdine = This.nOrdine + 1 LOCAL lcT, lcV lcT = VARTYPE(tcSql, .T.) DO CASE CASE lcT == 'X' lcV = '<<< .NULL. >>>' CASE VARTYPE(tcSql) <> 'C' lcV = '<<< netip-caracter: ' + lcT + ' >>>' CASE EMPTY(tcSql) lcV = '<<< SIR GOL, len=' + TRANSFORM(LEN(tcSql)) + ' >>>' OTHERWISE lcV = 'len=' + TRANSFORM(LEN(tcSql)) + ' [' + STRTRAN(LEFT(tcSql, 320), CHR(13) + CHR(10), ' ') + ']' ENDCASE DO S63bLog WITH ' [sql #' + PADL(TRANSFORM(This.nOrdine), 3) + ' type=' + lcT + '] cursor=[' + ; TRANSFORM(NVL(tcCursor, '')) + '] ' + lcV ENDPROC ENDDEFINE *================================================================================== * Identic cu driverS63 din test_s6_3_aviz_retur.prg: apasa pe formele modale care nu trec prin * functia amessagebox si elibereaza FRM_DATE_AVIZ_RETUR, care nu e drivabil headless. DEFINE CLASS driverS63b AS Custom nUltimAlteDate = 0 lBusy = .F. PROCEDURE Executa IF This.lBusy RETURN ENDIF This.lBusy = .T. IF TYPE('_SCREEN.tmrS63b') = 'O' _SCREEN.tmrS63b.Enabled = .F. ENDIF TRY LOCAL lnI, loMsgForm, loAlteDate, lcClasa, loAvizRetur loMsgForm = NULL loAlteDate = NULL loAvizRetur = NULL FOR lnI = 1 TO _SCREEN.FormCount lcClasa = UPPER(_SCREEN.Forms(lnI).Class) IF 'MESSAGEBOX_FORM' $ lcClasa loMsgForm = _SCREEN.Forms(lnI) ENDIF IF lcClasa == 'FRM_ALTE_DATE' loAlteDate = _SCREEN.Forms(lnI) ENDIF IF 'DATE_AVIZ_RETUR' $ lcClasa loAvizRetur = _SCREEN.Forms(lnI) ENDIF IF !(lcClasa $ gcClaseVazute) gcClaseVazute = gcClaseVazute + lcClasa + ';' DO S63bLog WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' ENDIF ENDFOR IF !ISNULL(loAvizRetur) gnAvizReturDeschis = gnAvizReturDeschis + 1 DO S63bLog WITH ' [driver] FRM_DATE_AVIZ_RETUR deschis - eliberat fortat (caz neconcludent)' TRY loAvizRetur.Release() CATCH ENDTRY ENDIF IF !ISNULL(loMsgForm) TRY LOCAL lcTextMsg lcTextMsg = '' TRY lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) CATCH ENDTRY DO S63bLog WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' IF 'avizul de retur' $ LOWER(lcTextMsg) gnIntrebariRetur = gnIntrebariRetur + 1 ENDIF DO CASE CASE ('avizul de retur' $ LOWER(lcTextMsg) OR 'totalul 0' $ LOWER(lcTextMsg)) ; AND gcRaspunsMsgForm == 'NU' AND PEMSTATUS(loMsgForm.cmgBotones, 'cmdNo', 5) DO S63bLog WITH ' [driver msg] apas cmgBotones.cmdNo' loMsgForm.cmgBotones.cmdNo.Click() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) DO S63bLog WITH ' [driver msg] apas cmgBotones.cmdYes' loMsgForm.cmgBotones.cmdYes.Click() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) DO S63bLog WITH ' [driver msg] apas cmgBotones.cmdOk' loMsgForm.cmgBotones.cmdOk.Click() ENDCASE CATCH TO loExcMsg DO S63bLog WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message ENDTRY ELSE IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) This.nUltimAlteDate = SECONDS() TRY DO S63bLog WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE' loAlteDate.do_termin() CATCH TO loExcAD DO S63bLog WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message ENDTRY ENDIF ENDIF CATCH TO loExcTop DO S63bLog WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message FINALLY IF TYPE('_SCREEN.tmrS63b') = 'O' _SCREEN.tmrS63b.Enabled = .T. ENDIF This.lBusy = .F. ENDTRY ENDPROC ENDDEFINE