Hola a todos. Hola, Oscar.

Voy a pegarme la vacilada, ya que nadie responde. A ver que te parece
mi soluci�n a tu problema.

Es un poco rollazo y requiere trabajar con api's y punteros, pero a
m� me funciona (y no es pasi�n de padre).

La rutina original es para comparar dos registros de un mismo fichero
entre s�, pero s�lo los campos que requiere el usuario, que graba los
nombres de campo en un fichero. Tambi�n copia y graba los campos de
un registro al otro.

Supongo que si lo m�o funciona lo tuyo tambi�n, pero he tenido que
improvisar un poco al escribir el correo, as� que me puedo haber
equivocado.

Si tienes dudas, pregunta.

Aqu� empieza la cosa:

-------------------------- 8< --------------------------

Define un espacio de trabajo con la API QUSCRTUS.

Llena el espacio de trabajo con la lista de los campos del fichero
(API QUSLFLD)

Aqu� ya hay que trabajar un poquito con punteros, para leer el
espacio de usuario (creo que hay una API, pero prefiero este sistema)

Se asigna un puntero (API QUSPTRUS) a la direcci�n del espacio de
usuario.

Yo lo hago con una DS con un array, asociada al puntero

      D USBloc          DS                  BASED(USPtr)
      D  USTxt                      1024
      D  USArray                       1    OVERLAY(USTxt) DIM(1024)
      (* Dades de Generic Header *)
      D  GenHdrSiz             65     68B 0
      D  Hdr                   69    148
      (* Dades de cap�alera *)
      D  OffsetList           125    128B 0
      D  SizeList             129    132B 0
      D  NumberListEnt        133    136B 0
      D  SizeListEnt          137    140B 0
      (* Camps de la llista *)
      D  FldName                1     10
      D  FldType               11     11
      D  FldUse                12     12
      D  FldOutBuf             13     16B 0
      D  FldInpBuf             17     20B 0
      D  FldLen                21     24B 0
      D  FldDig                25     28B 0
      D  FldDec                29     32B 0

y una vez le�da la cabecera (e interpretada! Hay que guardar el
tama�o del registro en TamanyEnt!!!) y colocado al principio de la
lista de campos, voy haciendo lecturas moviendo el puntero de esta
manera

      C                   EVAL      USPtr = %ADDR(USArray(TamanyEnt +
1)

Entonces te bastar�a con hacer:

      C                   IF        FldName = NombreCampo
      C                   EVAL      PosCamp = FldInpBuf
      C                   ENDIF

para tener la posici�n del campo dentro del fichero.

Luego s�lo hay que utilizar el fichero como un string, o asociar un
string a un apuntador como el siguiente:

     DFITXER         E DS                  EXTNAME(NOMFITXER)
     D  PrimeraPos             1      1A

     D Ptr1            S               *   inz(%addr(PrimeraPos))

Entonces con una operaci�n EVAL con substrings (vigilando el tama�o)
puedes pasar cualquier variable. Aqu� hay que trabajar un poco con el
tipo de la variable, pero ya es la parte "f�cil".

      D                 DS          1024    based(Ptr1)
      D Arr1                           1A   dim(257)
      D Str1                    1   1024

      C                   EVAL      CampSenseEditar =
%subst(Str1:PosCamp:LongRealCamp)


-------------------------- 8< --------------------------

Repito que me he dejado cosas y otras las he improvisado, o sea que
te va a tocar trabajar sobre el tema. Tambi�n es posible que haya una
soluci�n mejor, o m�s elegante, o ambas.

Suerte!
        Carlos


   __/,_\|\ /__      ___   ___   __ __  __       o/S
  /---.-_-=-_=_\_   / _ \ /___\ /__\\ \/ //\ /\ <|  A
 ;//-/-.-=-;.'-.\  / /_)///  /// \// \  // / \ \<o> B
 /|//'/_\_|_\_|=/ / ___// \_/De BierMeester\_/ / #   A
//|,|;/   === ==  \/    \___/ \/ \_//_/\_\\___/ <o>  L
\||/_|    (o) (o) [EMAIL PROTECTED]  #  L
'\|/c .        \    .-------.                   <o> U
 ||\_. .    __-')  /  .~~~~. \   GANAPIES       // T
 ## . . :. /   \  |  _|''''|  |      o/        <O>  S
/||\':. '. | o | _| (_|OoOo|  |    o/ o _       (_\
//:   ':.;.',,,) \    |oOoO|  | | ||~/||_)   oo0/o\0oo
.' |        /     \   '-==-' /  |_||/~||_)   (((( ))))
Pxu|  / \   )      '--------'  (c)Pxu'2000   /// M \\\
All anybody needs to know about prizes is that Mozart never won one.



_____________________________________________________
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, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]?body=LEAVE

Responder a