Hola,
No se que es lo que puede pasar si ejecutas las instrucciones dentro de
un RPG, ¿la idea seria recibir por parametro el nombre del fichero
origen y el de destino?. En principio estan en el mismo trabajo, por lo
que el OPNDBF deberia permanecer para las siguientes instrucciones.
Una cosa extraña que me ha pasado es al llamar de un programa COBOL/ILE
a un COBOL (tipico modulo de recuperacion de datos) y en el COBOL normal
intentar dejar los ficheros abiertos, al salir del programa se cerraban
los ficheros. Habia que llamar de un ILE a un programa intermedio en
COBOL normal que lo unico que hacia era llamar al modulo COBOL. Esto era
en una V4R5M0, no se como estara ahora el tema, pero creo que seguira
asi y sucedera lo mismo con RPG.
Si para cada fichero vas a llamar a un RPG esto puede que no sea lo mas
optimo, ya que en cada llamada hay que actualizar la pila de programas,
aunque supongo que tu intencion es desde el CL recuperar la lista de
ficheros a copiar y enviar pr BATCH el RPG.
Si simplemente es copiar de un fichero a otro, creo que lo mejor es un
CL que lea la lista de ficheros y enviar por BATCH a otro CL que haga la
copia de los datos, asi puedes enviar todos a la vez a la cola de BATCH
y que se vayan procesando.
Saludos
Dani
Isencia S.L.
Daniel García
E-mail: [EMAIL PROTECTED]
Tel. +34 93 754 03 66
Fax +34 93 754 03 98
Jaime Villa Torres escribió:
Daniel, una pregunta más, que efecto puede pasar al realizar OPNDBF desde
un RPGIV, en el rpg lo realizaríamos con un QCMDEXC, lo mismo que el CPYF,
en el CL no utilizaríamos QCMDEXC, sino que los dos comandos estarían dentro
de un mismo llamado que sería el CL.
Gracias
Jaime Villa T.
----- Mensaje original -----
De: "Daniel Garcia" <[EMAIL PROTECTED]>
Para: <[email protected]>
Enviado: Sábado, 27 de Agosto de 2005 02:54 a.m.
Asunto: Re: Cpyf
Hola Jaime,
Prueba a hacer la copia como te indique antes, con CPYF
FROMFILE(*LIBL/ORIGEN) TOFILE(*LIBL/DESTINO) FROMRCD(1) en vez de CPYF
FROMFILE(*LIBL/ORIGEN) TOFILE(*LIBL/DESTINO) FROMRCD(*START)
Ademas copia todo el fichero de origen a destino de una vez, ahorraras
algo de tiempo y de consumo de CPU. Depende de la maquina que tengas
necesitaras 1 millon de registros para apreciar una diferencia, pero te
aseguro que en maquinas lentas simplemente copiando 100.000 registros
hay diferencias de unos pocos segundos.
Si aun asi te interesa por algun motivo copiar en bloques hazlo de la
siguiente forma.
El CL debe estar sometido por BATCH y debe saber recuperar los nombres
de los ficheros a copiar.
Haces un OPNDBF FILE(*LIBL/ORIGEN) OPTION(*INP) SEQONLY(*NO 20) con esto
abres el fichero de origen de solo lectura y en cada acceso al disco
traeras a memoria 20 registros y para el de destino OPNDBF
FILE(*LIBL/DESTINO) OPTION(*OUT) SEQONLY(*NO 20)
Ahora cuando hagas la copia ya tendras siempre el fichero abierto y
evitaras que DB2 tenga que abrir y cerrar cada vez el fichero, ya que
esto suele consumir bastante tiempo.
Per sigo pensando que lo mas optimo seria hacer
PGM
OPNDBF FILE(*LIBL/ORIGEN) OPTION(*INP) ACCPTH(*ARRIVAL) SEQONLY(*YES 20)
OPNDBF FILE(*LIBL/DESTINO) OPTION(*OUT) SEQONLY(*NO 20)
CPYF FROMFILE(*LIBL/ORIGEN) TOFILE(*LIBL/DESTINO) FROMRCD(1)
CLOF OPNID(ORIGEN)
CLOF OPNID(DESTINO)
ENDPGM
Dependiendo de tu maquina puedes hacer que recupere mas o menos
registros en cada acceso al disco, pero no te recomendaria pusieras un
valor por encima de 100.
Saludos
Dani
Isencia S.L.
Daniel García
E-mail: [EMAIL PROTECTED]
Tel. +34 93 754 03 66
Fax +34 93 754 03 98
Jaime Villa Torres escribió:
Gracias Jesús, ya realice esa prueba, pero los tiempos de respuesta con el
insert, son n veces mayor que realizar el cpyf en un solo trabajo.
Gracias por tu tiempo.
Jaime Villa T.
----- Mensaje original -----
De: "Jesus Olague" <[EMAIL PROTECTED]>
Para: <[email protected]>
Enviado: Viernes, 26 de Agosto de 2005 06:05 p.m.
Asunto: Re: Cpyf
A grosso modo:
1. Obtienes de un archivo los nombres de los archivos a y b
2. Concatenas en una variable la sentencia SQL para que quede mas o menos
STRING = 'INSERT INTO b SELECT a WHERE blablabla'
3. Preparas la sentencia
C/EXEC SQL
C+ PREPARE SENT FROM :STRING
C/END-EXEC
4. Ejecutas la sentencia
C/EXEC SQL
C+ EXECUTE SENT
C/END-EXEC
Y ya está.
Saludos.
__________________________________________________
Forum.HELP400 es un servicio más de NEWS/400.
© Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________
Para darte de baja visita la siguente URL:
http://coyote.combios.es/mailman/listinfo/forum.help400
__________________________________________________
Forum.HELP400 es un servicio más de NEWS/400.
© Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________
Para darte de baja visita la siguente URL:
http://coyote.combios.es/mailman/listinfo/forum.help400
__________________________________________________
Forum.HELP400 es un servicio más de NEWS/400.
© Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________
Para darte de baja visita la siguente URL:
http://coyote.combios.es/mailman/listinfo/forum.help400