Files
comun/utile/Teste/facturare_unificat/probe_named_notation_odbc.prg
Marius Mutu 8e022d332e #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
2026-09-09 21:38:25 +03:00

109 lines
5.0 KiB
Plaintext

* probe_named_notation_odbc.prg
* Verifica daca driverul ODBC Oracle folosit de acest produs (prin goExecutor -> SQLExec, acelasi
* drum ca productia, NU sqlplus) accepta notatia cu nume (param=>valoare) in interiorul escape-ului
* {call ...}, asa cum e folosita in S4g (COMUN\clase\ofacturare.vc2, docs\raport_s4g_vfp.md) pentru
* al 29-lea argument V_CONT_VENIT.
*
* Metoda: procedura de test proprie, minimala, creata si stearsa in schema MARIUSM_AUTO. Procedura
* nu scrie nimic - ridica mereu RAISE_APPLICATION_ERROR cu parametrii primiti inclusi in text, asa
* ca reusita apelului {call} (ajuns pana in PL/SQL) e vizibila direct in mesajul de eroare capturat
* de goExecutor.cEroare, fara sa fie nevoie de parametri OUT sau de scriere de date. Doua apeluri:
* unul pur pozitional (control), unul cu ultimul argument in named notation (cazul S4g).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_named_notation_odbc.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_named_notation_odbc.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
CLOSE DATABASES
PUBLIC gcLog, gcCaz
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_named_notation_odbc.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gcCaz = ""
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
gnIdUtil = 8
DO AfLog WITH "ENV OK"
LOCAL lcProc, lnSucces, lcSql
lcProc = "wip13_test_named_notation_odbc"
*----------------------------------------------------------------------------------------
* setup: procedura de test, minimala, doar ridica eroare cu parametrii primiti - nimic scris
gcCaz = "[setup] "
lcSql = "CREATE OR REPLACE PROCEDURE " + lcProc + "(p1 IN NUMBER, p2 IN NUMBER, p3 IN VARCHAR2 DEFAULT 'DEFAULT_VAL') AS" + ;
" BEGIN RAISE_APPLICATION_ERROR(-20999, 'GOT p1=' || p1 || ' p2=' || p2 || ' p3=' || NVL(p3,'NULL')); END;"
lnSucces = goExecutor.oExecute(lcSql)
DO AfLog WITH "CREATE PROCEDURE: lnSucces=" + TRANSFORM(lnSucces) + " eroare=" + goExecutor.cEroare
IF lnSucces < 0
DO AfLog WITH "STOP: nu s-a putut crea procedura de test - verdict NECONCLUDENT"
DO Final
ENDIF
*----------------------------------------------------------------------------------------
* control: apel pur pozitional, acelasi drum (goExecutor -> SQLExec -> ODBC -> Oracle)
gcCaz = "[pozitional] "
lcSql = "{call " + lcProc + "(1,2,'posval')}"
lnSucces = goExecutor.oExecute(lcSql)
DO AfLog WITH "POZITIONAL sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]"
LOCAL llPozitionalOk
llPozitionalOk = "GOT p1=1 p2=2 p3=posval" $ goExecutor.cEroare
*----------------------------------------------------------------------------------------
* cazul S4g: ultimul argument in named notation, dupa argumente pozitionale
gcCaz = "[named-notation] "
lcSql = "{call " + lcProc + "(1,2,P3=>'namedval')}"
lnSucces = goExecutor.oExecute(lcSql)
DO AfLog WITH "NAMED sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]"
LOCAL llNamedOk
llNamedOk = "GOT p1=1 p2=2 p3=namedval" $ goExecutor.cEroare
*----------------------------------------------------------------------------------------
* teardown: sterge procedura de test, indiferent de rezultat
gcCaz = "[teardown] "
lnSucces = goExecutor.oExecute("DROP PROCEDURE " + lcProc)
DO AfLog WITH "DROP PROCEDURE: lnSucces=" + TRANSFORM(lnSucces) + " eroare=" + goExecutor.cEroare
*----------------------------------------------------------------------------------------
DO AfLog WITH "CONTROL (pozitional) OK=" + TRANSFORM(llPozitionalOk)
DO AfLog WITH "NAMED NOTATION OK=" + TRANSFORM(llNamedOk)
IF llPozitionalOk AND llNamedOk
DO AfLog WITH "VERDICT: MERGE - named notation acceptata de driverul ODBC in interiorul {call ...}"
ELSE
IF !llPozitionalOk
DO AfLog WITH "VERDICT: NECONCLUDENT - nici apelul pur pozitional (control) nu a ajuns curat in PL/SQL"
ELSE
DO AfLog WITH "VERDICT: NU MERGE - named notation respinsa/alterata de driverul ODBC (control a mers, named nu)"
ENDIF
ENDIF
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC