MERGE II - Usando XML para passar dados.

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

MERGE II - Usando XML para passar dados.

Mensagem por rochinha »

Amiguinhos

Tempos atras postei um topico relacionado a Merge de um arquivo .RTF a partir de um executável de linha de comando em MERGE - Colagem de dados via Command Line.

Pois é, depois de muito tempo(e conseguindo enrolar o Pablo), um amiguinho me contactou dizendo que ao passar comandos, dependendo do tamanho da string, paulava o aplicativo.

E como venho enxendo a mão com o uso de XML em meus sistemas resolvi usar a mesma técnica para passar parametros para o aplicativo.

A forma de usá-lo é assim:

OLEMerge arquivo.doc arquivo.xml

Exemplo:
OLEMerge teste.rtf teste.xml

Exemplo do arquivo .XML:

Código: Selecionar todos

<?xml version="1.0" encoding="ISO-8859-1"?> 
<olemerge> 

   <campos>nome</campos> 
   <campos>endereco</campos> 
   <campos>bairro</campos> 
   <campos>cep</campos>

   <dados>Jose Carlos da rocha</dados> 
   <dados>Rua Dr Mario Mauro Ramos Mattoso 50</dados> 
   <dados>Pirituba</dados> 
   <dados>05171-340</dados>

</olemerge>
O numero de campos deve coincidir com o numero de dados passados pois a rotina avalia o tamanho do objeto OLEMERGE visualizado pelo XML.

O limite de campos e dados dependerá da memória da maquina ao processar o merge.

Arquivo .RTF de exemplo(copie e cole o tenho entre as tags CODE e /CODE e salve como DOC.RTF):

Código: Selecionar todos

{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1046\deflangfe1046{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f36\froman\fcharset238\fprq2 Times New Roman CE;}{\f37\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f39\froman\fcharset161\fprq2 Times New Roman Greek;}
{\f40\froman\fcharset162\fprq2 Times New Roman Tur;}{\f41\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f42\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f43\froman\fcharset186\fprq2 Times New Roman Baltic;}
{\f44\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f56\fmodern\fcharset238\fprq1 Courier New CE;}{\f57\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f59\fmodern\fcharset161\fprq1 Courier New Greek;}
{\f60\fmodern\fcharset162\fprq1 Courier New Tur;}{\f61\fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f62\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f63\fmodern\fcharset186\fprq1 Courier New Baltic;}
{\f64\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0
\fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 \snext0 Normal;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\*
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv
\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\s15\ql \li0\ri0\nowidctlpar\tqc\tx4320\tqr\tx8640\faauto\rin0\lin0\itap0
\fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 \sbasedon0 \snext15 header;}{\s16\ql \li0\ri0\nowidctlpar\tqc\tx4320\tqr\tx8640\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 \sbasedon0 \snext16 footer;}}
{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid2510635\rsid12271358\rsid14224086\rsid15612869}{\*\generator Microsoft Word 11.0.5604;}{\info{\title ______February 3, 1997}{\author ziggy stardust}{\operator Administrador}
{\creatim\yr2007\mo11\dy29\min42}{\revtim\yr2008\mo5\dy27\hr18\min2}{\version5}{\edmins4}{\nofpages1}{\nofwords11}{\nofchars65}{\*\company 5volution}{\nofcharsws75}{\vern24689}}\margl1701\margr1701\margt1417\margb1417
\widowctrl\ftnbj\aenddoc\hyphhotz425\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\nolnhtadjtbl\rsidroot14224086
\fet0{\*\ftnsep \pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {\insrsid14224086 \chftnsep
\par }}{\*\ftnsepc \pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {\insrsid14224086 \chftnsepc
\par }}{\*\aftnsep \pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {\insrsid14224086 \chftnsep
\par }}{\*\aftnsepc \pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {\insrsid14224086 \chftnsepc
\par }}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\header \pard\plain \s15\qc \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {\b\f2\fs28\insrsid12271358 NOME DA EMPRESA}{
\b\f2\fs28\insrsid2510635\charrsid2510635
\par }{\fs28\lang1046\langfe1046\langnp1046\insrsid14224086\charrsid14224086 123 Endereco Completo
\par Bairro, UF  00000-000
\par }{\fs28\insrsid14224086 (011)9999-9999
\par }{\lang1024\langfe1024\noproof\langnp1046\insrsid12271358 {\shp{\*\shpinst\shpleft-72\shptop260\shpright8713\shpbottom261\shpfhdr1\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz0\shplid2049
{\sp{\sn shapeType}{\sv 20}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fShadow}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 0}}}{\shprslt{\*\do\dobxcolumn\dobypara\dodhgt8192\dpline\dpptx0\dppty0\dpptx8785\dppty1
\dpx-72\dpy260\dpxsize8785\dpysize1\dplinew15\dplinecor0\dplinecog0\dplinecob0}}}}{\fs28\insrsid14224086
\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}
{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8
\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {
\f2\fs28\insrsid14224086
\par }{\f2\fs28\lang1046\langfe1046\langnp1046\insrsid14224086\charrsid2510635 Nome: }{\f2\fs28\lang1046\langfe1046\langnp1046\insrsid2510635\charrsid2510635 &#NOME#&}{\f2\fs28\lang1046\langfe1046\langnp1046\insrsid14224086\charrsid2510635
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0\pararsid15612869 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid15612869\charrsid2510635
\par Endere\'e7o: &#ENDERECO#&
\par
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0\pararsid12271358 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358\charrsid2510635 Bairro: &#BAIRRO#&
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0\pararsid15612869 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid15612869
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0\pararsid12271358 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358 Cep}{\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358\charrsid2510635 : &#}{
\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358 CEP}{\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358\charrsid2510635 #&
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0\pararsid15612869 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358\charrsid2510635
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid14224086\charrsid2510635
\par }}
Codigo modificado do OLEMERGE.EXE:

Código: Selecionar todos

#include "FiveWin.ch"

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

#define BS             "\"

Function OLEMerge( cDOCFile, cXMLFile, lDOCPreview )
   LOCAL cHomeDir := CurDrive() + ":" + BS + CurDir() + BS
   LOCAL oDoc,oWord,oText,oFind,cFound,bError,cFile,cText
   DEFAULT lDOCPreview := .t.
   cFile := cHomeDir + cDOCFile

   oXMLDoc := TOLEAUTO():New("Microsoft.XMLDOM") 
   oXMLDoc:async := .f. 

   lSuccess := oXMLDoc:load( cXMLFile ) 
   if lSuccess
      aCampos   := {}
      oCampos   := oXMLDoc:getElementsByTagName( "campos" ) 
      for i = 1 to oCampos:length 
          aadd( aCampos, "&#" + oCampos:Item(i-1):Text + "#&" )
      next 

      aDados   := {}
      oDados   := oXMLDoc:getElementsByTagName( "dados" ) 
      for i = 1 to oDados:length 
          aadd( aDados, oDados:Item(i-1):Text )
      next 

   endif

   aVFields := aCampos
   aVWords  := aDados
   if File(cFile)
      CursorWait()
      oWord :=TOleAuto():New( "Word.Application" )
      oDoc  :=oWord:Get( "Documents" )
      oWord:Set("Visible",.f.)
      oDoc:Open( cFile )
      oText:=oWord:Selection()
      oFind:=oText:Find()
      for i = 1 to len( aVFields )
          oFind:Set("ClearFormatting")
          oFind:Text:="&#*#&"
          oFind:Wrap:=1
          oFind:Set("MatchWildcards",.t.)
          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] )
      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
Link para baixar o executável compilado em Harbour 46: XMLMerge.zip
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: MERGE II - Usando XML para passar dados.

Mensagem por Pablo César »

Pois é, depois de muito tempo(e conseguindo enrolar o Pablo)
Ahh é ?? Espero que tenha valido a pena esperar... jijijijiji

Baixei e testei Rochinha, parece ser mais ráido que o outro exemplo. Agora eu gostaria de experimentar com arquivo RTF feito para etiquetas, será que irá funcionar ? Vou fazer testes amanhã e farei meus comentários...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: MERGE II - Usando XML para passar dados.

Mensagem por rochinha »

Amiguinho

