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