Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Duda] Diferencia resultados consulta en MariaDB y PWC9 (https://www.cobolforo.es/showthread.php?t=1773)

Josber 7 de junio de 2024 13:30

Diferencia resultados consulta en MariaDB y PWC9
 
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:

Código SQL:
  1. 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:

Código SQL:
  1. SELECT COUNT(CLICOD)
  2.   FROM CLIENTES
  3.  WHERE CLICOD > TRIM(     333)
  4.    AND CLIORG LIKE '%' || TRIM('ZACIÓN                                            ') || '%'
  5.    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/so...rset-en-mysql/

Cita:

Citación del post de Charset y Collation
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

@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

Cita:

Citación del post de Kuk (Mensaje 9453)
@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

Cita:

Citación del post de Kuk (Mensaje 9457)
@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:

Código:

- 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....ara-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.

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  
  3.  input-output section.
  4.  file-control.
  5.      select optional archivo-csv assign to "C:\ARTI.CSV"
  6.         organization is line sequential.
  7.      
  8.  DATA            DIVISION.
  9.  file section.
  10.  fd  archivo-csv label records standard.
  11.  01  reg-csv     pic x(280).
  12.  
  13.  WORKING-STORAGE SECTION.
  14.  
  15.  01  registro.
  16.      02 csv-articulo     pic z(6).
  17.      02                  pic x value ";".
  18.      02 csv-denominacion pic x(100).
  19.      02                  pic x value ";".
  20.      02 csv-rubro        pic x(35).
  21.      02                  pic x value ";".
  22.      02 csv-cant-uni     pic zzzz9,999.
  23.      02                  pic x value ";".
  24.      02 csv-faccionado   pic xx.
  25.      02                  pic x value ";".
  26.      02 csv-kgfle        pic zzzz9,999.
  27.      02                  pic x value ";".
  28.      02 csv-porcaja      pic zzzz9,999.
  29.      02                  pic x value ";".
  30.      02 csv-porpallet    pic zzzz9,999.
  31.      02                  pic x value ";".
  32.      02 csv-desprom      pic zzzz9,999.
  33.      02                  pic x value ";".
  34.      02 csv-hasprom      pic zzzz9,999.
  35.      02                  pic x value ";".
  36.      02 csv-asociado     pic z(6).
  37.      02                  pic x value ";".
  38.      02 csv-suspendido   pic xx.
  39.      02                  pic x value ";".
  40.      02 csv-preciolibre  pic xx.
  41.      02                  pic x value ";".
  42.      02 csv-costo        pic z(9)9,99.
  43.      02                  pic x value ";".
  44.      02 csv-cosfec       pic x(10).
  45.      02                  pic x value ";".
  46.      02 csv-publico      pic z(9)9,99.
  47.      02                  pic x value ";".
  48.      02 csv-mayor        pic z(9)9,99.
  49.      02                  pic x value ";".
  50.      02 csv-iva          pic z9,99.
  51.      
  52.  01  wfraccionado        pic xx.
  53.  01  wprelibre           pic xx.
  54.  01  wsus                pic xx.
  55.  01  wcosto              pic 9(12)v99.
  56.  01  xfecha              pic 9999/99/99.
  57.  01  redefines xfecha.
  58.      02 wfecha           pic x(10).
  59.  01  wpublico            pic 9(12)v99.
  60.  01  wmayor              pic 9(12)v99.
  61.        
  62.  01 RETORNO      PIC S9(9) COMP-5.
  63.  01 COMANDO      PIC x(4096).
  64.  
  65.  PROCEDURE       DIVISION.
  66.  
  67.  #include "copys\declara-com.cpy".
  68.  
  69.  comienzo.
  70.     *> paso el string de conexión - tengo un origen de datos configurado por ODBC
  71.      move "DSN=POWERBI;UID=sa;PWD=**********"  to "ConnectionString" of BD.
  72.    
  73.      *> conecto a la BBDD
  74.      invoke BD "Connect" returning RETORNO.
  75.    
  76.      *> Elimino la BBDD
  77.      move spaces                   to comando.
  78.      move 'DROP TABLE IF EXISTS dbo."Articulos"'    to comando.
  79.      INVOKE BD "Execute" USING comando RETURNING RETORNO.
  80.  
  81.      *> Creo la BBDD
  82.      move spaces                   to comando.
  83.      string 'CREATE TABLE  dbo."Articulos"'         delimited by size
  84.             ' ( '                                   delimited by size
  85.             'articulo     integer, '                delimited by size
  86.             'denominacion character varying(100), ' delimited by size
  87.             'rubro        character varying(35), '  delimited by size
  88.             'cant_uni     numeric(8,3), '           delimited by size
  89.             'faccionado   character varying(2), '   delimited by size
  90.             'kgfle        numeric(8,3), '           delimited by size
  91.             'porcaja      numeric(8,3), '           delimited by size
  92.             'porpallet    numeric(8,3), '           delimited by size
  93.             'desprom      numeric(8,3), '           delimited by size
  94.             'hasprom      numeric(8,3), '           delimited by size
  95.             'asociado     integer, '                delimited by size
  96.             'suspendido   character varying(2), '   delimited by size
  97.             'preciolibre  character varying(2), '   delimited by size
  98.             'costo        numeric(12,2), '          delimited by size
  99.             'cosfec       date, '                   delimited by size
  100.             'publico      numeric(12,2), '          delimited by size
  101.             'mayor        numeric(12,2), '          delimited by size
  102.             'iva          numeric(5,2) '            delimited by size
  103.             ')'                                     delimited by size
  104.         into comando
  105.      end-string.
  106.      INVOKE BD "Execute" USING comando RETURNING RETORNO.
  107.  
  108.      open input arti nivel output archivo-csv.
  109.  
  110.      move spaces           to reg-csv.
  111.      string 'articulo;'                delimited by size
  112.             'denominacion;'            delimited by size
  113.             'rubro;'                   delimited by size
  114.             'cant_uni; '               delimited by size
  115.             'faccionado; '             delimited by size
  116.             'kgfle; '                  delimited by size
  117.             'porcaja; '                delimited by size
  118.             'porpallet; '              delimited by size
  119.             'desprom; '                delimited by size
  120.             'hasprom; '                delimited by size
  121.             'asociado; '               delimited by size
  122.             'suspendido; '             delimited by size
  123.             'preciolibre; '            delimited by size
  124.             'costo; '                  delimited by size
  125.             'cosfec'                   delimited by size
  126.             'publico'                  delimited by size
  127.             'mayor; '                  delimited by size
  128.             'iva'                      delimited by size
  129.         into reg-csv
  130.      end-string.
  131.      write reg-csv.
  132.      
  133.      initialize artcla.
  134.      start arti key is not < artcla invalid go sale.
  135.      
  136.  leo.
  137.      read arti next at end go sale.
  138.  
  139.      initialize nivcla.
  140.      move artniv1         to nivniv1.
  141.      read nivel invalid move spaces to nivdenom.
  142.      
  143.      if artfracc-s
  144.         move "SI"         to wfraccionado
  145.      else
  146.         move "NO"         to wfraccionado
  147.      end-if.
  148.  
  149.      if artsus-s
  150.         move "SI"         to wsus
  151.      else
  152.         move "NO"         to wsus
  153.      end-if.
  154.      if artpreciolibre-s
  155.         move "SI"         to wprelibre
  156.      else
  157.         move "NO"         to wprelibre
  158.      end-if.
  159.      move artcos          to wcosto.
  160.  
  161.      move artcos-fec      to fecha-amd.
  162.      perform amd-to-dma.
  163.      perform valida-fecha.
  164.      if error-fecha = 1 or artcos-fec = zeros
  165.         move 20000101       to fecha-amd
  166.      end-if  
  167.      move fecha-amd         to xfecha.
  168.      compute wpublico rounded = artpre1 * (1 + artiva-ins / 100).
  169.      compute wmayor   rounded = artpre2 * (1 + artiva-ins / 100).
  170.  
  171.      move articulo          to csv-articulo.
  172.      move artdenom          to csv-denominacion.
  173.      move nivdenom          to csv-rubro.
  174.      move artcant-uni       to csv-cant-uni.
  175.      move wfraccionado      to csv-faccionado.
  176.      move artkgfle          to csv-kgfle.
  177.      move artporcaja        to csv-porcaja.
  178.      move artporpallet      to csv-porpallet.
  179.      move artdesprom        to csv-desprom.
  180.      move zeros             to csv-hasprom.
  181.      move artasociado       to csv-asociado.
  182.      move wsus              to csv-suspendido.
  183.      move wprelibre         to csv-preciolibre.
  184.      move wcosto            to csv-costo.
  185.      move wfecha            to csv-cosfec.
  186.      move wpublico          to csv-publico.
  187.      move wmayor            to csv-mayor.
  188.      move artiva-ins        to csv-iva.
  189.      
  190.      inspect csv-denominacion replacing all ";" by " ".
  191.      inspect csv-rubro        replacing all ";" by " ".
  192.  
  193.      inspect registro         replacing all "," by ".".
  194.  
  195.      write reg-csv from registro.
  196.      
  197.      go leo.
  198.      
  199.  sale.
  200.      close arti nivel.
  201.  
  202.      move spaces            to comando.
  203.      
  204.      string "BULK INSERT dbo.Articulos "
  205.         'FROM "c:\ARTI.CSV" '
  206.         'WITH ( '
  207.         '  FIRSTROW = 2 '
  208.         ", FIELDTERMINATOR = ';' "
  209.         ", ROWTERMINATOR = '0x0a'); "
  210.         DELIMITED BY SIZE INTO comando
  211.      end-string.  
  212.      INVOKE BD "Execute" USING comando RETURNING RETORNO.
  213.      
  214.      INVOKE BD "Disconnect" RETURNING RETORNO.
  215.                
  216.      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:

Código COBOL:
  1. Comienzo                   05 00 00 86  13/06/2024                                                                      
  2.  Baja Artículos            05 00 20 85  13/06/2024                                                                      
  3.  Baja CtaCtes              05 00 32 25  13/06/2024                                                                      
  4.  Baja Ventas               05 00 46 32  13/06/2024                                                                      
  5.  Baja Stock                05 02 22 19  13/06/2024        
  6.    Artículos               05 03 06 06  13/06/2024          2.380 registros                                                  
  7.    Clientes                05 03 06 51  13/06/2024         22.801 registros                                                          
  8.    Stock                   05 03 07 14  13/06/2024      2.159.529 registros                                                                
  9.    Ventas                  05 03 24 29  13/06/2024     28.504.015 registros                                                                
  10. 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)

