* Ejemplo de uso.
* Llamado
* Genera un cursor y llama a GenFileText()
*******************************************
SELECT nombre,idclien,cuit,calle,numero,cpostal,ciudad,provincia ;
FROM clientes ;
WHERE !EMPTY(cuit) AND VAL(idclien)#0 ;
INTO CURSOR trclien
* Tipo: Cvs simil Excel
cFile="trclien<shut>"
cNomFiletext=ADDBS(dtemp)+"TxtClientes"
lHeader=.f.
lNotQuotes=.T.
cSymbol=";"
nFlag=0
GENFILETEXT(cFile,cNomFileText,cSymbol,lHeader,lNotQuotes,nFlag)
**********************************************************************************
PROCEDURE GENFILETEXT(xcFile,xcNomFileText,xcSymbol,xlHeader,xlNotQuotes,xnFlag)
**********************************************************************************
* Genera un archivo de texto plano, de tipo delimitado por Bajo Nivel
* xcFile: Tabla o cursor. Puede enviarse p.ej: cFile="MiCursor<shut>"
* Con lo cual se cierra la tabla o cursor al terminar el proceso.
* Tipicamente se genera un cursor ad-hoc para despachar los datos.
* xcNomFileText: Path\Nombre.ext del archivo de texto saliente.
* La extensión por defecto será ".txt". Si desea otra extensión
* incluya el nombre con la extensión requerida
* Ej: xcNomfileText="\\MqCentral\TextOuput\miarchivoplano.ths"
* xcSymbol: Separador de campos: [,] [;] [|] [*] etc. (Default [,] )
* xlHeader: Si incluye el nombre de los campos en la primer fila
* xlNotQuotes: Por defecto, los campos caracter son encomillados (Delimited)
* Si xlNotQuotes=.t., no tendrán comillas (SDF)
* xnFlag (manejado por FputLine() )
* 0 - Con Retorno de Carro, no incluye último separador
* 1 - Con Retorno de Carro, incluir útlimo separador
* 2 - Sin Retorno de Carro, no inlcuye último separador
* 3 - Sin REtorno de Carro, incluir último separador
******************************************************************************
* Funciones de usuario Utilizadas por GenFileTExt
* FPutLine()
* Qualifer()
* TelDecim() (convocada por Qualifer)
******************************************************************************
LOCAL nfop,lcRow,i,lnCampos,lShut
IF EMPTY(xcFile)
RETURN
ENDIF
xcfile=LOWER(xcFile)
IF AT("<shut>",xcfile)#0
lshut=.t.
xcFile=STRTRAN(xcFile,"<shut>","")
ENDIF
IF !USED(xcFile)
RETURN
ENDIF
IF EMPTY(xcNomFileText)
RETURN
ENDIF
xnFlag=EVL(xnFlag,0)
IF xnFlag>3
xnFlag=0
ENDIF
xcNomfileText=ALLTRIM(xcNomfileText)
lcExt=JUSTEXT(xcNomFileText)
IF EMPTY(lcExt)
xcNomFileText=xcNomFileText+".txt"
ENDIF
xcSymbol=EVL(xcSymbol,[,])
nfop=FCREATE(xcNomFileText)
IF nfop<0
RETURN
ENDIF
SELECT (xcFile)
lnCampos=FCOUNT()
IF xlHeader
lcRow=""
FOR i=1 TO lnCampos
lcRow=lcRow+Qualifer(FIELD(i),xcSymbol,xlNotQuotes)
NEXT
fputLine(nfop,lcRow,xnFlag,xcSymbol)
ENDIF
SCAN
lcRow=""
FOR i=1 TO lnCampos
lcCampo=FIELD(i)
lcRow=lcRow+Qualifer(EVALUATE(lcCampo),xcSymbol,xlNotQuotes)
NEXT
fputLine(nfop,lcRow,xnFlag,xcSymbol)
ENDSCAN
=FCLOSE(nfop)
IF lshut
IF USED(xcfile)
SELECT (xcFile)
USE
ENDIF
ENDIF
o = CREATEOBJECT("Shell.Application")
o.ShellExecute("write.exe", '&xcNomFileText', "", "open", 1)
ENDPROC
PROCEDURE fputLine(xnfop,xcRow,xnFlag,xcSymbol)
***********************************************
xcRow=ALLTRIM(xcRow)
xcSymbol=EVL(xcSymbol,",")
xnFlag=EVL(xnFlag,0)
IF MOD(xnFlag,2)=0
IF RIGHT(xcRow,1)=xcSymbol
xcRow=LEFT(xcRow,LEN(xcRow)-1)
ENDIF
ELSE
IF RIGHT(xcRow,1)#xcSymbol
xcRow=xcRow+xcSymbol
ENDIF
ENDIF
DO case
CASE INLIST(xnFlag,0,1)
=FPUTS(xnfop,xcRow)
CASE INLIST(xnFlag,2,3)
=FWRITE(xnfop,xcRow)
ENDCASE
ENDPROC
*****************************************
PROCEDURE TelDecim(xcnNUmero,xnPrecision)
*****************************************
* Determina la cantidad de decimales de un número.
* xnPrecision podría ser Entre 10 y 16
* 16 daría una precisión mayor pero válida para
* números con alta cantidad de decimales.
*********************************************
local i_,minumero,pnumero,cRest,nDecimales
if vartype(xnprecision)#"N"
xnPrecision=10
endif
kevar=Vartype(xcnNumero)
do case
case kevar="C"
minumero=val(xcnNumero)
case kevar$'NI'
Minumero=xcnNumero
other
return 0
endcase
if minumero=0
return 0
endif
nDecimales=16
for i_=0 to 16
pNumero=Round(MiNumero*10**i_,xnPrecision)
cRest=pNumero-Int(pNumero)
nDecimales=i_
if Round(cRest,xnPrecision)=0
exit
endif
next
return nDecimales
ENDPROC
**********************************
PROCEDURE QUALIFER(xDato,xcSymbol,xlNotQuotes)
***********************************
* Calificador de datos simil Delimited
LOCAL lcQuot,lcClin,lcRemp,kvt,vret,qdezim
lcQuot=IIF(xlNotQuotes,[],["])
if vartype(xcSymbol)#"C".or.empty(xcSymbol)
xcSymbol=","
endif
kvt=vartype(xDato)
vret=""
lcClin=CHR(9)+CHR(10)+CHR(13)
lcRemp=REPLICATE(SPACE(1),3)
do case
case kvt="C"
xDato=CHRTRAN(xDato,lcClin,lcRemp)
vret=lcQuot+alltrim(strtran(xdato,xcSymbol))+lcQuot
case kvt="N"
qDezim=TelDecim(xDato)
vret=ltrim(str(xDato,20,qDezim))
case kvt="I"
vret=ltrim(str(xdato))
case kvt="D"
vret=dtoc(xdato)
case kvt="T"
vret=ttoc(xdato)
case kvt="L"
vret=iif(xdato,".T.",".F.")
other
endcase
return vret+xcSymbol
ENDPROC