Página 1 de 1

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

Publicado: Dom Oct 14, 2007 7:02 pm
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.

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

Publicado: Lun Oct 15, 2007 1:24 pm
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.
>

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

Publicado: Mar Oct 16, 2007 12:46 pm
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.
>>

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

Publicado: Mar Oct 16, 2007 1:06 pm
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

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

Publicado: Mar Oct 16, 2007 1:22 pm
por xAvi
José Ramón,
Has probado los comandos COPY TO y APPEND FROM estándares de xBase.
Un saludo
Xavi

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

Publicado: Mar Oct 16, 2007 5:39 pm
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.
>

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

Publicado: Mar Oct 16, 2007 5:41 pm
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