Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Duda] Comenzar con BBDD... (https://www.cobolforo.es/showthread.php?t=949)

Fito 5 de febrero de 2019 17:08

Comenzar con BBDD...
 
Hola Amigos:

Quiero comenzar con el uso de alguna BBDD (postgres seguramente), y quiero alguna recomendación de qué utilizar.
Estoy en la duda si encarar por el lado de Control DBAcces, Ado, o Sql enbebido o alguna otra cosa. Mi idea es ir generando tablas paralelas a mis archivos cobol, es decir, seguir grabando mis archivos como siempre, y a su vez ir metiendo los mismos datos en la BBDD, para ir haciendolo paulatinamente.

Saludos.

Fito...

Josber 6 de febrero de 2019 11:15

A ver yo he utilizado SQL Embebido, porque me parecía el más sencillo y controlable de las 3 opciones. Intenté con ADO, pero me parecía muy costoso de escribir el código, y DBAccess, ni lo intenté. Buscando documentación y ejemplos, al final me quedé con el embebido. Funciona perfectamente, es senciullo, rápido y todo lo que necesitas. Tiene sus pegas, (que con ADO creo que no existen), y es que hay algunas instrucciones que no las reconoce, como son CREATE, ALTER y algunas más, que no recuerdo ahora, por lo que las tablas, han de venir creadas y/o modificadas "de casa", la conexión a la BD, también hay que hacerla a través de un fichero de configuración y un ODBC, pero, si te acostumbras a solventar ésto desde fuera de tus programas. SQL Embebido, funciona perfectamente.

Un saludo.-

Fito 6 de febrero de 2019 15:05

Hola:

Gracias Josber por responder. No me preocupa "mantener" las tablas desde el Cobol, solamente quiero hacer ABM. Lo demás lo haría con la herramienta de la BBDD.

Bien, SQL Embebido 1, controles ADO y DBAcces 0.

Saludos.

Fito...

Kuk 6 de febrero de 2019 19:33

Fito, Josber, he añadido una encuesta ;)

Lascu 7 de febrero de 2019 15:36

Hola Fito, me sumo a la respuesta de Josber. Es más sencillo de usar y mantener sql embebido que ADO, en mi opinión.
Te adjunto una rutina que uso para leer un registro de usuario.