Código COBOL:
  1.      STRING 'DRIVER=MARIADB ODBC 3.0 Driver; '
  2.             'Server=localhost; '
  3.             'Port=3306; '
  4.             'Database=braulio; '
  5.             'Uid=*******; '
  6.             'Pwd=*******;' DELIMITED BY SIZE INTO WS_SQL
  7.      END-STRING.
  8.  
  9.      MOVE WS_SQL TO "ConnectionString" OF Bd.
  10.  
  11.      INVOKE Bd "Connect" RETURNING RETORNO.
  12.  
  13.      INITIALIZE WS_SQL.
  14.      MOVE "SELECT COUNT(CLICOD) FROM CLIENTES WHERE CLIELI <> 'S'" TO WS_SQL.
  15.      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

mysql mariadb EXTMYSQL ocx
 
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


Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01 RETORNO        PIC S9(9) COMP-5.
  3.  01 sql-comando    pic x(8192).
  4.  01 BD-EMPRESA.
  5.     02 BDIDUSR    PIC 9(09).
  6.     02 BDNOMBRE   PIC X(55).
  7.     02 BDCLAVE    PIC X(255).
  8.  01 Cantidad-Registros PIC S9(9) COMP-5.
  9.  PROCEDURE       DIVISION.
  10.  
  11.      move spaces to sql-comando.
  12.      STRING 'DRIVER={MariaDB ODBC 3.2 Driver};'
  13.             'SERVER=xxxx.com.ar;'
  14.             'Port=3306;'
  15.             'DATABASE=xxxxxxxxxxxxxxx;'
  16.             'UID=xxxxx;'
  17.             'PWD=xxxxxxxxxx;'
  18.              DELIMITED BY SIZE INTO sql-comando
  19.      END-STRING.
  20.     *> conecta
  21.      MOVE sql-comando TO "ConnectionString" OF SqlServer1.    
  22.      invoke SqlServer1 "Connect" returning RETORNO.
  23.      display "    RETORNO db:" , RETORNO.
  24.  
  25.      *> select
  26.      move spaces to sql-comando.
  27.      move "select count(id_empresa) from empresas" to sql-comando.
  28.      INVOKE SqlServer1 "OpenQuery" USING sql-comando RETURNING RETORNO
  29.      display "    RETORNO Execute:" , RETORNO.
  30.    
  31.      
  32.      *> record
  33.      INVOKE SqlServer1 "GETVALUE" USING 1 RETURNING Cantidad-Registros
  34.      DISPLAY "CANTIDAD DE REGISTROS:" , Cantidad-Registros
  35.     *> desconecto
  36.      INVOKE SqlServer1 "Disconnect" RETURNING RETORNO.

