PDA

Ver la Versión Completa : [Duda] Diferencia resultados consulta en MariaDB y PWC9


Josber
7 de junio de 2024, 13:30
Resulta que una misma instrucción ejecutada desde PWC9, (mediante un EXEC SQL), o desde un gestor de BD de MariaDB, (una versión "libre" de MySql), da distintos resultados, ¿alguien tiene una idea de por qué puede ser?

La instrucción es ésta:

SELECT COUNT(CLICOD) FROM CLIENTES WHERE CLICOD > TRIM( 333) AND CLIORG LIKE CONCAT_WS('','%',TRIM('ZACIÓN '),'%') AND CLINOM LIKE CONCAT_WS('','%',TRIM('ENTE '),'%')"

En en gestor, el resultado es 140, (que es el correcto) y en PWC, el resultado es 0, (sin errores en SQLSTATE, ni nada por el estilo), con otras instrucciones no pasa, pero cuando hay varios "AND", falla.

Muchas gracias

Kuk
7 de junio de 2024, 20:49
@Josber, lo de las comillas dobles al final imagino que es el copy/paste...

Por lo pronto se me ocurre una sintaxis más ligera:


SELECT COUNT(CLICOD)
FROM CLIENTES
WHERE CLICOD > TRIM( 333)
AND CLIORG LIKE '%' || TRIM('ZACIÓN ') || '%'
AND CLINOM LIKE '%' || TRIM('ENTE ') || '%'


Me parece que va a ser problema de codificación de caracteres, es decir que en este caso el valor "ZACIÓN" lleva tilde y puede que no se pase correctamente en la consulta y se interprete por otro caracter en el lado BBDD.

Intenta la misma consulta pero donde ambos valores alfanuméricos son letras sin acentos y compara a ver. Si el resultado es correcto (el valor es el mismo), eso es que hemos encontrado el problema.

Josber
7 de junio de 2024, 22:11
Gracias @Kuk, sí lo de las comillas, ha sido el copy/pega, y lo tengo que hacer así de largo, porque es un montaje con un string, por eso está el tema de CONCAT_WS, en cuanto al acento, pues no he probado a no ponerlo, mañana hago la prueba a ver, todas las tablas las creo con COLLATE='utf8_spanish_ci, porque de lo contario, se da de bofetadas con las Ñs, acentos y demás

Un saludo

Kuk
8 de junio de 2024, 10:49
@Josber, UTF8 es una codificación Unicode, multi-byte, cosa que se puede tratar en PowerCOBOL únicamente con PIC N (N=National) y se configura la codificación a nivel de proyecto y trae alguna que otra complicación a nivel código. Es un tema que pocos hacemos mucho caso pero es importante.

El caso es que existe codificación mono-byte para el Español y no necesitas para nada Unicode como UTF8.

Pon el cotejamiento en latin1_spanish_ci

Echa on ojo a esto: https://blog.unreal4u.com/2012/08/sobre-collation-y-charset-en-mysql/


Una de las primeras cosas que se deben saber es el cómo un CHARSET u otro guarda la información. Para ser muy breves y concisos, utf8 ocupa hasta 3 bytes en cada caracter, mientras que latin1 siempre ocupará 1 solo byte.


Y eso de 1 byte es lo que necesitamos justamente en Cobol para poder tratar el dato de manera natural que es con PIC X.

Estoy casi seguro que el problema viene de ahí.

Kuk
8 de junio de 2024, 13:24
@Josber, una cosa importante que se me olvidaba: cuando los datos ya están dentro de la BBDD creo que cambiando la codificación no cambia cómo el dato está guardado (es decir que seguirían en UTF8). Así que hay que tener cuidado con esto si se confirma que con los datos sin tildes no hay problema, habría que mirar cómo convertir los datos ya existentes.

Josber
8 de junio de 2024, 18:17
Sí @Kuk, cuando ya están, el formato no cambia pero, como es una tabla de pruebas y los C.P., están en una hoja de Excel que me bajé de la página de Correos, creo recordar, sin problemas para "cepillarme" la tabla y volver a crearla.

Gracias por todo

Kuk
11 de junio de 2024, 09:28
@Josber, qué tal? Has hecho las pruebas?

Josber
11 de junio de 2024, 11:58
@Josber, qué tal? Has hecho las pruebas?

