Página 1 de 3
MERGE - Colagem de dados via Command Line
Enviado: 29 Nov 2007 01:10
por rochinha
Amiguinhos,
O assunto .RTF começou a dar asas a imaginação e me permitiu compartilhar mais um trecho de código de meu sistema, o qual adaptei para funcionar stand-alone.
Trata-se de um utilitário de linha de comando que recebe parametros e faz a colagem destes num arquivo .DOC ou .RTF.
É super fácil de usá-lo:
OLEMerge arquivo.doc "&#VARIAVEL1#&;&#VARIAVEL1#&" "CONTEUDO A;CONTEUDO B"
Exemplo:
OLEMerge doc.rtf "&#NOME#&;&#ENDERECO#&" "Jose Carlos da rocha;Rua Dr M.R.Mattoso, 50"
Explicação:
&#variavel#& - Toda variavel deve estar entre &# e #& e podem estar em qualquer posição do corpo do documento .DOC ou .RTF.
; - É o separador de conteudo. A função StringToArray cria o Array se encarrega de transformar o conjunto de dados string em um array usável pela função.
Baixem o exemplo com codigo completo de
http://www.5volution.com.br/downloads/f ... emerge.zip e boa sorte.
Enviado: 29 Nov 2007 10:45
por Pablo César
Legal Rochinha ! Baixei, testei e gostei. Entendo que seu aplicativo faz aquela substituição de "variáveis" ou TAGS dentro do arquivo .DOC ou .RTF e o faz de forma interativa sem precisar alterar em disco utilizando a interface "OLE" e que desta forma deixa o documento aberto para impressão sem precisar gravar. Isso é ótimo, pois eu faria um arquivo RTF no Word (como você fez, com cabeçalhos e tudo mais) e depois de gravado daria uma ATTRIB +R (Read-only) para esse mesmo arquivo e desta forma não se perderia na tentativa do usuário "teimoso" querer re-gravar esse arquivo na hora de ser exibido para impressão, digamos.
Obrigado pela sua contribuição ! Quem sabe eu, algum dia possa ir a São Paulo à rua Rua Dr M.R.Mattoso, 50 para dar um abraço no colega... (aproveitei para saber o seu endereço... hihihi, imagino eu...)
Enviado: 29 Nov 2007 14:06
por rochinha
Amiguinho
Será bem vindo!
Enviado: 29 Nov 2007 16:35
por Pablo César
Obrigado Rochinha, para mim será um prazer.
Estava pensando... quantos de nós ja não passamos por uma certa dificuldade quanto a impressão de ETIQUETAS. Pelo que vemos o Word pode ser um grande aliado. Daí pensei:
Farua um RTF modelo no Word uma folha completa para impressão etiquetas determinando os campos, será que daria para elaborar um aplicativo que pudesse ler DBF e ainda SKIPar de tal nº registro até tal número (a princípio poderia fazer em dbf temporário que vá desde o começo ao fim do BD), prenchendo/substituindo as TAGs, variáveis ou nome de campo de dbf ?
Digamos que numa página podem serem impressas 99 etiquetas (9 colunas x 11 linhas) e que pudesse prencher cada etiqueta como se utilizasse uma MATRIZ. Técnicamente não vejo problema, se eu tentasse fazer, você poderia compilar ? Claro, que terás que ter um pouquinho de paciência pois eu não programo em FiveWin e eu acho que poderei-me guiar do seu código exemplo OLEMARGE.PRG.
Sei que você compilou com FiveWin for Harbour e se eu mandar poderia compilar para nós ? O quê você acha ?. Seria possível você me acompanhar nesse projeto ?
Enviado: 30 Nov 2007 12:37
por rochinha
Amiguinho
Comece e vamos ver onde da pra chegar.
Enviado: 30 Nov 2007 12:51
por Pablo César
Ok, então.
Para inicio, deverão ser passados os seguintes parâmetros:
- Nome do RTF
- Nome do DBF
- Nome dos campos do DBF que serão utilizados
- Quantidade de colunas
- Quantidade de linhas
Digamos para esta primeira fase, serão considerados todos os registros do DBF, então prepararia-se antes o DBF ja filtrado e ordenado. Mas como é etiquetas a ordem não é tão importante. Se caso o número de registros que contém esse DBF seja maior do que pode caber numa página, haverá necessidade de copiar o modelo de forma que seja inserida no mesmo documento. Ou fazer um segundo chamado, tudo dependerá dos recursos da LIB do FiveWin. Irei fazer as alterações e irei posta-la aqui, se você me permitir Rochinha.
Enviado: 03 Dez 2007 10:51
por Pablo César
Eu poderia ter enviado por email para você Rochinha compilar, mas achei melhor postar aqui a minha idéia assim desta forma permita alguém fazer uma crítica/sugestão que possa advir. E aproveitei carona no seu post e como não obtive resposta negativa decidí postar aqui o código fonte:
Código: Selecionar todos
#include "FiveWin.ch"
#define CR Chr(13)
#define LF Chr(10)
#define BS "\"
Function OLEMerge( cDOCFile, cDBFile, cVFields, cQtCol, cQtLin, lDOCPreview )
/* O parametro lDOCPreview nao consegui utilizar no seu código anterior.
Este serviria para visualizar o arquivo ou até imprimi-lo, não é ?*/
LOCAL cHomeDir := CurDrive() + ":" + BS + CurDir() + BS
LOCAL oDoc,oWord,oText,oFind,cFound,bError,cFile,cText
IF cDOCFile=NIL
MsgInfo( "Falta parametro sobre o arquivo do Word." )
ELSE
cFile := cHomeDir + cDOCFile
if !File(cFile)
MsgInfo( "Arquivo "+cFile+" nao encontrado." )
QUIT
endif
ENDIF
IF cDBFile=NIL
MsgInfo( "Falta parametro sobre o arquivo DBF." )
ELSE
if !File(cHomeDir + cDBFile + (IF(".DBF" $ cDBFile,"",".DBF")) )
MsgInfo( "Arquivo "+cDBFile+" n„o encontrado." )
QUIT
endif
USE (cHomeDir + cDBFile) READONLY
ENDIF
aVFields := StringToArray( cVFields, ";" )
vt := len( aVFields )
IF vt = 0
MsgInfo( "Precisa informar os nomes dos campos do DBF." )
QUIT
ENDIF
IF VAL(cQtCol)=0
MsgInfo( "A quantidade de colunas para etiquetas nao esta correta." )
QUIT
ELSE
cQtCol := VAL(cQtCol)
ENDIF
IF VAL(cQtLin)=0
MsgInfo( "A quantidade de linhas para etiquetas nao esta correta." )
QUIT
ELSE
cQtLin := VAL(cQtLin)
ENDIF
IF lDOCPreview=NIL
lDOCPreview := .t.
ELSE
lDOCPreview := .f.
ENDIF
cTLins:=cQtLin*VT // Obtem quatidade de etiquetas por pagina
aVWords := {}
FOR I=1 TO cQtCol
AADD(aVWords,{})
NEXT
vc := 1
i := 1
Do While !EoF() // Transcrevendo o conteúdo dos campos do DBF para MATRIZ
AADD(aVWords[vc],(&(aVFields[i])))
vc ++
If vc > cQtCol
vc := 1
i ++
If i > vt
i := 1
Endif
Endif
SKIP
ENDDO
CursorWait()
oWord :=TOleAuto():New( "Word.Application" )
oDoc :=oWord:Get( "Documents" )
oWord:Set("Visible",.f.)
oDoc:Open( cFile )
oText:=oWord:Selection()
oFind:=oText:Find()
for vl = 1 to cTLins // Vai processar incialmente apenas a primeira p gina
for vc = 1 to cQtCol
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[vc,vl] )
next
next
if lDOCPreview
oWord:Set("Visible",.t.)
else
oWord:PrintOut()
oWord:Quit()
endif
CursorArrow()
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
Cabe dizer que me basei no código-fonte do Rochinha e este é apenas o primeiro passo. Se este procedimento for fazer as buscas e substituições das TAGs de forma sequencial e linhar, isto é, obdecendo a regra busca/substituição de esquerda à direita. Então, imagino que servirá para fazer apenas uma página de teste. Rochinha, se você puder compilar e disponibiliza-lo no site da sua disponibilidade e gostaria de ver o resultado.
Enviado: 03 Dez 2007 11:33
por rochinha
Amiguinho
Eu farei isto, aguarde.
Enviado: 19 Dez 2007 18:09
por Pablo César
Tem muitos erros o código-fonte que postei para ser compilado ?. Ou não funcionou essa lógica, Rochinha ?
Enviado: 14 Jan 2008 09:18
por rochinha
Mister Pablo
me envie o seu arquivo .DOC que voce preparou para o merge de etiquetas tenho algumas ideias.
Enviado: 15 Jan 2008 16:51
por Pablo César
Eu tinha mandado para
fivolution@hotmail.com no dia 03/12/2007, devia ter enviado em algum outro endereço ?. O meu email não retornou erro algum e é esse que consta no seu perfil daqui do fórum. Mandei o .DOC e o DBF exemplo. Hoje estarei re-enviando e solicitarei confirmação de recebimento, me avise por favor, caso não tenha chegado.
Obs.: O arquivo do Word que foi enviado tem extensão RTF
Enviado: 16 Jan 2008 08:30
por rochinha
Amiguinho
Recebido, vou anallisar, valew.
Enviado: 13 Abr 2008 10:30
por Pablo César
E aí Rochinha ? Ainda não conseguiu algum resultado para esta questão de etiquetas ?
Enviado: 13 Abr 2008 11:49
por rochinha
Amiguinho,
Pensei que ia conseguir fazer vc esquecer...
Esquecer...
Enviado: 13 Abr 2008 12:18
por Maligno
Pablo César NUNCA esquece. Pablo César NUNCA perdoa.

))))))