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

@@ -2727,6 +2727,10 @@ DEFINE CLASS frm_verificare_parteneri AS _frmbase OF "_frm_base.vcx"
loVerificareANAF = CREATEOBJECT("VerificareANAF") && validare.prg
SELECT crsVerificareParteneri
REPLACE ALL cod_fiscalfro WITH ALLTRIM(Strtran(cod_fiscal, loVerificare.GetCodTara(cod_fiscal),''))
INDEX ON cod_fiscalfro TAG cfro
SELECT distinct data FROM cListaCIFTempX INTO CURSOR cListaCIFTempData
SELECT cListaCIFTempData
SCAN
@@ -2741,17 +2745,29 @@ DEFINE CLASS frm_verificare_parteneri AS _frmbase OF "_frm_base.vcx"
SCAN
SCATTER NAME loRec
WITH loRec
lcCheieCauta = PADR(ALLTRIM(STR(.cui)), 30)
SELECT crsVerificareParteneri
LOCATE FOR ALLTRIM(Strtran(cod_fiscal, loVerificare.GetCodTara(cod_fiscal),'')) = ALLTRIM(STR(.cui)) AND (EMPTY(NVL(data, {})) OR data = m.ldData)
IF FOUND()
llGasit = .F.
IF SEEK(m.lcCheieCauta, 'crsVerificareParteneri', 'cfro')
llGasit = .T.
DO WHILE !(EMPTY(NVL(data, {})) OR data = m.ldData)
SKIP
IF EOF() OR cod_fiscalfro <> m.lcCheieCauta
llGasit = .F.
EXIT
ENDIF
ENDDO
ENDIF
IF llGasit
Replace firma With .denumire, adresa With .adresa, datatvamfin With TRANSFORM(.data), platitortvamfin With .tva, stare With .mesaj, cod WITH ALLTRIM(STR(.cui)), ;
tvaincasare WITH .tvaincasare, splittva WITH .splittva, inactiv WITH .inactiv, ;
sursa WITH NVL(.sursa, 'ANAF'), data_sursa WITH .data_sursa
ENDIF
ENDIF
ENDWITH
ENDSCAN && (m.lcCursorVerificareANAF)
ENDIF
ENDSCAN && cListaCIFTempData
SET ORDER TO 0 IN crsVerificareParteneri
USE IN (SELECT('cListaCIFTempData'))
USE IN (SELECT('cListaCIFTempX'))
USE IN (SELECT('cListaCIFTemp'))