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)

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


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

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