Página 2 de 3
Enviado: 26 Abr 2008 19:54
por Maligno
Pablo César escreveu:A indicação que eu fiz é justamente para que os dados sejam do tamanho FIXO e ainda acho que essa substituição está correta e não tem NADA a ver com o tamanho da variável em que está sendo subtituida.
Mas isso não dá certo mesmo, Pablo. Apenas para exemplificar, na primeira linha da sua sugestão há uma chamada assim:
Código: Selecionar todos
TxtBoleto:=StrTran( TxtBoleto,"@codigo",STRZERO(1234,5,0) )
Aí já começa que o dado não é fixo, conforme você disse que deve ser. A troca disso vai deformar o gabarito. Não resta a menor dúvida disso. Faça o teste. Pra que você nem se dê ao trabalho, fiz este programa de teste, usando apenas a primeira linha da sua sugestão. Compile e veja você mesmo.
Código: Selecionar todos
cVar := "@codigo-------------------->"
?? cVar
?
cVar := StrTran(cVar,"@codigo",STRZERO(1234,5,0))
?? cVar
?
Ao rodá-lo você verá que vai acontecer exatamente o que eu disse: o "gabarito" será puxado dois caracteres para a esquerda, deformando-o.
Então, a regra para sua sugestão será: qualquer que seja o dado, de largura fixa ou não, se for esta largura diferente da largura da tag, o gabarito acabará deformado. Ou seja, tem sim TUDO a ver com o tamanho da tag.
Documento matriz (Gabarito)
Enviado: 26 Abr 2008 21:48
por Pablo César
Maligno escreveu:Faça o teste. Pra que você nem se dê ao trabalho, fiz este programa de teste, usando apenas a primeira linha da sua sugestão. Compile e veja você mesmo.
Agora sou eu que peço a você, melhor que palavras veja que o que eu disse está correto:
Código: Selecionar todos
/* Programa: TESTE.PRG */
#define CRLF CHR(13)+CHR(10)
PARAMETERS cNOME
CLS
IF cNOME=NIL
? "Falta parametro NOME."
? "Lembrando que se o nome contiver espacos, o parametro deve estar entre aspas."
? "Exemplo: TESTE "+CHR(34)+"Pablo Cesar Arrascaeta"+CHR(34)
?
QUIT
ENDIF
SET COLOR TO "GR+/N"
? "+-Codigo+ Modelo do formulario vazio"
? "| |"
? "+-------+"
?
? "+-Nome completo------------------------------------+-Valor---+"
? "| |R$ |"
? "+--------------------------------------------------+---------+"
?
SET COLOR TO "R+/N"
? "+-Codigo+ Modelo do formulario com as TAGS"
? "| @codigo | (Arquivo BOLETO.TMP)"
? "+-------+"
?
? "+-Nome completo------------------------------------+-Valor---+"
? "|@nome|R$ @valor|"
? "+--------------------------------------------------+---------+"
?
SET COLOR TO "BG+/N"
cVar:="+-Codigo+ Modelo do formulario prenchido"+CRLF
cVar:=cVar+"| @codigo | (Arquivo ARQGERAD.TXT)"+CRLF
cVar:=cVar+"+-------+"+CRLF
cVar:=cVar+CRLF
cVar:=cVar+"+-Nome completo------------------------------------+-Valor---+"+CRLF
cVar:=cvar+"|@nome|R$ @valor|"+CRLF
cVar:=cVar+"+--------------------------------------------------+---------+"+CRLF
cVar:=cVar+CRLF
cVar:= StrTran( cVar,"@codigo",STRZERO(1234,5,0) )
cVar:= StrTran( cVar,"@nome",PADR(cNOME,50) )
cVar:= StrTran( cVar,"@valor",TRANSFORM(123.56,"@E 999.99") )
? cVar
INKEY(0)
Compile este meu exemplo, Maligno e você entenderá o que eu disse. Este exemplo precisa de parametro o qual é passado pela linha de comando, coloque o meu nome completo e experimente com o seu nome completo ou outro qualquer também e verá que não afetará o LAYOUT do forumulário, sempre e quando o arquivo MATRIZ (neste caso BOLETO.TMP) sejam respeitados os espaçamento ENTRE os campos. Foi isso que eu disse. Compare as tres cores e entenderá. Mas por via das dúvidas... melhor que dizer é fazer, daí você entenderá o que eu disse.
Enviado: 26 Abr 2008 22:26
por Maligno
Ah, mas assim é diferente. Você modificou o lay-out original do gabarito que o nosso colega postou, de forma que o uso do StrTran() desse certo. E aí dá certo mesmo. Mas nunca daria certo com o gabarito original, conforme eu venho dizendo.
Não que sua sugestão (mudança de gabarito) não seja válida. Não é ruim. Mas dos dois gabarito, prefiro o original, que é mais intuitivo. Na eventualidade de precisar de uma modificação, fica bem fácil. Na sua sugestão já daria mais trabalho.
Enviado: 27 Abr 2008 10:55
por Toledo
Pablo, agora sim tá explicado... achei estranho você não estar concordando com as observações minhas e do Maligno de que do jeito que você estava fazendo não ia dar certo.
Abraços,
Enviado: 28 Abr 2008 09:00
por Pablo César
Maligno escreveu:Ah, mas assim é diferente. Você modificou o lay-out original do gabarito que o nosso colega postou
Maligno, eu mudei o gabarito para poder exemplificar melhor. Você e o Toledo, não tinham me entendido ao que eu me referia. Se você prestar atenção desde a minha segunda mensagem deste post, venho falando sobre o arquivo original (o BOLETO.TMP para este caso específico do colega).
Nessa questão de utilizar o StrTran(), o que na verdade teria que fazer é ELIMINAR a string que constitui o NOME da variável-TAG e INSERIR o conteúdo do campo correspondente a essa variável-TAG. E não SUBSTITUIR o NOME da variável-TAG
+ <os espaços dados para manter um LAYOUT> que na minha opinião e exemplo, não tem razão de ser. Pois no exemplo de cor vermelha que fiz, mostra claramente que os espaços OCUPADOS pelo campo do formulário DEVEM ser REMOVIDOS e sem considerar o tamanho da nomenclatura das varáveis-TAGs.
Enfim, mais uma forma de se fazer essa substituição de TAGs e o que ocorreu foi apenas uma má interpretação do meu pseudocódigo (se podemos chamar assim)...

) Embora eu também concorde contigo Maligno, eu ficaria com seu exemplo pois você está informando o LIN e COL de onde deve ser SOBRESCRITO tais campos. O que facilita para melhor entendimento do código-fonte.
Re: MEMOREAD & STRTRAN não estão Funcionando... Ajuda!
Enviado: 09 Jul 2008 02:26
por fladimir
Pessoal o Boleto.TXT (Arquivo q contém as TAG´s) fica dentro da pasta do sistema e pode ser alterado de acordo com a necessidade de cada cliente, ou seja, as vezes um utiliza um layout e outro utiliza outro layout para impressão, bom essa é minha idéia e meta... Desta forma como vou passar um tamanho fixo das variáveis q são pegos os contéudos de vários DBF´s e com certeza variam, sendo q tb variam os Layouts...
Bom diante disto pensei na hipótese de criar uma função q analise posterior a uma TAG qdo tiver um @ (Símbolo q uso para identificar minha TAG dentro do Layout do TXT) contar qtos espaços tem e aí definir a largura máxima do campo... Seria isto ? Caso sim, alguém já tem algum código sugestão q possa compartilhar?
...ou estou mais perdido q um cego e surdo em um tiroteio... (se bem q ele nem vai saber o q esta acontecendo)
:%
Grato.
Re: MEMOREAD & STRTRAN não estão Funcionando... Ajuda!
Enviado: 09 Jul 2008 17:24
por ANDRIL
Veja se esta função lhe serve, pois acho o jeito mais facil de fazer o que quer, porem, nao o melhor.
Código: Selecionar todos
* CLIPPER teste.prg
* RTLINK FI teste
*
* 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
*
*****************************************************************************
//--aqui sao os elementos que devem serem procurados no arquivo BOLETO.TXT
elemento:={"@codigo","@nome","@telefone"}
//--aqui o array que fornece os dados conforme a posicao ordinal do array acima
conteudo:={"12345","Anderson Vieira","2222-2222"}
//--le o arquivo boleto.txt
string=memoread("BOLETO.TXT",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
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,padr(conteudo[num_elemento],tamanhofinal,"+"))
endif
endif
num_elemento++
enddo
next
*num_elemento++
*enddo
//--grava o arquivo alterado em RETORNO.TMP
memowrit("RETORNO.TMP",string)
Espero que lhe ajude,
Ate+
Re: MEMOREAD & STRTRAN não estão Funcionando... Ajuda!
Enviado: 09 Jul 2008 18:16
por fladimir
Grato Andril pela sua atenção vou dar uma olhada e depois reporto aki... mas agradeço muito sua ajuda...
Sucesso!!! :{
Re: MEMOREAD & STRTRAN não estão Funcionando... Ajuda!
Enviado: 09 Jul 2008 19:37
por fladimir
Bom Andril e colegas do fórum como prometido vou postar com relação a idéia do Andril...
Num primeiro momento não olhei nada apenas compilei e linkei para ver o resultado, obviamente antes criei um Boleto.TXT de acordo com a orientação e não deu certo o arquivo gerado não efetou as trocas... depois analisando verifiquei q se eu mexo no layout, colocando as TAGs na ordem em q foram informadas na definição da Array ai funciona... Agora se movimento dentro do Layout as Tags de lugar já não funciona.
Grato colegas, caso alguém tenha outra idéia...
Re: MEMOREAD & STRTRAN não estão Funcionando... Ajuda!
Enviado: 09 Jul 2008 20:07
por ANDRIL
Fladimir, realmente quando postei ele estava analisando pela ordem do array. Depois coloquei o codigo acima atualizado, agora acho que funciona.
*OBS: quando editei o topico, nao apareceu em baixo EDITADO, o que será que fiz de errado?
Ate+
Re: MEMOREAD & STRTRAN não estão Funcionando... Ajuda!
Enviado: 09 Jul 2008 20:48
por fladimir
Andril deu certo, obrigado... agora só para deixar as mentes aguçadas eu vi uma vez um sistema q tem um layout de uma NF dentro de um arquivo texto e lá o cara definiu coisas do tipo exemplo:
Código: Selecionar todos
n01 - Razão Social
n02 - Endereço
() Condensado
[] Expandido
e depois exemplo, se estivesse descrito abaixo:
(n01 )
Iria imprimir, caso a razão social fosse Retificadora de Motores Estrela da seguinte maneira e negrito
Retificadora de Motor
Além de outras coisas interessantes... vou anexar o tal arquivo, pois achei muito interessante caso alguém queira de base para melhorar esta discussão do tópico...
Eu particularmente penso em fazer isso mais adiante, pois meu problema principal seria este q o Colega Andril juntamente com a ajuda dos demais colegas q participaram do tópico colaboraram e esta resolvido, mas essa idéia do arquivo ter tb dentro dele uma flexibilidade para poder definir a cada cliente tipo se vai negrito ou não, a largura, os posicionamentos e coisas do tipo q enriqueçam ainda mais é muito interessante.
Grato a tdos... Sucesso!!!
Re: MEMOREAD & STRTRAN não estão Funcionando... Ajuda!
Enviado: 10 Jul 2008 10:15
por ANDRIL
Fladimir que bom que te ajudou. Com relação a sua ideia, implementei algumas funcoes a mais no codigo abaixo:
Código: Selecionar todos
* CLIPPER teste.prg
* RTLINK FI teste
*
* 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
*****************************************************************************
//--aqui sao os elementos que devem serem procurados no arquivo BOLETO.TXT
elemento:={"@codigo","@nome","@telefone"}
elemento:={"@telefone","@nome","@codigo"}
//--aqui o array que fornece os dados conforme a posicao ordinal do array acima
conteudo:={"12345","Anderson Vieira","2222-2222"}
conteudo:={"2222-2222","Anderson Vieira","12345"}
//--le o arquivo boleto.txt
string=memoread("BOLETO.TXT",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 BOLETO.TXT
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
//--grava o arquivo alterado em RETORNO.TMP
memowrit("RETORNO.TMP",string)
Ate+,
Re: MEMOREAD & STRTRAN não estão Funcionando... Ajuda!
Enviado: 10 Jul 2008 10:32
por fladimir
Vlw Andril... obrigado...
:)Pos
MEMOREAD & STRTRAN não estão Funcionando...!
Enviado: 10 Jul 2008 16:48
por fladimir
Apaguei pois tinha postado novamente a mensagem inicial do tópico... obrigado colega Páblo pelo aviso... fui!!!
MEMOREAD & STRTRAN não estão Funcionando... <<Resolvido>>
Enviado: 14 Jul 2008 09:44
por Pablo César
fladimir escreveu:aki comigo não esta dando certo não sei onde estou errando
Ué ? Não entendí... Fladimir, você não tinha conseguido ? Segundo sua mensagem viewtopic.php?f=1&t=7919&start=15#p46723 ? Inclusive eu entrei neste tópico por acaso e notei que você tinha utilizado um quoting de você mesmo e removí para dar melhor sentido a sua ultima mensagem. Também note fladimir que no título da mensagem está como
<<Resolvido>>, no final quer dizer que você ainda está com alguma dificuldade ?. Se for, relate e exemplifique melhor o resultado do que estaria acontencendo para podermos te ajudar melhor.