Arquivo texto definido usando &Macros

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
matrix
Usuário Nível 3
Usuário Nível 3
Mensagens: 131
Registrado em: 06 Jul 2004 08:41
Localização: Paraná
Contato:

Arquivo texto definido usando &Macros

Mensagem por matrix »

Pessoal

Preciso usar um arquivo pré definido pra emissao de duplicatas, entaum o layout e os textos fixos pensei em fazer num arquivo como dpl.txt.......
agora: como farei pra que na emissao das duplicatas o sistema use esse arquivo dpl.txt e inclua nele as variáveis do momento nos locais pra que possa ser impresso..........creio que terei que usar &macros mas e o resto??


agradeço.
"Ter Problemas é Inevitável, ser derrotado por eles é opcional.!!"
Alessandro
Usuário Nível 3
Usuário Nível 3
Mensagens: 141
Registrado em: 07 Jul 2004 09:39
Localização: Santo Antonio da Platina-PR

Mensagem por Alessandro »

Matrix

Se é que entendi bem o que quer fazer é emitir varias duplicatas, certo?

Não vejo necessidade de fazer um arquivo .txt pra isso, vc vai fazer a formatação do layout uma vez só. Coloque a emissão dentro do while para serem emitidas qtas forem necessárias...
Avatar do usuário
matrix
Usuário Nível 3
Usuário Nível 3
Mensagens: 131
Registrado em: 06 Jul 2004 08:41
Localização: Paraná
Contato:

Mensagem por matrix »

naum é bem isso, eu quero fazer o layout das duplicatas fora em um arquivo naum dentro dos fontes do sistema, nos fontes apenas chamar esse arquivo e jogar as macros pra ele depois imprimir esse arquivo.
"Ter Problemas é Inevitável, ser derrotado por eles é opcional.!!"
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

como farei pra que na emissao das duplicatas o sistema use esse arquivo dpl.txt e inclua nele as variáveis do momento nos locais pra que possa ser impresso..........creio que terei que usar &macros mas e o resto?
Seu arquivo de configuração terá de ser preparado com algumas "tags". Seu programa, então, só terá de abrir o arquivo de configuração, procurar, analisar e substituir essas "tags" conforme você as definir. É uma coisa que nem deve dar muito trabalho. Se tiver alguma dúvida, é só dizer.

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Continuando a explicação do Maligno:

Vc pode criar o arquivo texto;
Carrega-lo com o memoread;
Procurar as <tag´s> e substitui-las conforme suas regras;
Reformata, se necessário;
Montar a impressão do relatório.

Boa sorte.
Avatar do usuário
matrix
Usuário Nível 3
Usuário Nível 3
Mensagens: 131
Registrado em: 06 Jul 2004 08:41
Localização: Paraná
Contato:

Mensagem por matrix »

com certeza preciso de help, nunca trabalhei com tags, nao sei nem por onde começar.....se os amigos puderem me mandar exemplos....

agradeço a força
"Ter Problemas é Inevitável, ser derrotado por eles é opcional.!!"
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á

TAGS

Mensagem por Pablo César »

Colega Matrix,

Eu acho que o que os colegas chamam de TAGS, é apenas uma identificação no teu arquivo TXT que quando procurando essa string (formação de caracteres) e encontrado, você possa substituir-la.

Exemplo do conteúdo do teu texto:

Ao Sr. <<ABRE_NEGRITO>>Fulano de tal<<FECHA_NEGRITO>>
Cidade: <<ABRE_NEGRITO>>Francisco Beltrão - PR<<FECHA_NEGRITO>>

e assim por diante...

Daí você irá procurar a string "<<ABRE_NEGRITO>>" por CHR(27)+CHR(69) este comando para impressoras pradrão EPSON, ok ?

Espero que tenha entendido com a minha colocação. Se eu estiver errado, por favor me corrijam.

Um clip-abraço :)Pos
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á

Substituição de TAGS

Mensagem por Pablo César »

Caro colega Matrix,

Conforme sua solicitação por MP, estou respondendo por aqui mesmo, porque eu acho que a sua questão poderá ser útil para todos e inclusive a idéia que estou dando (com exemplos), poderá ser enriquecidas com os demais colegas, você não acha ?. Também tudo isto serviria para aquela opção de impressão por USB do Heveraldo.

