* 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