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