Página 1 de 1
Utilizar Copy to
Enviado: 09 Abr 2020 18:13
por frazato
Boa tarde! tenho esta rotina que copia campos para um arquivo temporario(xls) até ai blz, gostaria de passar os campos através de uma variável mais não estou conseguindo fazer funcionar, e possível, onde estou errando?
Frazato
Código: Selecionar todos
function FiltroTeste()
Local cCamposListar := ''
close all
Sele 1
use produto
set index to produto
Set filter to FORNECEDOR=='01401'
cArqSaida := 'Filtro_'+dtos(Date())+StrTran(Time(),':','')+'.xls'
* Desta forma funcina
* Copy to (mTemporal+cArqSaida) Field ESTOQUE,CODIGO,DESCRICAO,MARGEM
* Da forma abaixo nao funciona, nao cria o arquivo
cCamposListar := 'ESTOQUE,CODIGO,DESCRICAO,MARGEM'
Alerta(cCamposListar)
Copy Fields cCamposListar to (mTemporal+cArqSaida)
Alerta('Criando arquivo '+chr(10)+mTemporal+cArqSaida)
RETURN NIL
Utilizar Copy to
Enviado: 09 Abr 2020 19:38
por JoséQuintas
SE funcionar... é com macro.
Código: Selecionar todos
FUNCTION FiltroTeste()
LOCAL cPath := "c:\temp\", cFile, cFieldList := "ESTOQUE,CODIGO,DESCRICAO,MARGEM"
cFile := cPath + "Filtro_" + Dtos( Date() ) + StrTran( Time(), ":", "" ) + ".xls"
USE produto
SET INDEX TO produto
SET FILTER TO field->FORNECEDOR == "01401"
COPY FIELDS &cFieldList TO ( cFile )
Alert( "Criando arquivo " + chr(10) + cFile )
RETURN NIL
Utilizar Copy to
Enviado: 09 Abr 2020 20:47
por frazato
Boa noite!
não funciona testei quando colocado apenas um campo funciona, quando colocado vários campos na linha de comando funciona.
Fiz de uma outra maneira, mais trabalhosa mais funciona, segue código em anexo.
frazato
Código: Selecionar todos
Function Main()
// Joao Frazato
// Gerar uma saida xls, apartir de uma filtro e campos predefinidos usuario
// 4-petras
SETMODE(25,80)
close all
sele 1
use produto alias produto
set filter to fornecedor=='01401'
DadoCampo := DbStruct()
cCampos := {} // teste saber apenas nome dos campos
*For B:=1 to nTotCompos
*Aadd(cCampos,{Alltrim(Upper(DadoCampo[b,1])),DadoCampo[b,2],DadoCampo[b,3],DadoCampo[b,4]} )
*Next
//criar o dbf utlizando os campos solicitados
// lista de campos carregada pelo usuario
cCamposCriar := 'CODIGO_DESCRICAO_ESTOQUE_CUSTO_MARGEM_FORNECEDOR_DETO_GRUPO_POLITPRECO'
ccriar := {} // colocar os campos a serem criados
cFileSaida := 'c:\temp\'+ "Filtro_" + Dtos( Date() ) + StrTran( Time(), ":", "" ) + ".xls"
For i:= 1 to len(dadocampo)
? dadocampo[i,1]
if alltrim(dadocampo[i,1])$cCamposCriar
Aadd(cCriar,DadoCampo[i])
Endif
next
dbcreate(cFileSaida,cCriar)
// popular o dbf novos
sele 113
use (cFileSaida) alias tmp
sele produto
go top
do while !eof()
sele tmp
append blank
for x:=1 to fcount()
cCampo := FieldName(x)
repla Tmp->&cCampo With Produto->&cCampo
next
sele produto
skip+1
Enddo
Sele tmp
dbedit(00,00,maxrow(),maxCol())
alert('ok.... arquivo utilizar excel...'+cFileSaida)
close all
FUNCTION FiltroTeste()
LOCAL cPath := "c:\temp\", cFile, cFieldList := "ESTOQUE , DESCRICAO"
USE produto
*SET INDEX TO produto
SET FILTER TO field->FORNECEDOR == "01401"
COPY FIELDS FieldList TO ( cFile )
Alert( "Criando arquivo " + chr(10) + cFile )
RETURN NIL
quit
Do While .t.
Clear
@ 00,01 say "JAF Sistema de Automacao - Bobo envio de e-mail"
@ 01,01 say "Monitorando pasta....."+mDiretorio
Inkey(3)
if LastKey()==27
Exit
Endif
mListaArq := Directory(mDiretorio+mArquivo,"D")
nQtdLinha := Len(mListaArq)
For nPosic := 1 to nQtdLinha
@ 02,01 say "Enviando..."+Str(nPosic,7)+"/"+Str(nQtdLinha,7)
cComando := mDiretorio+mListaArq[nPosic,1]
@ 03,01 say 'Enviando email.........:'+cComando Color('R/W')
oShell := CreateObject("WScript.Shell")
//Ret := oShell:Run("%comspec% /C"+cComando,0,.T.)
Ret := oShell:Run("%comspec% /c"+cComando,1,.T.)
oShell := Nil
Inkey(3)
Delete File (cComando)
Next
Enddo
Return Nil
Utilizar Copy to
Enviado: 09 Abr 2020 21:54
por JoséQuintas
NÃO sei se o parâmetro indica array.
Se for.... use o direto.
Código: Selecionar todos
#command COPY [TO <(f)>] [FIELDS <fields,...>] ;
[FOR <for>] [WHILE <while>] [NEXT <next>] ;
[RECORD <rec>] [<rest:REST>] [ALL] [VIA <rdd>] [CODEPAGE <cp>] => ;
__dbCopy( <(f)>, { <(fields)> }, ;
<{for}>, <{while}>, <next>, <rec>, <.rest.>, <rdd>,, <cp> )
o __dbCopy()
Ou então, o que fez, mas depois de criar o temp:
No append from, só importa os campos que existem no arquivo aberto.
Utilizar Copy to
Enviado: 09 Abr 2020 22:50
por ANDRIL
Creio que o problema esta na construção do #command
COPY [TO <(f)>] [FIELDS <fields,...>] ;
Aqui parece que esta passando como string e o __dbCopy aceita array.
Não sei como passar o parâmetro para lista, mas seria algo assim
COPY [TO <(f)>] [FIELDS [fields,...]] ;
Se usar direto assim funciona
__dbCopy( "andto.dbf", {"CMP1","CMP10"} )
Até+
Utilizar Copy to
Enviado: 10 Abr 2020 09:05
por frazato
Bom dia!
funcionou perfeitamente como preciso e bem mais enxuto o código.
Obrigado
Código: Selecionar todos
close all
sele 1
use produto alias produto
set filter to fornecedor=='01401'
wcampos:= {}
aadd(wcampos,'codigo')
aadd(wcampos,'descricao')
aadd(wcampos, 'estoque')
aadd(wcampos,'fornecedor')
cFileSaida := 'c:\temp\'+ "Filtro_" + Dtos( Date() ) + StrTran( Time(), ":", "" ) + ".xls"
__dbcopy(cFileSaida,wcampos)
use (cFileSaida) alias tmp
dbedit(00,00,24,79)
return nil