Las hice ayer tarde, borré la tabla, la cree cambiando el COLLATE por latin1_spanis_ci y me sigue pasando lo mismo, en cuanto pongo un acento en PWC, ya no funciona la consulta, sin embargo, directamente en el gestor de BDs, funciona perfecto. :llora: :llora:

Sigo investigando ....

Kuk
11 de junio de 2024, 17:17
@Josber, no sé qué versión de Power estás utilizando. Qué tienes como valor en RCS cuando haces clic en el Proyecto?

Yo creo que es cuestión de ir probando. Prueba con latin1_general_ci

Mientras yo voy mirando a ver si encuentro más info.

Josber
11 de junio de 2024, 20:31
@Josber, Qué tienes como valor en RCS cuando haces clic en el Proyecto?.

Prueba con latin1_general_ci

No sé que es exactamente lo de RCS, la versión es PWC 9, he probado con latin1_general_ci, latin1_sweedish_ci, y varios más y el resultado siempre es el mismo, incluso he puesto BINARY, para que tome en cuenta las mayúscula y minúsculas.

Yo también sigo buscando, más que nada porque no es lo mismo buscar, por ejemplo, continuo que continuó y como los campos de búsqueda que tengo definidos incluye las observaciones, ahí puede haber de todo escrito, porque si fueran sólo los nombres y apellidos o direcciones, me daría igual.

*PD, me acabo de dar cuenta que con las Ñs, tampoco funciona, y eso ya es más importante, así que tiene que ser cuestión de elegir el "COLLATE" correcto, lo que me fastidia, es que tengo otras tablas en otros programas con latin1_spanis y utf8_spanish y funciona perfectamente. Voy a borrar la BD por completo y crear de nuevo las tablas a ver si tengo suerte y es un fallo en la creación

Muchas gracias.-

Kuk
11 de junio de 2024, 22:13
@Josber, es raro que te funcione con UTF8.... Por cierto cómo accedes a la base, vía SQL embebido o el AdoDB?

Estoy mirando unos pequeños ejemplos de hace años cuando el asunto no fue más allá de unos tests (yo siempre he usado ficheros indexados) y me está petando por todas partes :D :D :D


Acabo de hacer la prueba y a mi con el Power 10.1, el RCS=ASCII y la DB en latin1_general_ci me funciona todo.... Algo debe estar mal con tu BBDD :piensa:

Josber
12 de junio de 2024, 11:20
Uso SQL Embebido, quería haber usado ADO pero, no he encontrado ningún ejemplo claro de cómo hacer las cosas, lo poquito que hay por el foro, no me ha aclarado nada y los ejemplos de PWC, aún menos

Aprovecho por si alguien tiene la "bondad", sólo necesito de ADO, un ejemplo claro, bien explicado y sencillo de:

- Un OPEN
- SELECT ...
- SELECT con FETCH
- INSERT INTO ...
- UPDATE SET ...

y poquito más, no me importa en éstos momentos del proyecto, cambiar a ADO, y si no me da problemas, ya ni te cuento, así es que, si hay algún alma caritativa, que quiera perder un poquito de su tiempo, haciendo el ejemplo, se lo agradecería en el alma.

Un salu2.-

Kuk
12 de junio de 2024, 12:57
@Josber, yo creo que la mejor opción sería pasar por el OCX que facilitó @Nitzer, que por lo visto es una maravilla: https://www.cobolforo.es/showthread.php?1743-Ocx-para-SQL-nativo

Josber
12 de junio de 2024, 13:01
Anda, es verdad, no me acordaba, éste finde lo pruebo.

Gracias.-

Fito
12 de junio de 2024, 17:45
Hola Amigos:

Yo tengo unos procesos que suben info desde mis archivos cobol a un SQL Server. Lo hacía con ADO y Power 8. Más o menos como un ejemplo que puse acá hace mucho. El tema con ADO es que hay que programar mucho, asimismo no he tenido problemas, solamente hice volcado de datos hacia la BBDD, usé DROP TABLE, CREATE TABLE e INSERT.

Por ahora solamente he necesitado hacer volcado de grandes cantidades de datos. Nada de un trabajo interactico con la BBDD como ABMs y Listados.

