Abajo tienes el fuente de un programa que vale como prueba de concepto de lo que quieres hacer. Compílalo y lo pruebas. Si tienes alguna duda lo comentamos.

     H dftactgrp(*no)
     H actgrp(*new)
      *
      * Necesario para usar las funciones C
     H bnddir('QC2LE')
      *
      * memmove es la versión segura de memcpy, a utilizar si no se está seguro
      * de que destino se solapa con origen. También es más costoso de ejecutar,
      * por lo que si se sabe que no se van a solapar, es más eficiente usar
      * memcpy
      *
     D memmove         PR              *   extproc('memmove')
     D   destino                       *   value
     D   origen                        *   value
     D   tamanyo                     10U 0 value
      *
     D memcpy          PR              *   extproc('memcpy')
     D   destino                       *   value
     D   origen                        *   value
     D   tamanyo                     10U 0 value
      *
      *
     D DS              DS                  qualified inz
     D   campo1                      10A
     D   campo2                       3P 0
     D   campo3                       5A
      *
      *
      * Función para definir el valor de un campo en la DS
      *
     D definir         PR
     D   campo                       10A   value
     D   @valor                        *   value
      *
      *
      *
     D wrkCampo1       S                   like(ds.campo1)
     D wrkCampo2       S                   like(ds.campo2)
     D wrkCampo3       S                   like(ds.campo3)
      *
      /free
       wrkcampo1 = 'ABCDEFGHIJ';
       definir('campo1': %addr(wrkcampo1));
       dsply ds.campo1;
       dsply ds.campo2;
       dsply ds.campo3;

       wrkcampo2 = 123;
       definir('campo2': %addr(wrkcampo2));
       dsply ds.campo1;
       dsply ds.campo2;
       dsply ds.campo3;

       wrkcampo3 = 'abcdefghij';
       definir('campo3': %addr(wrkcampo3));
       dsply ds.campo1;
       dsply ds.campo2;
       dsply ds.campo3;

       *inlr = *on;
      /end-free

     P definir         B
     D                 PI
     D   campo                       10A   value
     D   @valor                        *   value
      *
     D posicion        S             10I 0
     D tamanyo         S             10I 0
     D @ds             S               *   inz(%addr(ds))
      *
      * Defino la posición inicial del campo dentro de la DS y su tamaño.
      * (Esta información se obtendría de dspffd, pero lo hago así para
      * simplificar el ejemplo)
      *
      /free
       if campo = 'campo1';
         posicion = %addr(ds.campo1) - @ds;
         tamanyo = %size(ds.campo1);
       elseif campo = 'campo2';
         posicion = %addr(ds.campo2) - @ds;
         tamanyo = %size(ds.campo2);
       elseif campo = 'campo3';
         posicion = %addr(ds.campo3) - @ds;
         tamanyo = %size(ds.campo3);
       endif;

       memcpy(@ds + posicion: @valor: tamanyo);

      /end-free
      *
     P definir         E

Saludos.

Fernando Pérez 

Cerámica Saloni. Dpto. Auditoría y Organización



Jaime Villa Torres escribió:
Fernando, me interesa lo del memcpy, los datos que tu dices que se requieren, los tengo, por otra api de propiedad de la empresa. Lo referente a que funciona por el fromfile es igual al input, es correcto, el ovrdbf se realiza para otras necesidades del programa, pero lo que deseo realmente el asignar los valores a la ds de una forma dinámica.
 
----- Original Message -----
Sent: Tuesday, October 07, 2008 2:11 AM
Subject: Re: Asignar un valor a una ds

Si te funciona debe ser porque el fichero input tiene la misma estructura que el fichero Fromfile, ¿Verdad? De no ser así, no creo que funcionara.

Creo que no hay una forma fácil de hacer lo que comentas. Una manera (bastante costosa) de conseguirlo que se me ocurre sería usar un dspffd del fichero para tener su lista de campos (que también serán los de la DS). Aprovechando la información de dspffd, que también incluye la longitud del campo en bytes y su posición inicial, podrías realizar una copia de la memoria del parámetro a la memoria donde se guarda el campo de la DS (con la función C memcpy. Es fácil de usar. Solo hay que definir el prototipo de la función, que te puedo pasar si lo necesitas).

Como ya te digo, es una solución factible pero algo rebuscada. Quizá si dieras más detalles de lo que quieres hacer podríamos encontrar una solución más adecuada.

Saludos.

Fernando Pérez 

Cerámica Saloni. Dpto. Auditoría y Organización



Jaime Villa Torres escribió:
Dentro de las tantas necesidades que se nos presenta a diario, pongo a su consideración el siguiente problema.
 
Tengo un programa de la siguiente manera
Le ingresan los parametros.
FromFile         10
FromLib          10
 
Dsxxxxxxxx     e Ds                  Extname(input) inz
 
CmdW = 'OVRDBF FILE(INPUT) TOFILE(' +
          %trim(FromLib)                             +
          '/'                                                 +
          %trim(FromFile)                           +
          ')'                               
Callp     Cmd(CmdW:%len(%trim(CmdW)))       
 
CFBANK =  1 
CFBRCH =  0 , estos dos campos pertenecen a la prueba del archivo que estoy probando.
 
Como se encuentran dentro del programa, toman el valor que se les está asignado y funciona perfecto.
 
El caso que deseo resolver es el siguiente:
 
Poder entrar como parametros el nombre de estas variables y sus valores y asignarselas a la ds.
 
Espero haberme hecho entender, y si es asi, recibir de ustedes una posible solución.
 
Gracias de antemano
 

__________________________________________________ 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://listas.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://listas.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://listas.combios.es/mailman/listinfo/forum.help400
begin:vcard
fn;quoted-printable:Fernando P=C3=A9rez
n;quoted-printable:P=C3=A9rez;Fernando
org;quoted-printable:;Auditor=C3=ADa y Organizaci=C3=B3n
email;internet:[EMAIL PROTECTED]
tel;work:Ext. 627
x-mozilla-html:TRUE
version:2.1
end:vcard

__________________________________________________
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://listas.combios.es/mailman/listinfo/forum.help400

Responder a