Utilizar Copy to

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Utilizar Copy to

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Utilizar Copy to

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Utilizar Copy to

Mensagem 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



Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Utilizar Copy to

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Utilizar Copy to

Mensagem 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é+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Utilizar Copy to

Mensagem 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
Responder