RE: Registro externo en procedimiento Solucion
Respondiendo a tu pregunta del TEMPLATE en las DS. Esta es una palabra clave que apreció en 6.1 (si no recuerdo bien) y se utiliza para declarar "un tipo nuevo", aunque en RPG no existe la posibilidad de crear nuevos tipos al estilo de C, Java, etc. Cuando definimos DS el compilador siempre reserva le espacio en memoria. Eso está muy bien. Pero, ¿qué ocurre si lo que quiero es declarar una estructura que funcione como plantilla (o tipo nuevo) para definir otras estructuras? Si la defino como TEMPLATE ocurren, por lo menos, dos cosas: 1. El compilador no le reserva espacio de memoria. 2. La estructura sólo puede aparecer en definiciones del tipo LIKEDS o LIKE. Y la pregunta ahora es ¿y toda esta parafernalia para qué sirve? Yo siempre que defino una DS es para cargarle valores, sino no la necesito. ¡Puest tienes razón! ¿O no? En el pequeño ejemplo que te envié yo defino dos TEMPLATE: una con la estructura de campos de un fichero (MAECLI_T) y otra para almacenar el resultado de un SELECT de SQL (SqlFila_T). Si te fijas, esta segunda define sus campos en función de algunos campos definidos en la primera. Todo esta estructura es más una cuestión de estilo y de ordenar las cosas. Si quiero definir varias variables cuyo tipo es el mismo que el de un campo de fichero lo defino en función del tipo de éste, en lugar de codificarlo con su tipo real (empaquetado, numérico con zona, alfanumérico, etc.). Si necesito definir parámetros de suprocecimientos que son DS, siempre utilizo LIKEDS de un TEMPLATE. Este estilo me ofrece algunas ventajas, en cada momento sé el "tipo" de cada variable o estructura. La localización de estas variables se simplifica. El cambio en la estructura o tipo, se realiza en un solo sitio, en el TEMPLATE. Por comparar, lenguajes como C, C++ o Java (entre otros) la única forma que tiene de definir nuevos tipos es con "struct" o "class" y las nuevas variables u objetos se definen en función de esos tipos. Yo hago algo parecido con los TEMPLATE y LIKEDS. Pero, ¿es necesario hacer todo esto en RPG? ¡NO! Pero a mí, me ha dado buenos resultados esta técnica. Respecto al tema del ARRAY sobre campos de un fichero o estructura. Se me ocurre, al menos, una alternativa si no quieres copiar los valores de los campos a un array a parte. Esta técnica sólo funciona si los campos que conforman cada elemento del arrary aparecen de forma consecutiva en el registro o DS. Estudia este ejemplo (ojo, no lo he compilado): D Tipo_T DS Template Qualified D alfa 3A D nume 5P 2 * CAMPOS DEL FICHERO: * * alfa1 3A * nume1 5P 2 * alfa2 3A * nume2 5P 2 * alfa3 3A * nume3 5P 2 D registro E DS ExtName( FICHERO ) D array DS LikeDs( Tipo_T ) D Dim( 3 ) D Based( ptrArray ) /FREE *InLR = *ON; ptrArray = %Addr( alfa1 ); // El primer campo del array array( 1 ).alfa = 'XXX'; // alfa1 = 'XXX' array( 1 ).nume = 3,7;// nume1 = 3,7 Saludos, Javier De: forum.help400-boun...@listas.combios.es [mailto:forum.help400-boun...@listas.combios.es] En nombre de alberto Enviado el: viernes, 14 de diciembre de 2018 11:18 Para: forum.help400 Asunto: Re: Registro externo en procedimiento Solucion Pues ya está. No deja definir un array dentro de una DS definida con LIKEDS. Entonces lo he definido así: D@RegDS E DS extname(FESDTO) D qualified DCliexclos 107601 0 DIM(99) D @Registro E DS Extname(Fesdto) Todo como Extname. Una curiosidad: tampoco me deja definir @regDS dentro del procedimiento. Lo tengo que definir en el principal, porque si no, me dice que no existe el campo @regds.Cliexclos. Serán tonterías de la V6R1? Por cierto, Javier Mora. Para qué usas el template en la deficición de la DS? Salu2 De:"alberto" Para:"forum.help400" Fecha:14/12/2018 10:17 Asunto:** Newsletter ** Re: Registro externo en procedimiento Enviado por:forum.help400-boun...@listas.combios.es Hola Creo que ya se cual es el problema(que no la solución). De hecho son dos problemas. SQL y procedimiento, porque en un programa con subrutinas y sin SQL funciona desde siempre. El problema lo tengo al definir que una parte de los campos del registro son un array. No tanto en la definición de la DS D @RegDS DS likeDS(@registro) d Cliexclos 107601s 0 DIM(99) Si defino el array en la misma DS que recibe los datos: Exec SQL Fetch Next From @cursor into :@reg; directamente el SQL no me lo reconoce como variable. Digo: vale, pues la defino sin array y muevo los datos a otra que tenga array. pues aquí está el problema. Desde
Re: Registro externo en procedimiento Solucion
Pues ya está. No deja definir un array dentro de una DS definida con LIKEDS. Entonces lo he definido así: D@RegDS E DS extname(FESDTO) D qualified DCliexclos 107601 0 DIM(99) D @Registro E DS Extname(Fesdto) Todo como Extname. Una curiosidad: tampoco me deja definir @regDS dentro del procedimiento. Lo tengo que definir en el principal, porque si no, me dice que no existe el campo @regds.Cliexclos. Serán tonterías de la V6R1? Por cierto, Javier Mora. Para qué usas el template en la deficición de la DS? Salu2 De: "alberto" Para: "forum.help400" Fecha: 14/12/2018 10:17 Asunto: ** Newsletter ** Re: Registro externo en procedimiento Enviado por:forum.help400-boun...@listas.combios.es Hola Creo que ya se cual es el problema(que no la solución). De hecho son dos problemas. SQL y procedimiento, porque en un programa con subrutinas y sin SQL funciona desde siempre. El problema lo tengo al definir que una parte de los campos del registro son un array. No tanto en la definición de la DS D @RegDS DS likeDS(@registro) d Cliexclos 107601s 0 DIM(99) Si defino el array en la misma DS que recibe los datos: Exec SQL Fetch Next From @cursor into :@reg; directamente el SQL no me lo reconoce como variable. Digo: vale, pues la defino sin array y muevo los datos a otra que tenga array. pues aquí está el problema. Desde el momento que defino el array y el programa tiene un sólo procedimiento, ya no me compila, porque los procedimientos por lo que veo no me están reconociendo un array de 99 elementos, sino un campo numérico de más de 63 dígitos. Esto me pasa tanto definiendo el array dentro del procedimiento como fuera. Tanto si la hago servir como si no. Me sigue faltando el compilar en 7.1 que no he podido. Salu2 De:"Juan Carlos Paredes" Para:"forum.help400" Fecha:12/12/2018 18:00 Asunto:** Newsletter ** Re: Registro externo en procedimiento Enviado por:forum.help400-boun...@listas.combios.es Me suena haberme encontrado con ese problema en alguna ocasión. Y creo recordar que lo solucioné definiendo el fichero en una hoja F específica del procedimiento, como Input y UsrOpn, haciendo una apertura en falso (para que no se queje el compilador de que no hay operación de apertura) y definiendo la DS como LikeRec(NombreRegistro) Un saludo. Juan Carlos --- https://paredes.info juancar...@paredes.info > 2018 09:20:04 +0100 > From: "alberto" > Subject: Registro externo en procedimiento > To: "forum.help400" > Message-ID: > > > Content-Type: text/plain; charset="iso-8859-1" > > Hola Foro. > Me ha surgido una cosa nueva, que a ver cómo lo resolvéis vosotros: > tengo definido dos registros externos como tal: > D @regext E DS EXTNAME(FESDTO) ? > D Cliexclos107601s 0 DIM(99) ? > D E DS EXTNAME(LARTTF1) ? > D TARE 10405P 3 DIM(99) > > El segundo lo hago servir en el cuerpo principal del programa, y el > primero @regext lo hago servir en un procedimiento, para me de el > resultado de un Select * y me cree un array con los campos que hay en > > esas posiciones. > En el procedimiento lo tengo definido así: > d@REG DS lIKEDS(@REGEXT) > .. >Exec SQL Fetch Next From @cursor into :@reg; > Supongo que esto lo habéis hecho servir muchos de vosotros. > El caso es que al compilar me da error en el que paso como parámetro. > Del > que hay en el cuerpo principal no se queja, pero con el otro no me > deja > compilar. > En el procedimiento lo tengo definido como he dicho antes, pero vamos, > que > ya he probado varias combinaciones diferentes y no hay manera. > Como muy poco, me da un error de nivel 20.pero no voy a aburrir con > los > errores diferentes que me da al compilar. > Alguien se ha encontrado con algo parecido? > Supongo que lo más rápido es pasar del procedimiento y hacer una > subrutina > de las de toda la vida, pero seguro que IBM ha resuelto esto y no me > lo ha > dicho. > Saludos > > El mié., 12 dic. 2018 a las 5:01, > escribió: > >> Envíe los mensajes para la lista Forum.help400 a >> forum.help400@listas.combios.es >> >> Para subscribirse o anular su subscripción a través de la WEB >> >> http://listas.combios.es/cgi-bin/mailman/listinfo/forum.help400 >> >> O por correo electrónico, enviando un mensaje con el texto "help" >> en >> el asunto (subject) o en el cuerpo a: >> forum.help400-requ...@listas.combios.es >> >> Puede contactar con el responsable de la lista escribiendo a: >> forum.help400-ow...@listas.combios.es >> >> Si responde a algún contenido de este mensaje, por favor, edite la >> linea del asunto (subject) para que el texto sea mas especifico que: >>
Re: Registro externo en procedimiento
Hola Creo que ya se cual es el problema(que no la solución). De hecho son dos problemas. SQL y procedimiento, porque en un programa con subrutinas y sin SQL funciona desde siempre. El problema lo tengo al definir que una parte de los campos del registro son un array. No tanto en la definición de la DS D @RegDS DS likeDS(@registro) d Cliexclos 107601s 0 DIM(99) Si defino el array en la misma DS que recibe los datos: Exec SQL Fetch Next From @cursor into :@reg; directamente el SQL no me lo reconoce como variable. Digo: vale, pues la defino sin array y muevo los datos a otra que tenga array. pues aquí está el problema. Desde el momento que defino el array y el programa tiene un sólo procedimiento, ya no me compila, porque los procedimientos por lo que veo no me están reconociendo un array de 99 elementos, sino un campo numérico de más de 63 dígitos. Esto me pasa tanto definiendo el array dentro del procedimiento como fuera. Tanto si la hago servir como si no. Me sigue faltando el compilar en 7.1 que no he podido. Salu2 De: "Juan Carlos Paredes" Para: "forum.help400" Fecha: 12/12/2018 18:00 Asunto: ** Newsletter ** Re: Registro externo en procedimiento Enviado por:forum.help400-boun...@listas.combios.es Me suena haberme encontrado con ese problema en alguna ocasión. Y creo recordar que lo solucioné definiendo el fichero en una hoja F específica del procedimiento, como Input y UsrOpn, haciendo una apertura en falso (para que no se queje el compilador de que no hay operación de apertura) y definiendo la DS como LikeRec(NombreRegistro) Un saludo. Juan Carlos --- https://paredes.info juancar...@paredes.info > 2018 09:20:04 +0100 > From: "alberto" > Subject: Registro externo en procedimiento > To: "forum.help400" > Message-ID: > > > Content-Type: text/plain; charset="iso-8859-1" > > Hola Foro. > Me ha surgido una cosa nueva, que a ver cómo lo resolvéis vosotros: > tengo definido dos registros externos como tal: > D @regext E DS EXTNAME(FESDTO) ? > D Cliexclos107601s 0 DIM(99) ? > D E DS EXTNAME(LARTTF1) ? > D TARE 10405P 3 DIM(99) > > El segundo lo hago servir en el cuerpo principal del programa, y el > primero @regext lo hago servir en un procedimiento, para me de el > resultado de un Select * y me cree un array con los campos que hay en > > esas posiciones. > En el procedimiento lo tengo definido así: > d@REG DS lIKEDS(@REGEXT) > .. >Exec SQL Fetch Next From @cursor into :@reg; > Supongo que esto lo habéis hecho servir muchos de vosotros. > El caso es que al compilar me da error en el que paso como parámetro. > Del > que hay en el cuerpo principal no se queja, pero con el otro no me > deja > compilar. > En el procedimiento lo tengo definido como he dicho antes, pero vamos, > que > ya he probado varias combinaciones diferentes y no hay manera. > Como muy poco, me da un error de nivel 20.pero no voy a aburrir con > los > errores diferentes que me da al compilar. > Alguien se ha encontrado con algo parecido? > Supongo que lo más rápido es pasar del procedimiento y hacer una > subrutina > de las de toda la vida, pero seguro que IBM ha resuelto esto y no me > lo ha > dicho. > Saludos > > El mié., 12 dic. 2018 a las 5:01, > escribió: > >> Envíe los mensajes para la lista Forum.help400 a >> forum.help400@listas.combios.es >> >> Para subscribirse o anular su subscripción a través de la WEB >> >> http://listas.combios.es/cgi-bin/mailman/listinfo/forum.help400 >> >> O por correo electrónico, enviando un mensaje con el texto "help" >> en >> el asunto (subject) o en el cuerpo a: >> forum.help400-requ...@listas.combios.es >> >> Puede contactar con el responsable de la lista escribiendo a: >> forum.help400-ow...@listas.combios.es >> >> Si responde a algún contenido de este mensaje, por favor, edite la >> linea del asunto (subject) para que el texto sea mas especifico que: >> "Re: Contents of Forum.help400 digest...". Además, por favor, >> incluya >> en la respuesta sólo aquellas partes del mensaje a las que está >> respondiendo. >> >> Asuntos del día: >> >> 1. Registro externo en procedimiento (alberto) >> 2. Re: Registro externo en procedimiento (Alex Martínez) >> 3. RE: Registro externo en procedimiento (Javier Mora) >> 4. Registro externo en procedimiento (alberto) >> >> > -- >> >> Message: 1 >> Date: Wed, 12 Dec 2018 09:20:04 +0100 >> From: "alberto" >> Subject: Registro externo en procedimiento >> To: "forum.help400" >> Message-ID: >> >> > >> Content-Type: text/plain; charset="iso-8859-1" >> >> Hola Foro. >> Me ha surgido una cosa nueva, que a ver cómo lo resolvéis >> vosotros: >> tengo definido dos registros externos como tal: >> D @regext E DS