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...

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

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