Clipper On Line • Ver Tópico - Abrir Word com variaveis (insistindo)

Abrir Word com variaveis (insistindo)

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

Moderador: Moderadores

 

Abrir Word com variaveis (insistindo)

Mensagempor EANDRIOLI » 02 Fev 2012 22:24

Amigos:

Consegui na internet um modelo que ao meu ver esta quase dando certo.

Como enviei em questoes anteriores, preciso abrir o Word 2003 com alguns campos preenchidos.

O metodo abaixo ira tentar abrir o Word, preenchendo variaveis pre-preenchidas que estiverem entre colchetes (ex.: [NOME])

Segue parte do fonte (esta dando erro ao abrir o Word - creio ser na parte referente aos campos/matriz.

PROCEDURE OLEDOC
local x, oWord, cModelo:=curdrive()+':\LIXO\arquivo.doc'    //importante colocar a letra do drive senão dá erro

//Gerar um array com nome do "campo" que estará entre [] a ser substituído no word
// e o conteúdo do arquivo de dados
 
aCampos:={}
aadd( aCampos, { 'NOME', "JOSE DA SILVA" } )
aadd( aCampos, { 'CPF',  "550" } )

*function ContratoWord( aCampos )

   TRY
      oWord := GetActiveObject(  "Word.Application" )
   CATCH
      TRY
         oWord := CreateObject( "Word.Application" ) 
      CATCH
         MsgBOX1("NÆo foi poss¡vel achar o Word instalado!!!")
         RETURN
      END
   END

oDoc := oWord:Documents:Open(cModelo)    //ABRE O WORD

for x=1 to len( aCampos )
        oWord:Replace( '['+aCampos[x,1]+']' , aCampos[x,2] )
next

//oWord:preview()                        // visualiza o documento no preview do Word
//oWord:Visualizar()                     // visualiza o documento
//oWord:PrintDoc(.t.)                      // imprime o documento sem apresentar na tela
oWord:end()

return nil



Reparem que coloquei em comentario a linha que chama a Function ControWord por achar nao necessario.

Preciso da ajuda dos senhores clippeiros por favor.

Abraços amigos.

ERASMO
Avatar de usuário

EANDRIOLI
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 109
Data de registro: 22 Jun 2007 18:31
Cidade/Estado: Sorriso-MT
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagempor EANDRIOLI » 03 Fev 2012 22:38

Amigos

Me disseram que eu poderia colocar assim em meu programa e acredito ser na linha após mandar abrir o word com o arquivo .doc:

oWord:Replace("[NOMECLI]",var)

Assim NOMECLI é o campo dentro do arquivo .doc e "var" a variavel de arquivo ou de dados do .dbf.

O problema é que ocorrem erros quando o Word vai ser aberto e esse erro é mostrado pelo programa compilado pelo Xharbour. Nao estou usando FIVEWIN.

O erro é este:

Error Word.Application/16389 E_FAIL: REPLACE Arguments:
( [ 1] = Type: C Val: [NOMECLI] [ 2] = Type: C Val: cArq)

Alguem pode ajudar? (Opa: cArq="C:\LOC\CTOLOC.DOC")

Obrigado, ERASMO.
Avatar de usuário

EANDRIOLI
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 109
Data de registro: 22 Jun 2007 18:31
Cidade/Estado: Sorriso-MT
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagempor rochinha » 06 Fev 2012 09:09

OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagempor Itamar M. Lins Jr. » 07 Fev 2012 09:58

Ola!
Supondo, que o campo deve ser caractere, por exemplo igual ao sintaxe SQL.
oWord:Replace("[NOMECLI]",var)
mude para:
oWord:Replace("[NOMECLI]","["+var+"]") ou
oWord:Replace("[NOMECLI]"," ' "+var+" ' ") ou
oWord:Replace("[NOMECLI]",' " '+var+' " ')

Quem sabe funcione ?

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagempor EANDRIOLI » 07 Fev 2012 12:11

Never... nao funciona mesmo... e o erro permanece...

(#-)
Avatar de usuário

EANDRIOLI
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 109
Data de registro: 22 Jun 2007 18:31
Cidade/Estado: Sorriso-MT
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagempor Itamar M. Lins Jr. » 07 Fev 2012 12:52

A sintaxe é qual da função replace ?
Eu achei essa no google.
Replace(string,find,replacewith[,start[,count[,compare]]])


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagempor Itamar M. Lins Jr. » 07 Fev 2012 13:26

No caso:
oDoc := oWord:Documents:Open(cModelo)    //ABRE O WORD

for x=1 to len( aCampos )
        oWord:Replace(oDoc, '['+aCampos[x,1]+']' , aCampos[x,2] )
next


Com certeza a função replace() estava recebendo os paramentros errados, não sei se vai funcionar, porém teste ai.

Suadações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagempor rochinha » 07 Fev 2012 14:27

Amiguinhos,

Voce chegaram a dar uma passadinha de leve nos links que postei?

Tenho a certeza que não. Pois teriam notado que não existe a figura do REPLACE

Ao dar o comando replace da forma como exposto com certeza o word repassa de uma vez todas as variáveis identicas. Neste caso de etiquetas o repasse será efetuado em todas as variaveis NOME com um mesmo conteúdo e não conteúdo a conteúdo.

O certo é usar find encontrar, uma ocorrência e repassá-la.

Pequeno trecho de meu uso:
   aVFields := { { "&#CL_NOME#&"                , CL_Nome },; 
                 { "&#cl_endereco#&"            , CL_Endereco },;
                 { "&#cl_cidade#&"              , CL_Cidade },;
                 { "&#cl_estado#&"              , CL_Estado },;
                 { "&#cl_cep#&"                 , CL_CEP },;
                 { "&#cl_telefone#&"            , CL_Telefone },;
                 { "&#cl_fax#&"                 , CL_Fax },;
                 { "&#cl_email#&"               , CL_Email },;
                 { "&#pn_idpedido#&"            , strzero(M->PRN_IDPEDIDO,6) },;
                 { "&#clienteNome#&"            , alltrim(M->PRN_NOME) },;
                 { "&#clienteEnderecoEntrega#&" , alltrim(M->PRN_LOCENTR) },;
                 { "&#clienteBairroEntrega#&"   , alltrim(M->PRN_BAIENTR) },;
                 { "&#clienteCidadeEntrega#&"   , alltrim(M->PRN_CIDENTR) },;
                 { "&#clienteCEPEntrega#&"      , alltrim(M->PRN_CEPENTR) },;
                 { "&#clienteNome#&"            , alltrim(M->PRN_NOME) },;
                 { "&#clienteEnderecoCobranca#&", alltrim(M->PRN_LOCCOBR) },;
                 { "&#clienteBairroCobranca#&"  , alltrim(M->PRN_BAICOBR) },;
                 { "&#clienteCidadeCobranca#&"  , alltrim(M->PRN_CIDCOBR) },;
                 { "&#clienteCEPCobranca#&"     , alltrim(M->PRN_CEPCOBR) },;
                 { "&#pn_subtotal#&"            , transf(M->PRN_SUBTOTAL,"@e 999,999.99") },;
                 { "&#pn_desconto#&"            , transf(M->PRN_DESCONTO,"@e 999,999.99") },;
                 { "&#pn_acrescimo#&"           , transf(M->PRN_ACRESCIMO,"@e 999,999.99") },;
                 { "&#pn_total#&"               , transf(M->PRN_TOTAL,"@e 999,999.99") },;
                 { "&#cl_email#&"               , CL_Email },;
                 { "&#pn_data#&"                , dtoc( date() ) } }
         //
   cTMPFile := cHomeDir+"DOC"+StrZero(Random(99999),5)+".DOC"
   if File(cDOCFile)
      CursorWait()
      __CopyFile( cDOCFile, cTMPFile )
      oWord := TOleAuto():New( "Word.Application" )
      oWord:Visible     := .f.
      //oWord:WindowState := 0
      oWord:Documents:Open( cTMPFile )
      oText := oWord:Selection()
      oFind := oText:Find()
      //
      for i = 1 to len( aVFields )
          //msgstop( "procurar "+aVFields[i][1] )
          oFind:Set("ClearFormatting")
          oFind:Text := aVFields[i][1]
          oFind:Wrap := 1
          oFind:Set("MatchWildcards",.t.)
          oFind:Execute()
          cFound := Alltrim(SubStr(aVFields[i][1],3,Len(Alltrim(aVFields[i][1]))-4))
          cFound := sSwap(cFound,{Chr(145),Chr(146)},"'")
          cFound := sSwap(cFound,{Chr(147),Chr(148)},'"')
          oText:TypeText( aVFields[i][2] )
      next
      //
      ...
      oWord:Documents:SaveAs( cTMPFile )


No meu caso as variáveis estão entre &# e #& e estão explicitas no meio do texto de meus documentos .RTF e .DOC.

No caso de voce estar usando aqueles controles de texto/edição do Word provavelmente o comando replace esteja falhando.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagempor fladimir » 07 Fev 2012 22:29

Eu uso essa q o Rochinha colocou os links e funciona...

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2434
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 157 vezes

Abrir Word com variaveis (insistindo)

Mensagempor EANDRIOLI » 08 Fev 2012 19:53

Senhores:

Deu certo... da forma abaixo... acredito que o mestre Rochinha resolveu o problema...

Fiz um teste usando uma var CAMPO valendo "erasmito", ficando assim:

   * abrindo o contrato principal....
   oDoc := oWord:Documents:Open(cARQ)    //ABRE O WORD

   oText:=oWord:Selection()
   oFind:=oText:Find()

   oFind:Text :="CAMPO"
   oFind:Wrap := 1
   oFind:Set("MatchWildcards",.t.)   // localizar se existir

   oFind:Execute()                   // substituir uma vez
   oText:Typetext('erasmito')
   oFind:Execute()                   // substituir mais uma vez
   oText:Typetext('erasmito')


Obs.: Percebi que se for colocado em oFind:Text :="[CAMPO]" a variavel no documento Word nao é alterada. Tem que ser somente CAMPO e no arquivo documento tem que estar entre [] a palavra CAMPO.

Neste simples exemplo que deu certo, conforme mostro acima, se for usado oFind:Execute() duas vezes e existir no documento aberto pelo Word, dois locais com o texto [CAMPO], ambos serão alterados.

Gostei do esquema... esquentei um pouco a "moringa" mas deu certo graças a voces grandes companheiros.

Se em alguma linha do codigo acima eu estiver errado, me corrijam por obséquio.

Abraços a todos,

ERASMO ANDRIOLI
By programming XHarbour
Avatar de usuário

EANDRIOLI
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 109
Data de registro: 22 Jun 2007 18:31
Cidade/Estado: Sorriso-MT
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Abrir Word com variaveis (insistindo)

Mensagempor rochinha » 08 Fev 2012 21:39

Amiguinho,

Voce apenas esquentou a moringa. Eu perdi todo o cabelo do lado esquerdo.

Voce esta usando um documento estilo mailing(etiquetas) correto?

Eu uso ele para gerar as cartas de fim de ano dos clientes, no meu caso é gerado um documento .DOC unico e cada pagina contém um conteúdo com os cabeçalhos com nomes de apresentação de cada cliente.

No final mando um comando para o Word, ele abre e sai imprimindo tudo.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Abrir Word com variaveis (insistindo)

Mensagempor rossine » 09 Fev 2012 12:17

Olá pessoal,

Vejam se é isto que precisam:

http://groups.google.com/group/harbour-users/browse_thread/thread/dbf130a6260fef72#

Abraços,

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
rossine
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 313
Data de registro: 06 Ago 2007 09:57
Cidade/Estado: Divinópolis-MG
Curtiu: 1 vez
Mens.Curtidas: 21 vezes

Abrir Word com variaveis (insistindo)

Mensagempor wilson marchiori » 20 Set 2012 17:11

Sr. Erasmo

vi os exmplos mas não entendi a variavel
(erasmito)

temos carta word
com varios campos a ser atualizado (trocados)
ex.

Ilmo Sr [vnome], residente , [vender], Cidade [vcidade]

etc.. e outros

,no exemplo postado é execuar para cada uma variavel
uma rotina de troca

grato
wilsonmarchiori
wilceci2006@yahoo.com.br
wilson marchiori
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 3
Data de registro: 20 Set 2012 16:22
Cidade/Estado: são PAULO
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Abrir Word com variaveis (insistindo)

Mensagempor rochinha » 21 Set 2012 02:35

Amiguinhos,

Analise o código abaixo:

#define CR             Chr(13)
#define LF             Chr(10) 

#define BS             "\"

Function OLEMerge( cDOCFile, cVFields, cVWords, lDOCPreview )
   LOCAL cHomeDir := CurDrive() + ":" + BS + CurDir() + BS
   LOCAL oDoc,oWord,oText,oFind,cFound,bError,cFile,cText
   DEFAULT lDOCPreview := .t.
   cFile := cHomeDir + cDOCFile
   aVFields := StringToArray( cVFields, ";" )
   aVWords  := StringToArray( cVWords, ";" )
   if File(cFile)
      CursorWait()
      oWord := TOleAuto():New( "Word.Application" )
      oDoc  := oWord:Get( "Documents" ) // oDoc := oWord:Documents:Open( cFile )
      oWord:Set("Visible",.t.)
      oDoc:Open( cFile )
      oText:=oWord:Selection()
      oFind:=oText:Find()
      for i = 1 to len( aVFields )
          oFind:Set("ClearFormatting")
          oFind:Text:=Alltrim(Upper(aVFields[i])) // "&#"+Alltrim(aVFields[i])+"#&"
          oFind:Wrap:=1
          oFind:Set("MatchWildcards",.t.)
          if oFind:Execute()
             cFound:=Alltrim(SubStr(aVFields[i],3,Len(Alltrim(aVFields[i]))-4))
             cFound:=sSwap(cFound,{Chr(145),Chr(146)},"'")
             cFound:=sSwap(cFound,{Chr(147),Chr(148)},'"')
             //if Empty(cFound)
             //   exit
             //endif
             oText:TypeText( aVWords[i] )
          endif
      next
      if lDOCPreview
         oWord:Set("Visible",.t.)
      else
         oWord:PrintOut()
         oWord:Quit()
      endif
      CursorArrow()
   else
      MsgInfo( "Arquivo "+cFile+" nao encontrado." )
   endif
   return nil

function StringToArray( cString, cSeparator )
   LOCAL nPos
   LOCAL aString := {}
   DEFAULT cSeparator := ";"
   cString := ALLTRIM( cString ) + cSeparator
   DO WHILE .T.
      nPos := AT( cSeparator, cString )
      IF nPos = 0
         EXIT
      ENDIF
      AADD( aString, SUBSTR( cString, 1, nPos-1 ) )
      cString := SUBSTR( cString, nPos+1 )
   ENDDO
   RETURN ( aString )

Function sSwap( cChar, c1, c2 )
   LOCAL n1,n2:=-1,ac1,f
   IF ValType(c1)="A"
      ac1:=c1
      FOR f=1 TO Len(ac1)
         c1:=ac1[f]
         WHILE .T.
            n1:=At(Upper( c1 ),Upper( cChar ))
            IF n1=0 .OR. n1=n2
               EXIT
            ENDIF
            cChar:=SubStr( cChar, 1, n1-1 )+c2+SubStr( cChar, n1+Len(c1), Len(cChar)-Len(c1) )
            n2:=n1
         ENDDO
      NEXT
   ELSE
      WHILE .T.
         n1:=At(Upper( c1 ),Upper( cChar ))
         IF n1=0 .OR. n1=n2
            EXIT
         ENDIF
         cChar:=SubStr( cChar, 1, n1-1 )+c2+SubStr( cChar, n1+Len(c1), Len(cChar)-Len(c1) )
         n2:=n1
      ENDDO
   ENDIF
   return cChar


Exemplo de uso:
      cMacro := [OLEMERGE.EXE CCEMERGE.DOC "&#CHAVE#&;&#PROTOCOLO#&;&#CORRECAO#&" "]+cChaveNFe+[;]+cNFEnProt+[;]+xCorrecao+["]
      MemoWrit( "ccemerge.bat", cMacro )
      RUN "ccemerge.bat"


Dentro do documento as variaveis são &#CHAVE#&, &#PROTOCOLO#& e &#CORRECAO#&

O laço for lê cada um dos campos passados e o if oFind:Execute() executa a transação, mas somente uma vez.

Desta forma se houver repetição do campo somente a primeira ocorrência deverá ser repassada.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro