#13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2. Clase: ofacturare (nucleul formularului unificat), ofacturare_comun, ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de cautare), omodificari. Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie si cota standard de TVA cand articolul nu are cota pe politica. Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte proiecte sunt rezolvate pastrand ambele parti. Loguri de rulare a testelor scoase din versionare; testele raman. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
This commit is contained in:
301
utile/Teste/editare_factura/probe_s13b_batchmode_direct.prg
Normal file
301
utile/Teste/editare_factura/probe_s13b_batchmode_direct.prg
Normal file
@@ -0,0 +1,301 @@
|
||||
* 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, '<NU E SIR>')
|
||||
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
|
||||
Reference in New Issue
Block a user