MEMOREAD e STRTRAN não estão Funcionando...

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

MEMOREAD e STRTRAN não estão Funcionando...

Mensagem por fladimir »

.

Olá Pessoal, td bem, por favor analisem esse trecho de codigo q pode ser compilado e executado a parte para testarem, porque aki comigo não esta dando certo não sei onde estou errando

Código: Selecionar todos

Proc Main

   FileCopy("Boleto.TXT","Boleto.TMP")

   TxtBoleto := MemoRead("Boleto.TMP")

   StrTran(TxtBoleto,"@codigo","01234")
   StrTran(TxtBoleto,"@nome","Jose Carlos de Lima")
   StrTran(TxtBoleto,"@endereco","Rua Teste da Silva, 124")
   StrTran(TxtBoleto,"@bairro","Centro")
   StrTran(TxtBoleto,"@cidade","São Paulo")
   StrTran(TxtBoleto,"@estado","SP")
   StrTran(TxtBoleto,"@cep","11111-111")
   StrTran(TxtBoleto,"@telefone","11-2222-2222")
   StrTran(TxtBoleto,"@nasc","10/01/1970")
   StrTran(TxtBoleto,"@cpf","111.111.111-11")
   StrTran(TxtBoleto,"@rg","1.111.111 SSP/SP")
   StrTran(TxtBoleto,"@venda","000098")
   StrTran(TxtBoleto,"@data","19/04/2008")
   StrTran(TxtBoleto,"@venc","19/05/2008")
   StrTran(TxtBoleto,"@parcela","1/1")
   StrTran(TxtBoleto,"@valor","10,00")

   MemoWrit("ARQGERAD.TXT", TxtBoleto)

Return
Conteúdo do Arquivo BOLETO.TXT

Código: Selecionar todos

@codigo
@nome
@endereco
@bairro
@cidade
@estado
@cep
@telefone
@nasc
@cpf
@rg
@venda
@data
@venc
@parcela
@valor
O q desejo é gerar um arquivo ARQGERAD.TXT substituindo os textos acima descritos q estão no Arquivo Boleto.TXT, mas ao editar o Arquivo ARQGERAD.TXT ele não trocou nada ficou tipo uma Cópia do Boleto.TXT...


Não sei no que posso estar errando, já li o NG das funções acima e tb pesquisei no fórum, sei q devo estar passando desapercebido em algo, mas já estou nisso há um bom tempo, então por isso recorro aos nobres Gurus...

Agradeço desde já a tdos.... Sucesso!!!


:{

Ah estou utilizando o Clipper 5.2e e o Rtlink , mas tb testei com o Blinker
Editado pela última vez por fladimir em 07 Abr 2009 22:29, em um total de 3 vezes.
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

StrTran(TxtBoleto,"@codigo","01234")
A função StrTran transforma uma parte da string ("@codigo"), em outra coisa ("01234").

Experimente tirar as aspas.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Fladimir, altere o seu exemplo conforme segue:

Código: Selecionar todos

   TxtBoleto:=StrTran(TxtBoleto,"@codigo","01234") 
   TxtBoleto:=StrTran(TxtBoleto,"@nome","Jose Carlos de Lima") 
   TxtBoleto:=StrTran(TxtBoleto,"@endereco","Rua Teste da Silva, 124") 
   TxtBoleto:=StrTran(TxtBoleto,"@bairro","Centro") 
   TxtBoleto:=StrTran(TxtBoleto,"@cidade","São Paulo") 
   TxtBoleto:=StrTran(TxtBoleto,"@estado","SP") 
   TxtBoleto:=StrTran(TxtBoleto,"@cep","11111-111") 
   TxtBoleto:=StrTran(TxtBoleto,"@telefone","11-2222-2222") 
   TxtBoleto:=StrTran(TxtBoleto,"@nasc","10/01/1970") 
   TxtBoleto:=StrTran(TxtBoleto,"@cpf","111.111.111-11") 
   TxtBoleto:=StrTran(TxtBoleto,"@rg","1.111.111 SSP/SP") 
   TxtBoleto:=StrTran(TxtBoleto,"@venda","000098") 
   TxtBoleto:=StrTran(TxtBoleto,"@data","19/04/2008") 
   TxtBoleto:=StrTran(TxtBoleto,"@venc","19/05/2008") 
   TxtBoleto:=StrTran(TxtBoleto,"@parcela","1/1") 
   TxtBoleto:=StrTran(TxtBoleto,"@valor","10,00") 
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Mensagem por fladimir »

Toledo... deu certo, obrigado. Mas teve um efeito q não esperava, e não sei se pode ser solucionado... Dentro do arquivo texto por exemplo esta como abaixo...

Código: Selecionar todos

   @codigo
   @nome                                               @data                @data
   @valor                                                                   @valor
gostaria q o resulta fosse assim:

Código: Selecionar todos

   01234
   Jose Carlos da Silva                                25/04/2008           25/04/2008
   R$ 100,00                                                                R$ 100,00
tipo sem mexer na posição do arquivo texto, mas esta ficando assim...

Código: Selecionar todos

   01234
   Jose Carlos da Silva                  25/04/2008         25/04/2008
   R$ 100,00                                         R$ 100,00

...tirando da posição original, porque uso a posição de cada variável conforme o Layout do Boleto, mas dessa forma verifiquei q dependendo o tamanho do conteúdo da varíavel ele muda a posição das datas e do valor... Gostaria de permanecer fixo o início, tipo o da esquerda para direita em cada variável sem afetar outras q estiverem na mesma linha, será q tem jeito ? Alguém do fórum tem idéia ?


Grato a todos...
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 »

A forma mais fácil de resolver isso é fixando o tamanho dos dados que serão inseridos, depois de ajustar as posições das tags conforme esses tamanhos. Senão o efeito será esse mesmo.

Mas há outras formas de fazer isso. Só que esse esquema de tags teria de ser muito alterado, talvez a custa de StrTran().

Particularmente, do pouco que conheço sobre sua necessidade, eu não usaria tag nenhuma. Já que o arquivo texto é gerado pelo programa, eu geraria o arquivo texto de forma mais convencional.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Fladimir, você terá que fazer o que o Maligno falou mesmo... exemplo:

Código: Selecionar todos

   TxtBoleto:=StrTran(TxtBoleto,"@codigo","01234") 
   TxtBoleto:=StrTran(TxtBoleto,"@nome"+spac(47),left("Jose Carlos de Lima"+spac(52),52))
   TxtBoleto:=StrTran(TxtBoleto,"@endereco","Rua Teste da Silva, 124") 
   TxtBoleto:=StrTran(TxtBoleto,"@bairro","Centro") 
   TxtBoleto:=StrTran(TxtBoleto,"@cidade","São Paulo") 
   TxtBoleto:=StrTran(TxtBoleto,"@estado","SP") 
   TxtBoleto:=StrTran(TxtBoleto,"@cep","11111-111") 
   TxtBoleto:=StrTran(TxtBoleto,"@telefone","11-2222-2222") 
   TxtBoleto:=StrTran(TxtBoleto,"@nasc","10/01/1970") 
   TxtBoleto:=StrTran(TxtBoleto,"@cpf","111.111.111-11") 
   TxtBoleto:=StrTran(TxtBoleto,"@rg","1.111.111 SSP/SP") 
   TxtBoleto:=StrTran(TxtBoleto,"@venda","000098") 
  TxtBoleto:=StrTran(TxtBoleto,"@data"+spac(16),left("19/04/2008"+spac(21),21)) 
   TxtBoleto:=StrTran(TxtBoleto,"@venc","19/05/2008") 
   TxtBoleto:=StrTran(TxtBoleto,"@parcela","1/1") 
   TxtBoleto:=StrTran(TxtBoleto,"@valor"+spac(67),left("10,00"+spac(73),73))
Ficou meio complicado, então vou pegar uma linha como exemplo para você entender o que eu fiz....

"@valor"+spac(67)
@valor = tem 6 letras, somando com spac(67) dá um total de 73 letras (espaços).

left("10,00"+spac(73),73)
Estou truncando o tamanho do valor também em 73 letras.

Só que tem um pequeno problema, no seu arquivo tem tags repetidas (@data e @valor), então as tags que estão no final da linha não serão alteradas, pois o StrTran() vai procurar tags com uma certa quantidade de espaços no final. Neste caso, você teria que usar novamente o StrTran() para procurar estas tags sem os espaços.

Exemplo:

Código: Selecionar todos

TxtBoleto:=StrTran(TxtBoleto,"@valor"+spac(67),left("10,00"+spac(73),73))
TxtBoleto:=StrTran(TxtBoleto,"@valor","10,00")
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
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á

Mensagem por Pablo César »

Como disse o Maligno: é só passar o conteúdo dessa variaveis com tamanho FIXO. O exemplo do Toledo não deixava de estar certo mas eu faria baseado no seu primeiro exemplo, assim:

Código: Selecionar todos

   TxtBoleto:=StrTran( TxtBoleto,"@codigo",STRZERO(1234,5,0) )
   TxtBoleto:=StrTran( TxtBoleto,"@nome",PADR("Jose Carlos de Lima",40) ) 
   TxtBoleto:=StrTran( TxtBoleto,"@endereco",PADR("Rua Teste da Silva, 124",40) ) 
   TxtBoleto:=StrTran( TxtBoleto,"@bairro",PADR("Centro",30) ) 
   TxtBoleto:=StrTran( TxtBoleto,"@cidade",PADR("São Paulo",35) ) 
   TxtBoleto:=StrTran( TxtBoleto,"@estado","SP" ) 
   TxtBoleto:=StrTran( TxtBoleto,"@cep",PADL("11111-111",9) ) 
   TxtBoleto:=StrTran( TxtBoleto,"@telefone",PADL("11-2222-2222",12) ) 
   TxtBoleto:=StrTran( TxtBoleto,"@nasc","10/01/1970") 
   TxtBoleto:=StrTran( TxtBoleto,"@cpf","111.111.111-11") 
   TxtBoleto:=StrTran( TxtBoleto,"@rg",PADR("1.111.111 SSP/SP",15) ) 
   TxtBoleto:=StrTran( TxtBoleto,"@venda",STRZERO(98,6,0) ) 
   TxtBoleto:=StrTran( TxtBoleto,"@data","19/04/2008") 
   TxtBoleto:=StrTran( TxtBoleto,"@venc","19/05/2008") 
   TxtBoleto:=StrTran( TxtBoleto,"@parcela","1/1") 
   TxtBoleto:=StrTran( TxtBoleto,"@valor",TRANSFORM ("@E 999,999.99") )
Os tamanhos de cada variável você irá ajustar conforme sua necessidade. Quando você troca os valores strings deverão ter o tamanho que sempre seja substituídos em forma FIXA, desta forma não irá NUNCA desposicionar quando forem substituídas, mas os espaços no arquivo original deverão obedecer rigorosamente o tamanho. Eu ja tinha pensado nessa questão, mas pensei que não iria ser necessário ser mencionada.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
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 »

Acho que esse código tá ficando muito enrolado. Se fosse eu a fazer, faria uma função especial para traduzir essas tags, mantendo uma base de ajuste dos dados, conforme sua largura. Não sei qual é a origem dos dados; se vêm de texto ou DBF. Mas seja de onde vier, vamos supor que eu possa montar uma matriz de dados mais ou menos assim:

Código: Selecionar todos

aDat := {{"@codigo"  ,"123"                   },;
         {"@nome"    ,"Fladimir Lula da Silva"},;
         {"@ENDERECO",                        },;
         {"@bairro"  ,""                      },;
         {"@cidade"  ,"Cuiaba"                },;
         {"@ESTADO"  ,"MT"                    },;
         {"@cep"     ,"99999-123"             },;
         {"@venda"   ,DtoC(Date())            },;
         {"@VALOR"   ,"R$1000,00"             } ;
         }
Note algumas particularidades: as tags podem estar em caixa alta ou baixa, nem todos as tags precisam existir, todos os dados são strings e os que existem não precisam conter coisa alguma no segundo elemento. Se um campo não contém dado algum, o vazio pode ser representado por uma string nula ou mesmo nil. A função tradutora vai conseguir tratar isso.

Supondo agora que a string com o gabarito é cGabarito; aquela que contém apenas as tags utilizadas, já nas posições corretas de preenchimento, poderíamos chamar a função tradutora:

Código: Selecionar todos

cResult := TraduzTag(cGabarito,aDat)
A função tradutora interpreta e traduz as tags, conforme elas existirem em aDat.

Código: Selecionar todos

01 function TraduzTag(cTemplate,aSource)
02 local i
03 local d
04 local s
05 local aTags := {{"@codigo"  , 5},;
06                 {"@nome"    ,35},;
07                 {"@endereco",35},;
08                 {"@bairro"  ,30},;
09                 {"@cidade"  ,25},;
10                 {"@estado"  , 2},;
11                 {"@cep"     , 9},;
12                 {"@telefone", 9},;
13                 {"@nasc"    ,10},;
14                 {"@cpf"     ,11},;
15                 {"@rg"      ,18},;
16                 {"@venda"   ,10},;
17                 {"@data"    ,10},;
18                 {"@venc"    ,10},;
19                 {"@parcela" , 2},;
20                 {"@valor"   ,12} ;
21                 }
22 
23 for i := 1 to Len(aTags)
24     if (d := AScan(aSource,{|a|Lower(a[1]) == aTags[i][1] .and. a[2] != nil .and. !Empty(a[2])})) > 0
25        while (s := At(aTags[i][1],cTemplate)) > 0
26           cTemplate := Stuff(cTemplate,s,Len(aTags[i][1]),Space(Len(aTags[i][1])))
27           cTemplate := Stuff(cTemplate,s,    aTags[i][2] ,PadR(aSource[d][2],aTags[i][2]))
28        end
29     end
30 next
31 return cTemplate
A função tradutora, como se pode observar, tem todos os tamanhos dos campos. Na linha 26 eu tomei o cuidado de limpar a string da tag antes de traduzir. Isso porque se o tamanho do dado fonte for menor que o tamanho da tag, a tradução resultará em "lixo" ao final da string.

Mas ao final, tem-se cResult com o texto perfeitamente traduzido e pronto pra impressão. sugiro ao colega que analise este exemplo e, se achá-lo aproveitável, adapte-o à sua realidade. Mas como eu disse antes: há várias formas de fazer isso. Esse modo é apenas uma sugestão.

Detalhe: só escrevi. Não testei. Pode conter algum bug.

Correção 1: troquei o nome de uma variável.
Correção 2: troquei o IF da linha 25 por WHILE.
Editado pela última vez por Maligno em 26 Abr 2008 13:55, em um total de 2 vezes.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Pablo, desta maneira vai continuar com o mesmo problema que o Fladimir exemplificou em sua mensagem, todo o espaço em branco que está entre @nome e @data vai continuar no arquivo.

O que eu fiz foi o seguinte: se do início de @nome até @data tem 52 caracteres (espaços), então a função StrTran() terá que procurar tags e trocar por variáveis com o mesmo número de caracteres. Assim a estrutura do arquivo não será modificada, e é isto que o Fladimir quer.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
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á

Mensagem por Pablo César »

Toledo escreveu:Pablo, desta maneira vai continuar com o mesmo problema que o Fladimir exemplificou em sua mensagem, todo o espaço em branco que está entre @nome e @data vai continuar no arquivo.
Desculpe, mas ainda não estou vendo que esse meu exemplo possa continuar. Pois veja bem, os espaços em brancos irão contar também portanto mantendo a possição FIXA no boleto, isto é, não vai desposicionar no arquivo após substituição da TAG. Isto se o arquivo TXT original estive no espaçamento certo, tendo em conta o tamanho das variáveis inclusive. Mas o que eu exemplifiquei ainda o vejo como correto.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
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 »

Pablo,
Não li tudo, mas notei que a sua sugestão tem dois problemas.

Primeiro: note que o número de código exemplo que você colocou terá 5 caracteres, mas o texto substituído (a tag) tem 7 caracteres. Aí você vai puxar todo o resto 2 caracteres pra esquerda.
O exemplo do Toledo tem o mesmo problema.

Segundo: com a tag "@nome" você faz algo parecido, só que invertido. A tag tem 5 caracteres e será substituída por um texto de 40 caracteres, o que vai "empurrar" tudo 35 caracteres pra direita.

Acho que o exemplo do Toledo, mesmo estando mais certo, ainda não é ideal, já que ele não é dinâmico. Foi feito com dados fixos e isso não resolve quando se tem uma fonte variável de dados.
O ideal, a meu ver, é mais ou menos do jeito que exemplifiquei: montar uma estrutura de dados fonte parcial ou integral e apenas passá-la para uma função tradutora que faz as devidas correções e ajustes, a fim de manter a estrutura do gabarito.
Editado pela última vez por Maligno em 26 Abr 2008 13:45, em um total de 1 vez.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Mensagem por Toledo »

Pablo, veja este exemplo:

Código: Selecionar todos

TxtBoleto:=StrTran( TxtBoleto,"@nome",PADR("Jose Carlos de Lima",40) ) 
A função StrTran() vai procurar por "@nome", que contem apenas 5 letras, e trocar por PADR("Jose Carlos de Lima",40), que contem 40 letras, então nesta linha do arquivo vai aumentar 35 letras (espaços), mudando a posição da tag que estiver na frente e na mesma linha de @nome.

Maligno, fantástico o seu exemplo, parabéns... mas lembre-se que a função Stuff() só altera a primeira ocorrência dentro da string. Observe que no exemplo do Fladimir existe tags com mais de um ocorrência, então o certo seria utilizar a função StrTran() mesmo.

Obs.: a variável "c" que você está usando como segundo parâmetro na função Stuff() não existe, acho que ali seria "s".

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
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 »

Toledo escreveu:Maligno, fantástico o seu exemplo, parabéns... mas lembre-se que a função Stuff() só altera a primeira ocorrência dentro da string. Observe que no exemplo do Fladimir existe tags com mais de um ocorrência, então o certo seria utilizar a função StrTran() mesmo.
Rapaz! Agora que vi isso. :)))
Mas ainda não precisa de StrTran(). É só usar trocar o IF por WHILE. Já alterei o código do meu exemplo. Veja lá.
Obs.: a variável "c" que você está usando como segundo parâmetro na função Stuff() não existe, acho que ali seria "s".
Isso mesmo. Já tinha corrigido quando você postou essa mensagem.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Mensagem por fladimir »