Eu gostaria ver o lay-out do seu arquivo dpl.txt. E entender o porquê da colocação de TAGS (vamos dizer). Pois eu mencionei das TAGS para que você tenha uma idéia com o tratamento de um arquivo de impressão. Sabe, eu sou fã de criar arquivos de impressão nas minhas aplicações. Idenpendente de visualizar em tela ou imprimir na impressora. Essas TAGs que mencionam, serviriam como um campo variável ao qual em outro processamento você define o que fazer com elas.

1) Você cria o teu arquivo básico (digamos: dpl.txt):

Nome: <nome>
Endereço: <endereço>

Valor R$ <valor>

2) Você lê este arquivo e faz a procura por:

<nome>
<endereço>
<valor>

3) A medida que o sistema encontrou, ele pode substituir essas "strings" pelos campos de teu bd (banco de dados). Mas você terá que gerar um arquivo de duplicata para cada registro, caso você for imprimir varias duplicatas ao mesmo tempo, depois você deleta. Faça uma rotina para cada substituição:

Por exemplo - substituição do <nome>:
a.) Você vai ler o arquivo e atribuir a uma variavel: VTXT:=MEMOREAD("DPL.TXT")
b.) Atribua a uma variavel o tamanho do que está procurando: VTAM:=LEN("<nome>")
c.) Pesquise nessa variável, qual é a posição da string "<nome>" e atribua a uma variável: VPOS:=AT("<nome>",VTXT)
d.) Digamos que o conteudo do que você quer colocar em lugar de "<nome>" está no campo de um DBF chamado (1->NOME).
e.) Utilize a função STUFF. VTXT:=STUFF(VTXT,VPOS,VTAM,(1->NOME))

Mas gostaria de ver o layout e te dizer se seria conveniente fazer isto tudo ou aplicar outro procedimento. Porque o tamanho dos campos, nem sempre são do mesmo tamanho. E isso poderá te acarretar um desalinhamento do que você quer imprimir. Certo ?

Estarei a disposição,

Um clip-abraço
:)Pos
Avatar do usuário
matrix
Usuário Nível 3
Usuário Nível 3
Mensagens: 131
Registrado em: 06 Jul 2004 08:41
Localização: Paraná
Contato:

Mensagem por matrix »

amigos,

ainda naum resolvi esse caso, se alguem tiver um exemplo mastigado agradeceria muito............

abraços.
"Ter Problemas é Inevitável, ser derrotado por eles é opcional.!!"
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

matrix escreveu:ainda naum resolvi esse caso, se alguem tiver um exemplo mastigado
Meio tosco, mas está testado...

Código: Selecionar todos

// Constantes de uso geral
#define _kEOL          Chr(13)+Chr(10)
#define _kTAG_OPEN     "<%"
#define _kTAG_CLOSE    "%>"
#define _kTAG_SYMB_LEN 2 // tamanho dos símbolos
//
// Índices para a matriz de dados
#define _kDAT_NOME   1
#define _kDAT_CIDADE 2
#define _kDAT_FONE   3

cStd := "  Nome: <%NOME%>"  + _kEOL +;
        "Cidade: <%CIDADE%>"+ _kEOL +;
        "  Fone: <%FONE%>"  + _kEOL

aDat := {{"Paulo" ,"Londrina" ,"1234-1234"},;
         {"Matrix","F.Beltrao","4321-4321"},;
         {"Pablo" ,"Paranagua","9999-1111"} ;
         }

clear

// Para cada ítem de dados, haverá uma impressão 
for i := 1 to Len(aDat)
    // Inicializar a string de saída
    cOut = cStd
    while .t.
       // Primeiro passo: encontrar alguma tag
       nPos1 = At(_kTAG_OPEN,cOut)
       if nPos1 = 0
          // Não encontrada mais nenhuma tag
          exit
       end
       nPos2 = At(_kTAG_CLOSE,SubStr(cOut,nPos1+1))+nPos1
       cTag  = Upper(SubStr(cOut,nPos1+_kTAG_SYMB_LEN,nPos2-nPos1))
       //
       // Analisar que tag foi encontrada e substituí-la em cOut
       nLen = nPos2-nPos1+_kTAG_SYMB_LEN
       if     cTag = "NOME"
              cOut = Stuff(cOut,nPos1,nLen,aDat[i][_kDAT_NOME  ])
       elseif cTag = "CIDADE"
              cOut = Stuff(cOut,nPos1,nLen,aDat[i][_kDAT_CIDADE])
       elseif cTag = "FONE"
              cOut = Stuff(cOut,nPos1,nLen,aDat[i][_kDAT_FONE  ])
       else
              // Há uma tag não identificada
              cOut = Stuff(cOut,nPos1,nLen,"<< ??? >>")
       end
    end
    // Imprimir o texto formado
    ?? cOut
    ?
next
? "The End!"
?
[]'s
Maligno
http://www.buzinello.com/prg
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á

Substituição de macros

Mensagem por Pablo César »

Retornando a este assunto, me permita MATRIX postar aqui a o exemplo sugerido. Mas vamos lá talvez consiga improvisar e dar mais luz a essa idéia:
Pablo César por email escreveu: Eu utilizo o CT.LIB que é fabuloso nessa questão de substituição de strings.
Também devo dizer que de acordo ao seu LAYOUT do DPL.TXT, você deveria manter as TAGS (ou variáveis, vamos dizer assim) de tamanho do seu conteúdo FIXO. Senão o alinhamento desse formulário, irá pro pau. Concorda ?.

Sempre gero a impressão em arquivo. Mas quando o usuário deseja cancelar (porque a impressora está desligada), eu mostro na tela e daí tenho que remover todos os comando de impressão para que o usuário ao visualizar o arquivo não apareçam os caracteres de comando para impressão (tipo chr(15), etc...).

E aqui vai um exemplo meu (intetarei adaptar, porque o meu não irás a entender):

// Digamos que são essas as TAGS que estarão no LAYOUT.TXT (ver arquivo anexo)
VREM:={"<NOME>","<ENDEREÇO>","<VALOR>"}

// E estes são os conteúdo que deverão prencher o seu formulário
VNOME:="João da Silva Nascimento"
VENDECO:="Rua das Flores na primavera, 365"
VQUANTO:=1500.50

// Todas tem que estar tipo caracter e com tamanho fixo
VPUT:={ PADR(VNOME,40), PADR(VENDERECO,40), PADR(ALLTRIM(TRANSFORM(VQUANTO,"@E 999,999,999.99")),14) }

// Agora ler o conteúdo do teu arquivo de LAYOUT
VDPL:=MEMOREAD("LAYOUT.TXT")

FOR I=1 TO 3 // Executar as tres vectores que contém as denominadas TAGS
VDPL:=ATREPL(VREM,VDPL,VPUT) // Função da LIB CT
NEXT
@ 04,00 SAY PADC(" Visualização da DUPLICATA",80)
MEMOEDIT(VDPL,05,00,19,78,.F.,,80)


Ver LAYOUT abaixo principalmente onde estão os campos <NOME>, <ENDEREÇO> e <VALOR>:

+-------------------------------------------+----------------------------------+
| | Enderecos do negocio nr 99 |
| | Bairro da Vida - Cep 99.999-999|
| | Cnpj: 99.999.999/9999-99 |
| | Insc: 99999999-99 |
| | |
| | Data Emissao: |
+--------------+--------------+-------------+--------------+-------------------+
| Fatura nr. | R$ Valor | Nr.Ordem | Vencimento | |
| |<VALOR> | | | |
+--------+-----+--------------+-------------+--------------+-------------------+
| | Nome Sacado..: <NOME> |
| | Endereco.....: <ENDERE€O> |
| | |
| | |
| | |
| | |
| +---------------------------------------------------------------------+
| |Extenso: (y.y.y.y.y.y.y).x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.|
| |x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x|
| +---------------------------------------------------------------------+
| | Reconheco(emos) a exatidao desta Duplicata de Venda Mercantil, na |
| |importancia acima que pagarei(emos) a , ou a |
| |sua ordem na praca e vencimento. |
| | |
| | |
| |Em, ___________________________ |
| | Assinatura do Sacado |
+--------+---------------------------------------------------------------------+

Parecerá estranho mas terá que ficar desse jeito as TAGS nesse arquivo, porque se não tiverem o tamanho certo ficará desalinhado o formulario a ser impresso.