Código COBOL:
  1. ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  
  5.      EXEC SQL BEGIN DECLARE SECTION END-EXEC.
  6.    
  7.  #INCLUDE "FD\BD-TABLAS.CPY".
  8.  
  9.  01 BDUSUARIOS.
  10.     02 BDIDUSR    PIC S9(06).
  11.     02 BDLOGIN    PIC X(20).
  12.     02 BDNOMBRE   PIC X(60).
  13.     02 BDTIPOUSR  PIC X(04).
  14.     02 BDCLAVE    PIC X(20).
  15.     02 BDCAMBIO   PIC X(08).
  16.     02 BDHOST     PIC X(80).
  17.     02 BDFOTOUSR  PIC X(80).
  18.     02 BDACCESO   PIC X(14).
  19.    
  20.  01 SQLFECHA            PIC X(08) GLOBAL.
  21.  01 SQLSTATE            PIC X(5) global.
  22.  01 SQLCODE             PIC S9(09) COMP-5 GLOBAL.
  23.  01 SQLMSG              PIC X(128) GLOBAL.
  24.  
  25.      EXEC SQL END DECLARE SECTION END-EXEC.
  26.  
  27.  01 DATOS-IMAGEN.
  28.     02 FILLER   PIC X(06) VALUE "FOTOS".
  29.     02 NOM-FOTO PIC X(15).
  30.  01 WK-COMBO.
  31.     02 WK-VALOR PIC X(04).
  32.     02 FILLER   PIC X(03) VALUE " - ".
  33.     02 WK-DESCR PIC X(40).
  34.    
  35.  LINKAGE SECTION.
  36.  01 LK-ID     PIC 9(04).
  37.  01 LK-NOMBRE PIC X(20).
  38.  PROCEDURE DIVISION USING LK-ID, LK-NOMBRE.
  39.      INITIALIZE BDUSUARIOS.
  40.      EXEC SQL CONNECT TO DEFAULT END-EXEC.    
  41.      EVALUATE TRUE
  42.         WHEN REG-EXISTE
  43.            MOVE LK-ID TO BDIDUSR
  44.            EXEC SQL SELECT * FROM usuarios WHERE iduser = :BDIDUSR
  45.                     INTO :BDIDUSR, :BDLOGIN, :BDNOMBRE, :BDTIPOUSR, :BDCLAVE, :BDCAMBIO, :BDACCESO
  46.            END-EXEC
  47.         WHEN REG-CAMBIO
  48.            MOVE LK-NOMBRE TO BDLOGIN
  49.            EXEC SQL SELECT * FROM usuarios WHERE iduser = :BDLOGIN
  50.                     INTO :BDIDUSR, :BDLOGIN, :BDNOMBRE, :BDTIPOUSR, :BDCLAVE, :BDCAMBIO, :BDACCESO
  51.            END-EXEC
  52.      END-EVALUATE.
  53.      IF SQLSTATE = "00000" THEN
  54.                               PERFORM DATOS-A-PANTALLA
  55.        ELSE
  56.           MOVE SQLSTATE TO WX-SQLSTATE-ERROR
  57.           MOVE SQLMSG   TO WX-SQLMSG-ERROR
  58.           INVOKE POW-SELF "CallForm" USING "INICIOERROR" "ERRORBD.DLL"
  59.      END-IF.
  60.      EXEC SQL DISCONNECT DEFAULT END-EXEC.
  61.      EXIT PROGRAM.
  62.      
  63.      
  64.  DATOS-A-PANTALLA.
  65.      MOVE BDIDUSR      TO "Caption" OF LBL-CODIGO.
  66.      MOVE BDLOGIN      TO "Text"    OF PIC-LOGIN.
  67.      MOVE BDNOMBRE     TO "Text"    OF PIC-NOMBRE.
  68.      MOVE BDCLAVE      TO "Text"    OF PIC-CLAVE.
  69. *     MOVE BDFECHA      TO "Caption" OF LBL-FECHA-ACCESO.
  70.      MOVE BDHOST       TO "Caption" OF LBL-ORDENADOR.
  71.      IF BDFOTOUSR NOT = SPACES THEN
  72.                                   MOVE BDFOTOUSR TO NOM-FOTO
  73.                                   MOVE DATOS-IMAGEN TO "ImageName" OF IMAGEN
  74.      END-IF.
  75.      IF BDTIPOUSR > SPACES THEN
  76.                               MOVE "TUSU"    TO BDTIPO
  77.                               MOVE BDTIPOUSR TO BDVALOR
  78.                               EXEC SQL
  79.                                  SELECT tipotbl, valortbl, descritbl FROM tablas
  80.                                  WHERE tipotbl = :BDTIPO AND valortbl = :BDVALOR INTO :BDTIPO, :BDVALOR, :BDDESCR
  81.                               END-EXEC
  82.                               MOVE BDVALOR TO WK-VALOR
  83.                               MOVE BDDESCR TO WK-DESCR
  84.                               MOVE WK-COMBO TO "Text" OF CBO-TIPO
  85.      END-IF.
  86.      IF REG-CAMBIO THEN
  87.                        MOVE POW-FALSE TO "Enabled" OF PIC-LOGIN
  88.                        MOVE POW-FALSE TO "Enabled" OF CBO-TIPO
  89.                        INVOKE PIC-NOMBRE "SetFocus"
  90.         ELSE
  91.            INVOKE PIC-LOGIN "SetFocus"
  92.       END-IF.

Saludos

Nitzer 8 de febrero de 2019 12:08

Perdonad que discrepe, pero no cambio el ADO por nada del mundo :)

Ha sido mi salvación para adaptarme a nuevos paradigmas. El único problema que no he sido capaz de solucionar es cuando se pierde la conexión a la base de datos (se haya caido el servicio) que no pasa jamás, pero alguna vez en la empresa se hace por motivos ... (que no vienen a cuento) y entonces saltan 10.000 errores :))) , pero es la única pega y si todo va como debe de ir, jamás falla.

Ventajas, bajo mi punto de vista:
- No hay que definir nada en la working especificamente.
- Permite conectarse con ConnectionString, por lo que puedo cambiar de base de datos sin tocar código.
- da igual la complejidad de la select, con un string la construyes sin limitaciones.
- trabajar con el recordset generado es muy fácil y extraer la información igualmente.
- Un problema, NO PUEDEN VENIR CAMPOS NULL si los vas a almacenar en un numérico, se soluciona con un CASE (sqlserver) en la propia select.


Todo lo expuesto para utilizarlo con el control ADO que viene con el NetCobol.

Para algún caso específico también creo el objeto, por ejemplo INSERT MASIVOS o ejecución de algún procedimiento almacenado o función.

Como consejo final, la decisión que tomé de utilizar bbdd y solo dejar los indexados para ficheros temporales de trabajo, ha sido la mejor que he tomado en mucho tiempo.


La franja horaria es GMT +2. Ahora son las 00:21.

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