Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol Fujitsu COBOL PowerCOBOL (ActiveX, v4 - v11)
PowerCOBOL (ActiveX, v4 - v11) Versiones del IDE basadas en ActiveX
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
[Sintaxis] SQL embebido - cursor con COUNT() en PowerCOBOL 7 drvedia1981 PowerCOBOL (ActiveX, v4 - v11) 13 7 de junio de 2023 11:28
[Sintaxis] Sql Embebido condición where Hrmcobol PowerCOBOL (ActiveX, v4 - v11) 3 25 de abril de 2020 21:43
[Compilador] Microfocus Cobol y SQL Embebido EBERCAMACHO Micro Focus COBOL 3 9 de agosto de 2019 16:07
[PowerCOBOL] Ejemplo PWC y SQL Embebido Josber Cocina PowerCOBOL 10 15 de junio de 2017 03:17
[Sintaxis] Variables en programa con SQL embebido DYANY IBM Enterprise COBOL 1 20 de diciembre de 2016 16:26

Respuesta

  #1
Antiguo 18 de febrero de 2016, 23:05
Hrmcobol
Guardián del Foro
Guardián del Foro: Guardián del espíritu y clima del Foro - Issue reason: Por implicación en la vida del Foro 
Última Actividad 01.03.2022 02:59
Posts Posts: 323
Likes enviados Enviados: 102
Likes recibidos Recibidos: 120
Predeterminado Sql Embebido
0 Inactivo Inactivo

Hola camaradas, nunca use esta modalidad de acceso, use siempre DbAccessControl, de Power, necesitaría un código como ejemplo de como hacer para leer un tabla de una base, vía una ODBC. Estoy leyendo el manual pero no doy pie con bola.
En algún momento alguien subió algo al respecto, pero no logro encontrarlo.
Lo que quiero hacer en concreto es agregar campos a tablas ya existentes, tambien crear tablas nuevas en una base. Se que las instrucciones son CreateTable y AlterTable.
Todo desde un programa cobol.
Saludos y Gracias !!
Hrmcobol is offline   Responder Con Cita
  #2
Antiguo 19 de febrero de 2016, 08:16
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 20.09.2026 12:17
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

A ver Hrm, primero tienes que empezar definiendo la estructura de la tabla en la WORKING, (y todas las variables que vayas a usar en SQL), por ejemplo

Código COBOL:
  1.             EXEC SQL
  2.                  BEGIN DECLARE SECTION
  3.             END-EXEC.
  4. *       FICHERO de GASTOS
  5.  01  REG-GAS    IS GLOBAL.
  6.      03  ID_GAS         PIC S9(11).
  7.      03  GASLIB         PIC X(4).       *> LIBRO DE REGISTRO AL QUE PERTENECE EL APUNTE
  8.      03  GASFEC         PIC X(8).       *> FECHA DEL APUNTE
  9.      03  GASDES         PIC X(60).      *> DESCRIPCIÓN DEL APUNTE
  10.      03  GASIMP         PIC S9(9)V999.      *> IMPORTE DEL APUNTE
  11.      03  GASTIP         PIC X.          *> TIPO DE APUNTE (Ingreso o Gasto)
  12.      03  GASOBS         PIC X(100).     *> OBSERVACIONES
  13.      03  GASUSU         PIC X(10).      *> USUARIO ALTA DEL APUNTE
  14.      03  GASUSU_FEC     PIC X(8).       *> FECHA EN LA QUE SE REALIZA EL APUNTE
  15.      03  GASHO.
  16.          05  GASHOR     PIC S9(6).      *> HORA EN LA QUE SE REALIZA EL APUNTE
  17.      03  GASUSU_MOD     PIC X(10).      *> USUARIO ULTIMA MODIFICACIÓN
  18.      03  GASFEC_MOD     PIC X(8).       *> FECHA ULTIMA MODIFICACIÓN
  19.      03  GASHO_MOD.
  20.          05  GASHOR_MOD     PIC S9(6).      *> HORA ULTIMA MODIFICACIÓN
  21.      03  GASELI         PIC X.          *> ¿APUNTE ELIMINADO?
  22. *
  23.  01  WGASLIB            PIC X(4)    IS GLOBAL.
  24.  01  WID_GAS            PIC S9(11)  IS GLOBAL.
  25.  01  ID_GAS1            PIC S9(11)  IS GLOBAL.
  26. *
  27.  01  SQLSTATE           PIC XXXXX   IS GLOBAL.
  28.  01  SQLCODE            PIC S9(9) COMP-5   GLOBAL.
  29.  01  SQLMSG         PIC X(600)     GLOBAL.
  30.  01  CONTASQL           PIC S9(9)   IS GLOBAL.  *> CONTADOR
  31.  01  WS-SQL         PIC X(250)      IS GLOBAL.
  32.             EXEC SQL
  33.                  END DECLARE SECTION
  34.             END-EXEC.