Pessoal agradeço a colaboração de todos, vou imprimir e analisar tudo isto e verificar o q acredito ser o melhor aki para o meu caso, mas realmente agradeço a todos, agora fiquei surpreso com a colaboração dos colegas tive mais do q esperava, agora vou ter que Assimilar tudo e ver o q encaixa melhor aki... Vlw

:)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á

Mensagem por Pablo César »

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. Vou utilizar o mesmo exemplo de resultado-final do Fladimir para eu poder exemplificar:

Código: Selecionar todos

   @codigo
   @nome                                               @data                @data
   @valor                                                                   @valor
E o resultado no arquivo ARQGERAD.TXT dado pelo Fladimir é assim:

Código: Selecionar todos

   01234
   Jose Carlos da Silva                                25/04/2008           25/04/2008
   R$ 100,00                                                                R$ 100,00
O importante como eu ja disse nas minhas ultimas duas mensagens, é que DEVE ser considerado o tamanho do conteúdo da variável e não a NOMENCLATURA da variável da qual estaria gravada no arquivo Boleto.TMP (citando exemplo) e desta forma contando quantos espaços tem entre os campos como resultado do arquivo ARQGERAD.TXT. Então eu contei todos os espaços que o Fladimir postou e eis os espaçamento entre variáveis:

