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: 765
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: 2820
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 8029
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 2 vezes
Curtiram: 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: 765
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: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 765
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: 3109
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