Ten en cuenta que TODAS las variables numéricas, en la WORKING tienen que llevar signo SÍ o SÍ.

- PARA LEER EL NÚMERO DE REGISTROS:

Código COBOL:
  1.      EXEC SQL
  2.           SELECT COUNT(GASLIB)
  3.                  FROM GASTOS
  4.                       WHERE GASLIB = :WGASLIB AND GASELI <> "S"
  5.                  INTO :CONTASQL
  6.      END-EXEC.

en CONTASQL se almacenaría el total de registros

- PARA LEER UN REGISTRO ESPECÍFICO

Código COBOL:
  1.      MOVE "Text" OF CAMPO10 TO WID_GAS.
  2.      
  3.      EXEC SQL
  4.           SELECT ID_GAS,
  5.                  GASFEC,
  6.                  GASDES,
  7.                  GASIMP,
  8.                  GASTIP,
  9.                  GASOBS,
  10.                  GASELI
  11.                  FROM GASTOS WHERE ID_GAS = :WID_GAS LIMIT 1
  12.                  INTO :ID_GAS,
  13.                       :GASFEC,
  14.                       :GASDES,
  15.                       :GASIMP,
  16.                       :GASTIP,
  17.                       :GASOBS,
  18.                       :GASELI
  19.      END-EXEC.
  20.      
  21.      IF SQLSTATE NOT = "00000" OR GASELI = "S"
  22.         ADD POW-DMICONERROR POW-DMOK GIVING ESTILO
  23.         INVOKE POW-SELF "DisplayMessage"
  24.                USING "*ERROR: El registro no existe ..."
  25.                      WS-ATENCION
  26.                      ESTILO
  27.         END-INVOKE
  28.         INVOKE CAMPO10 "SetFocus"
  29.         EXIT PROGRAM
  30.      END-IF.

- PARA LEER UN RANGO ESPECÍFICO DE REGISTROS

Código COBOL:
  1.      
  2.      EXEC SQL
  3.           DECLARE cursor1 CURSOR FOR
  4.                   SELECT ID_GAS,
  5.                          GASFEC,
  6.                          GASDES,
  7.                          GASIMP,
  8.                          GASTIP,
  9.                          GASOBS,
  10.                          GASELI
  11.                   FROM GASTOS WHERE GASLIB = :WGASLIB AND GASELI <> "S"
  12.                          ORDER BY ID_GAS ASC;
  13.      END-EXEC.
  14.      
  15.      EXEC SQL
  16.           OPEN cursor1
  17.      END-EXEC.
  18.      
  19.      PERFORM CARGAR THRU FIN-CARGAR UNTIL SQLSTATE = "02000".
  20.      
  21.      EXEC SQL
  22.           CLOSE cursor1
  23.      END-EXEC.
  24.      
  25.      EXEC SQL
  26.           COMMIT
  27.      END-EXEC.
  28.      .
  29.      .
  30.      .    
  31. *
  32.  CARGAR.
  33.      EXEC SQL
  34.           FETCH cursor1
  35.                 INTO :ID_GAS,
  36.                      :GASFEC,
  37.                      :GASDES,
  38.                      :GASIMP,
  39.                      :GASTIP,
  40.                      :GASOBS,
  41.                      :GASELI
  42.      END-EXEC.
  43.      
  44.      IF SQLSTATE = "02000"
  45.         GO FIN-CARGAR
  46.      END-IF.
  47.          
  48.      INVOKE VIEW2 "Add" USING 1 1 RETURNING WK-IDX
  49.      IF WK-IDX > 0 THEN
  50.         MOVE "ListItems"(WK-IDX) OF VIEW2 TO POW-PCMLIST
  51.      END-IF.
  52.      
  53.      MOVE GASFEC TO FECHA.
  54.      MOVE CORR FECHA TO FECHA1.
  55.      .
  56.      .
  57.      .
  58.      
  59.  FIN-CARGAR.
  60.      EXIT.

- PARA INSERTAR UN NUEVO REGISTRO

Código COBOL:
  1.         EXEC SQL
  2.              INSERT INTO GASTOS
  3.                     VALUES (
  4.                             NULL,
  5.                            :GASLIB,
  6.                            :GASFEC,
  7.                            :GASDES,
  8.                            :GASIMP,
  9.                            :GASTIP,
  10.                            :GASOBS,
  11.                            :GASUSU,
  12.                            :GASUSU_FEC,
  13.                            :GASHOR,
  14.                            :GASUSU_MOD,
  15.                            :GASFEC_MOD,
  16.                            :GASHOR_MOD,
  17.                            :GASELI     )
  18.         END-EXEC

El primer campo es NULL, porque el campo ID_GAS, que es la clave principal, es un campo AUTO_INCREMENT.

- PARA MODIFICAR UN REGISTRO EXISTENTE:

Código COBOL:
  1.      EXEC SQL
  2.           UPDATE GASTOS
  3.                  SET GASLIB =   :GASLIB,
  4.                      GASFEC =   :GASFEC,
  5.                      GASDES =   :GASDES,
  6.                      GASIMP =   :GASIMP,
  7.                      GASTIP =   :GASTIP,
  8.                      GASOBS =   :GASOBS,
  9.                      GASUSU_MOD = :GASUSU_MOD,
  10.                      GASFEC_MOD = :GASFEC_MOD,
  11.                      GASHOR_MOD = :GASHOR_MOD,
  12.                      GASELI =   :GASELI
  13.                   WHERE ID_GAS = :ID_GAS
  14.      END-EXEC.

Aquí no puedes poner el primer campo, porque la llave principal, no se puede volver a grabar, si lo pusieras daría el error S200 en SQLSTATE.

despues de cada vez que INSERTES/MODIFIQUES un registro, has de poner

Código COBOL:
  1. EXEC SQL
  2.         COMMIT
  3. END-EXEC.

o de lo contrario, no te modificará la tabla, en caso que que quiereas desacer los cambios, cambias el COMMIT por ROLLBACK, pero una vez que haya hecho el COMMIT, los cambios no se pueden deshacer.

Creo que está todo, si tienes dudas o problemas, dinoslo.

Un saludo.-
Josber is offline   Responder Con Cita
  #3
Antiguo 19 de febrero de 2016, 11:46
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 20.09.2026 12:17
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

Se me ha pasado el ponerte como se crea la tabla

Código COBOL:
  1. EXEC SQL
  2. CREATE TABLE IF NOT EXIST 'gastos' (
  3.  'ID_GAS' int(11) unsigned NOT NULL AUTO_INCREMENT,
  4.  'GASLIB' varchar(4) DEFAULT NULL COMMENT 'LIBRO DE GASTOS',
  5.  'GASFEC' varchar(8) DEFAULT NULL COMMENT 'FECHA APUNTE',
  6.  'GASDES' varchar(60) DEFAULT NULL COMMENT 'DESCRIPCIÓN APUNTE',
  7.  'GASIMP' decimal(12,3) NOT NULL DEFAULT '0.000' COMMENT 'IMPORTE APUNTE',
  8.  'GASTIP' varchar(1) DEFAULT NULL COMMENT 'TIPO DE APUNTE(GASTO o INGRESO)',
  9.  'GASOBS' varchar(100) DEFAULT NULL COMMENT 'OBSERVACIONES APUNTE',
  10.  'GASUSU' varchar(10) DEFAULT NULL COMMENT 'USUARIO QUE HIZO EL APUNTE',
  11.  'GASUSU_FEC' varchar(8) DEFAULT NULL COMMENT 'FECHA QUE SE HIZO EL APUNTE',
  12.  'GASHOR' decimal(6,0) DEFAULT '0' COMMENT 'HORA EN LA QUE SE HIZO EL APUNTE',
  13.  'GASUSU_MOD' varchar(10) DEFAULT NULL COMMENT 'USUARIO ÚLTIMA MODIFICACIÓN',
  14.  'GASFEC_MOD' varchar(8) DEFAULT NULL COMMENT 'FECHA ÚLTIMA MODIFICACIÓN',
  15.  'GASHOR_MOD' decimal(6,0) DEFAULT NULL COMMENT 'HORA ÚLTIMA MODIFICACIÓN',
  16.  'GASELI' varchar(1) DEFAULT NULL COMMENT '¿APUNTE ELIMINADO?',
  17.  UNIQUE KEY ('ID_GAS')
  18. ) ENGINE=InnoDB DEFAULT CHARSET=latin1
  19. END-EXEC

Si no pones la instrucción IF NOT EXIST, te dará error si la tabla ya existe

- Si deseas eliminar elementos de la tabla:

Código COBOL:
  1. EXEC SQL
  2.         DELETE FROM GASTOS
  3.                    WHERE ID_GAS = :WID_GAS
  4. END-EXEC.

- Si quieres vaciar por completo una tabla, además de poner el contador AUTO_INCREMENT a 0, (si lo tiene la tabla, que no es obligatorio)

Código COBOL:
  1. EXEC SQL
  2.         TRUNCATE TABLE GASTOS
  3. END-EXEC.

- Si quieres eliminar por completo la tabla, (datos y estructura)

Código COBOL:
  1. EXEC SQL
  2.         DROP TABLE GASTOS
  3. END-EXEC.

¡Cuidado! que TRUNCATE y DROP, no tienen vuelta atrás

Si quieres ver cómo esta creada una tabla, desde el administrador de BD, no desde tu programa COBOL

Código SQL:
  1. SHOW CREATE TABLE Nombre_de_la_tabla

Esto te daría un fichero de texto plano muy similar al que utilizas para crear la tabla.

Un saludo y suerte.-

---------- Post añadido : 11:46 ---------- Post anterior : 11:30 ----------

Otra cosa a tener en cuenta, es cuando creas un número en SQL y has de ponerle un tamaño con decimales, esto se define entre paréntesis, el primer número indica el tamaño total, (incluidos los decimales) y el segundo los decimales, por ejemplo, un campo en COBOL del tipo

Código COBOL:
  1. 01  WNUM        PIC S9(7).
  2. 01  WDEC        PIC S9(7)V999.

en SQL, sería

Código SQL:
  1. 'WNUM' decimal(7,0),
  2. 'WDEC' decimal(10,3)

Si te fijas WDECIMAL en SQL, tiene un tamaño de 10, de los que 3 son decimales.
Los campos en SQL, se separan utilizando el símbolo de la , (coma), y las instrucciones se separan utilizando el símbolo ; (punto y coma), por ejemplo:

Código COBOL:
  1.      
  2.      EXEC SQL
  3.  
  4.           DECLARE cursor1 CURSOR FOR
  5.                   SELECT ID_GAS,
  6.                          GASFEC,
  7.                          GASDES,
  8.                          GASIMP,
  9.                          GASTIP,
  10.                          GASOBS,
  11.                          GASELI
  12.                   FROM GASTOS WHERE GASLIB = :WGASLIB AND GASELI <> "S"
  13.                          ORDER BY ID_GAS ASC;
  14.  
  15.           OPEN cursor1
  16.  
  17.      END-EXEC.

Cuidado con las comas y los punto y comas, que son obligatorios y es muy estricto en ésto.



Un saludo
Josber is offline   Responder Con Cita
  #4
Antiguo 24 de febrero de 2016, 16:14
Hrmcobol
Guardián del Foro
Guardián del Foro: Guardián del espíritu y clima del Foro - Issue reason: Por implicación en la vida del Foro 
Última Actividad 01.03.2022 02:59
Posts Posts: 323
Likes enviados Enviados: 102
Likes recibidos Recibidos: 120

Estimados, sigo colgado con este tema.
La pregunta es:
Como relaciono la ODBC con el PwCobol sin usar DbAccessControl
Saludos
Hrmcobol is offline   Responder Con Cita
  #5
Antiguo 24 de febrero de 2016, 21:45
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

Hrmcobol, si no me equivoco, tienes que crear un fichero *.inf con la configuración de la conexión e indicarlo en COBOL85.CBR con la variable @ODBC_Inf.
Ejemplo:
Código:
@ODBC_Inf=PRUEBA.inf



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #6
Antiguo 25 de febrero de 2016, 21:38
Hrmcobol
Guardián del Foro
Guardián del Foro: Guardián del espíritu y clima del Foro - Issue reason: Por implicación en la vida del Foro 
Última Actividad 01.03.2022 02:59
Posts Posts: 323
Likes enviados Enviados: 102
Likes recibidos Recibidos: 120

Asi Es Kuk, la conexión se hace r intermedio del @ODBC_Inf=PRUEBA.inf y el cobol85.cbr, logre abrir la base y leer registros de la tabla.
Gracias.
Hrmcobol is offline   Responder Con Cita
  #7
Antiguo 26 de febrero de 2016, 04:44
Juanghi
Forero Junior
Última Actividad 08.05.2025 13:04
Posts Posts: 8
Likes enviados Enviados: 2
Likes recibidos Recibidos: 2
Predeterminado muy bueno el aporte de jorber
1 Inactivo Inactivo

Como primer paso en tu proyecto deberias direccionar donde estara tu archivo de coneccion via odbc (ojo .. por fuera podes cambiar esa direccion tambien)

Luego ejecutar el SQLODBCS a los efectos de crear la sesion con el archivo de coneccion

seleccionas una seccon en este caso la llame SV4 asociada a una base "cursos", con su usuario y clave (root y su clave)

luego en la procedure estableces la coneccion y trabajas con todas aquellas
posiblidades que te brindo josber con comandos sql

al finalizar el programas te desconectas

Miniatura de Adjuntos
Pulsar la imagen para la versión amplia
Nombre:  screenshot.165.png
Vistas: 220
Tamaño:  3,8 KB   Pulsar la imagen para la versión amplia
Nombre:  screenshot.166.png
Vistas: 202
Tamaño:  6,9 KB   Pulsar la imagen para la versión amplia
Nombre:  screenshot.167.png
Vistas: 235
Tamaño:  7,1 KB   Pulsar la imagen para la versión amplia
Nombre:  screenshot.168.png
Vistas: 202
Tamaño:  861 Bytes   Pulsar la imagen para la versión amplia
Nombre:  screenshot.169.png
Vistas: 193
Tamaño:  1,1 KB  
Juanghi is offline   Responder Con Cita
  #8
Antiguo 26 de febrero de 2016, 14:56
Hrmcobol
Guardián del Foro
Guardián del Foro: Guardián del espíritu y clima del Foro - Issue reason: Por implicación en la vida del Foro 
Última Actividad 01.03.2022 02:59
Posts Posts: 323
Likes enviados Enviados: 102
Likes recibidos Recibidos: 120

Estimados, ante todo gracias por vuestra colaboración.
Ya he logrado leer y agregar registros a la tabla.
Aprendí la conexión Odbc/Cobol85/Sql.Inf
Ahora lo que quiero hacer es crear una tabla nueva con la instrucción CREATE TABLE, como se imaginaran copie el código del post que puso Josber, cuando compilo me da el siguiente error:
ART00101 CbLeer1-Click(20) : JMN2633I-S The SQL statement is invalid. ODBC-7600E NOT EXECUTABLE SQL STATEMENT..
Aparentemente el error es que " Create Table" no esta soportado.
Alguna idea?
Saludos

Les adjunto el código que escribí

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  
  5.      EXEC SQL BEGIN DECLARE SECTION END-EXEC.
  6.  
  7.  01 SQLSTATE        PIC  X(005).
  8.  
  9.      EXEC SQL END DECLARE SECTION END-EXEC.
  10.  
  11.  PROCEDURE DIVISION.
  12.  
  13.      EXEC SQL CONNECT TO 'maestro' END-EXEC.  *> Maestro es el nombre de la ODBC
  14.  
  15.         EXEC SQL
  16.         CREATE TABLE IF NOT EXIST 'gastos' (
  17.                 'ID_GAS'    int   (011) unsigned          NOT NULL AUTO_INCREMENT,
  18.                 'GASLIB'    varchar (004)               DEFAULT NULL,
  19.                 'GASFEC'    varchar (008)               DEFAULT NULL,
  20.                 'GASDES'    varchar (060)               DEFAULT NULL,
  21.                 'GASELI'    varchar (001)               DEFAULT NULL,
  22.             UNIQUE KEY ('ID_GAS')) ENGINE=InnoDB DEFAULT CHARSET=latin1
  23.         END-EXEC      
  24.  
  25.      IF  sqlstate not = "00000" INVOKE POW-SELF "DisplayMessage" USING sqlstate "Error".
  26.  
  27.      EXEC SQL DISCONNECT 'maestro'  END-EXEC.
Hrmcobol is offline   Responder Con Cita
  #9
Antiguo 26 de febrero de 2016, 18:41
Xavier
Forero Junior
Última Actividad 17.11.2021 12:04
Posts Posts: 24
Likes enviados Enviados: 13
Likes recibidos Recibidos: 3

Hola Hrm
Creo haber leído en algún sitio, ahora no recuerdo donde, que desde el SQL embebido solo puedes hacer uso del lenguaje DML (Data Manipulation Laguaje) que es que estáis comentando aquí, pero no puedes hacer uso del DDL (Data Definition Laguaje) que es el que sirve para definir objetos en la base de datos (Tablas, Vistas, etc.)
Xavier is offline   Responder Con Cita
  #10
Antiguo 27 de febrero de 2016, 19:06
Hrmcobol
Guardián del Foro
Guardián del Foro: Guardián del espíritu y clima del Foro - Issue reason: Por implicación en la vida del Foro 
Última Actividad 01.03.2022 02:59
Posts Posts: 323
Likes enviados Enviados: 102
Likes recibidos Recibidos: 120

Gracias Xavier. Estoy leyendo el manual un poco mas detenidamente y aparentemente es así como tu dices.

Entonces la pregunta es: No se pueden usar "Alter" y "Create" en PWC ?

Saludos
Hrmcobol is offline   Responder Con Cita
Respuesta


Herramientas

Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:50.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.