Página 1 de 1

Estouro de Campo com Valor Negativo

Enviado: 17 Nov 2021 12:42
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

Estouro de Campo com Valor Negativo

Enviado: 17 Nov 2021 12:55
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.

Estouro de Campo com Valor Negativo

Enviado: 17 Nov 2021 13:00
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.

Estouro de Campo com Valor Negativo

Enviado: 17 Nov 2021 13:12
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.

Estouro de Campo com Valor Negativo

Enviado: 17 Nov 2021 13:44
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

Estouro de Campo com Valor Negativo

Enviado: 17 Nov 2021 14:11
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.

Estouro de Campo com Valor Negativo

Enviado: 17 Nov 2021 17:54
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...

Estouro de Campo com Valor Negativo

Enviado: 17 Nov 2021 18:53
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
//-----------------------------------------------------------------