* test_s6_3d_abd_pretd.prg * Proba celor patru modificari comise in COMUN fara nicio rulare (ba4776b, b798450, 97fd884, 18637e5): * A taxcode trimis de v2 la adauga_articol_factura / adauga_rata_factura + Gather-ul ratei * B lot trimis de v2 pe caile incarcate in masa * D regresia de moment pe ramura aviz: Min(exista_ramas_avize_lista, Sum(crsarticole.cantitate)) * pretd Iif(Isnull(poArt.pretd),[NULL],...) in do_scrie_articole, in AMBELE clase * * Doua emiteri reale, in ordinea asta, ca esecul sa fie informativ: * 1) aviz 667 pe v1 - sursa cu pretd NULL (pusa de date_test_aviz_667.sql.txt). Avizul 131, care * are pretd NULL nativ, arata ca garda functioneaza (sirul se construieste, 1472 dispare) dar * Oracle cade mai jos, in scrie_factura_avize ("Nu au fost gasite articolele! FACT-015"), * deci nu poate arata ca v1 SCRIE. Inainte de 18637e5 rularea cadea cu 1472 in do_scrie_articole. * 2) aviz 683 pe v2 - sursa pregatita cu LOT si cu PRETD NULL (date_test_aviz_683.sql.txt). * Acopera A (taxcode in VANZARI_DETALII), B (lot), D (intrebarea nu apare) si pretd pe v2. * * D se probeaza pe doua cai independente: * - la nivel de cursor, asertiunea proiectata in docs\propunere_taxcode_lot_si_regresie_aviz.md * sec. 2.4 (trei pasi, fara emitere, fara formular); * - pe emiterea reala, prin jurnalul driverului: intrebarea "avizul de retur" NU trece prin * functia amessagebox (mock-ul ramane gol - vezi logul S6-3b), ci deschide un MESSAGEBOX_FORM * pe care il numara gnIntrebariRetur. Pe SSS 671, inainte de fix, valoarea a fost 1. * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_3d_abd_pretd.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3d_abd_pretd.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, goDriverS63d, gcClaseVazute, gcRaspunsMsgForm PUBLIC gnIntrebariRetur, gnAvizReturDeschis, glInEmitere, gnFatal, gnStivaTiparita gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3d_abd_pretd.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 se aleg LA RULARE (AlegeSurseAvizS63d), nu prin id fix: se consuma la prima emitere, *-- iar un id fix face testul verde o singura data. V1 cere un aviz cu pretd NULL, V2 unul cu LOT *-- si pretd NULL - forma pe care o marcheaza pe doua felii din rezervorul AVZ13 scriptul *-- docs\wip13_2026_09_05_04_COMUN_FIXTURI_TEST.sql.txt (sectiunea D). *-- Daca sursa V2 nu mai e disponibila, verificarile A/B se fac pe documentul deja scris *-- (gnDocV2Gata), ca rularea sa ramana repetabila. PUBLIC gnSursaAviz, gnSursaV1, gnSursaV2, gnDocV2Gata, gcSerV2Gata, gnNrV2Gata, gn1472 gnSursaV1 = 0 gnSursaV2 = 0 gnSursaAviz = 0 gnDocV2Gata = 1125 gcSerV2Gata = 'SSS' gnNrV2Gata = 674 gn1472 = 0 PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil poDate = NULL poGeneratorNumere = NULL poDateGestiuneDest = NULL pnTotalDiscountAvize = 0 plVizibil = .F. ON ERROR DO S63dErr 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 S63dLog WITH 'EROARE: conectare Oracle esuata' DO S63dFinal ENDIF SQLSETPROP(gnHandle, "QueryTimeOut", 45) DO S63dLog 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 S63dLog WITH 'EROARE: actualizeaza_optiuni_program()' DO S63dFinal 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 S63dLog 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 PUBLIC goSpionSql, glSpionActiv glSpionActiv = .F. goSpionSql = CREATEOBJECT('spionSql') BINDEVENT(goExecutor, 'oExecute', goSpionSql, 'Vede', 1) BINDEVENT(goExecutor, 'oExecuta', goSpionSql, 'Vede', 1) goDriverS63d = CREATEOBJECT('driverS63d') _SCREEN.AddObject('tmrS63d', 'Timer') _SCREEN.tmrS63d.Interval = 200 BINDEVENT(_SCREEN.tmrS63d, 'Timer', goDriverS63d, 'Executa') _SCREEN.tmrS63d.Enabled = .T. PUBLIC glAvizOk, gnLiniiAviz, gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz PUBLIC gnIdDocV1, gcSerV1, gnNrV1, gnIdDocV2, gcSerV2, gnNrV2 STORE 0 TO gnIdDocV1, gnNrV1, gnIdDocV2, gnNrV2 STORE '' TO gcSerV1, gcSerV2 DO AlegeSurseAvizS63d *================================================================================== * D, calea 1: asertiunea proiectata in propunere sec. 2.4. Fara emitere, fara formular - se * simuleaza "Adauga tot" pe cursor exact ca linia ofacturare.vc2:18799 (Replace cantitate With * cantitate - cantitatea adaugata). Se face INAINTE de orice emitere, cat avizul 683 e intact. DO S63dLog WITH CHR(13) + CHR(10) + '===== D (calea 1): garda pe cursor, aviz ' + TRANSFORM(gnSursaV1) + ' =====' DO ProbaDCursor WITH gnSursaV1 *================================================================================== DO S63dLog WITH CHR(13) + CHR(10) + '===== EMITERE 1: aviz ' + TRANSFORM(gnSursaV1) + ' pe V1 (pretd NULL nativ) =====' gnSursaAviz = gnSursaV1 DO VerificaSursaAviz IF glAvizOk gnIdDocV1 = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaV1)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v1-pretd', .F.) gcSerV1 = gcUltimaSerie gnNrV1 = gnUltimulNract IF gnFatal <> 0 DO DupaAbort WITH 'aviz-v1-pretd' ENDIF ELSE DO Assert WITH .F., 'aviz-v1-pretd: sursa ' + TRANSFORM(gnSursaV1) + ' inca disponibila' ENDIF *================================================================================== DO S63dLog WITH CHR(13) + CHR(10) + '===== EMITERE 2: aviz ' + TRANSFORM(gnSursaV2) + ' pe V2 (lot + pretd NULL) =====' gnSursaAviz = gnSursaV2 DO VerificaSursaAviz IF glAvizOk gnIdDocV2 = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaV2)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v2-abd', .T.) gcSerV2 = gcUltimaSerie gnNrV2 = gnUltimulNract IF gnFatal <> 0 DO DupaAbort WITH 'aviz-v2-abd' ENDIF ELSE gnIdDocV2 = gnDocV2Gata gcSerV2 = gcSerV2Gata gnNrV2 = gnNrV2Gata DO S63dLog WITH ' sursa ' + TRANSFORM(gnSursaV2) + ' consumata de o rulare anterioara - verificarile A/B ' + ; 'se fac pe documentul deja scris de v2, id_vanzare=' + TRANSFORM(gnIdDocV2) ENDIF *================================================================================== DO S63dLog WITH CHR(13) + CHR(10) + '===== VERIFICARI IN VANZARI_DETALII =====' IF gnIdDocV1 > 0 DO VerificaPretd WITH gnIdDocV1, 'pretd-v1' DO VerificaTaxcode WITH gnIdDocV1, 'taxcode-v1(referinta)' ELSE DO Assert WITH .F., 'pretd-v1: v1 a scris documentul din avizul ' + TRANSFORM(gnSursaV1) + ' (pretd NULL)' ENDIF IF gnIdDocV2 > 0 DO VerificaPretd WITH gnIdDocV2, 'pretd-v2' DO VerificaTaxcode WITH gnIdDocV2, 'taxcode-v2 (livrabil A)' DO VerificaLot WITH gnIdDocV2, gnSursaV2, 'lot-v2 (livrabil B)' ELSE DO Assert WITH .F., 'aviz-v2-abd: v2 a scris documentul din avizul ' + TRANSFORM(gnSursaV2) ENDIF *================================================================================== DO S63dLog WITH CHR(13) + CHR(10) + '===== CompDoc aviz: v1(' + gcSerV1 + ' ' + TRANSFORM(gnNrV1) + ; ') vs v2(' + gcSerV2 + ' ' + TRANSFORM(gnNrV2) + ') =====' IF gnIdDocV1 > 0 AND gnIdDocV2 > 0 DO Compara WITH gcSerV1, gnNrV1, gcSerV2, gnNrV2, 'aviz' ELSE DO S63dLog WITH ' CompDoc sarit: lipseste una din jumatatile perechii' ENDIF DO S63dFinal *================================================================================== * D, calea 1 - trei pasi, exact ca in propunere sec. 2.4. PROCEDURE ProbaDCursor LPARAMETERS tnSursa LOCAL lnO, lnSuma, lnMin gcCaz = '[D-cursor] ' lnO = RamasOracle(tnSursa) DO S63dLog WITH ' exista_ramas_avize_lista(' + TRANSFORM(tnSursa) + ') = ' + TRANSFORM(lnO) IF lnO <= 0 DO Assert WITH .F., 'D-cursor: avizul ' + TRANSFORM(tnSursa) + ' e neconsumat (exista_ramas > 0), e=' + TRANSFORM(lnO) RETURN ENDIF DO Inchide WITH 'crsarticole' poDate = CREATEOBJECT('empty') ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(tnSursa))) pnTotalDiscountAvize = 0 IF goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsarticole') < 0 poDate = NULL DO Assert WITH .F., 'D-cursor: cursor_avize a intors linii' RETURN ENDIF poDate = NULL *-- pasul 1: preconditia L_initial = O_initial (ancora, acoperita si de S4-4) lnSuma = SumaCantitate() DO S63dLog WITH ' pas 1 (nimic adaugat): Sum(crsarticole.cantitate)=' + TRANSFORM(lnSuma) + ' O=' + TRANSFORM(lnO) DO Assert WITH ROUND(lnSuma, 2) == ROUND(lnO, 2), ; 'D pas 1: Sum(crsarticole.cantitate) = exista_ramas_avize_lista, ' + TRANSFORM(lnSuma) + ' vs ' + TRANSFORM(lnO) *-- pasul 3: adaugare partiala (jumatate din fiecare linie) - garda TREBUIE sa intrebe, *-- si sa intrebe pe cantitatea corecta. Tine onesta reparatia: o "reparatie" care nu mai *-- intreaba niciodata cade aici. SELECT crsarticole REPLACE ALL cantitate WITH cantitate - ROUND(cantitate / 2, 4) lnSuma = SumaCantitate() lnMin = MIN(lnO, lnSuma) DO S63dLog WITH ' pas 3 (adaugat pe jumatate): Sum=' + TRANSFORM(lnSuma) + ' Min(O,Sum)=' + TRANSFORM(lnMin) DO Assert WITH lnMin > 0 AND ROUND(lnMin, 2) == ROUND(lnSuma, 2), ; 'D pas 3: Min(O,Sum) > 0 si = Sum (garda intreaba, pe cantitatea ramasa), Min=' + TRANSFORM(lnMin) + ' Sum=' + TRANSFORM(lnSuma) *-- pasul 2: "Adauga tot" ia toata cantitatea. AICI cadea inainte de 97fd884: garda ramanea *-- doar cu O (= 9), deci intreba. Acum Min(O, 0) = 0. SELECT crsarticole REPLACE ALL cantitate WITH 0 lnSuma = SumaCantitate() lnMin = MIN(lnO, lnSuma) DO S63dLog WITH ' pas 2 (Adauga tot): Sum=' + TRANSFORM(lnSuma) + ' O=' + TRANSFORM(lnO) + ' Min(O,Sum)=' + TRANSFORM(lnMin) DO Assert WITH ROUND(lnMin, 2) == 0, ; 'D pas 2: dupa Adauga tot Min(O,Sum) = 0, deci garda NU pune intrebarea (inainte de fix era O=' + ; TRANSFORM(lnO) + '), Min=' + TRANSFORM(lnMin) DO Inchide WITH 'crsarticole' ENDPROC *-- Calculate muta Recno() la EOF si schimba zona curenta - se salveaza si se restaureaza amandoua. FUNCTION SumaCantitate LOCAL lnS, lcAliasVechi lnS = 0 lcAliasVechi = ALIAS() SELECT crsarticole CALCULATE SUM(cantitate) TO lnS GO TOP IN crsarticole IF !EMPTY(lcAliasVechi) AND USED(lcAliasVechi) SELECT (lcAliasVechi) ENDIF RETURN NVL(lnS, 0) ENDFUNC FUNCTION RamasOracle LPARAMETERS tnSursa LOCAL lnR lnR = -1 DO Inchide WITH 'crsRamasD' IF goExecutor.oExecute([SELECT pack_facturare.exista_ramas_avize_lista('] + ALLTRIM(TRANSFORM(tnSursa)) + ; [') AS ramas FROM dual], 'crsRamasD') >= 0 AND USED('crsRamasD') AND RECCOUNT('crsRamasD') > 0 lnR = NVL(crsRamasD.ramas, -1) ENDIF DO Inchide WITH 'crsRamasD' RETURN lnR ENDFUNC *================================================================================== * pretd. Ce dovedeste garda: sirul SQL se construieste si pleaca (inainte, un singur camp NULL * facea tot lcSql .NULL., Empty(.NULL.) e .T. in oExecute si SQLExec arunca 1472). Ce NU poate * dovedi: ca NULL supravietuieste in tabela - adauga_articol_factura scrie in ACT_TEMP * NVL(V_PRETD, 0) (PACK_FACTURARE body:4085), deci Oracle normalizeaza NULL la 0 prin proiect. * Deci se aserteaza: documentul are linii, si nicio eroare 1472 in toata rularea. PROCEDURE VerificaPretd LPARAMETERS tnIdVz, tcEticheta LOCAL lnTot, lnNule, lnZero gcCaz = '[' + tcEticheta + '] ' DO Inchide WITH 'crsPd' IF goExecutor.oExecute([select count(*) as tot, sum(case when pretd is null then 1 else 0 end) as nule, ] + ; [sum(case when pretd = 0 then 1 else 0 end) as zero ] + ; [from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsPd') < 0 OR !USED('crsPd') DO Assert WITH .F., tcEticheta + ': citire PRETD din VANZARI_DETALII' RETURN ENDIF lnTot = NVL(crsPd.tot, 0) lnNule = NVL(crsPd.nule, 0) lnZero = NVL(crsPd.zero, 0) DO Inchide WITH 'crsPd' DO S63dLog WITH ' id_vanzare=' + TRANSFORM(tnIdVz) + ' linii=' + TRANSFORM(lnTot) + ; ' PRETD NULL=' + TRANSFORM(lnNule) + ' PRETD 0=' + TRANSFORM(lnZero) + ; ' (Oracle scrie NVL(V_PRETD,0), PACK_FACTURARE body:4085)' DO Assert WITH lnTot > 0, tcEticheta + ': documentul are linii in VANZARI_DETALII, e=' + TRANSFORM(lnTot) DO Assert WITH gn1472 = 0, ; tcEticheta + ': nicio eroare 1472 in rulare (sirul SQL nu mai devine .NULL. pe pretd), e=' + TRANSFORM(gn1472) ENDPROC *================================================================================== * taxcode: asteptarea se calculeaza cu aceeasi functie ca in A11 (test_s8_cablare_incarcare), * ramura cu ramura. GetTaxCode intoarce NULL cand gl406 e stins, iar Oracle scrie * decode(V_TAXCODE,0,NULL,V_TAXCODE) - deci 0 devine NULL in tabela. Nu se aserteaza "nenul". PROCEDURE VerificaTaxcode LPARAMETERS tnIdVz, tcEticheta LOCAL llSaft, lnRau, lnNenul, lnTot, lnAstept, lnGasit, ldData gcCaz = '[' + tcEticheta + '] ' llSaft = (TYPE('gl406') = 'L' AND gl406) DO Inchide WITH 'crsTc' IF goExecutor.oExecute([select v.data_act, nvl(d.id_jtva_coloana,0) as id_jtva_coloana, d.taxcode ] + ; [from vanzari v, vanzari_detalii d where d.id_vanzare = v.id_vanzare and v.id_vanzare = ] + ; TRANSFORM(tnIdVz) + [ order by d.id_vanzare_det], 'crsTc') < 0 OR !USED('crsTc') DO Assert WITH .F., tcEticheta + ': citire TAXCODE din VANZARI_DETALII' RETURN ENDIF lnRau = 0 lnNenul = 0 lnTot = RECCOUNT('crsTc') SELECT crsTc SCAN ldData = crsTc.data_act lnAstept = IIF(m.llSaft, NVL(GetTaxCode(gnAn, gnLuna, ldData, NVL(crsTc.id_jtva_coloana, 0), .F.), 0), 0) lnGasit = NVL(crsTc.taxcode, 0) IF lnGasit <> lnAstept lnRau = lnRau + 1 DO S63dLog WITH ' nepotrivire: id_jtva_coloana=' + TRANSFORM(crsTc.id_jtva_coloana) + ; ' TAXCODE=' + TRANSFORM(crsTc.taxcode) + ' asteptat=' + TRANSFORM(lnAstept) ELSE DO S63dLog WITH ' ok: id_jtva_coloana=' + TRANSFORM(crsTc.id_jtva_coloana) + ; ' TAXCODE=' + TRANSFORM(crsTc.taxcode) + ' asteptat=' + TRANSFORM(lnAstept) ENDIF IF lnGasit <> 0 lnNenul = lnNenul + 1 ENDIF ENDSCAN DO Inchide WITH 'crsTc' DO S63dLog WITH ' gl406=' + TRANSFORM(m.llSaft) + ' linii cu TAXCODE nenul in VANZARI_DETALII=' + ; TRANSFORM(lnNenul) + '/' + TRANSFORM(lnTot) DO Assert WITH lnTot > 0 AND lnRau = 0, ; tcEticheta + ': TAXCODE din VANZARI_DETALII = valoarea derivata de cod, nepotriviri=' + TRANSFORM(lnRau) IF lnNenul = 0 DO S63dLog WITH ' ATENTIE: toate liniile au TAXCODE gol - asertiunea e conforma cu codul, dar ' + ; 'NU dovedeste ca s-a inchis golul din CompDoc (gl406 stins sau coloane jtva fara cod SAFT)' ENDIF DO Assert WITH lnNenul > 0, ; tcEticheta + ': cel putin o linie are TAXCODE nenul (golul din CompDoc sec. 5.1 s-a inchis), nenule=' + TRANSFORM(lnNenul) ENDPROC *================================================================================== * lot: jonctiunea pe id_articol cu liniile sursei (avizul are articole distincte). PROCEDURE VerificaLot LPARAMETERS tnIdVz, tnSursa, tcEticheta LOCAL lnTot, lnGresit, lnCuLot gcCaz = '[' + tcEticheta + '] ' DO Inchide WITH 'crsLot' IF goExecutor.oExecute([select d.id_vanzare_det, d.id_articol, nvl(d.lot,'@fara@') as lot_nou, ] + ; [nvl(s.lot,'@fara@') as lot_sursa ] + ; [from vanzari_detalii d, vanzari_detalii s ] + ; [where d.id_vanzare = ] + TRANSFORM(tnIdVz) + [ and s.id_vanzare = ] + TRANSFORM(tnSursa) + ; [ and s.id_articol = d.id_articol order by d.id_vanzare_det], 'crsLot') < 0 OR !USED('crsLot') DO Assert WITH .F., tcEticheta + ': citire LOT din VANZARI_DETALII' RETURN ENDIF lnTot = 0 lnGresit = 0 lnCuLot = 0 SELECT crsLot SCAN lnTot = lnTot + 1 IF ALLTRIM(NVL(crsLot.lot_nou, '')) == ALLTRIM(NVL(crsLot.lot_sursa, '')) lnCuLot = lnCuLot + IIF(ALLTRIM(NVL(crsLot.lot_sursa, '')) == '@fara@', 0, 1) ELSE lnGresit = lnGresit + 1 ENDIF DO S63dLog WITH ' id_articol=' + TRANSFORM(crsLot.id_articol) + ' LOT nou=[' + ALLTRIM(TRANSFORM(crsLot.lot_nou)) + ; '] LOT sursa=[' + ALLTRIM(TRANSFORM(crsLot.lot_sursa)) + ']' ENDSCAN DO Inchide WITH 'crsLot' DO Assert WITH lnTot > 0, tcEticheta + ': jonctiunea pe id_articol cu sursa da linii, e=' + TRANSFORM(lnTot) DO Assert WITH lnTot > 0 AND lnGresit = 0, ; tcEticheta + ': LOT din VANZARI_DETALII = LOT din sursa pe toate liniile, gresite=' + TRANSFORM(lnGresit) DO Assert WITH lnCuLot > 0, ; tcEticheta + ': cel putin o linie poarta un LOT nevid din sursa (proba nu e vida), e=' + TRANSFORM(lnCuLot) ENDPROC *================================================================================== * Sursa avizului: exact filtrul din caut_avize (oproceduri_facturare.prg:2038) plus id-ul fixat. *================================================================================== * Alege la rulare cele doua surse de aviz, din capatul de jos al rezervorului AVZ13 (AlegeSursaAviz * din test_s6_3_aviz_retur / test_s6_3b_v2_primul consuma de la capatul de sus, deci nu se calca). * Feliile se recunosc dupa forma liniilor, nu dupa o coloana de marcaj: * V1 - pretd NULL si lot NULL; V2 - pretd NULL si lot completat. * Conditia de cantitate ramasa e cea din pack_facturare.cursor_avize. PROCEDURE AlegeSurseAvizS63d gnSursaV1 = SursaAvizDinFelie(.F.) gnSursaV2 = SursaAvizDinFelie(.T.) DO S63dLog WITH 'surse alese la rulare: V1=' + TRANSFORM(gnSursaV1) + ' V2=' + TRANSFORM(gnSursaV2) DO Assert WITH gnSursaV1 > 0, 'exista un aviz-sursa cu pretd NULL (felia V1 din AVZ13)' DO Assert WITH gnSursaV2 > 0, 'exista un aviz-sursa cu lot + pretd NULL (felia V2 din AVZ13)' ENDPROC FUNCTION SursaAvizDinFelie LPARAMETERS tlCuLot LOCAL lnQ, lnId lnId = 0 DO Inchide WITH 'crsFelieAv' lnQ = goExecutor.oExecute([select min(a.id_vanzare) as id_vanzare from vanzari a ] + ; [where a.serie_act = 'AVZ13' and a.sters = 0 and a.facturat = 0 and a.tip in (21,22,26,42) ] + ; [and exists (select 1 from vanzari_detalii d where d.id_vanzare = a.id_vanzare and d.sters = 0 ] + ; [and d.pretd is null and d.lot is ] + IIF(m.tlCuLot, [not null ], [null ]) + ; [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))], 'crsFelieAv') IF lnQ >= 0 AND USED('crsFelieAv') AND RECCOUNT('crsFelieAv') > 0 lnId = NVL(crsFelieAv.id_vanzare, 0) ENDIF DO Inchide WITH 'crsFelieAv' RETURN m.lnId ENDFUNC PROCEDURE VerificaSursaAviz LOCAL lnQ, lnLinii glAvizOk = .F. gnLiniiAviz = 0 gnIdPartAviz = 0 gcNumeAviz = '' gcDescrAviz = '' gnIdComAviz = 0 gcCaz = '[sursa ' + TRANSFORM(gnSursaAviz) + '] ' 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 S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': INEXISTENT in vanzari' RETURN ENDIF SELECT crsAvOne GO TOP DO S63dLog 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 S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': NU mai trece filtrul caut_avize' 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 S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': cursor_avize -> linii=' + TRANSFORM(lnLinii) IF lnLinii > 0 AND TYPE('crsSonda.lot') <> 'U' SELECT crsSonda GO TOP DO S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': crsarticole.lot pe primul rand=[' + ; ALLTRIM(TRANSFORM(NVL(crsSonda.lot, ''))) + ']' ENDIF DO Inchide WITH 'crsSonda' poDate = NULL gnLiniiAviz = lnLinii glAvizOk = (lnLinii > 0) DO Assert WITH glAvizOk, 'sursa ' + TRANSFORM(gnSursaAviz) + ' da articole, linii=' + TRANSFORM(lnLinii) DO S63dLog WITH ' [D diag] exista_ramas_avize_lista(' + TRANSFORM(gnSursaAviz) + ') INAINTE de emitere = ' + ; TRANSFORM(RamasOracle(gnSursaAviz)) ENDPROC *================================================================================== * Emiterea pe traseul real (butonul, nu metoda). Fara TRY: o eroare cade pe ON ERROR. FUNCTION EmiteUnu LPARAMETERS tnTip, tcLista, tnIdPart, tcNume, tcDescr, tnIdCom, tcEticheta, tlFormNou LOCAL lnIdVz, lcSerie, lnNract, oform, lnArt, lnFact, loRez, llOk, lnIntrInainte, lnAvRetInainte lnIdVz = 0 lcSerie = '' lnNract = 0 gcUltimaSerie = '' gnUltimulNract = 0 gcCaz = '[' + tcEticheta + '] ' DO S63dLog 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 ADDPROPERTY(poDate, 'id_comanda_aviz', tnIdCom) 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 S63dLog 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 pnTotalDiscountAvize = 0 loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) llOk = (loRez.nSucces >= 0) AND loRez.lArticole DO S63dLog 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 oform.but_incarca_articole.Click() ELSE 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 S63dLog WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) + ; ' Sum(crsarticole.cantitate)=' + TRANSFORM(IIF(lnArt > 0, SumaCantitate(), 0)) DO S63dLog 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 DO S63dLog WITH ' crsfactura.lot pe primul rand=[' + ; IIF(TYPE('crsfactura.lot') = 'U', '(coloana lipseste)', ALLTRIM(TRANSFORM(NVL(crsfactura.lot, '')))) + ']' oform.do_calculeaza_totaluri() DOEVENTS FORCE DO S63dLog WITH ' do_calculeaza_totaluri OK, ntotalron=' + TRANSFORM(oform.ntotalron) SET PROCEDURE TO (gcMock) ADDITIVE gcMockApeluri = '' lnIntrInainte = gnIntrebariRetur lnAvRetInainte = gnAvizReturDeschis DO S63dLog WITH ' [pas] but_termin1.Click' glInEmitere = .T. glSpionActiv = .T. oform.but_termin1.Click() glSpionActiv = .F. glInEmitere = .F. DOEVENTS FORCE DO S63dLog WITH ' intrebarea "avizul de retur" pe acest caz: ' + TRANSFORM(gnIntrebariRetur - lnIntrInainte) + ; '; FRM_DATE_AVIZ_RETUR deschis: ' + TRANSFORM(gnAvizReturDeschis - lnAvRetInainte) DO S63dLog WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' *-- D, calea 2: dupa un "Adauga tot" care ia toata cantitatea, garda da 0 si intrebarea *-- nu mai apare. Pe SSS 671 (aceeasi cale, inainte de 97fd884) valoarea a fost 1. DO Assert WITH (gnIntrebariRetur - lnIntrInainte) = 0, ; tcEticheta + ': intrebarea "avizul de retur" NU apare dupa Adauga tot (livrabil D), aparitii=' + ; TRANSFORM(gnIntrebariRetur - lnIntrInainte) DO Assert WITH !('avizul de retur' $ LOWER(gcMockApeluri)), ; tcEticheta + ': jurnalul de amessagebox nu contine intrebarea de aviz de retur' lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) IF lnIdVz < 0 lnIdVz = 0 ENDIF DO S63dLog 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 *================================================================================== PROCEDURE DupaAbort LPARAMETERS tcEticheta LOCAL lnI, lnIdVz, lcSerie, lnNr glInEmitere = .F. glSpionActiv = .F. gnFatal = 0 DO S63dLog 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 S63dLog 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 + '] ' nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-3d ' + 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 S63dLog WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ' (surse diferite - fiecare divergenta se argumenteaza in raport)' 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 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 S63dLog WITH ' [nuluri ' + tcAlias + ' rand ' + TRANSFORM(RECNO()) + '/' + TRANSFORM(RECCOUNT(tcAlias)) + ; '] ' + IIF(EMPTY(lcNule), '(niciun camp NULL)', lcNule) ENDSCAN GO TOP IN (tcAlias) ENDPROC 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 S63dLog WITH 'PASS: ' + gcCaz + tcMsg ELSE gnFail = gnFail + 1 DO S63dLog WITH 'FAIL: ' + gcCaz + tcMsg ENDIF ENDPROC PROCEDURE S63dLog LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE S63dErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine gnErr = gnErr + 1 IF tnErr = 1472 gn1472 = gn1472 + 1 ENDIF DO S63dLog WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + TRANSFORM(tcProg) + ':' + TRANSFORM(tnLine) + '] ' + TRANSFORM(tcMsg) DO S63dLog WITH ' MESSAGE(1)=[' + TRANSFORM(MESSAGE(1)) + '] SYS(2018)=[' + TRANSFORM(SYS(2018)) + ']' DO LogStiva IF glInEmitere gnFatal = tnErr DO S63dLog 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 S63dLog WITH ' ASTACKINFO indisponibil' RETURN ENDIF DO S63dLog 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 S63dLog 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 S63dLog WITH ' --- sfarsit ASTACKINFO ---' ENDPROC PROCEDURE S63dFinal LOCAL lnI IF TYPE('_SCREEN.tmrS63d') = 'O' _SCREEN.tmrS63d.Enabled = .F. TRY _SCREEN.RemoveObject('tmrS63d') 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 S63dLog WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):' SELECT crsNrSSS SCAN DO S63dLog WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) ENDSCAN USE IN crsNrSSS ENDIF CATCH ENDTRY DO S63dLog WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere DO S63dLog WITH 'STIVE TIPARITE: ' + TRANSFORM(gnStivaTiparita) DO S63dLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) DO S63dLog WITH 'END ' + TTOC(DATETIME()) QUIT ENDPROC *================================================================================== 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, 400), CHR(13) + CHR(10), ' ') + ']' ENDCASE DO S63dLog WITH ' [sql #' + PADL(TRANSFORM(This.nOrdine), 3) + ' type=' + lcT + '] cursor=[' + ; TRANSFORM(NVL(tcCursor, '')) + '] ' + lcV ENDPROC ENDDEFINE *================================================================================== DEFINE CLASS driverS63d AS Custom nUltimAlteDate = 0 lBusy = .F. PROCEDURE Executa IF This.lBusy RETURN ENDIF This.lBusy = .T. IF TYPE('_SCREEN.tmrS63d') = 'O' _SCREEN.tmrS63d.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 S63dLog WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' ENDIF ENDFOR IF !ISNULL(loAvizRetur) gnAvizReturDeschis = gnAvizReturDeschis + 1 DO S63dLog 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 S63dLog 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 S63dLog WITH ' [driver msg] apas cmgBotones.cmdNo' loMsgForm.cmgBotones.cmdNo.Click() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) DO S63dLog WITH ' [driver msg] apas cmgBotones.cmdYes' loMsgForm.cmgBotones.cmdYes.Click() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) DO S63dLog WITH ' [driver msg] apas cmgBotones.cmdOk' loMsgForm.cmgBotones.cmdOk.Click() ENDCASE CATCH TO loExcMsg DO S63dLog WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message ENDTRY ELSE IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) This.nUltimAlteDate = SECONDS() TRY DO S63dLog WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE' loAlteDate.do_termin() CATCH TO loExcAD DO S63dLog WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message ENDTRY ENDIF ENDIF CATCH TO loExcTop DO S63dLog WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message FINALLY IF TYPE('_SCREEN.tmrS63d') = 'O' _SCREEN.tmrS63d.Enabled = .T. ENDIF This.lBusy = .F. ENDTRY ENDPROC ENDDEFINE