In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Campos de una base de datos a un fichero de texto y su recuperación

Foro de Xailer profesional en español
Responder
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Campos de una base de datos a un fichero de texto y su recuperación

Mensaje por jrcpoli-quitar »

Saludos:
Para pasar los datos de una base de datos a un fichero de texto empleo
esta rutina:
** Seleccionamos la base de datos de Federación
WITH OBJECT ::oParent:oDbfFederacion
:SaveState( .T. )
:OrdSetFocus( "NUMERO" )
buscador := cFed
IF lCorrecto := :Seek(buscador)
contenido := ""
** Poner variable al principio de linea
contenido := "1"
** Array con el nombre de los campos
aCampos := :FieldNames()
FOR i = 1 TO LEN(aCampos)
DO CASE
CASE :FieldType(i) == "C"
contenido += :FieldGetByName(aCampos)
CASE :FieldType(i) == "N"
contenido += STR(:FieldGetByName(aCampos,;
:FieldLen(i),:FieldDec(i)) )
CASE :FieldType(i) == "D"
contenido += DTOC(:FieldGetByName(aCampos) )
CASE :FieldType(i) == "L"
contenido +=
IF(:FieldGetByName(aCampos),"1","0")
END CASE
NEXT
*
contenido += CRLF
*
FWRITE(gestor, contenido) // Escribe la linea
*
ENDIF
:RestoreState( .T. )
END
Esto funciona bien y su escritura en el fichero de texto es correcta,
pero al querer recuperar cada una de las lineas del fichero de texto que
corresponden con una base de datos distinta, intento recuperarlas con un
solo método que es este:
oDS es por ejemplo ::oDbfFederación
linea_actual contiene toda la linea del fichero de texto.
METHOD GrabarRegistro( oDS, linea_act ) CLASS TFormImportarConc
LOCAL post := 1
LOCAL i := 0
//LOCAL aCampos := {}
*
WITH OBJECT oDS
*
** Añadir un nuevo Registro
:AddNew()
*
FOR i := 1 TO :FieldCount()//LEN(aCampos)
//MsgInfo( :FieldName(i) )
DO CASE
CASE :FieldType(i) == "C"
:FieldPut( i, SubStr( linea_act, post+1, :FieldLen(i)))
CASE :FieldType(i) == "N"
:FieldPut( i, VAL(Alltrim(SubStr( linea_act, post+1,
:FieldLen(i)))))
CASE :FieldType(i) == "D"
:FieldPut(i, CTOD(SubStr( linea_act, post+1, :FieldLen(i))))
CASE :FieldType(i) == "L"
:FieldPut(i, IIF(SubStr( linea_act, post+1,
:FieldLen(i)) = "1",.T.,.F.))
END CASE
//MsgInfo( SubStr( linea_act, post+1, :FieldLen(i)) )
post += :FieldLen(i)
NEXT
*
** Graba el registro Añadido
:Update()
:End()
END
RETURN Nil
Usando esta segunda rutina se recupera correctamente del fichero de
texto a la base de datos que corresponde pero siempre que el fichero de
base de datos esté con lShared := .F. ya que FieldPut( nField, Value) no
permite su escritura si el Field no está bloqueado.
¿ De que forma puedo bloquear el field para no tener que hacer lShared
:= .F.?.
¿Quizás tenga que usar la propiedad nLockType?, si es así­ cual debo
emplear.
O por el contrario como debo modificar el método o los métodos se
admiten sugerencias ver los que hacen otros siempre es bueno.
Gracias.
José Ramón Castro.
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Campos de una base de datos a un fichero de texto y su recuperación

Mensaje por jrcpoli-quitar »

