* probe_s13b_batchmode_direct.prg * Ultima verificare ceruta de docs/diagnostic_contract_too_many_columns.md (sectiunea Necunoscut): * statement-ul #15 ({call pack_facturare.scrie_factura2(...)}, ofacturare.vc2:20307-20328) executat * DIRECT dupa statement-ul #14, cu BatchMode ramas .T. (neschimbat) si FARA diagnosticele D1-D7 * intercalate - spre deosebire de probe_s13_toomanycolumns.prg, care la #15 devia intai prin * MasoaraResultSets (D1-D7, apoi comuta pe BatchMode=.F.). * * Nu modifica niciun fisier de productie. Nu face COMMIT. La final verifica cascada documentului * 360 (VANZARI, VANZARI_DETALII, DOCUMENTE, ACT x2, CTR_RATE_FACTURI). SET SAFETY OFF SET TALK OFF PUBLIC gcErrLog PUBLIC poDate, poSnapshotEditare, goFormReemitere gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13b_batchmode_direct_log_' + ; STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13B-DIRECT doc=360 perioada=2009/4' + CHR(13) + CHR(10), gcErrLog) ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0 IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) QUIT ENDIF gnIdUtil = 8 SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE *!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul LOCAL lcProcExistent lcProcExistent = SET("PROCEDURE") SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent LOCAL lcPathVechi, lcPathNou lcPathVechi = SET("PATH") lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi SET PATH TO &lcPathNou PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip gnMockRaspuns = 7 gcMockUltimMesaj = '' gnMockUltimTip = 0 STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) DO Probeaza STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) QUIT *============================================================================================== PROCEDURE Probeaza LOCAL loForm, lnDiscRon, lnDiscVal, lnIdV, lnRuta, llRez, loSpy, loReal lnIdV = 360 DO StareCascada WITH 'INAINTE' lnDiscRon = 0 lnDiscVal = 0 poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal) IF VARTYPE(poDate) <> 'O' STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1) RETURN ENDIF IncarcaLiniiFacturaEditare(poDate, lnIdV) IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1) RETURN ENDIF update_jtva_coloane([JV], [jtva_coloane_temp]) update_saft_taxtable() IF USED('jtva_coloane') USE IN jtva_coloane ENDIF 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 loForm = CREATEOBJECT('frm_facturare_articole2') loForm.ndiscfactron = lnDiscRon loForm.ndiscfactval = lnDiscVal loForm.do_calculeaza_totaluri() poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ; lnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), ; Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), gnAn, gnLuna) IF VARTYPE(poSnapshotEditare) <> 'O' STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1) RETURN ENDIF SELECT crsfactura GO TOP REPLACE cantitate WITH cantitate + 1 IN crsfactura loForm.do_calculeaza_totaluri() lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') STRTOFILE('ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1) loReal = goExecutor loSpy = CREATEOBJECT('SpyS13Direct') loSpy.nHandle = gnHandle goExecutor = loSpy STRTOFILE('BatchMode inainte de do_scrie_factura = ' + TRANSFORM(SQLGetProp(gnHandle, 'BatchMode')) + CHR(13) + CHR(10), gcErrLog, 1) STRTOFILE('--- INCEPE do_scrie_factura, statementele urmeaza in ordine ---' + CHR(13) + CHR(10), gcErrLog, 1) llRez = loForm.do_scrie_factura() STRTOFILE('--- do_scrie_factura a intors ' + TRANSFORM(llRez) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1) goExecutor = loReal STRTOFILE('statemente capturate: ' + TRANSFORM(loSpy.nIdx) + ' #15 interceptat=' + TRANSFORM(loSpy.lInterceptat15) + CHR(13) + CHR(10), gcErrLog, 1) STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) SQLROLLBACK(gnHandle) SQLSetProp(gnHandle, 'Transactions', 1) DO StareCascada WITH 'DUPA' ENDPROC *============================================================================================== PROCEDURE StareCascada LPARAMETERS tcEticheta LOCAL lnIdFact lnIdFact = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = 360]) STRTOFILE(tcEticheta + ' GLOBAL: max_id_vanzare=' + TRANSFORM(Val1([select nvl(max(id_vanzare),0) as v from vanzari])) + ; ' count_vanzari=' + TRANSFORM(Val1([select count(*) as v from vanzari])) + ; ' max_numar_act_SSS=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where serie_act = 'SSS'])) + ; ' max_numar_act_serie360=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where nvl(serie_act,'@') = (select nvl(serie_act,'@') from vanzari where id_vanzare = 360)])) + ; CHR(13) + CHR(10), gcErrLog, 1) STRTOFILE(tcEticheta + ' CASCADA 360: vanzari.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 360])) + ; ' id_fact=' + TRANSFORM(lnIdFact) + ; ' vanzari_detalii_vii=' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii where id_vanzare = 360 and sters = 0])) + ; ' documente.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from documente where id_doc = ] + TRANSFORM(lnIdFact))) + ; ' act_vii=' + TRANSFORM(Val1([select count(*) as v from act where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ; ' ctr_rate_facturi_vii=' + TRANSFORM(Val1([select count(*) as v from ctr_rate_facturi where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ; CHR(13) + CHR(10), gcErrLog, 1) ENDPROC *============================================================================================== * LogCursoareCumulativ: la BatchMode=.T., un singur SQLExec pe un statement cu mai multe result * set-uri le materializeaza direct in tcCursor, tcCursor1, tcCursor2, ... (fara SQLMoreResults). * Numara coloanele PE FIECARE si intoarce totalul cumulat - ipoteza de testat e ca VFP insumeaza * coloanele tuturor cursoarelor batch-ului, nu doar pe ale celui mai lat. *============================================================================================== FUNCTION LogCursoareCumulativ LPARAMETERS tcCursor, tcMoment LOCAL lnJ, lcN, laF[1], lnF, lnTotalCampuri lnTotalCampuri = 0 FOR lnJ = 0 TO 8 lcN = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ)) IF USED(lcN) lnF = AFIELDS(laF, lcN) lnTotalCampuri = lnTotalCampuri + lnF STRTOFILE(' [' + tcMoment + '] cursor ' + lcN + ': ' + TRANSFORM(lnF) + ' coloane, ' + ; TRANSFORM(RECCOUNT(lcN)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) ENDIF ENDFOR STRTOFILE(' [' + tcMoment + '] TOTAL CUMULAT coloane (toate sub-cursoarele batch-ului) = ' + ; TRANSFORM(lnTotalCampuri) + CHR(13) + CHR(10), gcErrLog, 1) RETURN lnTotalCampuri ENDFUNC PROCEDURE bat LPARAMETERS tcPas STRTOFILE('BAT ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1) ENDPROC FUNCTION Val1 LPARAMETERS tcSql LOCAL lnRet lnRet = -1 IF USED('v_val97b') USE IN v_val97b ENDIF IF goExecutor.oExecuta(tcSql, 'v_val97b') SELECT v_val97b IF RECCOUNT('v_val97b') > 0 GO TOP lnRet = NVL(v_val97b.v, -1) ENDIF USE IN v_val97b ENDIF RETURN lnRet ENDFUNC PROCEDURE test_error_handler LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo STRTOFILE('EROARE NEPRINSA ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) IF TYPE('gnHandle') = 'N' AND gnHandle > 0 SQLROLLBACK(gnHandle) SQLSetProp(gnHandle, 'Transactions', 1) ENDIF STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) QUIT ENDPROC *============================================================================================== * SpyS13Direct: subclasa a lui oexecutor, identica cu SpyS13 (probe_s13_toomanycolumns.prg) pentru * toate statementele - DODEFAULT, acelasi PCOUNT. Diferenta e DOAR la statement-ul #15 * (continut = 'scrie_factura2'): aici NU devia prin diagnostice (D1-D7) si NU schimba BatchMode - * face SQLExec() direct, cu BatchMode ramas asa cum e (implicit .T.), si prinde exceptia integral. *============================================================================================== DEFINE CLASS SpyS13Direct AS oexecutor nIdx = 0 lInterceptat15 = .F. PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect) LOCAL lnI, lnRet, loEx, lcS, lcC, lnPc, lnR, laE[1], lnJ, lnTotalCol THIS.nIdx = THIS.nIdx + 1 lnI = THIS.nIdx lnPc = PCOUNT() lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '') lcC = IIF(VARTYPE(m.tcCursor) = 'C', m.tcCursor, '') STRTOFILE('#' + TRANSFORM(lnI) + ' pcount=' + TRANSFORM(lnPc) + ' cursor=[' + lcC + ']' + ; ' BatchMode=' + TRANSFORM(SQLGetProp(THIS.nHandle, 'BatchMode')) + CHR(13) + CHR(10) + ; ' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcErrLog, 1) IF 'scrie_factura2' $ lcS THIS.lInterceptat15 = .T. STRTOFILE(' *** statement #15: SQLExec DIRECT, fara D1-D7, BatchMode neschimbat ***' + CHR(13) + CHR(10), gcErrLog, 1) IF USED(lcC) USE IN (lcC) ENDIF TRY lnR = SQLExec(THIS.nHandle, m.tcSql, m.tcCursor) STRTOFILE(' SQLExec ret=' + TRANSFORM(lnR) + CHR(13) + CHR(10), gcErrLog, 1) IF lnR < 0 STRTOFILE(' ret<0 FARA exceptie VFP - eroare SQL normala, nu 1872.' + CHR(13) + CHR(10), gcErrLog, 1) IF AERROR(laE) > 0 FOR lnJ = 1 TO ALEN(laE, 2) STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1) ENDFOR ENDIF ENDIF lnTotalCol = LogCursoareCumulativ(lcC, 'dupa SQLExec #15 direct') STRTOFILE(' NU s-a reprodus 1872 - statement #15 a reusit direct (fara eroare 1872).' + CHR(13) + CHR(10), gcErrLog, 1) CATCH TO loEx STRTOFILE(' S-A REPRODUS: EXCEPTIE la statement #15 direct: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ; ' Message=[' + TRANSFORM(loEx.Message) + '] Procedure=' + TRANSFORM(loEx.Procedure) + ; ' LineNo=' + TRANSFORM(loEx.Lineno) + CHR(13) + CHR(10), gcErrLog, 1) IF AERROR(laE) > 0 FOR lnJ = 1 TO ALEN(laE, 2) STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1) ENDFOR ENDIF ENDTRY THIS.cEroare = 'SpyS13Direct: statement #15 masurat direct' RETURN -1 ENDIF lnRet = -1 TRY DO CASE CASE lnPc <= 1 lnRet = DODEFAULT(m.tcSql) CASE lnPc = 2 lnRet = DODEFAULT(m.tcSql, m.tcCursor) CASE lnPc = 3 lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress) CASE lnPc = 4 lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress) CASE lnPc = 5 lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle) CASE lnPc = 6 lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError) CASE lnPc = 7 lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError) OTHERWISE lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect) ENDCASE STRTOFILE(' -> ret=' + TRANSFORM(lnRet) + IIF(lnRet < 0, ' EROARE=[' + THIS.cEroare + ']', '') + CHR(13) + CHR(10), gcErrLog, 1) CATCH TO loEx STRTOFILE(' -> EXCEPTIE VFP la statement #' + TRANSFORM(lnI) + ; ': ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1) lnRet = -1 THIS.cEroare = 'SpyS13Direct: ' + TRANSFORM(loEx.Message) ENDTRY RETURN lnRet ENDPROC FUNCTION oPrelucrareEroare RETURN 'SpyS13Direct: ' + TRANSFORM(THIS.cEroare) ENDFUNC ENDDEFINE