Estouro de Campo com Valor Negativo

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Estouro de Campo com Valor Negativo

Mensagem por Nascimento »

Estourando tamanho de campo na gravação

amigos estou com um problema na gravação de um banco de baixa no estoque, como sempre o cliente pede mais dar manutenção é outros quinhentos

todo fechamento de caixa o estoque diminue oq foi vendido

o valor negativo fica a tal ponto que estoura o tamanho do campo

a pergunta é como eu faria essa verificação que se estourar o tamanho do campo ele não efetue o replace?

campo numerico tamanho 9 decimal 3

lembrando os valores negativos , como eu faria pra evitar esse estouro de campo?







att: Nascimento
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Estouro de Campo com Valor Negativo

Mensagem por Jairo Maia »

Nascimento escreveu:campo numerico tamanho 9 decimal 3
Será que a função LenNum( <nNumber> ) não resolveria? Então você checa se o numeral é maior que o tamanho do campo, e muda para zero ou pula o Replace.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Estouro de Campo com Valor Negativo

Mensagem por JoséQuintas »

A pergunta é:
Quando é que esse estoque negativo vai virar positivo?

Possibilidades de alteração:

indicação no estoque, se vai controlar estoque (se faz baixa ou não)
IF no replace pra não estourar
uma rotina que sempre modifica o estoque deixando o mínimo de -10.000.000, pra nunca chegar a -100.000.000

o que tá parecendo é que só baixa, e nunca soma.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Estouro de Campo com Valor Negativo

Mensagem por Itamar M. Lins Jr. »

Olá!
campo numerico tamanho 9 decimal 3
Limite do campo numérico do Harbour é 12.4 (salvo engano) ou 16 sem decimais. No seu caso 13.3 = 16
Ou ensinado por José Quintas -> replace qtd := qtd - IIF((qtd+nBAIXA) >= 999999.999 , 999999.999, nBAIXA)

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Estouro de Campo com Valor Negativo

Mensagem por Nascimento »

muito obg nobre amigo jairo resolvido a situação

peguei o valor do campo atual - o valor de baixa , com o LenNum() ele dá a quantidade de numeros
abri o banco e coloquei esse valor no campo no campo -9999999.999

quando passa para gravar da o total de 13 estourando o tamanho , então eu so botei if lenNum(rota_atu - baixa) < 13

problema aparentemente resolvido
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Estouro de Campo com Valor Negativo

Mensagem por JoséQuintas »

Nascimento escreveu:então eu so botei if leNum(rota_atu - baixa) < 13
Resolveu, mas... eu preferiria usar de uma forma mais universal: IF rota - baixa < -9999999
Assim vale em qualquer linguagem de programação.
LenNum() também vale pra número positivo, mas não sei se a solução de negativo vai ser a mesma pra positivo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Estouro de Campo com Valor Negativo

Mensagem por Nascimento »

JoséQuintas escreveu:
Nascimento escreveu:então eu so botei if leNum(rota_atu - baixa) < 13
Resolveu, mas... eu preferiria usar de uma forma mais universal: IF rota - baixa < -9999999
Assim vale em qualquer linguagem de programação.
LenNum() também vale pra número positivo, mas não sei se a solução de negativo vai ser a mesma pra positivo.
entendo mais não pretendo mudar ao menos por hora...

mais agradeço a todos que se empenharam para me ajudar...
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Estouro de Campo com Valor Negativo

Mensagem por alxsts »

Olá!
Nascimento escreveu:mais não pretendo mudar ao menos por hora...
Segue outra abordagem, em Harbour:

Código: Selecionar todos

// hbmk2 Teste hbmemio.hbc

REQUEST HB_MEMIO
REQUEST DBFCDX

PROCEDURE Teste()

   LOCAL aLayOut := { { "vlOrder",  "N", 13, 2 } }
   LOCAL bErr := ErrorBlock( __BreakBlock() ), oErr

   Begin Sequence
      DbCreate( "mem:Teste", aLayOut, "DBFCDX", .T., "tbOrder" )

      tbOrder->( DbAppend() )
      tbOrder->vlOrder := 99999999999999999999.99

   Recover Using oErr
      With Object oErr
         If :subsystem == "DBFCDX" .And. :subcode == 1021
            hb_Alert( "Erro;Nao foi possivel realizar a atualizacao.;Verifique o saldo em estoque deste produto.",, "W+/GR+" )
         Endif

         // aqui pode tratar outras exceções, quantas forem necessárias...
      End With
   Always
      tbOrder->( DbCloseArea() )
      DbDrop( "mem:Teste", "DBFCDX" )

      ErrorBlock( bErr )
   End Sequence

RETURN
//-----------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
Responder