- Na primeira linha do arquivo Boleto.TMP, o primeiro campo "@codigo" está na terceira posição
- Logo vem a variável-TAG "@código" que possue 7 caracteres, mas que não interessa isso na minha substituição e sim o tamanho-limite que tem para ser escrito no formulario-boleto que neste caso é tamanho 5.
- Na segunda linha vem um espaçamento de 3 caracteres antes da variável-Tag "@nome" o qual parece possuir 50 caracteres onde iria o nome completo.
- Depois vem dois espaços-caracter antes da outra variável-Tag "@data"
- Logo vem o conteúdo dessa data o que ocuparia o tamanho de 10 caracteres (este tamanho é fixo caso utilize-se o CENTURY ON).
- Logo vem um espaçamento de 11 caracteres antes da outra variável-Tag "@data".
- Depois viria o conteúdo dessa data o que ocuparia o tamanho de 10 caracteres.
- Na terceira linha, vem 3 espaços antes da string "R$ "
- A seguir vem a string "R$ " ocupando 3 caracteres e enseguida o conteúdo da variável-TAG "@valor" que ocupa o tamanho de 6 caracteres ( pode utilizar o TRANSFORM(VALOR,"@E 999.99") )
- Logo após vem um espaçamento de 64 caracteres para separar antes da segunda string que define a moeda "R$ ".
- Coloca-se a string "R$ " que ocupa 3 caracteres e enseguida o conteúdo da ultima variável-TAG "@valor" que ocupa tambem o tamanho de 6 caracteres.

