Generar Archivo de TEXTO

3,243 views
Skip to first unread message

Luis Salazar

unread,
Feb 5, 2013, 4:27:11 PM2/5/13
to publice...@googlegroups.com
Saludos a los amigos FOXEROS  .. me permito hacer la siguiente consulta
 
Necesito  generar un archivo TXT   desde los datos de una tabla ,
la longitud del registro del TXT es de  387   caracteres.
 
Pero tengo entendido que lo maximo que puedo poner en una variable son 256
caracteres ..  como logro concatenar los  387 caracteres y darlo en una salida directa a TXT
 
Alguna IDEA al respecto ...
 
 
  Gracias de antemano ...
 
 
 
 

Baltazar Moreno

unread,
Feb 5, 2013, 4:41:20 PM2/5/13
to publice...@googlegroups.com
TEXT TO....


Saludos!

Baltazar Moreno
VFP9SP2 - Win7
Guadalajara, Jalisco, México

Pablo Daniel Lissa

unread,
Feb 5, 2013, 5:28:59 PM2/5/13
to publice...@googlegroups.com
Hola:

Si no entiendo mal, los datos están en un campo memo. Si es así, puedes usar:
    STRTOFILE(cMemo, "c.\archivo.txt")

En caso contrario, puedes armar el texto a enviar con TEXT - ENDTEXT y luego usar la instrucción STRTOFILE.

Saludos.

Luis Salazar

unread,
Feb 5, 2013, 5:44:08 PM2/5/13
to publice...@googlegroups.com
EN REALIDAD  los datos NO estan en campos MEMOS 
son campos numericos que necesito convertir a caracter  mas
campos caracter  .. un conjunto de campos que en total
convertido a TXT  son  387 caracteres ...
y que el conjunto de registros de la tabla (por cada) registro
me genere una linea de TXT de longitid  387 caracteres
>>.
Me explique un poco mejor  ????
  Gracias ...

FidelJ

unread,
Feb 5, 2013, 5:57:45 PM2/5/13
to publice...@googlegroups.com
Una forma bastante sencilla es crear un cursor donde cada campo tiene la longitud de los campos requeridos en el txt. Todos los campos son caracter. Desde tu fuente de información rellenas el cursor con los registros necesarios, todos transformados en caracter y luego, simplemente
SELECT elCursor
copy to ArchivoTexto.txt SDF

Para rellenar los campos numéricos en el cursor, puedes utilizar esta función bodrio (la utilizo para exportar datos a los aplicativos de Afip Argentina). Seguramente hay mejor forma de escribirla. Esta nació en Clipper 5.01 y luego tiene alguna adaptación a VFP 6.0. Nunca la revisé para VFP 9. 

FUNCTION NUMALFA(nNumero,xnSpacio,xcSymbol)
********************************************
* Creada específicamente para exportación de datos a otros sistemas
* tales como Siap ó SAP, cuando se requiere que un valor numérico 
* sea consignado como un string con relleno a la izquierda.
* nNUmero es el número a convertir
* xnSpacio es la cantidad total de dígitos del string
* xcSymbol es el separador de decimales solicitado (puede ser una 
* cadena vacía).
* Nótese que el proc. elimna los valores negativos, tomando Abs(nNUmero)
local xnREs,xnCom
if vartype(xcSymbol)#"C"
xcSymbol="."
endif
if vartype(xnSpacio)#"N"
xnspacio=14
endif
xnREs=iif(empty(xcSymbol),0,1)
xnCom=iif(empty(xcSymbol),2,3)
kcValor=Valcod(Abs(nNumero)*100,xnSpacio-XNRES)
Return left(kcValor,xnSpacio-xnCom)+xcSymbol+Right(kcValor,2)

Luis Maria Guayan

unread,
Feb 5, 2013, 6:02:52 PM2/5/13
to publice...@googlegroups.com
Lo mas fácil es utilizar STRTOFILE().

La longitud máxima de una variable caracter está muy lejos de 256 caracteres, es de 16777184 caracteres

De la ayuda de VFP:

Maximum # of characters per character string or memory variable:  16,777,184
 

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Pablo Daniel Lissa

unread,
Feb 5, 2013, 6:06:03 PM2/5/13
to publice...@googlegroups.com
Justamente a eso me refería con armar el texto con el comando TEXT.

Por ejemplo:

SCAN
    TEXT TO cLinea NOSHOW TEXTMERGE PRETEXT 15
        <<campo1>><<campo2>><<campo3>>...<<campoN>>
    ENDTEXT

    STRTOFILE(cLinea, "c:\archivo.txt", .T.)    && .T. es para que agregue al final del archivo.
ENDSCAN

Obviamente, dentro de TEXT - ENDTEXT se arma el contenido con el formato que corresponda. La ventaja es que no hay que convertir los valores que no sean caracter. Automáticamente se convierten todos los valores entre <<>> a caracter.



El martes, 5 de febrero de 2013 19:44:08 UTC-3, likiliki escribió:

FidelJ

unread,
Feb 5, 2013, 6:28:19 PM2/5/13
to publice...@googlegroups.com
El problema con el método propuesto surge cuando se deben generar archivos para transmisión de datos.
Por ejemplo, los aplicativos de Afip tienen tantos espacios reservados para cada campo y determinada forma de alineación, relleno de caracteres y formato de números. Llamativamente no todos son iguales.
Algunos piden ceros a la izquierda de la cadena numérica, otros no. pero siempre piden que el número se alinee sobre la derecha del espacio del campo de registro.
07/08/201202490554      BANCO MACRO S.A.              11119.30
23/11/201212395106      HSBC BANK ARGENTINA S.A.      1837.50
28/01/20132366911       BANCO SUPERVIELLE S.A.        14520.44
08/02/201366762883      BANCO DE LA PROVINCIA DE BUENO14275.36
13/02/201367590174      BANCO DE LA PROVINCIA DE BUENO5626.50
15/03/201367590175      BANCO DE LA PROVINCIA DE BUENO5626.50
15/03/201329643755      HSBC BANK ARGENTINA S.A.      2900.00
06/02/20132817922       BANCO SUPERVIELLE S.A.        10900.00
04/02/20137516563       BANCO MACRO S.A.              3418.25
13/02/201343372384      BANCO DE LA NACION ARGENTINA  1338.64
15/02/201366762893      BANCO DE LA PROVINCIA DE BUENO11574.50
01/02/20137007032       BANCO SANTANDER RIO S.A.      124610.84
29/01/20137007273       BANCO SANTANDER RIO S.A.      45943.97
El ejemplo no se corresponde con el solicitado. Pero valga el caso. Está generado como propuso Pablo.
En este ejemplo, el parser podría dar error por falta de caracteres en el último campo (control de total de caracteres por línea). Si el aplicativo contiene un campo para comentarios que puede quedar vacío, en el archivo deben existir los caracteres chr(32) que completan la línea.
El otro tema, es que probablemente nuestras tablas no tengan las mismas previsiones que utilizan los parser a los cuales se destinan. Por ejemplo, en el mismo archivo, Afip exige que determinados campos numéricos tengan 10 espacios y otros 9. 

En archivos para transmisión de datos al SAP (Acindar), cada línea tenía que tener su EOL. Por lo que para generarlo utilizaba funciones de bajo nivel (=fputs()). En cambio, los archivos destinados al SIAP Afip, funcionan si se generan como SDF.

En fin, hay que ver para qué se utilizará el TXT.



El martes, 5 de febrero de 2013 18:27:11 UTC-3, likiliki escribió:

Luis Salazar

unread,
Feb 11, 2013, 10:13:38 PM2/11/13
to publice...@googlegroups.com
Gracias a los amigos Foxeros por la Ayuda para generar el TXT
me funciona bien crear el cursor , convertir todos los campos numericos a carater
concatenarlos y guradarlos en el cursor
 
luego copy micursor to   arch_txt type SDF
 
**++++++++++++++++++++++++++++++++++
Reply all
Reply to author
Forward
0 new messages