Cache ANAF: verificarea in masa a codurilor fiscale, pe transe (SVN r17935)

Verificarea "in masa" (VerificaListaCIF ... 'MASA') pica pe ORA-01795 peste 1000
de coduri, iar esecul trimitea tot lotul la ANAF, cu pauze de o secunda la fiecare
100 de coduri. Pe langa asta, fiecare rand servit din cache era salvat inapoi in
istoric si logat separat.

- programe/validare.prg: CitesteIstoricPentruCoduri citeste pe transe de maxim
  1000 de coduri legate cu OR in aceeasi interogare (fara obiecte noi in baza,
  compatibil cu Oracle 10g); plasa de siguranta cere codurile neacoperite o
  singura data, nu cod cu cod; SalveazaIstoricDinCursor sare peste randurile cu
  sursa CACHE*; bucla de log per rand devine o singura linie cu totalul.
- clase/overificari.vc2: completarea tabelului de parteneri foloseste index pe
  codul normalizat si SEEK in loc de LOCATE cu UDF (era patratic).
- utile/Teste/cache_anaf/: harness-uri de masurare si non-regresie pentru
  timpii de mai jos.

Masurat pe MARIUSM_AUTO, cu ANAF blocat: 1000 de coduri 5,1 s -> 0,318 s;
1001 coduri 16,6 s cu ORA-01795 -> 0,553 s fara eroare; 3000 de coduri 1,565 s;
200 de coduri din cache 3,93 s -> 0,05 s, cu 0 randuri noi in istoric;
completarea tabelului pentru 2000 de parteneri 11,97 s -> 0,028 s.
Randurile intoarse si verdictele raman identice.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JCzVWfqscv1xyo5uvJiWiW
This commit is contained in:
2026-08-02 07:27:42 +03:00
parent 4342aae78c
commit 5c8a201438
8 changed files with 2043 additions and 15 deletions

View File

@@ -0,0 +1,483 @@
* test_timp_verificare_masa.prg - masoara UNDE se duce timpul la verificarea in masa a
* codurilor fiscale cand raspunsul vine din cache (ISTORIC_CODURI_FISCALE), nu de la ANAF.
*
* Traseul masurat: VerificareANAF.VerificaListaCIF(..., 'MASA') din COMUN\programe\validare.prg,
* apelat de frm_verificare_parteneri.do_verifica (COMUN\clase\overificari.vc2:2736) si de
* orapoarte.prg:1997.
*
* ANAF-ul REAL nu e apelat niciodata: subclasa VerificareANAFTimp (finalul fisierului) blocheaza
* ANAF_SincronWebService_PlatitorTva si numara apelurile, deci tot ce se masoara e cost local
* (Oracle + VFP), nu latenta serviciului ANAF.
*
* Ce masoara, in ordine:
* A. rulare completa VerificaListaCIF pe N coduri proaspete in cache (implicit N=200)
* B. descompunerea pe faze a aceleiasi rulari (OrdineCache, ZileCache, NormalizeazaCoduriCursor,
* CitesteIstoricPentruCoduri, bucla de Locate, SalveazaIstoricDinCursor, bucla de goLog)
* C. costul brut al unui apel Oracle prin goExecutor (cu si fara scriere in goLog)
* D. limita IN (...) din CitesteIstoricPentruCoduri: lista de coduri se pune inline in SQL,
* deci peste 1000 de coduri Oracle da ORA-01795
* E. bucla de completare din apelant (overificari.vc2:2741-2756): LOCATE cu UDF per rand,
* comparata cu aceeasi completare pe cursor indexat
*
* Rulare: vfp9.exe -A -T "...\test_timp_verificare_masa.prg" [N]
* Log: test_timp_verificare_masa_log.txt (langa script)
* Curatenie: randurile scrise in ISTORIC_CODURI_FISCALE peste watermark-ul de ID se sterg la final.
LPARAMETERS tcN
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcTestLog, gnApeluriANAF, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcTestLog = "D:\ROA\ROACONT\COMUN\utile\Teste\cache_anaf\test_timp_verificare_masa_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcTestLog)
gnApeluriANAF = 0
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
ON ERROR DO ErrTimp WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO WrLog WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT
ENDIF
DO WrLog WITH 'mediu OK, schema=' + gcS
* mock-ul de amessagebox se incarca ULTIMUL (dialogurile modale ar bloca rularea headless)
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
* mock_amessagebox NU acopera apelul de amessagebox din oexecutor.oExecuta: VFP rezolva intai
* in fisierul de proceduri curent (oproceduri_comune.prg), iar acolo amessagebox deschide un
* FORMULAR modal (MessageBox.vcx), invizibil in enumerarea ferestrelor - headless blocheaza
* procesul la nesfarsit. Sectiunea D provoaca intentionat ORA-01795, deci executorul trebuie
* sa fie unul care nu deschide dialogul.
PUBLIC gnErorriSQL, gcUltimaEroareSQL
gnErorriSQL = 0
gcUltimaEroareSQL = ''
LOCAL loExecFaraDialog
loExecFaraDialog = CREATEOBJECT('oexec_fara_dialog_t')
loExecFaraDialog.nHandle = gnHandle
goExecutor = loExecFaraDialog
LOCAL lnN, lnI, lnT, lcSql, lcLista, lnRandInit, lnRandFinal
lnN = IIF(TYPE('tcN') = 'C' AND !EMPTY(tcN), INT(VAL(tcN)), 200)
DO WrLog WITH 'N cerut = ' + TRANSFORM(lnN)
* goLog scrie doar daca fisierul de log EXISTA (log_mesaje.prg:54) - in productie exista,
* deci il cream, ca masuratoarea sa includa costul real de logare
PUBLIC gcLogApp
gcLogApp = "D:\ROA\ROACONT\COMUN\utile\Teste\cache_anaf\test_timp_log_app.txt"
STRTOFILE('', gcLogApp)
goLog.cLogFile = gcLogApp
* --- watermark ID, inainte de orice scriere ---
PUBLIC gnIdMaxIstoric
gnIdMaxIstoric = 0
IF goExecutor.oExecuta('SELECT NVL(MAX(ID),0) AS IDMAX FROM ISTORIC_CODURI_FISCALE', 'crsWmT')
SELECT crsWmT
GO TOP
gnIdMaxIstoric = IDMAX
USE IN (SELECT('crsWmT'))
ENDIF
DO WrLog WITH 'watermark ISTORIC_CODURI_FISCALE id_max=' + TRANSFORM(gnIdMaxIstoric)
IF gnIdMaxIstoric <= 0
DO WrLog WITH 'ATENTIE: watermark invalid - curatenia finala se va sari'
ENDIF
LOCAL loVer, lnZile
loVer = CREATEOBJECT('VerificareANAFTimp')
lnZile = loVer.ZileCache()
DO WrLog WITH 'ZileCache = ' + TRANSFORM(lnZile)
* --- context: cat de mare e istoricul, cate coduri sunt proaspete ---
IF goExecutor.oExecuta('SELECT COUNT(*) AS N FROM ISTORIC_CODURI_FISCALE', 'crsCtx1')
DO WrLog WITH 'randuri in ISTORIC_CODURI_FISCALE: ' + TRANSFORM(crsCtx1.N)
USE IN (SELECT('crsCtx1'))
ENDIF
lcSql = 'SELECT COUNT(DISTINCT COD_FISCAL_N) AS N FROM ISTORIC_CODURI_FISCALE'
lcSql = lcSql + ' WHERE DATAORAV_ANAF IS NOT NULL AND SYSDATE - DATAORAV_ANAF <= ' + TRANSFORM(lnZile)
IF goExecutor.oExecuta(lcSql, 'crsCtx2')
DO WrLog WITH 'coduri proaspete in cache (<= ' + TRANSFORM(lnZile) + ' zile): ' + TRANSFORM(crsCtx2.N)
USE IN (SELECT('crsCtx2'))
ENDIF
* --- lotul de test: coduri PROASPETE din cache, ca sa nu se ajunga la ANAF ---
lcSql = 'SELECT COD_FISCAL_N FROM (SELECT DISTINCT COD_FISCAL_N FROM ISTORIC_CODURI_FISCALE'
lcSql = lcSql + ' WHERE COD_FISCAL_N IS NOT NULL AND DATAORAV_ANAF IS NOT NULL'
lcSql = lcSql + ' AND SYSDATE - DATAORAV_ANAF <= ' + TRANSFORM(lnZile)
lcSql = lcSql + ' ORDER BY COD_FISCAL_N) WHERE ROWNUM <= ' + TRANSFORM(lnN)
IF !goExecutor.oExecuta(lcSql, 'crsCoduriSursa')
DO WrLog WITH 'EROARE: nu pot citi codurile din istoric - GATA'
QUIT
ENDIF
IF USED('cCoduriMasa')
USE IN cCoduriMasa
ENDIF
CREATE CURSOR cCoduriMasa (cod_fiscal C(30) NULL, data D NULL)
SELECT crsCoduriSursa
SCAN
INSERT INTO cCoduriMasa (cod_fiscal, data) VALUES (ALLTRIM(TRANSFORM(crsCoduriSursa.COD_FISCAL_N)), DATE())
SELECT crsCoduriSursa
ENDSCAN
USE IN (SELECT('crsCoduriSursa'))
lnN = RECCOUNT('cCoduriMasa')
DO WrLog WITH '--- lot efectiv: ' + TRANSFORM(lnN) + ' coduri proaspete'
IF lnN = 0
DO WrLog WITH 'EROARE: niciun cod proaspat in cache - GATA'
QUIT
ENDIF
*==========================================================
* A. rulare completa VerificaListaCIF (traseu MASA = CACHE,ANAF)
*==========================================================
DO WrLog WITH ''
DO WrLog WITH '=== A. VerificaListaCIF complet, ' + TRANSFORM(lnN) + ' coduri ==='
gnApeluriANAF = 0
lnRandInit = NrRanduriIstoric()
lnT = SECONDS()
LOCAL lcRez
lcRez = loVer.VerificaListaCIF('cCoduriMasa', DATE(), 'crsANAFTest', 'MASA')
lnT = SECONDS() - lnT
lnRandFinal = NrRanduriIstoric()
DO WrLog WITH 'TOTAL VerificaListaCIF = ' + TRANSFORM(ROUND(lnT, 3)) + ' s pentru ' + TRANSFORM(lnN) + ' coduri'
DO WrLog WITH ' = ' + TRANSFORM(ROUND(lnT / MAX(lnN, 1) * 1000, 2)) + ' ms/cod'
DO WrLog WITH 'randuri intoarse: ' + TRANSFORM(IIF(USED('crsANAFTest'), RECCOUNT('crsANAFTest'), 0))
DO WrLog WITH 'apeluri ANAF (blocate de subclasa): ' + TRANSFORM(gnApeluriANAF)
DO WrLog WITH 'randuri NOI in ISTORIC_CODURI_FISCALE dupa rulare: ' + TRANSFORM(lnRandFinal - lnRandInit)
IF USED('crsANAFTest')
SELECT sursa, COUNT(*) AS nr FROM crsANAFTest GROUP BY sursa INTO CURSOR crsSurse
SELECT crsSurse
SCAN
DO WrLog WITH ' sursa [' + ALLTRIM(NVL(crsSurse.sursa, '')) + '] = ' + TRANSFORM(crsSurse.nr)
SELECT crsSurse
ENDSCAN
USE IN (SELECT('crsSurse'))
ENDIF
*==========================================================
* B. descompunere pe faze
*==========================================================
DO WrLog WITH ''
DO WrLog WITH '=== B. descompunere pe faze ==='
LOCAL loVerB, lcAliasNorm, lnCui, lcCod, ldData, llGasit, lnFaraRasp
loVerB = CREATEOBJECT('VerificareANAFTimp')
lnT = SECONDS()
LOCAL lcOrdine
lcOrdine = loVerB.OrdineCacheReal('MASA')
DO WrLog WITH 'B1 OrdineCache(MASA) = ' + TRANSFORM(ROUND(SECONDS() - lnT, 3)) + ' s -> ' + lcOrdine
lnT = SECONDS()
=loVerB.ZileCache()
DO WrLog WITH 'B2 ZileCache = ' + TRANSFORM(ROUND(SECONDS() - lnT, 3)) + ' s'
lnT = SECONDS()
lcAliasNorm = loVerB.NormalizeazaCoduriCursor('cCoduriMasa', DATE())
DO WrLog WITH 'B3 NormalizeazaCoduriCursor = ' + TRANSFORM(ROUND(SECONDS() - lnT, 3)) + ' s'
lnT = SECONDS()
lcLista = ''
SELECT (lcAliasNorm)
SCAN FOR cui_n <> 0
lcLista = lcLista + IIF(EMPTY(lcLista), '', ',') + ALLTRIM(STR(cui_n))
SELECT (lcAliasNorm)
ENDSCAN
DO WrLog WITH 'B4 construire lista coduri = ' + TRANSFORM(ROUND(SECONDS() - lnT, 3)) + ' s'
IF USED('crsFazaB')
USE IN crsFazaB
ENDIF
lnT = SECONDS()
=loVerB.CitesteIstoricPentruCoduri(lcLista, DATE(), 'crsFazaB', 'CACHE')
DO WrLog WITH 'B5 CitesteIstoricPentruCoduri (1 interogare) = ' + TRANSFORM(ROUND(SECONDS() - lnT, 3)) + ' s'
DO WrLog WITH ' randuri din cache: ' + TRANSFORM(IIF(USED('crsFazaB'), RECCOUNT('crsFazaB'), 0))
* bucla de Locate care alege codurile ramase (validare.prg:1939-1954)
lnT = SECONDS()
lnFaraRasp = 0
SELECT (lcAliasNorm)
SCAN
lnCui = cui_n
llGasit = .F.
IF lnCui <> 0 AND USED('crsFazaB') AND RECCOUNT('crsFazaB') > 0
SELECT crsFazaB
LOCATE FOR cui = lnCui
llGasit = FOUND()
ENDIF
IF !llGasit
lnFaraRasp = lnFaraRasp + 1
ENDIF
SELECT (lcAliasNorm)
ENDSCAN
DO WrLog WITH 'B6 bucla Locate (2 treceri in cod real) = ' + TRANSFORM(ROUND(SECONDS() - lnT, 3)) + ' s'
DO WrLog WITH ' coduri neacoperite de cache: ' + TRANSFORM(lnFaraRasp)
lnT = SECONDS()
LOCAL lnSalvate
lnSalvate = loVerB.SalveazaIstoricDinCursor('crsFazaB', gnIdUtil)
lnT = SECONDS() - lnT
DO WrLog WITH 'B7 SalveazaIstoricDinCursor = ' + TRANSFORM(ROUND(lnT, 3)) + ' s pentru ' + TRANSFORM(lnSalvate) + ' randuri'
DO WrLog WITH ' = ' + TRANSFORM(ROUND(lnT / MAX(lnSalvate, 1) * 1000, 2)) + ' ms/rand (1 apel PL/SQL per rand)'
lnT = SECONDS()
IF USED('crsFazaB')
SELECT crsFazaB
SCAN FOR LEFT(NVL(sursa, ''), 5) == 'CACHE'
goLog.Log('cache cui=' + TRANSFORM(cui) + ' sursa=' + ALLTRIM(sursa), 'testtimp')
SELECT crsFazaB
ENDSCAN
ENDIF
DO WrLog WITH 'B8 bucla de goLog pe randurile din cache = ' + TRANSFORM(ROUND(SECONDS() - lnT, 3)) + ' s'
*==========================================================
* C. costul brut al unui apel Oracle prin goExecutor
*==========================================================
DO WrLog WITH ''
DO WrLog WITH '=== C. cost apel Oracle prin goExecutor ==='
LOCAL lnRep
lnRep = MIN(lnN, 200)
lnT = SECONDS()
FOR lnI = 1 TO lnRep
=goExecutor.oExecuta('begin null; end;')
ENDFOR
lnT = SECONDS() - lnT
DO WrLog WITH 'C1 ' + TRANSFORM(lnRep) + ' x [begin null; end;] cu goLog activ = ' + TRANSFORM(ROUND(lnT, 3)) + ' s'
DO WrLog WITH ' = ' + TRANSFORM(ROUND(lnT / lnRep * 1000, 2)) + ' ms/apel'
LOCAL lcLogVechi
lcLogVechi = goLog.cLogFile
goLog.cLogFile = 'D:\ROA\ROACONT\COMUN\utile\Teste\cache_anaf\_log_inexistent.txt'
lnT = SECONDS()
FOR lnI = 1 TO lnRep
=goExecutor.oExecuta('begin null; end;')
ENDFOR
lnT = SECONDS() - lnT
DO WrLog WITH 'C2 ' + TRANSFORM(lnRep) + ' x [begin null; end;] fara goLog = ' + TRANSFORM(ROUND(lnT, 3)) + ' s'
DO WrLog WITH ' = ' + TRANSFORM(ROUND(lnT / lnRep * 1000, 2)) + ' ms/apel'
goLog.cLogFile = lcLogVechi
*==========================================================
* D. limita IN (...) din CitesteIstoricPentruCoduri
*==========================================================
DO WrLog WITH ''
DO WrLog WITH '=== D. limita listei IN (...) ==='
LOCAL lcLista1000, lcLista1001, llOk
lcLista1000 = ListaSintetica(1000)
lcLista1001 = ListaSintetica(1001)
lcSql = 'SELECT COUNT(*) AS N FROM ISTORIC_CODURI_FISCALE WHERE COD_FISCAL_N IN (' + lcLista1000 + ')'
llOk = (goExecutor.oExecute(lcSql, 'crsLim1') >= 1)
DO WrLog WITH 'D1 IN cu 1000 elemente: ' + IIF(llOk, 'OK', 'ESEC -> ' + goExecutor.cEroare)
IF USED('crsLim1')
USE IN crsLim1
ENDIF
lcSql = 'SELECT COUNT(*) AS N FROM ISTORIC_CODURI_FISCALE WHERE COD_FISCAL_N IN (' + lcLista1001 + ')'
llOk = (goExecutor.oExecute(lcSql, 'crsLim2') >= 1)
DO WrLog WITH 'D2 IN cu 1001 elemente: ' + IIF(llOk, 'OK', 'ESEC -> ' + goExecutor.cEroare)
IF USED('crsLim2')
USE IN crsLim2
ENDIF
* efectul in flux: lot de 1001 coduri, cache-ul pica, ANAF blocat -> plasa de siguranta
* face cate o interogare per cod
IF USED('cCoduri1001')
USE IN cCoduri1001
ENDIF
CREATE CURSOR cCoduri1001 (cod_fiscal C(30) NULL, data D NULL)
SELECT cCoduriMasa
SCAN
INSERT INTO cCoduri1001 (cod_fiscal, data) VALUES (cCoduriMasa.cod_fiscal, DATE())
SELECT cCoduriMasa
ENDSCAN
FOR lnI = RECCOUNT('cCoduri1001') + 1 TO 1001
INSERT INTO cCoduri1001 (cod_fiscal, data) VALUES (ALLTRIM(STR(9000000 + lnI)), DATE())
ENDFOR
DO WrLog WITH 'D3 lot de ' + TRANSFORM(RECCOUNT('cCoduri1001')) + ' coduri (peste limita IN)'
gnApeluriANAF = 0
gcMockUltimMesaj = ''
lnT = SECONDS()
=loVer.VerificaListaCIF('cCoduri1001', DATE(), 'crsANAF1001', 'MASA')
lnT = SECONDS() - lnT
DO WrLog WITH 'D4 TOTAL VerificaListaCIF pe 1001 coduri = ' + TRANSFORM(ROUND(lnT, 3)) + ' s'
DO WrLog WITH ' randuri intoarse: ' + TRANSFORM(IIF(USED('crsANAF1001'), RECCOUNT('crsANAF1001'), 0))
DO WrLog WITH ' apeluri ANAF (blocate): ' + TRANSFORM(gnApeluriANAF)
DO WrLog WITH ' ultim dialog modal interceptat: [' + LEFT(gcMockUltimMesaj, 120) + ']'
*==========================================================
* E. bucla de completare din apelant (overificari.vc2)
*==========================================================
DO WrLog WITH ''
DO WrLog WITH '=== E. completarea tabelului in apelant (do_verifica) ==='
IF !USED('crsANAFTest') OR RECCOUNT('crsANAFTest') = 0
DO WrLog WITH 'E: sarit - nu am rezultate de completat'
ELSE
DO ConstruiestePart WITH lnN
LOCAL loVerificare, ldDataE
loVerificare = CREATEOBJECT('verificarecod', .F., .F.)
ldDataE = DATE()
lnT = SECONDS()
SELECT crsANAFTest
SCAN
SCATTER NAME loRec
WITH loRec
SELECT crsPartTest
LOCATE FOR ALLTRIM(STRTRAN(cod_fiscal, loVerificare.GetCodTara(cod_fiscal), '')) = ALLTRIM(STR(.cui)) AND (EMPTY(NVL(data, {})) OR data = ldDataE)
IF FOUND()
REPLACE firma WITH .denumire, adresa WITH .adresa, stare WITH .mesaj, ;
cod WITH ALLTRIM(STR(.cui)), tvaincasare WITH .tvaincasare, ;
splittva WITH .splittva, inactiv WITH .inactiv
ENDIF
ENDWITH
SELECT crsANAFTest
ENDSCAN
lnT = SECONDS() - lnT
DO WrLog WITH 'E1 completare cu LOCATE + UDF (cod real) = ' + TRANSFORM(ROUND(lnT, 3)) + ' s'
DO WrLog WITH ' ' + TRANSFORM(RECCOUNT('crsANAFTest')) + ' rezultate x ' + TRANSFORM(RECCOUNT('crsPartTest')) + ' randuri in tabel'
* aceeasi completare, pe cursor indexat pe codul normalizat (reper pentru cat s-ar putea castiga)
DO ConstruiestePart WITH lnN
lnT = SECONDS()
SELECT crsPartTest
REPLACE ALL cod_fiscalfro WITH ALLTRIM(STRTRAN(STRTRAN(UPPER(NVL(cod_fiscal, '')), 'RO', ''), ' ', ''))
INDEX ON cod_fiscalfro TAG cfro
SELECT crsANAFTest
SCAN
SCATTER NAME loRec
WITH loRec
IF SEEK(PADR(ALLTRIM(STR(.cui)), 30), 'crsPartTest', 'cfro')
SELECT crsPartTest
REPLACE firma WITH .denumire, adresa WITH .adresa, stare WITH .mesaj, ;
cod WITH ALLTRIM(STR(.cui)), tvaincasare WITH .tvaincasare, ;
splittva WITH .splittva, inactiv WITH .inactiv
ENDIF
ENDWITH
SELECT crsANAFTest
ENDSCAN
lnT = SECONDS() - lnT
DO WrLog WITH 'E2 aceeasi completare pe cursor indexat (SEEK) = ' + TRANSFORM(ROUND(lnT, 3)) + ' s'
ENDIF
*==========================================================
* curatenie
*==========================================================
DO WrLog WITH ''
DO CurataIstoricTimp
DO WrLog WITH 'GATA ' + TTOC(DATETIME())
QUIT
PROCEDURE WrLog
LPARAMETERS tcText
STRTOFILE(TRANSFORM(tcText) + CHR(13) + CHR(10), gcTestLog, .T.)
ENDPROC
PROCEDURE ErrTimp
LPARAMETERS tnError, tcMessage, tcProgram, tnLine
DO WrLog WITH 'EROARE ' + TRANSFORM(tnError) + ' [' + TRANSFORM(tcMessage) + '] in ' + ;
TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLine)
RETURN
ENDPROC
FUNCTION NrRanduriIstoric
LOCAL lnRez
lnRez = 0
IF goExecutor.oExecuta('SELECT COUNT(*) AS N FROM ISTORIC_CODURI_FISCALE', 'crsNrIst')
lnRez = crsNrIst.N
USE IN (SELECT('crsNrIst'))
ENDIF
RETURN lnRez
ENDFUNC
FUNCTION ListaSintetica
LPARAMETERS tnCate
LOCAL lcRez, lnJ
lcRez = ''
FOR lnJ = 1 TO tnCate
lcRez = lcRez + IIF(EMPTY(lcRez), '', ',') + ALLTRIM(STR(8000000 + lnJ))
ENDFOR
RETURN lcRez
ENDFUNC
PROCEDURE ConstruiestePart
LPARAMETERS tnCate
LOCAL lnK
IF USED('crsPartTest')
USE IN crsPartTest
ENDIF
CREATE CURSOR crsPartTest (ales L, denumire C(100) NULL, cod_fiscal C(30) NULL, Valid L NULL, ;
firma C(100) NULL, cod C(100) NULL, adresa C(250) NULL, judet C(100) NULL, regcom C(30) NULL, ;
datatvamfin C(30) NULL, platitortvamfin L NULL, IsCIF L NULL, duplicat L, atribut_fiscal C(2), ;
stare C(100), atentie C(100), cod_fiscalfro C(30) NULL, tvaincasare L, splittva L, inactiv L, Data D)
SELECT cCoduriMasa
SCAN
INSERT INTO crsPartTest (cod_fiscal, denumire, Valid, IsCIF, Data) ;
VALUES (cCoduriMasa.cod_fiscal, 'PARTENER ' + ALLTRIM(NVL(cCoduriMasa.cod_fiscal, '')), .T., .T., DATE())
SELECT cCoduriMasa
ENDSCAN
ENDPROC
PROCEDURE CurataIstoricTimp
LOCAL lnSterse
IF TYPE('gnIdMaxIstoric') <> 'N' OR gnIdMaxIstoric <= 0
DO WrLog WITH 'curatenie SARITA - watermark invalid'
RETURN
ENDIF
lnSterse = goExecutor.oExecuta('DELETE FROM ISTORIC_CODURI_FISCALE WHERE ID > ' + TRANSFORM(gnIdMaxIstoric))
=goExecutor.oExecuta('COMMIT')
DO WrLog WITH 'curatenie: sterse randurile cu ID > ' + TRANSFORM(gnIdMaxIstoric)
ENDPROC
*** executor care nu deschide formularul modal de eroare (altfel headless se blocheaza)
DEFINE CLASS oexec_fara_dialog_t AS oexecutor
FUNCTION oExecuta
LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect
LOCAL lcSql, lcCursor, lnHandle, lnRez
lcSql = IIF(EMPTY(tcSql), This.cSql, tcSql)
lcCursor = IIF(EMPTY(tcCursor), This.cCursor, tcCursor)
lnHandle = IIF(EMPTY(tnHandle), This.nHandle, tnHandle)
lnRez = This.oExecute(lcSql, lcCursor, tlProgress, tcTitluProgress, lnHandle)
IF lnRez < 1
gnErorriSQL = gnErorriSQL + 1
gcUltimaEroareSQL = TRANSFORM(This.cEroare)
ENDIF
RETURN (lnRez >= 1)
ENDFUNC
ENDDEFINE
*** subclasa de test: blocheaza ANAF-ul real si expune OrdineCache-ul real sub alt nume
DEFINE CLASS VerificareANAFTimp AS VerificareANAF
PROCEDURE OrdineCache
LPARAMETERS tcTraseu
RETURN 'CACHE,ANAF'
ENDPROC
PROCEDURE OrdineCacheReal
LPARAMETERS tcTraseu
RETURN VerificareANAF::OrdineCache(tcTraseu)
ENDPROC
PROCEDURE ANAF_SincronWebService_PlatitorTva
LPARAMETERS tcCursorListaCIF, tdData, tcAlias
gnApeluriANAF = gnApeluriANAF + 1
RETURN IIF(EMPTY(tcAlias), 'crsANAF', tcAlias)
ENDPROC
ENDDEFINE