ZEROS a esquerda

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
JLF
Usuário Nível 2
Usuário Nível 2
Mensagens: 78
Registrado em: 21 Jul 2005 12:52
Localização: Sao Paulo

ZEROS a esquerda

Mensagem por JLF »

Amigos,
Depois de um tempo longe do fórum e claro longe da programação, voltei

O que estou precisando é o seguinte, vou gerar um arquivo TXT para importação em um programa e estou fazendo o programa que vai ser imputada as informações e depois vou gerar o TXT.

Neste TXT os campos numéricos tem que serem preenchidos sem . ou , e com zeros a esquerda.

Pensei primeiramente em criar o DBF como numerico sem casas decimais, mas que na tela de entrada o usuário consegui-se visualizar no formato @E 999.999,99.

Claro que não deu certo.. :(Neg ... esta indo pro DBF sem os centavos e muito menos com os zeros a esquerda.

Tem como fazer o acerto já no imput ou é melhor tratar na hora da geração do TXT ??

Abraços!
JLF - relembrando bons tempos
Clipper 5.3 - Blinker 7
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Não sei se tem uma mascara para isso, mas tente:

<campo> := strtran(transform(10.59, '@E 99999.99'), ' ', '0')

O campo no DBF deve ser caracter.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

JLF,
Pode deixar, no DBF, o campo como numérico e com as decimais.
A função a seguir:
- multiplica o valor do campo por 100, aí as 2 casas decimais "somem"
- usa a função STRZERO() para completar com zeros à esquerda

Código: Selecionar todos

nCampo=1234.56 // numérico
?qqnome(nCampo,10) -> 0000123456

function qqnome(numero,tam)
novo=strzero(numero*100,tam,0)
retu novo

As "máscaras" só formatam a apresentação, não alteram o conteúdo do campo ou variável. Exemplos:

Código: Selecionar todos

numero=1234.56 
@10,10 say tran(numero,"@E 999,999.99") -> 1.234,56 
@10,10 say tran(numero,"@ 999,999.99") -> 1,234.56 
@10,10 say strzero(numero*100,10,0) -> 0000123456 

cnpj=11222333444455 // caracter, tamanho 14 
@10,10 say tran(cnpj,"@R 99.999.999/9999-99") -> 11.222.333/4444-55 

minuscula="abcdef" 
@10,10 say tran(minuscula,"@!") -> "ABCDEF" 

set date brit 
set cent on 
data=ctod("24/05/2007") 
@10,10 say data -> 24/05/2007 
set date amer 
@10,10 say data -> 05/24/2007 
set cent off 
@10,10 say data -> 05/24/07 
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Desculpe a nossa falha...

No DBF, o campo deve ser numérico.
Quando for gerar o arquivo texto, vc deve usar o conjunto que eu postei.

? strtran(transform(<campo numerico>, '@E 99999.99'), ' ', '0')
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

GVC,
No seu exemplo, permanece o "." dos centavos, o que o JLF não quer...
... os campos numéricos tem que serem preenchidos sem . ou , e com...
Avatar do usuário
JLF
Usuário Nível 2
Usuário Nível 2
Mensagens: 78
Registrado em: 21 Jul 2005 12:52
Localização: Sao Paulo

Mensagem por JLF »

OBRIGADO AMIGOS!

Vou testar agora e ja volto para avisar se deu tudo certo...

Abraços!
JLF - relembrando bons tempos
Clipper 5.3 - Blinker 7
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Explique melhor, vc quer que: 999.999,99 seja transformado em 99999999 ou 00999999 ?
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Desculpe. Falha minha. Vc esta certo, Eolo.
Eu não havia lido corretamente a postagem do amigo JLF.
Eu postei para trocar o . pela , e colocar zero a direita.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
JLF
Usuário Nível 2
Usuário Nível 2
Mensagens: 78
Registrado em: 21 Jul 2005 12:52
Localização: Sao Paulo

Mensagem por JLF »

-:]

Eolo, funcionou perfeitamente...Obrigado.

Grings, o que foi feito é o seguinte, tendo o campo valor(suponhamos tamanho 10 com 2 decimais) de 100,23 necessitava gerar ele para TXT no tamanho de 15 com zeros a esquerda, ou seja, tinha que ficar assim: 000000000010023.

A solução do Eolo foi melhor, o dado entra normal e tratei na hora de gerar o TXT.

Agora só estou tendo uma dificuldade na criação do arquivo TXT, é que devido ao padrão do programa que vai importar os dados do TXT o dito arquivo não tem um nome fixo e sim uma variavel OBRIGATÓRIA, em vez dele ser arquivo.TXT ele tem que ser arquivo.??

Após o (ponto) vem o mês a que se refere, até ai beleza criei uma variavel que le a data e pega o mes, fiz o teste em tela e carregou certo, porem na hora de gerar o arquivo não esta indo..segue o que estou fazendo:

vMes :=SUBSTR(C06,4,2)
@ 12,12 say vMes // aqui visualizei e esta certo
vEmp :="FI004004." // aqui o nome fixo

private hArquivo,;
arq :=STUFF(vEmp,9,0,vMes)
hArquivo := fCreate(arq,0)

Se puderem dar uma mão...
:-o
JLF - relembrando bons tempos
Clipper 5.3 - Blinker 7
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

JLF,

Se vc precisa só o MÊS com 2 dígitos ("01... 02... até 12"), faça o seguinte:

?HOJE=date() -> 24/05/2007
?arq="FI004004."+strzero(month(HOJE),2,0) -> "FI004004.05"
hArquivo := fCreate(arq,0)
etc.

?DATA=ctod("30/06/2007") -> 30/06/2007
?arq="FI004004."+strzero(month(DATA),2,0) -> "FI004004.06"
hArquivo := fCreate(arq,0)
etc.
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

JLF, usar as funções de baixo nível é trabalhoso, é mais fácil vc direcionar o relatório para um arquivo ao invés da impresora, faça assim:

Set Printer On
Set Device To Printer
Set Printer To <nome do arquivo que vc quer criar>


Gere seu relatório com se fosse enviar para a impressora ...
@ x,y Say ......

Set Printer To
Set Printer Off
Set Device To Screen

Pronto, foi gerado o arquivo que vc quer.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

JLF,

A sugestão do Grings é boa, vale usar!

Só precisa confirmar a quebra de linha com o uso do "@x,y say": ver se o que é adicionado ao final de cada linha - tipo chr(10) e/ou chr(13) - é exatamente o que o destinatário do arquivo exige.
Avatar do usuário
JLF
Usuário Nível 2
Usuário Nível 2
Mensagens: 78
Registrado em: 21 Jul 2005 12:52
Localização: Sao Paulo

Mensagem por JLF »

Amigos, Achei o problema na criação do nome do arquivo...super simples...o erro estava na posição inicial em vez de 9 o correto é 10, esqueci de contar o "ponto"...rsss
private hArquivo,;
arq :=STUFF(vEmp,9,0,vMes) arq :=STUFF(vEmp,10,0,vMes)
hArquivo := fCreate(arq,0)


Usei a rotina do Grings, mas não foi nada para o arquivo ele ficou VAZIO...

Onde estou errando? to compilando a rotina isoladamente com
clipper geratxt /n
blinker fi geratxt

Segue todo o código...se puderem me ajudar agradeço muito...

FUNCTION GeraTxt()
USE impcont
**************************************************************
* Cria o arquivo em formato TXT
*

vMes :=SUBSTR(C06,4,2)
vEmp :="FI004004."

private hArquivo,;
arq :=STUFF(vEmp,10,0,vMes)
hArquivo := fCreate(arq,0)
If hArquivo = -1
Alert('Erro na criacao do arquivo')
Return NIL
Endif

SET PRINT ON
SET DEVICE TO PRINTER
SET PRINT TO &hArquivo

Go TOP
* --- Inicio da pagina
cLinha := 1
WHILE !EOF()

* --- Linhas de detalhe do relatorio

@ cLinha,001 SAY c01
@ cLinha,006 SAY c02
@ cLinha,024 SAY c03
@ cLinha,042 SAY c04
@ cLinha,047 SAY strzero(c05*100,12,0)
@ cLinha,059 SAY c06
@ cLinha,069 SAY c07
@ cLinha,075 SAY c08
@ cLinha,181 SAY c09
@ cLinha,216 SAY c10
@ cLinha,218 SAY c11
@ cLinha,238 SAY c12
@ cLinha,258 SAY c13
@ cLinha,278 SAY strzero(c14*100,15,0)
@ cLinha,293 SAY c15
@ cLinha,313 SAY strzero(c16*100,15,0)
cLinha = cLinha + 1
SKIP

* ----- final

ENDDO

SET PRINTER TO
SET PRINT OFF
SET DEVICE TO SCREEN
RETURN NIL


:-o
JLF - relembrando bons tempos
Clipper 5.3 - Blinker 7
Dércio_Luiz_Zanatta
Usuário Nível 3
Usuário Nível 3
Mensagens: 153
Registrado em: 11 Jan 2006 15:37
Localização: Ibirubá - RS

Mensagem por Dércio_Luiz_Zanatta »

Amiginho..
SET DEVICE TO "nome do arquivo Texto"

Vc está passando o número do Handle obtido no FCreate..
Vc não precisa fazer o Fcreate, o arquivo será criado automaticamente..

é só colocar
SET DEVICE TO &ARQ ao invés de SET DEVICE TO HARQUIVO !!

Um abrãço..
Avatar do usuário
JLF
Usuário Nível 2
Usuário Nível 2
Mensagens: 78
Registrado em: 21 Jul 2005 12:52
Localização: Sao Paulo

Mensagem por JLF »

Valeu Dércio...Que falha a minha...como iria gerar o arquivo colocando o nome errado da variavel #-)

Valeu amigos... agora é só gerar a codificação completa e mandar ver nos testes... isso que da ficar muito tempo parado...

Abraços! :)Pos
JLF - relembrando bons tempos
Clipper 5.3 - Blinker 7
Responder