* test_s5c_legatura_sql.prg * Headless (-A -T): S5c, contractul Oracle al legaturii proforma -> factura, izolat de UI. * Ruleaza EXACT blocul anonim pe care il trimite scrie_legatura_proforma() (ofacturare_comun.prg): * begin pack_facturare.nid_vanzare := ; pack_facturare.clistaid := ''; * pack_facturare.scrie_corespondente_vanzari(4); end; * B1 - numaratoarea initiala a randurilor TIP = 4 din VANZARI_CORESP * B2 - alege o proforma reala si o factura reala fara corespondente (daca nu exista, SARIT) * B3 - blocul anonim, in tranzactie MANUALA * B4 - randul TIP = 4 factura -> proforma exista si e unic * B5 - efectul colateral masurat: VANZARI.AVIZE al facturii contine seria+numarul proformei * B6 - ROLLBACK; numaratoarea TIP = 4 revine la valoarea de la B1 (testul nu lasa date in urma) * * Nu emite documente si nu consuma numere. Toate scrierile sunt anulate de ROLLBACK-ul de la B6; * Final() mai face un rollback defensiv si readuce conexiunea pe tranzactie automata. * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5c_legatura_sql.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_legatura_sql.log * Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8. SET SAFETY OFF SET TALK OFF SET NOTIFY OFF PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz, gnH, glManual gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_legatura_sql.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 gnSarit = 0 gcCaz = "" glManual = .F. 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 SQLSETPROP(gnHandle, "QueryTimeOut", 45) IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45) ENDIF PUBLIC gcMockUltimMesaj, gnMockUltimTip gcMockUltimMesaj = "" gnMockUltimTip = 0 IF !actualizeaza_optiuni_program() DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" DO Final ENDIF gnIdUtil = 8 goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) * toate scrierile si toate citirile trec prin goExecutor -> tranzactia se deschide pe handle-ul LUI, * altfel ROLLBACK-ul de la B6 ar anula alta sesiune decat cea care a scris gnH = IIF(TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0, goExecutor.nHandle, gnHandle) DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + " goExecutor.nHandle=" + TRANSFORM(gnH) DO TestLegaturaTip4 DO Final *---------------------------------------------------------------------------------------- PROCEDURE TestLegaturaTip4 LOCAL lnInainte, lnProf, lnFact, lnDupaInsert, lnAvize, lnDupaRollback, lnSucces gcCaz = "[B legatura TIP = 4 pe contractul Oracle] " * B1 lnInainte = ValoareScalara([select count(*) as nr from vanzari_coresp where tip = 4]) DO Assert WITH lnInainte >= 0, "B1 numaratoare initiala TIP = 4 citita, e=" + TRANSFORM(lnInainte) IF lnInainte < 0 RETURN ENDIF DO AfLog WITH "B1: vanzari_coresp tip=4 inainte = " + TRANSFORM(lnInainte) * B2 - nu se inventeaza date: fara proforma sau fara factura libera, pasul e SARIT lnProf = ValoareScalara([select id_vanzare as nr from (select id_vanzare from vanzari ] + ; [where sters = 0 and nvl(eproforma,0) = 1 order by id_vanzare desc) where rownum = 1]) lnFact = ValoareScalara([select id_vanzare as nr from (select v.id_vanzare from vanzari v ] + ; [where v.sters = 0 and nvl(v.eproforma,0) = 0 and v.tip in (1,5,7,10) ] + ; [and not exists (select 1 from vanzari_coresp c where c.id_vanzare_fact = v.id_vanzare) ] + ; [order by v.id_vanzare desc) where rownum = 1]) DO AfLog WITH "B2: lnProf=" + TRANSFORM(lnProf) + " lnFact=" + TRANSFORM(lnFact) IF lnProf <= 0 OR lnFact <= 0 DO AfLog WITH "SARIT - " + gcCaz + "nu exista in MARIUSM_AUTO o proforma (lnProf=" + TRANSFORM(lnProf) + ; ") si/sau o factura fara corespondente (lnFact=" + TRANSFORM(lnFact) + ")" gnSarit = gnSarit + 1 RETURN ENDIF * tranzactie manuala pe handle-ul lui goExecutor - acelasi tipar ca do_deschide_tranzactie goExecutor.oExecuta([select * from dual]) lnSucces = SQLSETPROP(gnH, "Transactions", 2) IF lnSucces < 0 DO Assert WITH .F., "trecerea pe tranzactie manuala a esuat - testul NU se ruleaza (ar lasa date)" RETURN ENDIF glManual = .T. DO AfLog WITH "tranzactie MANUALA deschisa pe handle " + TRANSFORM(gnH) * B3 - blocul anonim, identic cu cel construit de scrie_legatura_proforma() lnSucces = goExecutor.oExecute([begin pack_facturare.nid_vanzare := ] + ALLTRIM(STR(lnFact, 20, 0)) + [;] + ; [ pack_facturare.clistaid := '] + ALLTRIM(STR(lnProf, 20, 0)) + [';] + ; [ pack_facturare.scrie_corespondente_vanzari(4); end;]) DO Assert WITH lnSucces >= 0, "B3 blocul anonim s-a executat fara eroare Oracle, succes=" + TRANSFORM(lnSucces) + ; " eroare=" + IIF(lnSucces < 0, TRANSFORM(goExecutor.cEroare), "") IF lnSucces < 0 DO FaRollback RETURN ENDIF * B4 lnDupaInsert = ValoareScalara([select count(*) as nr from vanzari_coresp where sters = 0 and tip = 4 ] + ; [and id_vanzare_fact = ] + ALLTRIM(STR(lnFact, 20, 0)) + ; [ and id_vanzare_aviz = ] + ALLTRIM(STR(lnProf, 20, 0))) DO Assert WITH lnDupaInsert = 1, "B4 exact un rand TIP = 4 factura -> proforma, e=" + TRANSFORM(lnDupaInsert) DO AfLog WITH "B4: randuri tip=4 fact=" + TRANSFORM(lnFact) + " aviz=" + TRANSFORM(lnProf) + " -> " + TRANSFORM(lnDupaInsert) * B5 - efectul colateral din 1.5, masurat nu presupus: comparatia se face in SQL, ca sa nu depinda * de formatarea numarului in VFP lnAvize = ValoareScalara([select count(*) as nr from vanzari f where f.id_vanzare = ] + ALLTRIM(STR(lnFact, 20, 0)) + ; [ and f.avize like '%' || (select nvl(p.serie_act,'') || chr(32) || p.numar_act from vanzari p ] + ; [where p.id_vanzare = ] + ALLTRIM(STR(lnProf, 20, 0)) + [) || '%']) DO Assert WITH lnAvize = 1, "B5 VANZARI.AVIZE al facturii contine seria+numarul proformei (efect colateral cunoscut), e=" + ; TRANSFORM(lnAvize) DO AfLog WITH "B5: VANZARI.AVIZE contine seria+numarul proformei -> " + TRANSFORM(lnAvize) * B6 DO FaRollback lnDupaRollback = ValoareScalara([select count(*) as nr from vanzari_coresp where tip = 4]) DO Assert WITH lnDupaRollback = lnInainte, ; "B6 dupa ROLLBACK numaratoarea TIP = 4 revine la valoarea initiala, inainte=" + TRANSFORM(lnInainte) + ; " dupa=" + TRANSFORM(lnDupaRollback) DO AfLog WITH "B6: vanzari_coresp tip=4 dupa rollback = " + TRANSFORM(lnDupaRollback) ENDPROC PROCEDURE FaRollback LOCAL lnSucces IF !glManual RETURN ENDIF lnSucces = SQLROLLBACK(gnH) DO AfLog WITH "ROLLBACK succes=" + TRANSFORM(lnSucces) SQLSETPROP(gnH, "Transactions", 1) glManual = .F. ENDPROC FUNCTION ValoareScalara LPARAMETERS tcSql LOCAL lnRez, lnSucces lnRez = -1 lnSucces = goExecutor.oExecute(tcSql, [crsscalar]) IF lnSucces >= 0 AND USED('crsscalar') IF RECCOUNT('crsscalar') > 0 SELECT crsscalar GO TOP lnRez = NVL(crsscalar.nr, 0) ELSE lnRez = 0 ENDIF USE IN (SELECT('crsscalar')) ELSE DO AfLog WITH "SQL ESEC: " + TRANSFORM(goExecutor.cEroare) + " | " + tcSql ENDIF RETURN lnRez ENDFUNC PROCEDURE Assert LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 ELSE gnFail = gnFail + 1 DO AfLog WITH "FAIL: " + gcCaz + 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 DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg ENDPROC PROCEDURE Final * rollback defensiv: daca testul a cazut in mijloc, nimic nu ramane scris IF glManual DO AfLog WITH "rollback defensiv (tranzactia era inca deschisa)" DO FaRollback ENDIF DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit) DO AfLog WITH "END " + TTOC(DATETIME()) QUIT ENDPROC