Como transformar um N° inteiro em decimal

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Gilberto M Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 230
Registrado em: 13 Mar 2007 18:00
Localização: Natal-RN / Parelhas(RN) / Natal(RN)
Contato:

Como transformar um N° inteiro em decimal

Mensagem por Gilberto M Silva »

Colegas

Estou tentando pegar um n° estraido de um string e transforma-lo em um n° decimal.
Ex:
x:=2010200000296
p:=substr(x,8,5)
o n° achado é pra ficar 000,29 ou 0,29
como faço pra que fique assim???

obg.
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
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 função SubStr() apenas separa uma parte da string, que continua sendo string. Como a string representa um número inteiro, você deverá convertê-lo para numérico e depois dividí-lo por um múltiplo de 10 para inserir a vírgula (ou ponto) decimal na posição desejada. No seu caso, sendo p sua sub-string "00029", a expressãoVal(p)/100 lhe dará o valor numérico desejado: 0,29.
[]'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
Gilberto M Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 230
Registrado em: 13 Mar 2007 18:00
Localização: Natal-RN / Parelhas(RN) / Natal(RN)
Contato:

Mensagem por Gilberto M Silva »

Valeu :|<
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
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á

Re: Como transformar um N° inteiro em decimal

Mensagem por Pablo César »

Gilberto M Silva escreveu:pegar um n° estraido de um string e transforma-lo em um n° decimal.
Ex:
x:=2010200000296
p:=substr(x,8,5)
o n° achado é pra ficar 000,29 ou 0,29
Tem outra forma também, se seu decimal for SEMPRE com posição FIXA (é claro, impresindível) eu faria assim:

x:=2010200000296
p:=VAL( substr(x,8,3)+"."+substr(x,11,2) )

Por quê usei o "." (ponto) e não a vírgula. Simplesmente porque o tratamento de NÚMEROS o Clipper faz ao estilo americano, onde o ponto é vírgula para nós (decimais) e onde são vírgulas para os americanos para nós são pontos (milhares). Daí pra frente você faz o que quiser com o número, que ora pode ser transformado em string novamente:

? "Valor -> "+ALLTRIM(TRANSFORM(p,"@E 999.99"))+" <-"
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.
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Como disse o Pablo, se o número de decimais for fixo, dois por exemplo:

? cNumero:='100000000'
? cNumero:= Stuff(cNumero,Len(cNumero)-1,0,'.')
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Melhorando o código:

Cls
cNumero:='100000000'
? Converte(cNumero,1)
? Converte(cNumero,2)
? Converte(cNumero,3)

Static Function Converte(cNumero,nDecimal)
Return(Val(cNumero:=Stuff(cNumero,Len(cNumero)-nDecimal,0,'.')))
Avatar do usuário
Gilberto M Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 230
Registrado em: 13 Mar 2007 18:00
Localização: Natal-RN / Parelhas(RN) / Natal(RN)
Contato:

Mensagem por Gilberto M Silva »

Companheiros, valeu muito as dicas, usei a do Maligno, pois resolveu, é pra tratar um código de barras de balança. O n° "2 010200 000296" sendo que: 2 010200= 2 é o dígito verificador; 010200= é o código do produto e 000296= é o preço registrado na balança, na prática não precisa usar o ultimo dígito, então cadastrei o código no sistema, quando o caixa passa o produto no leitor, o sistema checa o produto pega o preço do c.de barras com o preço do produto e calcula a quantidade e joga para o cupom fiscal, o ex: do Maligno encaixou 1ª. :))
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho,

Qual balança voce esta usando?

É possivel voce postar o trecho de codigo em que voce le/pega esta informação para nós?

Valeu.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Gilberto M Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 230
Registrado em: 13 Mar 2007 18:00
Localização: Natal-RN / Parelhas(RN) / Natal(RN)
Contato:

Mensagem por Gilberto M Silva »

Filizola
é que cada vez que se pesa um item ela gera um código de barras diferente onde os cinco ultimos digitos é o valor da pesagem. Então eu fiz assim:


SFIR:="2010200 000519"
FIR := SUBSTR(SFIR,1,5)
SELE A (arq.onde estao os dados dos produtos"
SEEK FIR
PREUNI := 0
IF CNCLAMAT <> "001" (classe dos produtos que são pesados na balança)
SEEK SFIR
SPRECO:= PRECO
ELSE
SPRECO:= PRECO
PREUNI:= SUBSTR(SFIR,8,5)
PREUNI:= VAL(PREUNI)/100
BAIXA := PREUNI/SPRECO
ENDIF
@ 07,08 CLEAR TO 07,23
@ 07,10 SAY SFIR
@ 07,28 SAY BAIXA PICT "@R 9999.999"
@ 09,03 SAY CCNOMMAT
@ 11,11 SAY CNANTQTD PICT "@E 999,999.999"
@ 13,17 SAY DATE()
DO WHILE .T.
IF RLOCK()
@ 15,18 GET PRECO PICT "@E 999,999.99"
INKEY(1)
READ
UNLOCK
EXIT
ENDIF
ENDDO
IF PREUNI <> 0 (se preço for redigitado, calcula quantidade vendida)
BAIXA := PREUNI/PRECO
@ 07,28 SAY BAIXA PICT "@R 9999.999"
ENDIF

Essa foi a forma que achei para para funcionar sem problemas, e está funcionando blz.
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
Avatar do usuário
Gilberto M Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 230
Registrado em: 13 Mar 2007 18:00
Localização: Natal-RN / Parelhas(RN) / Natal(RN)
Contato:

Mensagem por Gilberto M Silva »

Há, a balança não está on line com o sistema, os item pesados são pre cadastrados no sistema, por isso fiz assim.
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
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 »

Eu estou montando um sistema que usa balanças TOLEDO e ECFs Bematech térmicas, e tem um pepino: Arredondamento (balança) versus Truncamento (ECF) de valores (na Bematech matricial não há problema).


Exemplo: código 1663. Banana Caturra KG, R$0,89 por Kg (informações previamente carregadas na balança e no PDV).

Coloquei 696 gramas na balança e ela fez o seguinte:
. calculou 0,696g x R$0,89 = R$0,61944
. arredondou o resultado para R$0,62.
. imprimiu a etiqueta com código 1663, valor R$0,62.
. (código de barras: 2 016630 00062 2)

No PDV, como o código de barras da etiqueta só traz o código de produto e o valor final, é feito o seguinte para poder completar as informações do cupom fiscal:
. procura o código 1663 na sua lista de produtos;
. obtém o preço por Kg (R$0,89) e o nome do produto.
. para obter o peso, faz a conta inversa:
R$0,62 / R$0,89 = 0,69662921..
. como não aceita arredondamento, trunca este valor para 0,696.
. em seguida, faz 0,696 x R$0,89 = 0,61944 e trunca para R$0,61.
. imprime 0,696g x R$,89 = R$0,61 no cupom fiscal...

Tá feita a encrenca: R$0,62 na etiqueta contra R$0,61 no cupom.

Outro problema é o peso para baixa de estoque: neste exemplo, o peso foi o mesmo nas duas pontas - 696 gramas, mas foi coincidência. Certo que eventuais diferenças seriam pequenas, mas acho que deveria haver algum tratamento...

Mais um: cargas passadas às balanças e aos PDVs DURANTE o expediente. Exemplo: o cliente passa na balança às 10:00hs. e pega a etiqueta conforme citado acima. Às 10:05hs., é atualizada a tabela de preços (a banana passa a R$1,50/kg). Às 10:10hs., o cliente passa a etiqueta (original) no caixa e o PDV faz o cálculo com o novo preço:
. R$0,62 / R$1,50 (novo preço) = 0,4133333... (NOVO PESO!)
. valor truncado para 0,413g
. 0,413g x R$1,50 = R$0,6195
. valor truncado para R$0,61

O cliente vai pagar o mesmo valor, mas o estoque vai ser baixado em 413 e não em 696 gramas...


Bem, uma saída talvez seja fazer a balança imprimir o código de barras com o PESO ao invés do PREÇO. Mas pode fazer isso, dar ao cliente uma etiqueta sem preço?
Avatar do usuário
Gilberto M Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 230
Registrado em: 13 Mar 2007 18:00
Localização: Natal-RN / Parelhas(RN) / Natal(RN)
Contato:

Mensagem por Gilberto M Silva »

O cliente vai pagar o mesmo valor, mas o estoque vai ser baixado em 413 e não em 696 gramas...


Bem, uma saída talvez seja fazer a balança imprimir o código de barras com o PESO ao invés do PREÇO. Mas pode fazer isso, dar ao cliente uma etiqueta sem preço?
Mestre Eolo, Não pode sair a etiqueta sem preço e sem peso, aqui no mercadinho não tem problema quanto ao estoque, pois eles trabalham com quebra de estoque para produtos açougue e horti-fruti, eles tem um percentual pra + ou pra - se extrapolar o limite eles sabem por isso não tem problema agora quanto a diferença de peso no PDV, pois a balança trabalha com uma pesagem de cinco em cinco gramas e o PC calcula de uma em uma. se existe uma forma de conciliar balança PDV não sei, aqui a etiqueta sai o código e os ultimos 5 digitos é o preço.
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
Responder