Amiguinho,
Eis uma correção de peso para o código:
Código: Selecionar todos
#include "FiveWin.ch"
#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
A correção ficará por conta da função UPPER() que transforma as variáveis passadas para a função, devendo é claro, deixar as variáveis dentro do arquivo .DOC/.RTF estarem em maiusculas, pois o método FIND() DO WinWord fará esta distinção.
E também pelo
if oFind:Execute() no qual eu verifico se a variável foi encontrada e executo a transformação.
No código original acontecia que as variáveis, eram alteradas mesmo que fossem passadas outras informações, exemplo:
Se no .DOC/.RTF eu tivesse a variavel ROCHINHA e passasse o parametro RO
XNHA a mesma seria alterada.
Não estava acontecendo a critica relativa se existia ou não a variável dentro do arquivo e a rotina de pesquisa continuava a troca mesmo sendo dados diferentes.
Quando executei o comando abaixo com o código original as variaveis foram modificadas mesmo assim:
Código: Selecionar todos
"OLEMerge arquivo.rtf '&#NOME#&;&#ADDRESS#&' 'CONTEUDO A;CONTEUDO B'"
Mesmo a variavel
ADDRESS não existindo no arquivo .DOC/.RTF o
CONTEUDO B foi colado.
Com a nova alteração isto não acontecerá, portanto faça os dois testes a seguir e veja a diferença dos resultados:
Primeiro:
Código: Selecionar todos
"OLEMerge arquivo.rtf '&#NOME#&;&#ADDRESS#&' 'CONTEUDO A;CONTEUDO B'"
Segundo:
Código: Selecionar todos
"OLEMerge arquivo.rtf '&#NOME#&;&#ENDERECO#&' 'CONTEUDO A;CONTEUDO B'"
Se tudo correr bem, somente o segundo teste terá funcionado totalmente.