Agora se concatenamos cada LINHA para gravar o arquivo Boleto.TMP (contendo as variáveis), deverá ficar assim:

Código: Selecionar todos

SET ALTERNATE TO Boleto.TMP
SET ALTERNATE ON
? SPACE(3)+"@codigo"
? SPACE(3)+"@nome"+SPACE(2)+"@data"+SPACE(11)+"@data"
? SPACE(3)+"R$ "+"@valor"+SPACE(64)+"R$ "+"@valor"
SET ALTERNATE OFF
SET ALTERNATE TO
Portanto o arquivo Boleto.TMP irá ficar com o seguinte FORMATO:

Código: Selecionar todos

   @codigo
   @nome @data           @data
   R$ @valor                                                                R$ @valor
Agora veja que na minha mensagem anterior estou substituindo a string "@codigo" por STRZERO(1234,5,0), portanto a string "@codigo" deixará de existir sendo substituída por outra string "01234".
Ja na substituição do "@nome" indiquei PADR("Jose Carlos de Lima",40) o tamanho 40 foi um chute, mas se fizermos conforme foi dimensionado acima, teremos que fazer PADR("Jose Carlos de Lima",50), isso é de menos. E assim por diante. Portanto ainda acredito que o importante é o CORRETO posicionamento das variáveis no arquivo Boleto.TMP sem necessidade alguma de contar o tamanho da NOMENCLATURA de cada variável-TAG, certo ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder