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:
EXEC SQL
BEGIN DECLARE SECTION
END-EXEC.
* FICHERO de GASTOS
01 REG-GAS IS GLOBAL.
03 ID_GAS PIC S9(11).
03 GASLIB PIC X(4). *> LIBRO DE REGISTRO AL QUE PERTENECE EL APUNTE
03 GASFEC PIC X(8). *> FECHA DEL APUNTE
03 GASDES PIC X(60). *> DESCRIPCIÓN DEL APUNTE
03 GASIMP PIC S9(9)V999. *> IMPORTE DEL APUNTE
03 GASTIP PIC X. *> TIPO DE APUNTE (Ingreso o Gasto)
03 GASOBS PIC X(100). *> OBSERVACIONES
03 GASUSU PIC X(10). *> USUARIO ALTA DEL APUNTE
03 GASUSU_FEC PIC X(8). *> FECHA EN LA QUE SE REALIZA EL APUNTE
03 GASHO.
05 GASHOR PIC S9(6). *> HORA EN LA QUE SE REALIZA EL APUNTE
03 GASUSU_MOD PIC X(10). *> USUARIO ULTIMA MODIFICACIÓN
03 GASFEC_MOD PIC X(8). *> FECHA ULTIMA MODIFICACIÓN
03 GASHO_MOD.
05 GASHOR_MOD PIC S9(6). *> HORA ULTIMA MODIFICACIÓN
03 GASELI PIC X. *> ¿APUNTE ELIMINADO?
*
01 WGASLIB PIC X(4) IS GLOBAL.
01 WID_GAS PIC S9(11) IS GLOBAL.
01 ID_GAS1 PIC S9(11) IS GLOBAL.
*
01 SQLSTATE PIC XXXXX IS GLOBAL.
01 SQLCODE PIC S9(9) COMP-5 GLOBAL.
01 SQLMSG PIC X(600) GLOBAL.
01 CONTASQL PIC S9(9) IS GLOBAL. *> CONTADOR
01 WS-SQL PIC X(250) IS GLOBAL.
EXEC SQL
END DECLARE SECTION
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:
EXEC SQL
SELECT COUNT(GASLIB)
FROM GASTOS
WHERE GASLIB = :WGASLIB AND GASELI <> "S"
INTO :CONTASQL
END-EXEC.
en CONTASQL se almacenaría el total de registros
- PARA LEER UN REGISTRO ESPECÍFICO
Código COBOL:
MOVE "Text" OF CAMPO10 TO WID_GAS.
EXEC SQL
SELECT ID_GAS,
GASFEC,
GASDES,
GASIMP,
GASTIP,
GASOBS,
GASELI
FROM GASTOS WHERE ID_GAS = :WID_GAS LIMIT 1
INTO :ID_GAS,
:GASFEC,
:GASDES,
:GASIMP,
:GASTIP,
:GASOBS,
:GASELI
END-EXEC.
IF SQLSTATE NOT = "00000" OR GASELI = "S"
ADD POW-DMICONERROR POW-DMOK GIVING ESTILO
INVOKE POW-SELF "DisplayMessage"
USING "*ERROR: El registro no existe ..."
WS-ATENCION
ESTILO
END-INVOKE
INVOKE CAMPO10 "SetFocus"
EXIT PROGRAM
END-IF.
- PARA LEER UN RANGO ESPECÍFICO DE REGISTROS
Código COBOL:
EXEC SQL
DECLARE cursor1 CURSOR FOR
SELECT ID_GAS,
GASFEC,
GASDES,
GASIMP,
GASTIP,
GASOBS,
GASELI
FROM GASTOS WHERE GASLIB = :WGASLIB AND GASELI <> "S"
ORDER BY ID_GAS ASC;
END-EXEC.
EXEC SQL
OPEN cursor1
END-EXEC.
PERFORM CARGAR THRU FIN-CARGAR UNTIL SQLSTATE = "02000".
EXEC SQL
CLOSE cursor1
END-EXEC.
EXEC SQL
COMMIT
END-EXEC.
.
.
.
*
CARGAR.
EXEC SQL
FETCH cursor1
INTO :ID_GAS,
:GASFEC,
:GASDES,
:GASIMP,
:GASTIP,
:GASOBS,
:GASELI
END-EXEC.
IF SQLSTATE = "02000"
GO FIN-CARGAR
END-IF.
INVOKE VIEW2 "Add" USING 1 1 RETURNING WK-IDX
IF WK-IDX > 0 THEN
MOVE "ListItems"(WK-IDX) OF VIEW2 TO POW-PCMLIST
END-IF.
MOVE GASFEC TO FECHA.
MOVE CORR FECHA TO FECHA1.
.
.
.
FIN-CARGAR.
EXIT.
- PARA INSERTAR UN NUEVO REGISTRO
Código COBOL:
EXEC SQL
INSERT INTO GASTOS
VALUES (
NULL,
:GASLIB,
:GASFEC,
:GASDES,
:GASIMP,
:GASTIP,
:GASOBS,
:GASUSU,
:GASUSU_FEC,
:GASHOR,
:GASUSU_MOD,
:GASFEC_MOD,
:GASHOR_MOD,
:GASELI )
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:
EXEC SQL
UPDATE GASTOS
SET GASLIB = :GASLIB,
GASFEC = :GASFEC,
GASDES = :GASDES,
GASIMP = :GASIMP,
GASTIP = :GASTIP,
GASOBS = :GASOBS,
GASUSU_MOD = :GASUSU_MOD,
GASFEC_MOD = :GASFEC_MOD,
GASHOR_MOD = :GASHOR_MOD,
GASELI = :GASELI
WHERE ID_GAS = :ID_GAS
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
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.-