Saludos:
No hay nadie que me pueda decir algo sobre este tema a las preguntas
finales que planteo.
¿ De que forma puedo bloquear el field para no tener que hacer
> lShared := .F.?.
> ¿Quizás tenga que usar la propiedad nLockType?, si es así­ cual
debo emplear.
> O por el contrario como debo modificar el segundo método para no
emplear :FieldPut( nField, Value )
También hice esto en lugar de :FieldPut(nField, Value)
:FieldName(i) := SubStr( linea_act, post+1, :FieldLen(i))
Pero esto da un error.
José Ramón Castro.
José Ramón Castro Polinio escribió:
> Saludos:
>
> Para pasar los datos de una base de datos a un fichero de texto empleo
> esta rutina:
> ** Seleccionamos la base de datos de Federación
> WITH OBJECT ::oParent:oDbfFederacion
> :SaveState( .T. )
> :OrdSetFocus( "NUMERO" )
> buscador := cFed
> IF lCorrecto := :Seek(buscador)
> contenido := ""
> ** Poner variable al principio de linea
> contenido := "1"
> ** Array con el nombre de los campos
> aCampos := :FieldNames()
> FOR i = 1 TO LEN(aCampos)
> DO CASE
> CASE :FieldType(i) == "C"
> contenido += :FieldGetByName(aCampos)
> CASE :FieldType(i) == "N"
> contenido += STR(:FieldGetByName(aCampos,;
> :FieldLen(i),:FieldDec(i)) )
> CASE :FieldType(i) == "D"
> contenido += DTOC(:FieldGetByName(aCampos) )
> CASE :FieldType(i) == "L"
> contenido += IF(:FieldGetByName(aCampos),"1","0")
> END CASE
> NEXT
> *
> contenido += CRLF
> *
> FWRITE(gestor, contenido) // Escribe la linea
> *
> ENDIF
> :RestoreState( .T. )
> END
>
> Esto funciona bien y su escritura en el fichero de texto es correcta,
> pero al querer recuperar cada una de las lineas del fichero de texto que
> corresponden con una base de datos distinta, intento recuperarlas con un
> solo método que es este:
>
> oDS es por ejemplo ::oDbfFederación
> linea_actual contiene toda la linea del fichero de texto.
>
> METHOD GrabarRegistro( oDS, linea_act ) CLASS TFormImportarConc
>
> LOCAL post := 1
> LOCAL i := 0
> //LOCAL aCampos := {}
> *
> WITH OBJECT oDS
> *
> ** Añadir un nuevo Registro
> :AddNew()
> *
> FOR i := 1 TO :FieldCount()//LEN(aCampos)
> //MsgInfo( :FieldName(i) )
> DO CASE
> CASE :FieldType(i) == "C"
> :FieldPut( i, SubStr( linea_act, post+1, :FieldLen(i)))
> CASE :FieldType(i) == "N"
> :FieldPut( i, VAL(Alltrim(SubStr( linea_act, post+1,
> :FieldLen(i)))))
> CASE :FieldType(i) == "D"
> :FieldPut(i, CTOD(SubStr( linea_act, post+1, :FieldLen(i))))
> CASE :FieldType(i) == "L"
> :FieldPut(i, IIF(SubStr( linea_act, post+1, :FieldLen(i))
> = "1",.T.,.F.))
> END CASE
> //MsgInfo( SubStr( linea_act, post+1, :FieldLen(i)) )
> post += :FieldLen(i)
> NEXT
> *
> ** Graba el registro Añadido
> :Update()
> :End()
> END
>
> RETURN Nil
>
> Usando esta segunda rutina se recupera correctamente del fichero de
> texto a la base de datos que corresponde pero siempre que el fichero de
> base de datos esté con lShared := .F. ya que FieldPut( nField, Value) no
> permite su escritura si el Field no está bloqueado.
> ¿ De que forma puedo bloquear el field para no tener que hacer
> lShared := .F.?.
> ¿Quizás tenga que usar la propiedad nLockType?, si es así­ cual debo
> emplear.
> O por el contrario como debo modificar el método o los métodos se
> admiten sugerencias ver los que hacen otros siempre es bueno.
>
> Gracias.
>
> José Ramón Castro.
>
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Campos de una base de datos a un fichero de texto y su recuperación

Mensaje por jrcpoli-quitar »