Ahora para un nuevo cliente que tenía que hacer la misma tarea, me puse a probar el ocx de Andres. Pero repito, solamente volcado de datos, así que usé solamente el comando EXECUTE pasando ahí el string con el comando. Y funciona de maravilla.

Ya con más tiempo voy a empezar a usarlo "profesionalmente", para decirlo de alguna manera.

Lo único que no maneja transacciones, que es algo que me interesaría mucho. Tendría que ver si con el comando EXECUTE se podría hacer. Pero es todo para investigar y probar.

Lo que sí que para poder hacer cosas con ese ocx lo veo realmente muy sencillo.

Saludos.

Fito...

Josber
12 de junio de 2024, 21:03
¿Alguien podría subir varios ejemplos?, porque lo estoy intentando usar, pero no consigo nada, no sé ni siquiera si se conecta bien a la BD, (es a través de ODBC),, ejemplos con conexión a la BD, contar registros, (que en mis pruebas, siempre me da 0), etc. las cosas normales que se hacen con una BD y también, muy importante, el tema de controlar los errores, lo que explica Andrés, (nuestro estimado @Nitzer), de la opción DIAGNOTICRECORD, que supongo que será parecido a SQLMSG, pero que no hay manera.

Me haría un gran favor, ahora que me he decidido a pasar del SQL EMBEBIDO ..

Muchas gracias

Fito
12 de junio de 2024, 21:35
Hola:

Acá paso el código de lo que dije anteriormente. Necesito exportar a una BBDD los datos de artículos, en este caso. Para eso creo un archivo .CSV y con la instrucción BULK INSERT de Sql Server lo importo.


ENVIRONMENT DIVISION.

input-output section.
file-control.
select optional archivo-csv assign to "C:\ARTI.CSV"
organization is line sequential.

DATA DIVISION.
file section.
fd archivo-csv label records standard.
01 reg-csv pic x(280).

WORKING-STORAGE SECTION.

01 registro.
02 csv-articulo pic z(6).
02 pic x value ";".
02 csv-denominacion pic x(100).
02 pic x value ";".
02 csv-rubro pic x(35).
02 pic x value ";".
02 csv-cant-uni pic zzzz9,999.
02 pic x value ";".
02 csv-faccionado pic xx.
02 pic x value ";".
02 csv-kgfle pic zzzz9,999.
02 pic x value ";".
02 csv-porcaja pic zzzz9,999.
02 pic x value ";".
02 csv-porpallet pic zzzz9,999.
02 pic x value ";".
02 csv-desprom pic zzzz9,999.
02 pic x value ";".
02 csv-hasprom pic zzzz9,999.
02 pic x value ";".
02 csv-asociado pic z(6).
02 pic x value ";".
02 csv-suspendido pic xx.
02 pic x value ";".
02 csv-preciolibre pic xx.
02 pic x value ";".
02 csv-costo pic z(9)9,99.
02 pic x value ";".
02 csv-cosfec pic x(10).
02 pic x value ";".
02 csv-publico pic z(9)9,99.
02 pic x value ";".
02 csv-mayor pic z(9)9,99.
02 pic x value ";".
02 csv-iva pic z9,99.

01 wfraccionado pic xx.
01 wprelibre pic xx.
01 wsus pic xx.
01 wcosto pic 9(12)v99.
01 xfecha pic 9999/99/99.
01 redefines xfecha.
02 wfecha pic x(10).
01 wpublico pic 9(12)v99.
01 wmayor pic 9(12)v99.

01 RETORNO PIC S9(9) COMP-5.
01 COMANDO PIC x(4096).

PROCEDURE DIVISION.

#include "copys\declara-com.cpy".

comienzo.
*> paso el string de conexión - tengo un origen de datos configurado por ODBC
move "DSN=POWERBI;UID=sa;PWD=**********" to "ConnectionString" of BD.

*> conecto a la BBDD
invoke BD "Connect" returning RETORNO.

*> Elimino la BBDD
move spaces to comando.
move 'DROP TABLE IF EXISTS dbo."Articulos"' to comando.
INVOKE BD "Execute" USING comando RETURNING RETORNO.

*> Creo la BBDD
move spaces to comando.
string 'CREATE TABLE dbo."Articulos"' delimited by size
' ( ' delimited by size
'articulo integer, ' delimited by size
'denominacion character varying(100), ' delimited by size
'rubro character varying(35), ' delimited by size
'cant_uni numeric(8,3), ' delimited by size
'faccionado character varying(2), ' delimited by size
'kgfle numeric(8,3), ' delimited by size
'porcaja numeric(8,3), ' delimited by size
'porpallet numeric(8,3), ' delimited by size
'desprom numeric(8,3), ' delimited by size
'hasprom numeric(8,3), ' delimited by size
'asociado integer, ' delimited by size
'suspendido character varying(2), ' delimited by size
'preciolibre character varying(2), ' delimited by size
'costo numeric(12,2), ' delimited by size
'cosfec date, ' delimited by size
'publico numeric(12,2), ' delimited by size
'mayor numeric(12,2), ' delimited by size
'iva numeric(5,2) ' delimited by size
')' delimited by size
into comando
end-string.
INVOKE BD "Execute" USING comando RETURNING RETORNO.

open input arti nivel output archivo-csv.

move spaces to reg-csv.
string 'articulo;' delimited by size
'denominacion;' delimited by size
'rubro;' delimited by size
'cant_uni; ' delimited by size
'faccionado; ' delimited by size
'kgfle; ' delimited by size
'porcaja; ' delimited by size
'porpallet; ' delimited by size
'desprom; ' delimited by size
'hasprom; ' delimited by size
'asociado; ' delimited by size
'suspendido; ' delimited by size
'preciolibre; ' delimited by size
'costo; ' delimited by size
'cosfec' delimited by size
'publico' delimited by size
'mayor; ' delimited by size
'iva' delimited by size
into reg-csv
end-string.
write reg-csv.

initialize artcla.
start arti key is not < artcla invalid go sale.

leo.
read arti next at end go sale.

initialize nivcla.
move artniv1 to nivniv1.
read nivel invalid move spaces to nivdenom.

if artfracc-s
move "SI" to wfraccionado
else
move "NO" to wfraccionado
end-if.

if artsus-s
move "SI" to wsus
else
move "NO" to wsus
end-if.
if artpreciolibre-s
move "SI" to wprelibre
else
move "NO" to wprelibre
end-if.
move artcos to wcosto.

move artcos-fec to fecha-amd.
perform amd-to-dma.
perform valida-fecha.
if error-fecha = 1 or artcos-fec = zeros
move 20000101 to fecha-amd
end-if
move fecha-amd to xfecha.
compute wpublico rounded = artpre1 * (1 + artiva-ins / 100).
compute wmayor rounded = artpre2 * (1 + artiva-ins / 100).

move articulo to csv-articulo.
move artdenom to csv-denominacion.
move nivdenom to csv-rubro.
move artcant-uni to csv-cant-uni.
move wfraccionado to csv-faccionado.
move artkgfle to csv-kgfle.
move artporcaja to csv-porcaja.
move artporpallet to csv-porpallet.
move artdesprom to csv-desprom.
move zeros to csv-hasprom.
move artasociado to csv-asociado.
move wsus to csv-suspendido.
move wprelibre to csv-preciolibre.
move wcosto to csv-costo.
move wfecha to csv-cosfec.
move wpublico to csv-publico.
move wmayor to csv-mayor.
move artiva-ins to csv-iva.

inspect csv-denominacion replacing all ";" by " ".
inspect csv-rubro replacing all ";" by " ".

inspect registro replacing all "," by ".".

write reg-csv from registro.

go leo.

sale.
close arti nivel.

move spaces to comando.

string "BULK INSERT dbo.Articulos "
'FROM "c:\ARTI.CSV" '
'WITH ( '
' FIRSTROW = 2 '
", FIELDTERMINATOR = ';' "
", ROWTERMINATOR = '0x0a'); "
DELIMITED BY SIZE INTO comando
end-string.
INVOKE BD "Execute" USING comando RETURNING RETORNO.

INVOKE BD "Disconnect" RETURNING RETORNO.

exit program.


Cuando avance más con esto, voy pasando. Pero el ejemplo que pone Andres en el pdf que pasó, está excelentemente explicado.

Saludos.

Fito...

Josber
13 de junio de 2024, 12:34
Gracias @Fito, no digo que lo que ha puesto @Nitzer no esté bien explicado, (creo que explica muy bien las cosas), lo que digo es que faltan "casos", como por ejemplo, poder leer los errores que da una BD y que devuelve en las variables SQLMSG y SQLSTATE, (por lo menos cuando es SQLEmbebido), y que, según comenta, se gestionan con DIAGNOTICRECORD, pero no dice cómo y es algo muy importante, sobre todo, cuando estás haciendo el programa, te da un error y no sabes exactamente que es, y quizás sea una simple coma olvidada en la instrucción SQL, un paréntesis, una variable mal escrita ..., algún ejemplo más de un COUNT, SELECT, etc, para poder comparar con los otros que tiene puesto, etc.

Un salu2.-

Fito
13 de junio de 2024, 13:54
Holaaa.

Quedé muy impresionado con la instrucción BULK INSERT de SqlServer:


Comienzo 05 00 00 86 13/06/2024
Baja Artículos 05 00 20 85 13/06/2024
Baja CtaCtes 05 00 32 25 13/06/2024
Baja Ventas 05 00 46 32 13/06/2024
Baja Stock 05 02 22 19 13/06/2024
Artículos 05 03 06 06 13/06/2024 2.380 registros
Clientes 05 03 06 51 13/06/2024 22.801 registros
Stock 05 03 07 14 13/06/2024 2.159.529 registros
Ventas 05 03 24 29 13/06/2024 28.504.015 registros
Finaliza 05 07 57 45 13/06/2024


Este es el log que genero con el proceso. Fíejnse los tiempos, impresionante. Cuando lo hacía con INSERT uno por uno, tardaba varias horas cargar tantos registros. Tambien tengan en cuenta que dentro de ese tiempo está la generación del archivo CSV, no es sólo la importación.

Lo que si es que ese de Ventas que es más grande solamente me cargaba 3.159.999 registros, no sé si la limitación esa es los registros que puede manejar, o de acuerdo al tamaño del registro, la cantidad de caracteres. Es decir, si en registro fuera más largo, importaría menos lineas. Por eso los estoy subiendo cada tres millones de registros. Esa cantodad de ahi son 10 inserts.

Una maravilla...

Saludos

Fito...

Josber
13 de junio de 2024, 19:24
No sé si es que el OCX no funciona bien con MariaDB, o es que estoy haciéndolo mal, como prueba, estoy haciendo esto desde PWC (versión 9 sobre Win 10, para más info)


STRING 'DRIVER=MARIADB ODBC 3.0 Driver; '
'Server=localhost; '
'Port=3306; '
'Database=braulio; '
'Uid=*******; '
'Pwd=*******;' DELIMITED BY SIZE INTO WS_SQL
END-STRING.

MOVE WS_SQL TO "ConnectionString" OF Bd.

INVOKE Bd "Connect" RETURNING RETORNO.

INITIALIZE WS_SQL.
MOVE "SELECT COUNT(CLICOD) FROM CLIENTES WHERE CLIELI <> 'S'" TO WS_SQL.
INVOKE Bd "OpenQuery" USING WS_SQL RETURNING RETORNO.


La conexión, supongo que la hace bien, puesto que si cambio algún parámetro para que sea incorrecta, me abre una ventana pidiendo datos de conexión, según @Nitzer (Andrés), la función OpenQuery, devuelve en RETORNO, el número de registros, sé que el número es 308, (es lo que me da, si hago la consulta directamente a la Bd), pero siempre me devuelve 0, si ésta instrucción no funciona, el resto de funciones, ya me da lo mismo, esta se usa mucho para saber si hay registros con ciertas condiciones.

¿Alguien ve si es que estoy haciendo algo mal?

Mil gracias

Josber
17 de junio de 2024, 20:32
Bueno pues, desisto de seguir, como tampoco tengo más ideas del resto de foreros, no voy a perder más tiempo, una desilusión, porque esperaba algo más de otros foreros, (los que me habéis aportado alguna idea o sugerencia, mil gracias, como siempre), continuo con SQLEmbebido y ya veremos por dónde sale la cosa.

Gracias por vuestro tiempo

Kuk
17 de junio de 2024, 21:24
@Josber, has probado el OCX de @Nitzer? A ver se asoma y nos da unos ejemplos para el cursor y estas cosas....

Josber
18 de junio de 2024, 09:35
@Kuk, sí, sí que lo he probado y para ese OCX es para el que pedía ayuda sobre todo pero, no he tenido suerte, si miras las últimas entradas de éste tema, verás cuáles son los principales problemas que he tenido con ese OCX.

Un salu2.-

fastpho
28 de septiembre de 2024, 19:33
Hola @Josber

Me ha surgido la necesidad ahora de tener que conectarme a un servidor apache , con la version Mysql MariaDB
estuve probando Ado de Micro (via odbc) , probe con la EXTMYSQL (directo usando como conector libmysql.dll) que paso @Joseg, con resultados positivos en ambos casos.

Y tambien probe con la ocx que compartio @Nitzer , con buenos resultados tambien te pongo dos ejemplos todo via odbc
Version PowerCobol 5.0

*> Lectura de Cantidad de Registros en la tabla



WORKING-STORAGE SECTION.
01 RETORNO PIC S9(9) COMP-5.
01 sql-comando pic x(8192).
01 BD-EMPRESA.
02 BDIDUSR PIC 9(09).
02 BDNOMBRE PIC X(55).
02 BDCLAVE PIC X(255).
01 Cantidad-Registros PIC S9(9) COMP-5.
PROCEDURE DIVISION.

move spaces to sql-comando.
STRING 'DRIVER={MariaDB ODBC 3.2 Driver};'
'SERVER=xxxx.com.ar;'
'Port=3306;'
'DATABASE=xxxxxxxxxxxxxxx;'
'UID=xxxxx;'
'PWD=xxxxxxxxxx;'
DELIMITED BY SIZE INTO sql-comando
END-STRING.
*> conecta
MOVE sql-comando TO "ConnectionString" OF SqlServer1.
invoke SqlServer1 "Connect" returning RETORNO.
display " RETORNO db:" , RETORNO.

*> select
move spaces to sql-comando.
move "select count(id_empresa) from empresas" to sql-comando.
INVOKE SqlServer1 "OpenQuery" USING sql-comando RETURNING RETORNO
display " RETORNO Execute:" , RETORNO.


*> record
INVOKE SqlServer1 "GETVALUE" USING 1 RETURNING Cantidad-Registros
DISPLAY "CANTIDAD DE REGISTROS:" , Cantidad-Registros
*> desconecto
INVOKE SqlServer1 "Disconnect" RETURNING RETORNO.



*> Select simple


WORKING-STORAGE SECTION.
01 RETORNO PIC S9(9) COMP-5.
01 sql-comando pic x(8192).
01 BD-EMPRESA.
02 BDIDUSR PIC 9(09).
02 BDNOMBRE PIC X(55).
02 BDCLAVE PIC X(255).
01 Cantidad-Registros PIC S9(9) COMP-5.
PROCEDURE DIVISION.

move spaces to sql-comando.
STRING 'DRIVER={MariaDB ODBC 3.2 Driver};'
'SERVER=xxxx.com.ar;'
'Port=3306;'
'DATABASE=xxxxxxxxxxxxxxx;'
'UID=xxxxx;'
'PWD=xxxxxxxxxx;'
DELIMITED BY SIZE INTO sql-comando
END-STRING.
*> conecta
MOVE sql-comando TO "ConnectionString" OF SqlServer1.
invoke SqlServer1 "Connect" returning RETORNO.
display " RETORNO db:" , RETORNO.

*> select
move spaces to sql-comando.
move "select Id_empresa , Nombre_empresa , Password_empresa from empresas" to sql-comando.
INVOKE SqlServer1 "OpenQuery" USING sql-comando RETURNING RETORNO
display " RETORNO Execute:" , RETORNO. *> si es distinto de zeros o -1 error en la select
*> loop record
PERFORM WITH NO LIMIT

INVOKE SqlServer1 "NEXT" RETURNING RETORNO
IF ISEOF OF SqlServer1 = 1 EXIT PERFORM END-IF
INVOKE SqlServer1 "GETVALUE" USING 1 RETURNING BDIDUSR
DISPLAY "EMPRESA ID:" , BDIDUSR
INVOKE SqlServer1 "GETVALUE" USING 2 RETURNING BDNOMBRE
DISPLAY "NOMBRE:" , BDNOMBRE
INVOKE SqlServer1 "GETVALUE" USING 3 RETURNING BDCLAVE
DISPLAY "CLAVE:" , BDCLAVE

END-PERFORM.


