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
484 lines
18 KiB
Plaintext
484 lines
18 KiB
Plaintext
* 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
|