Hola Jaime:
Bueno, por lo que parece no andaba desencaminado, según parece el problema es
que no lees el registro con sus campos sino un sólo campo por todo el registro.
Es una buena solución (y muy ingeniosa) para actualizaciones masivas de
diferentes ficheros pero creo que estamos planteando mal el problema al
intentar arreglar la casa por el tejado, me explico:
El problema no es que leas todo el registro en un sólo campo y lo trates como
si fuera alfanumérico, el problema es que el parámetro que recibe el programa
no concuerda con los datos que debe tratar.
Imagina que uno de los campos es numérico desempaquetado y, por error, el
programa llamador envía caracteres alfabéticos para actualizar ese campo, no te
va a generar errores pero el contenido del campo se convertirá en un"churro",
lo mismo pasa al enviar datos Zoned a un campo Packed, no tiene ningún sentido
y por eso surje el problema.
Según mi punto de vista la rutina es perfecta, el problema está en el programa
que la llama, los datos que envía, aunque sean alfanuméricos, deben estar
empaquetados para que al hacer
>>> %substs(Dsmiarchivo:poscision inicial:longitud en bytes) = %trim(valor);
actualice la cadena de caracteres tal cual debe.
Otra solución sería averiguar en la rutina si el campo es Packed (debería estar
en la *InzSr) y utilizar un campo intermedio de tipo Packed, tal y como ha
sugerido Nicolás.
Sigo pensando en que lo que está mal es el dato que se recibe ya que no
coincide con el que se debe grabar, estamos mezclando peras con manzanas (o
yogures de macedonia con naturales ;-)
Un saludo.
Juanra
----- Original Message -----
From: Jaime Villa Torres
To: forum.help400
Sent: Friday, February 01, 2008 3:24 AM
Subject: Re: Actualizar un campo numérico tipo P...Fernando
Pérez--Nicolas-Juan Ramon
Nicolás y Juan Ramón, gracias por la respuesta, pero la sentencia MOVE
AUXPacked TuCampoDS, no aplica, ya que tendrías que realizarlo por cada
campo, y eso no es dinámico.
Imagina el siguiente programa
d dsmiarchivo e ds extname(archivo)
c *entry plist
c parm nomvar 10
nombre de la variable
c parm valor 50
valor de la variable
c parm close
//free
If close <> 'C'
....
.... con los datos de la *InzSr, buscamos la información correspondiente
al campo ingresado y....
%substs(Dsmiarchivo:poscision inicial:longitud en bytes) = %trim(valor);
... ESTO FUNCIONA PERFETAMENTE EN LA MAYORIA DE LOS
ARCHIVOS, YA QUE LA APLICACIÓN DONDE SE APLICA CASI TODO ES
ALFANUMERICO...PERO LLEGO LA EXCEPCIÓN, UN CAMPO EMPAQUETADO.
Else;
cuando termina de actualizar el el registro.
envia a un programa el parámetro Dsmiarchivo, y este último programa realiza
otras acciones con el registro.
*Inlr = *on;
EndIf;
Return
Begsr *InzSr;
en este punto utilizamos un api, de la empresa, que genera la información de
todos los campos del archivo y nos devuelve, la posición inicial del campo, la
longitud en bytes y la longitud real.
EndSR;
.......__________________________________________________
Forum.HELP400 es un servicio m&#225;s de NEWS/400.
&#169; Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________
Para darte de baja visita la siguente URL:
http://listas.combios.es/mailman/listinfo/forum.help400