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&amp;#225;s de NEWS/400.
&amp;#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

Responder a