Saludos:
Decirme por lo menos algo aunque sea "no entiendo lo que quieres"
José Ramón Castro.
José Ramón Castro Polinio escribió:
> Saludos:
>
> No hay nadie que me pueda decir algo sobre este tema a las preguntas
> finales que planteo.
>
> ¿ De que forma puedo bloquear el field para no tener que hacer
> > lShared := .F.?.
> > ¿Quizás tenga que usar la propiedad nLockType?, si es así­ cual
> debo emplear.
> > O por el contrario como debo modificar el segundo método para no
> emplear :FieldPut( nField, Value )
>
> También hice esto en lugar de :FieldPut(nField, Value)
>
> :FieldName(i) := SubStr( linea_act, post+1, :FieldLen(i))
>
> Pero esto da un error.
>
> José Ramón Castro.
>
> José Ramón Castro Polinio escribió:
>> Saludos:
>>
>> Para pasar los datos de una base de datos a un fichero de texto empleo
>> esta rutina:
>> ** Seleccionamos la base de datos de Federación
>> WITH OBJECT ::oParent:oDbfFederacion
>> :SaveState( .T. )
>> :OrdSetFocus( "NUMERO" )
>> buscador := cFed
>> IF lCorrecto := :Seek(buscador)
>> contenido := ""
>> ** Poner variable al principio de linea
>> contenido := "1"
>> ** Array con el nombre de los campos
>> aCampos := :FieldNames()
>> FOR i = 1 TO LEN(aCampos)
>> DO CASE
>> CASE :FieldType(i) == "C"
>> contenido += :FieldGetByName(aCampos)
>> CASE :FieldType(i) == "N"
>> contenido += STR(:FieldGetByName(aCampos,;
>> :FieldLen(i),:FieldDec(i)) )
>> CASE :FieldType(i) == "D"
>> contenido += DTOC(:FieldGetByName(aCampos) )
>> CASE :FieldType(i) == "L"
>> contenido += IF(:FieldGetByName(aCampos),"1","0")
>> END CASE
>> NEXT
>> *
>> contenido += CRLF
>> *
>> FWRITE(gestor, contenido) // Escribe la linea
>> *
>> ENDIF
>> :RestoreState( .T. )
>> END
>>
>> Esto funciona bien y su escritura en el fichero de texto es correcta,
>> pero al querer recuperar cada una de las lineas del fichero de texto
>> que corresponden con una base de datos distinta, intento recuperarlas
>> con un solo método que es este:
>>
>> oDS es por ejemplo ::oDbfFederación
>> linea_actual contiene toda la linea del fichero de texto.
>>
>> METHOD GrabarRegistro( oDS, linea_act ) CLASS TFormImportarConc
>>
>> LOCAL post := 1
>> LOCAL i := 0
>> //LOCAL aCampos := {}
>> *
>> WITH OBJECT oDS
>> *
>> ** Añadir un nuevo Registro
>> :AddNew()
>> *
>> FOR i := 1 TO :FieldCount()//LEN(aCampos)
>> //MsgInfo( :FieldName(i) )
>> DO CASE
>> CASE :FieldType(i) == "C"
>> :FieldPut( i, SubStr( linea_act, post+1, :FieldLen(i)))
>> CASE :FieldType(i) == "N"
>> :FieldPut( i, VAL(Alltrim(SubStr( linea_act, post+1,
>> :FieldLen(i)))))
>> CASE :FieldType(i) == "D"
>> :FieldPut(i, CTOD(SubStr( linea_act, post+1,
>> :FieldLen(i))))
>> CASE :FieldType(i) == "L"
>> :FieldPut(i, IIF(SubStr( linea_act, post+1,
>> :FieldLen(i)) = "1",.T.,.F.))
>> END CASE
>> //MsgInfo( SubStr( linea_act, post+1, :FieldLen(i)) )
>> post += :FieldLen(i)
>> NEXT
>> *
>> ** Graba el registro Añadido
>> :Update()
>> :End()
>> END
>>
>> RETURN Nil
>>
>> Usando esta segunda rutina se recupera correctamente del fichero de
>> texto a la base de datos que corresponde pero siempre que el fichero
>> de base de datos esté con lShared := .F. ya que FieldPut( nField,
>> Value) no permite su escritura si el Field no está bloqueado.
>> ¿ De que forma puedo bloquear el field para no tener que hacer
>> lShared := .F.?.
>> ¿Quizás tenga que usar la propiedad nLockType?, si es así­ cual
>> debo emplear.
>> O por el contrario como debo modificar el método o los métodos se
>> admiten sugerencias ver los que hacen otros siempre es bueno.
>>
>> Gracias.
>>
>> José Ramón Castro.
>>
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Campos de una base de datos a un fichero de texto y su recuperación

Mensaje por jfgimenez »

José Ramón,
> Usando esta segunda rutina se recupera correctamente del fichero de texto
> a la base de datos que corresponde pero siempre que el fichero de base de
> datos esté con lShared := .F. ya que FieldPut( nField, Value) no permite
> su escritura si el Field no está bloqueado.
> ¿ De que forma puedo bloquear el field para no tener que hacer lShared :=
> .F.?.
Supongo que es mejor que llames a :Append() antes de los :FieldPut() en vez
de :AddNew(), y al final llames a :RecUnlock() para desbloquear el registro.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
xAvi
Mensajes: 108
Registrado: Mar Abr 08, 2008 6:12 pm

Campos de una base de datos a un fichero de texto y su recuperación

Mensaje por xAvi »

José Ramón,
Has probado los comandos COPY TO y APPEND FROM estándares de xBase.
Un saludo
Xavi
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Campos de una base de datos a un fichero de texto y su recuperación

Mensaje por jrcpoli-quitar »

Saludos José F. Gimenez
Como siempre has acertado la cosa se soluciona con :Append() y
:RecUnlock() por lo tanto para grabar los campos de una base de datos en
un fichero de texto hago esto:
METHOD GrabarLinea( oDS, contenido ) CLASS TFormConcursoExport1
LOCAL i := 0
LOCAL aCampos := {}
*
** Array con el nombre de los campos
aCampos := oDS:FieldNames()
FOR i = 1 TO LEN(aCampos)
DO CASE
CASE oDS:FieldType(i) == "C"
contenido += oDS:FieldGetByName(aCampos)
CASE oDS:FieldType(i) == "N"
contenido += STR(oDS:FieldGetByName(aCampos,;
oDS:FieldLen(i),oDS:FieldDec(i)) )
CASE oDS:FieldType(i) == "D"
contenido += DTOC(oDS:FieldGetByName(aCampos) )
CASE oDS:FieldType(i) == "L"
contenido += IIF(oDS:FieldGetByName(aCampos),"1","0")
END CASE
NEXT
*
contenido += CRLF
RETURN Nil
Esto graba cada campo de cada registro de la base de datos en una linea
de un fichero de texto
Cuando quiero recuperar las lineas del fichero de texto para grabarlas
en la su base de datos haré esto otro:
METHOD GrabarRegistro( oDS, linea_act ) CLASS TFormImportarConc
LOCAL lCorrecto := .T.
LOCAL post := 1
LOCAL i := 0
*
WITH OBJECT oDS
*
** Añadir un nuevo Registro
IF lCorrecto := :Append()
*
FOR i := 1 TO :FieldCount()
DO CASE
CASE :FieldType(i) == "C"
:FieldPut( i, SubStr( linea_act, post+1, :FieldLen(i)))
CASE :FieldType(i) == "N"
:FieldPut( i, VAL(Alltrim(SubStr( linea_act, post+1,
:FieldLen(i)))))
CASE :FieldType(i) == "D"
:FieldPut(i, CTOD(SubStr( linea_act, post+1,
:FieldLen(i))))
CASE :FieldType(i) == "L"
:FieldPut(i, IIF(SubStr( linea_act, post+1,
:FieldLen(i)) = "1",.T.,.F.))
END CASE
** Posición anterior mas largo del campo
post += :FieldLen(i)
NEXT
*
** Libera el registro Añadido
:RecUnLock()
*
ENDIF
:End()
END
RETURN lCorrecto
De esta forma funciona correctamente sin tener que poner la base de
datos como lShared := .F.
Gracias.
José Ramón Castro.
Jose F. Gimenez escribió:
> José Ramón,
>
>> Usando esta segunda rutina se recupera correctamente del fichero de texto
>> a la base de datos que corresponde pero siempre que el fichero de base de
>> datos esté con lShared := .F. ya que FieldPut( nField, Value) no permite
>> su escritura si el Field no está bloqueado.
>> ¿ De que forma puedo bloquear el field para no tener que hacer lShared :=
>> .F.?.
>
> Supongo que es mejor que llames a :Append() antes de los :FieldPut() en vez
> de :AddNew(), y al final llames a :RecUnlock() para desbloquear el registro.
>
jrcpoli-quitar
Mensajes: 558
Registrado: Mar Feb 09, 2010 2:26 pm

Campos de una base de datos a un fichero de texto y su recuperación

Mensaje por jrcpoli-quitar »

Saludos:
Gracias por tu sugerencia.
José Ramón Castro.
xAvi escribió:
> José Ramón,
>
> Has probado los comandos COPY TO y APPEND FROM estándares de xBase.
>
> Un saludo
> Xavi
Responder