*> desconecto
INVOKE SqlServer1 "Disconnect" RETURNING RETORNO.







Saludos ..
Voy a seguir investigando y probando las tres opciones.

fastpho
30 de septiembre de 2024, 16:36
Probando con el ocx de nitzer , agrego como hacer un Insert y Update

*Update*


*> Update
move spaces to sql-comando.
MOVE "empresa de prueba nro 23" TO Q-Nombre.
MOVE "dirección con ñÑ y acentos" TO Q-Dire.



STRING
"UPDATE empresas SET "

"Nombre_empresa = "
"'"
Q-Nombre
"'"
","
"Direccion_empresa = "
"'"
Q-Dire
"'"
" WHERE id_empresa = 23;"
delimited by size
INTO sql-comando
END-STRING.
DISPLAY "sql-comando : " , sql-comando(1:400).
INVOKE SqlServer1 "Execute" USING sql-comando RETURNING RETORNO.
display " RETORNO Execute UPDATE:" , RETORNO. *> si es 0 ERROR , SI ES CORRECTO 1
*> si hay error en sql-comando dispara el evento con POW-RETCODE = -1 , en POW-RECORD = mensaje de error
*>

if RETORNO = 1 THEN
display "UPDATE correcto !!"
else
display "UPDATE error !!"
end-if.


*Insert*


*------------
*> Insert

MOVE SPACES TO sql-comando.
MOVE "EMPRESADA MODELO OCX SQL 2232" TO Q-Nombre.
MOVE "San Martin 4242" TO Q-Dire.

STRING
"INSERT INTO empresas "
"("
"Nombre_empresa"
","
"Direccion_empresa"

")"
" VALUES "

"("

QueryEmpresa

")"
';' delimited by size
INTO sql-comando
END-STRING.
DISPLAY "sql-comando : " , sql-comando(1:400).
*> execute insert
INVOKE SqlServer1 "Execute" USING sql-comando RETURNING RETORNO.
display " RETORNO Execute INSERT:" , RETORNO. *> si es 0 ERROR , SI ES 1 CORRECTO
*> si hay error en sql-comando dispara el evento con POW-RETCODE = -1 , en POW-RECORD = mensaje de error
*>

if RETORNO = 1 THEN
display "insert correcto !!"
else
display "insert error !!"
end-if.




Saludos...

Josber
1 de octubre de 2024, 10:30
Gracias @fastpho pero, entre otras cosas, me sigue faltando, por ejemplo, el saber porqué ha dado fallo, (si es porque hay un fallo en la construcción de la sentencia, si es porque no hay más registros, etc.), es el valor que se devuelve automáticamente en la variable SQLSTATE cuando es SQL Embebido

Un salu2.-

fastpho
1 de octubre de 2024, 13:09
@Josber lo que podido comprobar como dice en el manual , es que en el Evento “DiagnoticRecord” se dispara si hay algún error en las sentencias
Por Ejemplo deliberadamente puse una dato mal en la propiedad “ConnectionString” me trajo:


POW-RETCODE = - 1 Error POW-RETCODE = 0 Ok
POW-RECORD = No se encuentra el nombre origen de los datos ….. (muestra exactamente cual fue el error detalladamente)
RETORNO = ZEROS
si está mal armada muestra un “string” con los errores y -1


Con respecto al RETORNO solamente para los métodos ,por las pruebas que hice , tiene 3 valores 0 , -1 , 1

RETORNO = 0 no hizo ningún cambio para “UPDATE” por ejemplo
RETORNO = 1 realizo el cambio
RETORNO = -1 Error

Por ahi @Fito , pudo avanzar en algo y nos da alguna otra apreciación
Voy a seguir probando

Saludos...

Fito
2 de octubre de 2024, 03:33
Hola Gente:

Yo estoy usando el ocx de Andrés para hacer insert en unas tablas Sql Server. Anda a la perfección.

En el evento "DiagnosticRecord" grabo un log con los errores.

El Returning del invoke donde llamamos a los métodos del objeto, tengo entendido que revuelve error si el método no se puede realizar. En cambio en el "DiagnosticRecord" devuelve el error de la instruccion que enviamos.

Por ejemplo su realizamos un "Execute" con un Insert adentro. El Returning devuelve el error del método Execute y el evento DiagnosticRecord el error del Insert.

Saludos...

Fito...