Se possivel reporte a versão de Windows que voce testou, qual Service Pack, etc. Assim será possilve rastrear a compatibilidade e homologar seu uso para um ou outro S.O.

Meu sistema é:

Windows 2003 Server, SP2.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Everton
Usuário Nível 3
Usuário Nível 3
Mensagens: 143
Registrado em: 07 Jul 2004 08:53
Localização: Campo Grande - MS

Re: MERGE II - Usando XML para passar dados.

Mensagem por Everton »

Olá Rochinha.

Testei no windows XP SP3, o que não consegui fazer é ele buscar os dados no arquivo .xml. Valeu
Everton Luiz Penteado
Clipper 5.2b - Blink 7.0
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

MERGE II - Usando XML para passar dados.

Mensagem por Pablo César »

Rochinha, funcionou beleza !

1. Fiz testes também com formulário de etiquetas e deu certo sim. Foi que uma beleza !

2. Meu sistema é: Windows XP Professional, SP2. Versão 2002. Service Pack 2

3. É bom esclarecer que o arquivo XMLMerge.zip que você Rochinha disponibilizou na 1ª mensagem, contém um arquivo fonte chamado OLEMERGE.PRG com o tamanho de 2.345 bytes e que não é o mesmo que o executável. Esse fonte é o mesmo do tópico MERGE - Colagem de dados via Command Line, portanto deverá ser pego daqui mesmo deste tópico fazendo colagem.

4. Outra coisa que achei fundamental observar que ao copiar/colar pelo NOTEPAD (foi o que eu usei, pois o meu costumeiro editor de fontes é em DOS não for Windows) ele dá uma margem de tres caracteres em toda sua extensão do arquivo. Portanto deverá ser removida com o seu editor que marque coluna e remover esses espaços. Acho que isso acontece porque a configuração do NOTEPAD não está setada a "Quebra automática de linhas".

5. Através do seu código fonte que disponibilizou para todos nós, entendí que você utiliza o arquivo de extensão e formato XML para compor as duas matrizes. Uma matriz que conterá os nomes dos campos e a outra matriz que armazenará os dados em substituição. Tendo isto, eu gostaria de te fazer uma pergunta Rochinha:

a) Em vez de utilizar um arquivo XML, então quer dizer que daria para substituir por um DBF ?
b) A idéia seria criar um DBF contendo o apenas e tão somente os campos que serão utilizados para o seu engênio de susbtituição de "tags" por OLEMERGE. Sendo assim, você teria os nomes do campos do DBF dos quais ja fariam parte no arquivo RTF e teria os dados considerando todos os registros.
c) Será que dava LIGA fazer isso ?

Parabéns Rochinha e muito obrigado pela sua contribuição. Agora faltava fazer MERGE III - Usando DBF para passar dados.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: MERGE II - Usando XML para passar dados.

Mensagem por rochinha »

Amiguinhos

O arquivo .ZIP contendo o material necessário esta reposto neste link

Eu pensei sim em .DBF mas a idéia de usar o XML é imputar na cabeça dos colegas que o mesmo não é um bicho de 7 cabeças e que a técnica usada no novo OLEMERGE, agora batizado de XMLMERGE ensina como usar a API de manipulação deste tipo de arquivo.

Fazer o uso de .DBF seria mais fácil e simples e por estar na boca de todos não seria problema nem para quem esta iniciando.

O arquivo .XML não precisa ter tamanho fixo, podendo ser gerado on-the-fly dando flexibilidade de uso de vários arquivos de merge diferentes, tipo formularios com muitos campos, como contratos, etc.

Acho até que seja possivel usar em formulários Word bem elaborados, com imagens, formatações especiais, bordas, etc.

A imaginação é que conta.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
ribertobraz
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 27 Jul 2009 17:10
Localização: Varginha/MG

Re: MERGE II - Usando XML para passar dados.

Mensagem por ribertobraz »

Alguém tem o link atualizado deste fonte?

Grato,

Riberto de M.Braz
Programador Clipper/Java
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: MERGE II - Usando XML para passar dados.

Mensagem por rochinha »

Amiguinho,

Envie um email solicitando o fonte diretamente em irochinha@itelefonica.com.br

Logo mais o link estara disponivel.

Obrigado.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder