Tema: Sql Embebido
Ver Mensaje Individual
  #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