Um clip-abraço
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á

Utilização do WORD - MESCALR DOCUMENTOS

Mensagem por Pablo César »

Agora MATRIX, se a sua intenção é fazer um layout mais aprimorado (mais bonitinho...) por quê não faz no WORD tipo TABELA, com campos diretamente do seu banco de dados ??.

Eu fiz algo para mala-direta imprimindo pelo WORD. Claro que tem que disponibilizar os dados de forma sintética e filtrada para o usuário. Ahhh e além disso, as vezes tem que dar umas aulinhas pro usuário de como usar o WORD, abrir o arquivo DBF, mesclar documento e imprimir.

Mas este seria o caminho mais adequado, pois terá um resultado muito mais aprimorado em modo gráfico. E se essa for a questão, ja sabe... nossos colegas aconselham, usem outra linguagem (ou aplicativo, hihihi) que trabalhe em modo GUI (Graphical User Interface).

E nos dê a conhecer qual foi a sua opção ou qual foi a solução.

Um clip-abraço
:)Pos
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

Código: Selecionar todos

// Para cada ítem de dados, haverá uma impressão 
for i := 1 to Len(aDat) 
    // Inicializar a string de saída 
    cOut = cStd 
    while .t. 
       // Primeiro passo: encontrar alguma tag 
       nPos1 = At(_kTAG_OPEN,cOut) 
       if nPos1 = 0 
          // Não encontrada mais nenhuma tag 
          exit 
       end 
       nPos2 = At(_kTAG_CLOSE,SubStr(cOut,nPos1+1))+nPos1 
       cTag  = Upper(SubStr(cOut,nPos1+_kTAG_SYMB_LEN,nPos2-nPos1)) 
       // 
       // Analisar que tag foi encontrada e substituí-la em cOut 
       nLen = nPos2-nPos1+_kTAG_SYMB_LEN 
       if     cTag = "NOME" 
              cOut = Stuff(cOut,nPos1,nLen,aDat[i][_kDAT_NOME  ]) 
       elseif cTag = "CIDADE" 
              cOut = Stuff(cOut,nPos1,nLen,aDat[i][_kDAT_CIDADE]) 
       elseif cTag = "FONE" 
              cOut = Stuff(cOut,nPos1,nLen,aDat[i][_kDAT_FONE  ]) 
       else 
              // Há uma tag não identificada 
              cOut = Stuff(cOut,nPos1,nLen,"<< ??? >>") 
       end 
    end 
    // Imprimir o texto formado 
    ?? cOut 
    ? 
next 
Só revisando, ao inves de todo este codigo porque não usar o STRTRAN?

Assim, supondo que vc tivesse um texto e quisesse substituir todas as TAGS <%NOME_DO_CAMPO%> faça o seguinte:

Código: Selecionar todos

texto=memoread("arquivo.txt")
for i=1 to fcount()
   campo="<%"+field(i)+"%>"
   texto=strtran(texto,campo,&(field(i)))
next
memowrite("arquivo.txt",texto)
Você pode digitar um texto e com esta pequena rotina vc substitui as TAGs de campo pelo seu conteudo fisico.

Legal e simples.
Sem mais
Wagner Nunes
www.vagucs.com.br
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Só revisando, ao inves de todo este codigo porque não usar o STRTRAN?
Não conseguiu perceber porque?
Explico: sua rotina, usando STRTRAN tem um problema. Se o colega tiver que imprimir, digamos, 100 documentos e no "script" existirem, digamos, 10 tags, sua rotina fará a leitura integral do texto 1000 vezes. Isso é característica da STRTRAN, que precisa "varrer" o texto do começo ao fim.
Por outro lado, na minha função, devidamente otimizada, a leitura será feita apenas 100 vezes. Ou seja, 10 vezes mais rápido.

Isso que meu post foi por volta das seis da manhã. Eu já estava bêbado de sono. Fiz na hora, do jeito que pude. Mas dá pra otimizar mais ainda, removendo as chamadas a STUFF.
Legal e simples.
Um pensamento legal: "Nem sempre o código mais simples é o mais eficiente".

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

So a presença da rotina STUFF torna o seu codigo muito mais lento, para otimizar melhor substituir ela por outra solução.
Sem mais
Wagner Nunes
www.vagucs.com.br
Responder