*> Select simple

Código COBOL:
  1. WORKING-STORAGE SECTION.
  2.  01 RETORNO        PIC S9(9) COMP-5.
  3.  01 sql-comando    pic x(8192).
  4.  01 BD-EMPRESA.
  5.     02 BDIDUSR    PIC 9(09).
  6.     02 BDNOMBRE   PIC X(55).
  7.     02 BDCLAVE    PIC X(255).
  8.  01 Cantidad-Registros PIC S9(9) COMP-5.
  9.  PROCEDURE       DIVISION.
  10.  
  11.      move spaces to sql-comando.
  12.      STRING 'DRIVER={MariaDB ODBC 3.2 Driver};'
  13.             'SERVER=xxxx.com.ar;'
  14.             'Port=3306;'
  15.             'DATABASE=xxxxxxxxxxxxxxx;'
  16.             'UID=xxxxx;'
  17.             'PWD=xxxxxxxxxx;'
  18.              DELIMITED BY SIZE INTO sql-comando
  19.      END-STRING.
  20.     *> conecta
  21.      MOVE sql-comando TO "ConnectionString" OF SqlServer1.    
  22.      invoke SqlServer1 "Connect" returning RETORNO.
  23.      display "    RETORNO db:" , RETORNO.
  24.  
  25.      *> select
  26.      move spaces to sql-comando.
  27.      move "select Id_empresa , Nombre_empresa , Password_empresa  from empresas" to sql-comando.
  28.      INVOKE SqlServer1 "OpenQuery" USING sql-comando RETURNING RETORNO
  29.      display "    RETORNO Execute:" , RETORNO. *> si es distinto de zeros o -1 error en la select
  30.     *> loop record    
  31.      PERFORM WITH NO LIMIT
  32.  
  33.                  INVOKE SqlServer1 "NEXT" RETURNING RETORNO
  34.                  IF ISEOF OF SqlServer1 = 1 EXIT PERFORM END-IF
  35.      INVOKE SqlServer1 "GETVALUE" USING 1 RETURNING BDIDUSR
  36.      DISPLAY "EMPRESA ID:" , BDIDUSR
  37.      INVOKE SqlServer1 "GETVALUE" USING 2 RETURNING BDNOMBRE
  38.      DISPLAY "NOMBRE:" , BDNOMBRE
  39.      INVOKE SqlServer1 "GETVALUE" USING 3 RETURNING BDCLAVE
  40.      DISPLAY "CLAVE:" , BDCLAVE
  41.      
  42.      END-PERFORM.
  43.    
  44.      
  45.      *> desconecto
  46.      INVOKE SqlServer1 "Disconnect" RETURNING RETORNO.





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

fastpho 30 de septiembre de 2024 16:36

Ocx para SQL nativo
 
Probando con el ocx de nitzer , agrego como hacer un Insert y Update

*Update*

Código COBOL:
  1. *> Update
  2.      move spaces to sql-comando.
  3.      MOVE "empresa de prueba nro 23" TO Q-Nombre.
  4.      MOVE "dirección con ñÑ y acentos"       TO Q-Dire.
  5.  
  6.  
  7.  
  8.           STRING
  9.             "UPDATE  empresas SET "  
  10.  
  11.             "Nombre_empresa = "      
  12.             "'"  
  13.             Q-Nombre          
  14.             "'"            
  15.             ","                      
  16.             "Direccion_empresa = "      
  17.             "'"
  18.             Q-Dire
  19.             "'"
  20.             " WHERE id_empresa = 23;"    
  21.             delimited by size
  22.             INTO  sql-comando
  23.          END-STRING.    
  24.      DISPLAY "sql-comando : " , sql-comando(1:400).    
  25.      INVOKE SqlServer1 "Execute" USING sql-comando RETURNING RETORNO.
  26.      display "    RETORNO Execute UPDATE:" , RETORNO. *> si es 0 ERROR , SI ES CORRECTO 1
  27.     *> si hay error en sql-comando dispara el evento con POW-RETCODE = -1 , en POW-RECORD = mensaje de error
  28.     *>
  29.      
  30.      if RETORNO = 1 THEN
  31.         display "UPDATE correcto !!"
  32.      else
  33.         display "UPDATE error !!"
  34.      end-if.    

*Insert*

Código COBOL:
  1. *------------        
  2. *> Insert
  3.  
  4.          MOVE SPACES TO sql-comando.
  5.          MOVE "EMPRESADA MODELO OCX SQL 2232"   TO Q-Nombre.
  6.          MOVE "San Martin 4242"                 TO Q-Dire.
  7.  
  8.           STRING
  9.             "INSERT INTO empresas "  
  10.             "("                      
  11.             "Nombre_empresa"        
  12.             ","                      
  13.             "Direccion_empresa"      
  14.  
  15.             ")"                      
  16.             " VALUES "
  17.            
  18.             "("
  19.            
  20.             QueryEmpresa
  21.  
  22.              ")"
  23.              ';' delimited by size                          
  24.                  INTO sql-comando
  25.          END-STRING.
  26.      DISPLAY "sql-comando : " , sql-comando(1:400).
  27.     *> execute insert
  28.      INVOKE SqlServer1 "Execute" USING sql-comando RETURNING RETORNO.
  29.      display "    RETORNO Execute INSERT:" , RETORNO. *> si es 0 ERROR , SI ES 1 CORRECTO
  30.     *> si hay error en sql-comando dispara el evento con POW-RETCODE = -1 , en POW-RECORD = mensaje de error
  31.     *>
  32.  
  33.      if RETORNO = 1 THEN
  34.         display "insert correcto !!"
  35.      else
  36.         display "insert error !!"
  37.      end-if.
  38.      
  39.  
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

Ocx para SQL nativo
 
@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:

Código COBOL:
  1. POW-RETCODE = - 1 Error POW-RETCODE = 0 Ok
  2. POW-RECORD = No se encuentra el  nombre origen de los datos ….. (muestra exactamente cual fue el error detalladamente)
  3. RETORNO = ZEROS
  4.  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
Código COBOL:
  1. RETORNO = 0  no hizo ningún cambio para “UPDATE” por ejemplo
  2. RETORNO = 1 realizo el cambio
  3. 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...


La franja horaria es GMT +2. Ahora son las 17:04.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.