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:

Código: Selecionar todos

use ( temp )
APPEND FROM ( original )
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