* test_s3b_paritate_emitere.prg * Headless: criteriul 1 de "gata" din docs\cercetare\s3b_alte_date_analitice.md sectiunea 10 - * paritate de EMITERE intre calea veche (frm_alte_date, dialogul modal creat de * frm_facturare_articole.inainte_de_do_termin, ofacturare.vc2:14923) si formularul unificat * (frm_facturare_articole2, care are grupul de incasare inline), pe toate patru tipurile de * incasare: 1=Fara incasare, 2=Chitanta, 3=Bon fiscal, 4=POS Card. * * Se compara doua marimi, cerute explicit de criteriu: * (a) numarul alocat -> poDate.nr_incasare, scris de actualizeaza_tipincasare (ramurile 1/2: * nr_incasare=0; ramura 3: do_aloca_nr_bon; ramura 4: do_aloca_nr_pos) si de ControlSource-ul * clb_nrchit.text_simplu1 ("poDate.nr_incasare", ofacturare.vc2:16558 / * ferestre_cere_date.vc2:2490); * (b) lcListaIncasare - stringul asamblat in do_scrie_factura inainte de scrie_factura2 * (ofacturare.vc2:14227-14253 pentru calea veche, 19967-19993 pentru cea noua). * * De ce lcListaIncasare se calculeaza cu o REPLICA, nu prin apelul codului real: * lcListaIncasare e o variabila LOCAL in do_scrie_factura, iar do_scrie_factura EMITE documentul * (scrie in Oracle). Testul nu are voie sa emita. In loc de asta: * - blocul de asamblare din cele doua do_scrie_factura e comparat CA TEXT, in test, si trebuie sa * fie identic (assert dedicat); * - replica din acest fisier (intre marcajele REPLICA-LISTA) e comparata CA TEXT cu blocul din * sursa, dupa normalizare (fara comentarii && , fara spatii de indentare, fara linii goale) - * assert dedicat. Daca sursa se schimba si replica nu, testul cade. * La fel pentru pasul de emitere dinaintea lui do_scrie_factura: poDate.ntip_incasare se calculeaza * din opt_incasat.Value cu aceeasi expresie pe ambele cai (ferestre_cere_date.vc2:3067 in * frm_alte_date.inainte_de_do_termin, ofacturare.vc2:20673 in * frm_facturare_articole2.inainte_de_do_termin) - cele doua linii sunt comparate ca text. * Comutarea POS (incasatCARD = incasat; incasat = 0) e ferestre_cere_date.vc2:3100-3104 respectiv * ofacturare.vc2:20680-20683 - aceleasi doua atribuiri, sub garzi echivalente (plReturn / gnButon). * * SECVENTIAL, nu simultan: frm_alte_date e creata, parcursa pe toate patru tipurile si eliberata * COMPLET inainte sa existe frm_facturare_articole2. Ambele forme au propriul cboTipFactura cu * RowSource identic ("... into cursor cTipFacturaX", ofacturare.vc2:16157 si * ferestre_cere_date.vc2:2388), reevaluat la fiecare actualizeaza_tipincasare - doua forme vii * simultan se bat pe acelasi nume de cursor. Acelasi poDate pentru ambele faze, cu starea * restaurata explicit intre faze. * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_paritate_emitere.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_paritate_emitere.log SET SAFETY OFF SET TALK OFF SET NOTIFY OFF PUBLIC gcLog, gnFail, gnPass, gcSursaNou, gcSursaVechi, gcAcestFisier, glPOSDisponibil glPOSDisponibil = .F. gcAcestFisier = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_paritate_emitere.prg" gcSursaNou = "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2" gcSursaVechi = "D:\ROA\ROAFACTURARE\COMUN\clase\ferestre_cere_date.vc2" gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_paritate_emitere.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) gnFail = 0 gnPass = 0 ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() 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 AfLog WITH "FAIL: conexiune Oracle esuata" DO Final ENDIF SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE PUBLIC gcMockUltimMesaj, gnMockUltimTip gcMockUltimMesaj = "" gnMockUltimTip = 0 DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) IF !actualizeaza_optiuni_program() DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" DO Final ENDIF gnScadereStoc = 0 gnIdUtil = 8 * singura plaja pentru tipul 26 e legata de sucursala 167; mediul lasa gnIdSucursala pe 110 (sau * null), iar filtrul NVL(id_sucursala,-99) IN (v_id_sucursala,-99) din pack_serii_numere nu o prinde gnIdSucursala = 167 goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + " gnPc=" + TRANSFORM(gnPc) + ; " gnIdUtil=" + TRANSFORM(gnIdUtil) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala) * fara asta, un lacat pe plajele de serii blocheaza rularea la infinit, invizibil in log SQLSETPROP(gnHandle, "QueryTimeOut", 45) IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45) ENDIF DO AfLog WITH "QueryTimeOut gnHandle=" + TRANSFORM(SQLGETPROP(gnHandle, "QueryTimeOut")) + ; " goExecutor.nHandle=" + TRANSFORM(goExecutor.nHandle) SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE IF USED('crscursuri') USE IN crscursuri ENDIF CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) 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 DO ProbaTextSursa DO ProbaParitateEmitere DO Final *===================================================================================== * Partea 1 - aserturile pe TEXTUL sursei: cele doua cai asambleaza identic, si replica * din acest fisier e identica cu sursa. *===================================================================================== PROCEDURE ProbaTextSursa LOCAL lcAncora, lnCate, i LOCAL ARRAY laSursa[1], laPoz[1] IF !FILE(gcSursaNou) DO Assert WITH .F., "sursa " + gcSursaNou + " exista" RETURN ENDIF lnCate = ALINES(laSursa, FILETOSTR(gcSursaNou), 0) DO AfLog WITH "ofacturare.vc2: " + TRANSFORM(lnCate) + " linii" * blocul de asamblare incepe cu acest If si tine pana la Endif-ul de dupa lcListaIncasare = [NULL] lcAncora = "IF INLIST(PODATE.NTIP_INCASARE, 11, 2, 3)" DIMENSION laPoz[2] laPoz[1] = 0 laPoz[2] = 0 LOCAL lnGasit lnGasit = 0 FOR i = 1 TO lnCate IF UPPER(NormalizeazaLinie(laSursa[i])) == lcAncora lnGasit = lnGasit + 1 IF lnGasit <= 2 laPoz[lnGasit] = i ENDIF ENDIF ENDFOR DO AfLog WITH "ancora blocului de asamblare gasita de " + TRANSFORM(lnGasit) + " ori, la liniile " + ; TRANSFORM(laPoz[1]) + " si " + TRANSFORM(laPoz[2]) DO Assert WITH lnGasit = 2, "blocul lcListaIncasare apare exact de doua ori in ofacturare.vc2 (calea veche + calea noua)" IF lnGasit <> 2 RETURN ENDIF LOCAL lcA, lcB, lcRep lcA = ExtrageBloc(gcSursaNou, laPoz[1], 30) lcB = ExtrageBloc(gcSursaNou, laPoz[2], 30) DO AfLog WITH "bloc vechi (ofacturare.vc2:" + TRANSFORM(laPoz[1]) + ") normalizat, " + TRANSFORM(LEN(lcA)) + " octeti" DO AfLog WITH "bloc nou (ofacturare.vc2:" + TRANSFORM(laPoz[2]) + ") normalizat, " + TRANSFORM(LEN(lcB)) + " octeti" DO Assert WITH lcA == lcB, "asamblarea lcListaIncasare e identica in do_scrie_factura al celor doua cai" IF !(lcA == lcB) DO AfLog WITH "vechi=[" + lcA + "]" DO AfLog WITH "nou =[" + lcB + "]" ENDIF * replica din acest fisier, intre marcaje, trebuie sa fie aceeasi bucata de cod lcRep = ExtrageIntreMarcaje(gcAcestFisier, "*--REPLICA-LISTA-START--*", "*--REPLICA-LISTA-END--*") DO AfLog WITH "replica din test normalizata, " + TRANSFORM(LEN(lcRep)) + " octeti" DO Assert WITH lcRep == lcB, "replica ListaIncasare() din test e identica cu blocul din sursa" IF !(lcRep == lcB) DO AfLog WITH "replica=[" + lcRep + "]" DO AfLog WITH "sursa =[" + lcB + "]" ENDIF * linia care calculeaza ntip_incasare din opt_incasat.Value, pe ambele cai LOCAL lcNtipNou, lcNtipVechi, lcNtipVechiNorm lcNtipNou = CautaLinie(gcSursaNou, "PODATE.NTIP_INCASARE = IIF(") lcNtipVechi = CautaLinie(gcSursaVechi, "PODATE.NTIP_INCASARE = IIF(") * calea noua citeste modul de incasare prin nmod_incasare(), nu direct opt_incasat.Value (container ct_incasare) lcNtipVechiNorm = STRTRAN(lcNtipVechi, "THISFORM.OPT_INCASAT.VALUE", "THISFORM.NMOD_INCASARE()") DO AfLog WITH "ntip nou =[" + lcNtipNou + "]" DO AfLog WITH "ntip vechi =[" + lcNtipVechi + "] normalizat=[" + lcNtipVechiNorm + "]" DO Assert WITH !EMPTY(lcNtipNou) AND lcNtipNou == lcNtipVechiNorm, ; "expresia poDate.ntip_incasare = Iif(opt_incasat.Value...) e identica pe ambele cai" ENDPROC *===================================================================================== * Partea 2 - proba de runtime, pe cele doua forme, secvential *===================================================================================== PROCEDURE ProbaParitateEmitere PRIVATE poDate, poGeneratorNumere, loVechi, loNou, i LOCAL laTip[4], laNume[4], laVechi[4,4], laNou[4,4] laTip[1] = 1 laTip[2] = 2 laTip[3] = 3 laTip[4] = 4 laNume[1] = "Fara incasare" laNume[2] = "Chitanta" laNume[3] = "Bon fiscal" laNume[4] = "POS Card" poDate = CREATEOBJECT("oDateFactura", 25000, 1) poDate.nIdTipDoc = 5 poDate.totalctva = 1000 DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + ; " poDate.incasat=" + TRANSFORM(poDate.incasat) + " poDate.nract=" + TRANSFORM(poDate.nract) poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") poGeneratorNumere.ResetNumere() DO ProbaSerii WITH poDate.nIdTipDoc poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) * tipul 26 (POS/card) nu are plaje in acest mediu la fiecare rulare; fara pre-proba, * do_aloca_nr_pos blocheaza rularea in interiorul apelului Oracle, fara nimic in log LOCAL lnRandPOS lnRandPOS = RanduriSerii(26) glPOSDisponibil = (lnRandPOS > 0) DO AfLog WITH "pre-proba plaje: tip 3 randuri=" + TRANSFORM(RanduriSerii(3)) + ; " tip 16 randuri=" + TRANSFORM(RanduriSerii(16)) + " tip 26 randuri=" + TRANSFORM(lnRandPOS) + ; " -> POS " + IIF(glPOSDisponibil, "probabil", "NEPROBABIL in acest mediu") LOCAL lnStartIncasat, lnStartCard, lnStartTichete, lnStartCasa, lnStartTipInc, lnStartNrInc, lnStartPos lnStartIncasat = poDate.incasat lnStartCard = poDate.incasatCARD lnStartTichete = poDate.incasatTichete lnStartCasa = poDate.id_casa lnStartTipInc = poDate.ntip_incasare lnStartNrInc = poDate.nr_incasare lnStartPos = poDate.nIncasatPos DO AfLog WITH "stare start poDate: incasat=" + TRANSFORM(lnStartIncasat) + " incasatCARD=" + TRANSFORM(lnStartCard) + ; " incasatTichete=" + TRANSFORM(lnStartTichete) + " id_casa=" + TRANSFORM(lnStartCasa) + ; " ntip_incasare=" + TRANSFORM(lnStartTipInc) + " nr_incasare=" + TRANSFORM(lnStartNrInc) + ; " nIncasatPos=" + TRANSFORM(lnStartPos) LOCAL lnTip, lcNumeTip * ---------- FAZA 1: calea veche - frm_alte_date ---------- DO AsiguraSaftTipFacturi loVechi = CREATEOBJECT('frm_alte_date') DO Assert WITH VARTYPE(loVechi) = 'O', "Createobject frm_alte_date (calea veche)" IF VARTYPE(loVechi) <> 'O' RETURN ENDIF loVechi.Visible = .F. loVechi.nnrbon = poDate.nract FOR i = 1 TO 4 lnTip = laTip[i] lcNumeTip = laNume[i] IF lnTip = 4 AND !glPOSDisponibil DO AfLog WITH "vechi [" + lcNumeTip + "]: SARIT - nu exista plaje de serii pentru tipul 26 in acest mediu" LOOP ENDIF loVechi.opt_incasat.Value = lnTip DO AfLog WITH "vechi [" + lcNumeTip + "]: dupa opt_incasat.Value=" + TRANSFORM(lnTip) + ; " nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " incasat=" + TRANSFORM(poDate.incasat) + ; " incasatCARD=" + TRANSFORM(poDate.incasatCARD) + " id_casa=" + TRANSFORM(poDate.id_casa) + ; " nIncasatPos=" + TRANSFORM(poDate.nIncasatPos) + " nnrbon=" + TRANSFORM(loVechi.nnrbon) + ; " numere=" + StareToate() laVechi[i,1] = poDate.nr_incasare DO AplicaTermin WITH loVechi.opt_incasat.Value laVechi[i,2] = poDate.ntip_incasare laVechi[i,3] = ListaIncasare() laVechi[i,4] = "incasat=" + TRANSFORM(poDate.incasat) + "|card=" + TRANSFORM(poDate.incasatCARD) + ; "|tichete=" + TRANSFORM(poDate.incasatTichete) + "|casa=" + TRANSFORM(poDate.id_casa) DO AfLog WITH "vechi [" + lcNumeTip + "]: dupa emitere ntip_incasare=" + TRANSFORM(laVechi[i,2]) + ; " nr_incasare=" + TRANSFORM(laVechi[i,1]) + " campuri=" + laVechi[i,4] DO AfLog WITH "vechi [" + lcNumeTip + "]: lcListaIncasare=[" + laVechi[i,3] + "]" * dezaloca si readu campurile la starea de start, ca tipul urmator sa porneasca identic loVechi.opt_incasat.Value = 1 poDate.incasatCARD = lnStartCard poDate.incasatTichete = lnStartTichete DO AfLog WITH "vechi [" + lcNumeTip + "]: dezalocat, numere=" + StareToate() DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), ; "vechi [" + lcNumeTip + "] nimic alocat dupa comutarea inapoi pe Fara incasare (" + StareToate() + ")" ENDFOR loVechi.Release() RELEASE loVechi DO AfLog WITH "dupa Release loVechi: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ; " USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) poDate.incasat = lnStartIncasat poDate.incasatCARD = lnStartCard poDate.incasatTichete = lnStartTichete poDate.id_casa = lnStartCasa poDate.ntip_incasare = lnStartTipInc poDate.nr_incasare = lnStartNrInc poDate.nIncasatPos = lnStartPos DO AfLog WITH "poDate resetat inainte de faza 2: incasat=" + TRANSFORM(poDate.incasat) + ; " nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " numere=" + StareToate() * ---------- FAZA 2: calea noua - frm_facturare_articole2 ---------- DO AsiguraSaftTipFacturi loNou = CREATEOBJECT('frm_facturare_articole2') DO Assert WITH VARTYPE(loNou) = 'O', "Createobject frm_facturare_articole2 (calea noua)" IF VARTYPE(loNou) <> 'O' RETURN ENDIF loNou.Visible = .F. loNou.nnrbon = poDate.nract FOR i = 1 TO 4 lnTip = laTip[i] lcNumeTip = laNume[i] IF lnTip = 4 AND !glPOSDisponibil DO AfLog WITH "nou [" + lcNumeTip + "]: SARIT - nu exista plaje de serii pentru tipul 26 in acest mediu" LOOP ENDIF loNou.seteaza_mod_incasare(lnTip) DO Assert WITH loNou.nmod_incasare() = lnTip, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(" + TRANSFORM(lnTip) + ")" DO AfLog WITH "nou [" + lcNumeTip + "]: dupa opt_incasat.Value=" + TRANSFORM(lnTip) + ; " nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " incasat=" + TRANSFORM(poDate.incasat) + ; " incasatCARD=" + TRANSFORM(poDate.incasatCARD) + " id_casa=" + TRANSFORM(poDate.id_casa) + ; " nIncasatPos=" + TRANSFORM(poDate.nIncasatPos) + " nnrbon=" + TRANSFORM(loNou.nnrbon) + ; " numere=" + StareToate() laNou[i,1] = poDate.nr_incasare DO AplicaTermin WITH loNou.nmod_incasare() laNou[i,2] = poDate.ntip_incasare laNou[i,3] = ListaIncasare() laNou[i,4] = "incasat=" + TRANSFORM(poDate.incasat) + "|card=" + TRANSFORM(poDate.incasatCARD) + ; "|tichete=" + TRANSFORM(poDate.incasatTichete) + "|casa=" + TRANSFORM(poDate.id_casa) DO AfLog WITH "nou [" + lcNumeTip + "]: dupa emitere ntip_incasare=" + TRANSFORM(laNou[i,2]) + ; " nr_incasare=" + TRANSFORM(laNou[i,1]) + " campuri=" + laNou[i,4] DO AfLog WITH "nou [" + lcNumeTip + "]: lcListaIncasare=[" + laNou[i,3] + "]" DO Assert WITH laNou[i,1] = laVechi[i,1], "[" + lcNumeTip + "] poDate.nr_incasare identic (vechi=" + ; TRANSFORM(laVechi[i,1]) + " nou=" + TRANSFORM(laNou[i,1]) + ")" DO Assert WITH laNou[i,3] == laVechi[i,3], "[" + lcNumeTip + "] lcListaIncasare identic (vechi=[" + ; laVechi[i,3] + "] nou=[" + laNou[i,3] + "])" DO Assert WITH laNou[i,2] = laVechi[i,2], "[" + lcNumeTip + "] poDate.ntip_incasare identic (vechi=" + ; TRANSFORM(laVechi[i,2]) + " nou=" + TRANSFORM(laNou[i,2]) + ")" DO Assert WITH laNou[i,4] == laVechi[i,4], "[" + lcNumeTip + "] campurile care intra in lcListaIncasare identice (vechi=" + ; laVechi[i,4] + " nou=" + laNou[i,4] + ")" loNou.seteaza_mod_incasare(1) DO Assert WITH loNou.nmod_incasare() = 1, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(1) (dezalocare)" loNou.actualizeaza_tipincasare() poDate.incasatCARD = lnStartCard poDate.incasatTichete = lnStartTichete DO AfLog WITH "nou [" + lcNumeTip + "]: dezalocat, numere=" + StareToate() DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), ; "nou [" + lcNumeTip + "] nimic alocat dupa comutarea inapoi pe Fara incasare (" + StareToate() + ")" ENDFOR DO AfLog WITH "stare finala numere (asteptat nimic alocat): " + StareToate() DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), "nimic ramas alocat la finalul rularii" loNou.Release() RELEASE loNou ENDPROC * Pasul de emitere dinaintea lui do_scrie_factura, comun celor doua cai: * ferestre_cere_date.vc2:3067 + 3100-3104 (frm_alte_date.inainte_de_do_termin) * ofacturare.vc2:20673 + 20680-20683 (frm_facturare_articole2.inainte_de_do_termin) PROCEDURE AplicaTermin LPARAMETERS tnValoareOpt poDate.ntip_incasare = Iif(tnValoareOpt=2, 11, IIF(tnValoareOpt = 3, 2, IIF(tnValoareOpt = 4, 3, 0))) IF poDate.nIncasatPos = 1 poDate.incasatCARD = poDate.incasat poDate.incasat = 0 ENDIF ENDPROC * Replica blocului din do_scrie_factura. Corpul dintre marcaje e comparat ca text cu sursa * (ProbaTextSursa) - nu edita aici fara sa verifici sursa. FUNCTION ListaIncasare LOCAL lcListaIncasare lcListaIncasare = '' *--REPLICA-LISTA-START--* If Inlist(poDate.ntip_incasare, 11, 2, 3) Do Case Case poDate.ntip_incasare = 11 If poDate.incasat <> 0 lcListaIncasare = lcListaIncasare + ['11|] + Alltrim(Str(poDate.incasat,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] Endif Case poDate.ntip_incasare = 3 If poDate.incasatCARD <> 0 lcListaIncasare = lcListaIncasare + ['3|] + Alltrim(Str(poDate.incasatCARD,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] Endif Otherwise If poDate.incasat <> 0 lcListaIncasare = lcListaIncasare + ['2|] + Alltrim(Str(poDate.incasat,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] Endif If poDate.incasatCARD <> 0 lcListaIncasare = lcListaIncasare + ['3|] + Alltrim(Str(poDate.incasatCARD,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] Endif If poDate.incasatTichete <> 0 lcListaIncasare = lcListaIncasare + ['5|] + Alltrim(Str(poDate.incasatTichete,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] Endif Endcase If Empty(m.lcListaIncasare) lcListaIncasare = [NULL] Endif Else lcListaIncasare = [NULL] Endif *--REPLICA-LISTA-END--* RETURN lcListaIncasare ENDFUNC *===================================================================================== * Ajutoare de text *===================================================================================== * taie comentariul && , spatiile de la capete si tab-urile de indentare FUNCTION NormalizeazaLinie LPARAMETERS tcLinie LOCAL lcL, lnP * marcajul de comentariu se construieste din CHR(38): scris literal, compilatorul VFP il ia * drept inceput de comentariu si taie restul liniei, chiar si intre ghilimele lcL = CHRTRAN(tcLinie, CHR(9), " ") lnP = AT(CHR(38) + CHR(38), lcL) IF lnP > 0 lcL = LEFT(lcL, lnP - 1) ENDIF RETURN ALLTRIM(lcL) ENDFUNC * concateneaza tnCate linii din fisier incepand de la tnStart, normalizate si fara linii goale FUNCTION ExtrageBloc LPARAMETERS tcFisier, tnStart, tnCate LOCAL lcRez, i, lcL, lnCate LOCAL ARRAY laF[1] lcRez = "" lnCate = ALINES(laF, FILETOSTR(tcFisier), 0) FOR i = tnStart TO MIN(tnStart + tnCate - 1, lnCate) lcL = UPPER(NormalizeazaLinie(laF[i])) IF !EMPTY(lcL) lcRez = lcRez + lcL + CHR(10) ENDIF ENDFOR RETURN lcRez ENDFUNC * extrage din fisier liniile dintre cele doua marcaje, normalizate, fara linii goale FUNCTION ExtrageIntreMarcaje LPARAMETERS tcFisier, tcStart, tcStop LOCAL lcRez, i, lnCate, llIn, lcL LOCAL ARRAY laF[1] lcRez = "" llIn = .F. lnCate = ALINES(laF, FILETOSTR(tcFisier), 0) FOR i = 1 TO lnCate lcL = ALLTRIM(CHRTRAN(laF[i], CHR(9), " ")) IF lcL == tcStop EXIT ENDIF IF llIn lcL = UPPER(NormalizeazaLinie(laF[i])) IF !EMPTY(lcL) lcRez = lcRez + lcL + CHR(10) ENDIF ENDIF IF lcL == tcStart llIn = .T. ENDIF ENDFOR RETURN lcRez ENDFUNC * prima linie normalizata (majuscule) care contine tcFragment FUNCTION CautaLinie LPARAMETERS tcFisier, tcFragment LOCAL i, lnCate, lcL LOCAL ARRAY laF[1] lnCate = ALINES(laF, FILETOSTR(tcFisier), 0) FOR i = 1 TO lnCate lcL = UPPER(NormalizeazaLinie(laF[i])) IF tcFragment $ lcL RETURN lcL ENDIF ENDFOR RETURN "" ENDFUNC *===================================================================================== * Ajutoare de mediu, preluate din test_s3b_incasare_paritate_campuri.prg *===================================================================================== PROCEDURE AsiguraSaftTipFacturi * cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel la * instantiere (ofacturare.vc2:16157, ferestre_cere_date.vc2:2388). Structura copiata din * update_saft_tip_facturi (updateserver.prg:669-691), fara apel la server. 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 ENDPROC FUNCTION EsteAlocat LPARAMETERS tnTip LOCAL lcCursor IF poGeneratorNumere.paPlaje(tnTip, 6) lcCursor = poGeneratorNumere.paPlaje(tnTip, 8) IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor) RETURN .F. ENDIF RETURN RECCOUNT(lcCursor) > 0 ELSE RETURN poGeneratorNumere.paPlaje(tnTip, 1) <> 0 ENDIF ENDFUNC FUNCTION StareNumar LPARAMETERS tnTip LOCAL lcCursor, lnCount IF poGeneratorNumere.paPlaje(tnTip, 6) lcCursor = poGeneratorNumere.paPlaje(tnTip, 8) IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor) lnCount = 0 ELSE lnCount = RECCOUNT(lcCursor) ENDIF RETURN "buffer:" + TRANSFORM(lnCount) ELSE RETURN "array:" + TRANSFORM(poGeneratorNumere.paPlaje(tnTip, 1)) ENDIF ENDFUNC FUNCTION StareToate RETURN "3=" + StareNumar(3) + "|16=" + StareNumar(16) + "|26=" + StareNumar(26) ENDFUNC PROCEDURE ProbaSerii LPARAMETERS tnIdTipDoc LOCAL lnOk, laErr[1], i, lcSql PRIVATE pnIdTipDoc, pnRezultat pnIdTipDoc = tnIdTipDoc pnRezultat = 0 lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" FOR i = 1 TO 3 lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") IF lnOk > 0 DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) USE IN (SELECT("crsprobaserii")) EXIT ELSE AERROR(laErr) DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) ENDIF ENDFOR ENDPROC * cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce FUNCTION RanduriSerii LPARAMETERS tnIdTipDoc LOCAL lnOk, lnRanduri, lcSql LOCAL ARRAY laErr[1] PRIVATE pnIdTipDoc, pnRezultat pnIdTipDoc = tnIdTipDoc pnRezultat = 0 lnRanduri = -1 lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl") IF lnOk > 0 lnRanduri = RECCOUNT("crsprobapl") USE IN (SELECT("crsprobapl")) ELSE AERROR(laErr) DO AfLog WITH "pre-proba plaje tip " + TRANSFORM(tnIdTipDoc) + " ESEC: " + TRANSFORM(laErr[2]) ENDIF RETURN lnRanduri ENDFUNC PROCEDURE Assert LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 DO AfLog WITH "PASS: " + tcMsg ELSE gnFail = gnFail + 1 DO AfLog WITH "FAIL: " + tcMsg ENDIF ENDPROC PROCEDURE AfLog LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE AfErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine gnFail = gnFail + 1 * plafon de scriere: o eroare intr-o bucla peste liniile unui .vc2 a produs un log de 3 MB IF gnFail <= 200 DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg ENDIF IF gnFail = 201 DO AfLog WITH "ERROR: peste 200 de erori, restul nu se mai scriu in log" ENDIF ENDPROC PROCEDURE Final DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) DO AfLog WITH "END " + TTOC(DATETIME()) QUIT ENDPROC