Primeiramente, obrigado pela sua atenção e dedicação colega Pablo, e permita-me, antes de discutirmos um desabafo, desde q comecei, acredito q como a maioria do fórum ou muitos, tive q se virar, correr atrás...
... no quesito cálculos sempre me dei bem, agora qdo envolve manipulação de arquivos tipo texto, impressora e vídeo, sempre bato a cabeça, e na verdade eu não entendi muito bem ou quase nada do q vc explicou...
... vou tentar repassar do meu jeito espero q vc entenda e possa ajudar, ou estou frito, rsrsrs...
Sempre achei e ainda acho o Maligno, vc, o Leo, Toledo, Vagner e muitos outros aqui do fórum dos quais tive e tenho o prazer de acompanhar algumas discussões um nível muito elevado. Espero q algum dia consiga galgar alguns degrais de conhecimento e estar conversando ao nível de vcs....
Mas como ainda sou um mero mortal... vamos lá....
1. Esse arquivo modelo, matriz ou gabarito como você o titulou; precisa ser exibido em tela para o usuário ?
Então esse arquivo modelo q contem as TAGs ele varia muito de cliente para cliente, pois dependendendo do q o cliente quer imprimir eu edito o
arquivo na hora e acrescento texto, mudo de lugar as TAGs para poder sair de acordo com algum papel pré-formatado q ele tenha tipo um boleto pré-impresso ou uma promissória mandada fazer na gráfica e assim por diante... e o q é exibido na tela é o resultado já com as TAGs substituidas...
Isso é interessante, pq ai não preciso ficar mudando o código de cliente para cliente.
Abaixo vou colocar o jeito q estava funcionando
Código: Selecionar todos
Use Clientes alias Clientes Shared New
set device to printer
set printer to cArq
.
.
.
If File("base.txt")
FileCopy("base.txt","base.tmp")
TxtBase := "base.tmp"
* Substitui TAGs pelos dados da empresa q busca em um determinado DBF
* Caso nao tiver uma TAG no TXT não troca nada e se tiver uma TAG no TXT q não tenha aki no código...
* ... vai ficar sobrando como se fosse um texto do layout mesmo
PesqByte(TxtBase,"@empresa",Emp->NOME)
PesqByte(TxtBase,"@endemp",ALLTRIM(Emp->ENDERECO)+Emp->NUMERO)
PesqByte(TxtBase,"@cidaemp",Emp->CIDADE)
PesqByte(TxtBase,"@estadoemp",Emp->UF)
PesqByte(TxtBase,"@foneemp",Emp->TELEFONE)
* Substitui as TAGs pelos dados do cliente
PesqByte(TxtBase,"@codcli",Clientes->CODIGO)
PesqByte(TxtBase,"@nomecli",left(alltrim(Clientes->NOME),32))
PesqByte(TxtBase,"@endereco",Clientes->ENDERECO)
PesqByte(TxtBase,"@bairro",Clientes->BAIRRO)
PesqByte(TxtBase,"@cidade",Clientes->CIDADE)
PesqByte(TxtBase,"@estado",Clientes->ESTADO)
PesqByte(TxtBase,"@cep",Clientes->CEP)
PesqByte(TxtBase,"@telefone",Clientes->TELEFONE)
PesqByte(TxtBase,"@dtnasc",dtoc(Clientes->nascimento))
* Dados da Venda
PesqByte(TxtBase,"@venda",cVenda)
PesqByte(TxtBase,"@data", DATE(), )
PesqByte(TxtBase,"@vcto",dtoc(dVenc))
PesqByte(TxtBase,"@parcela",str(nParc,2)+"/"+transform(nParcelas,"@B 99"))
PesqByte(TxtBase,"@valor",transform(nValor,"@E 999,999.99"))
ArqGer:=MemoRead("base.tmp")
Aviso("Aguarde... Gerando o arquivo para impressao.","W+*/R")
Set Print On
Set Device to Printer
SetPRC(0,0)
TotLinhas:=MlCount(ArqGer,150)
lLinha:=0
inicio :=1
For inicio:=1 to TotLinhas
If lLinha>=60
Eject
lLinha:=0
End if
Imp:=Memoline(ArqGer,150,local3)
@ lLinha,0 Say trim(imp)
lLinha++
Next
Endif
.
.
.
/* Funcao para Trocar Strings em qualquer arquivo *
Pesquisa a existencia de um determinado texto dentro de um arquivo
O arquivo pode ter qualquer extensao (prg,exe,com,dll,txt,etc...)
Parametros
cArq = Nome do arquivo a ser pesquisado
cPesq = Cadeia a ser pesquisada
cTroca = Caso seja informado ao encontrar a sequencia sera feita a troca
Obs : Se a nova string for menor que a pesquisada entao a diferenca
: sera preenchida com espacos
Retorno :
Retorna a quantidade de ocorrencias
Em caso de erro retorna -1, -2 ou -3 dependendo do erro
Alterada em : 11.02.2008 as 14:29 horario de Brasilia
A pesquisa agora e feita do 1º byte em diante
A funcao agora nao diferencia maisusculas de minusculas
Obs : Na pesquisa tanto faz se e maiuscula ou minuscula
porem no caso da nova string vale como ela foi passada
Ex : Se a nova string for "BaRtOlomEU" assim ela sera gravada
Autor..........: Marcelo (Clipper)
Contribuicoes : Maligno e Eolo
*/
*------------------------------------*
Function PesqByte(cArq,cPesq,cTroca)
*------------------------------------*
if cArq=nil .or. cPesq=nil // Falta de parametros
return(-1)
endif
cPesq=alltrim(cPesq)
if cTroca<>nil
cTroca=Alltrim(cTroca)
if len(cPesq)>len(cTroca) // a nova string e menor que pesquisada entao
espacos=len(cPesq)-len(cTroca) // a diferenca sera preenchida com espacos
cTroca=cTroca+space(espacos)
endif
endif
if !File(cArq) // Arquivo nao encontrado
return(-3)
endif
pl:=upper(substr(cPesq,1,1))
hand:=fopen(cArq,2)
Byte:=1
Tamanho:=Fseek(hand,0,2)
posiciona:=Fseek(hand,0,0)
conta:=0
do whil .T.
lebyte:=freadstr(hand,1)
if upper(lebyte)=pl
posiciona:=fseek(hand,-1,1)
leu:=freadstr(hand,len(cPesq))
if upper(leu)=upper(cPesq)
conta++
if cTroca<>nil
fseek(hand,-len(cPesq),1)
fwrite(hand,cTroca,len(cTroca))
endif
endif
endif
byteatual:=fseek(hand,1,-1)
byte++
if byte>=tamanho-len(cPesq)+1
fclose(hand)
return(conta)
endif
enddo
Bom em resumo era assim q estava usando e sem problemas e com o resultado q eu quero, q é não bagunçar o Arquivo Gerado em relação as posições do texto e das Trocas das TAGS.
Vou disponibilar aki para baixar 4 Modelos de clientes diferentes do BASE.TXT q na verdade como disse no início varia de cliente para cliente.
Agora eu tive q mudar para usar a função q entitulei de LayoutTXT do colega Andril para manter a compatibilidade com o xHarbour, ou seja, a PesqByte funciona no clipper mas no xHB não consegui fazer funcionar, e a do colega Andril esta funcionando tanto no Clipper qto no xHB, mas tem agora somente q resolver a questão dos espacamentos, ou melhor, não bagunçar o arquivo gerado, manter os mesmos posicionamentos do texto e do local das TAGS como no arquivo BASE.TXT
Abaixo como coloquei agora o código trocado para utilizar a função LayoutTXT.
BASE1.TXT
- Modelo 01 do Arquivo BASE.TXT
- (2.38 KiB) Baixado 100 vezes
BASE2.TXT
- Modelo 02 do Arquivo BASE.TXT
- (1.91 KiB) Baixado 80 vezes
BASE3.TXT
- Modelo 03 do Arquivo BASE.TXT
- (422 Bytes) Baixado 81 vezes
BASE4.TXT
- Modelo 04 do Arquivo BASE.TXT
- (429 Bytes) Baixado 81 vezes
Código: Selecionar todos
Use Clientes alias Clientes Shared New
set device to printer
set printer to cArq
.
.
.
If File("base.txt")
FileCopy("base.txt","base.tmp")
TxtBase := "base.tmp"
pesq:= { "@empresa", "@endemp", "@cidaemp", "@estadoemp", "@foneemp", ;
"@codcli", "@nomecli", "@endereco", "@bairro", ;
"@cidade", "@estado", "@cep", "@telefone", "@dtnasc", ;
"@venda", "@data", "@vcto", "@parcela", "@valor" }
Troc:= { Emp->Nome, Emp->Endereco+Emp->Numero, Emp->Cidade, Emp->Estado, Emp->Telefone,;
Clientes->Codigo, Left(Alltrim(Clientes->Nome),32), Clientes->Endereco, Clientes->Bairro, ;
Clientes->Cidade , Clientes->estado, Clientes->CEP, Clientes->Telefone, dtoc(Clientes->Nascimento), ;
cVenda, DATE(), dtoc(dVenc), str(nParc,2)+"/"+transform(nParcelas,"@B 99"), transform(nValor,"@E 999,999.99") }
LayoutTXT(TXTBase, pesq, troc, "Retorno")
ArqGer:=memoread("Retorno")
Aviso("Aguarde... Gerando o arquivo para impressao.","W+*/R")
Set Print On
Set Device to Printer
SetPRC(0,0)
TotLinhas:=MlCount(ArqGer,150)
lLinha:=0
inicio :=1
For inicio:=1 to TotLinhas
If lLinha>=60
Eject
lLinha:=0
End if
Imp:=Memoline(ArqGer,150,local3)
@ lLinha,0 Say trim(imp)
lLinha++
Next
Endif
.
.
.
/* Funcao para trocar Strings em Layouts TXT (LayoutTXT)
Autor..: Andril
COMO USAR: o arquivo BOLETO.TXT deve ser preenchido assim
@nome35
@codigo09
@cidade35
ONDE: @nome ‚ o campo a ser alterado
35 ‚ a largura da formatacao do campo
NOTA: se a largura for de 1 a 10 preencher sempre com 2 digitos
@sexo01
IMPRESSAO: @nome35# onde # indica que deve ser feita a impressao desta
palavra em CONDENSADO
@nome35$ onde $ indica que deve ser feita a impressao em
ESPANDIDO
Pode definir uma mascara para NEGRITO como % e alterar o IF no
codigo para permiti-la
*/
*------------------------------------------------------------------------
Function LayoutTxt(cArqLay, aElemento, aConteudo, cArqRet)
* cArqLay = Nome do Arquivo TXT q contem o Layout
* aElemento = Array Multidimensional com os elementos a serem trocados
* aConteudo = Array Multidimensional com o conteudo q ira preencher
* cArqRet = Nome do Arquivo de Retorno com as trocas realizadas
//--aqui sao os elementos que devem serem procurados no arquivo BOLETO.TXT
elemento:=aElemento
//--aqui o array que fornece os dados conforme a posicao ordinal do array acima
conteudo:= aConteudo
//--le o arquivo de Layout
string=memoread(cArqLay,80)
linhas=mlcount(string,80)
//--inicia o varredura no arquivo
for i = 1 to linhas
num_elemento=1
do while num_elemento<=len(elemento)
if at(elemento[num_elemento],memoline(string,80,i))>0
//--se encontrou a string na linha entra aqui
//--obtem a coluna inicial
comeco_col=at(elemento[num_elemento],memoline(string,80,i))
//--rotina para obter o spaco de formatacao
if ISDIGIT(substr(memoline(string,80,i),comeco_col+len(elemento[num_elemento]),1))=.F.
//--se apos a chave existir um espaco indica que nao ha formatacao feita pelo
//--usuario
string=strtran(string,elemento[num_elemento],conteudo[num_elemento])
else
comeco_col=len(substr(memoline(string,80,i),comeco_col,len(elemento[num_elemento])+1))
posicao=1
do while substr(memoline(string,80,i),comeco_col,posicao)$"0123456789"
posicao++
enddo
//--aqui defini a impressao no modo normal
modoimpbasico="chr(18)"
//--aqui defini conforme esta no arquivo de Layout
modoimpressao=""
if substr(memoline(string,80,i),comeco_col+posicao,1)="$"
//--expandido
modoimpressao="chr(14)"
elseif substr(memoline(string,80,i),comeco_col+posicao,1)="#"
//--condensado
modoimpressao="chr(15)"
endif
stringtamanho=substr(memoline(string,80,i),comeco_col,posicao)
tamanhofinal=val(substr(memoline(string,80,i),comeco_col,posicao))
string=strtran(string,elemento[num_elemento]+stringtamanho+;
if(!empty(modoimpressao),substr(memoline(string,80,i),comeco_col+posicao,1),""),;
padr(if(!empty(modoimpressao),&modoimpressao+conteudo[num_elemento]+&modoimpbasico,conteudo[num_elemento]),tamanhofinal,"+"))
endif
endif
num_elemento++
enddo
next
*num_elemento++
*enddo
memowrit(cArqRet,string)
return
Bom Pablo e pesso é isso, não sei se compliquei mais, ou se agora ficou mais um pouco mais de informação... rsrs
Grato...
:)Pos