Página 1 de 1

ZEROS a esquerda

Enviado: 24 Mai 2007 14:21
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!

Enviado: 24 Mai 2007 14:58
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.

Enviado: 24 Mai 2007 15:32
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 

Enviado: 24 Mai 2007 17:36
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')

Enviado: 24 Mai 2007 18:23
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...

Enviado: 25 Mai 2007 09:23
por JLF
OBRIGADO AMIGOS!

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

Abraços!

Enviado: 25 Mai 2007 10:20
por Grings
Explique melhor, vc quer que: 999.999,99 seja transformado em 99999999 ou 00999999 ?

Enviado: 25 Mai 2007 10:23
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.

Enviado: 25 Mai 2007 15:44
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

Enviado: 25 Mai 2007 16:31
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.

Enviado: 25 Mai 2007 16:37
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.

Enviado: 25 Mai 2007 17:07
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.

Enviado: 29 Mai 2007 17:39
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

Enviado: 29 Mai 2007 17:54
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..

Enviado: 30 Mai 2007 08:58
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