Imprimi Página | Fechar janela

If e elseif

Impresso de: Helpfacil - Portal do conhecimento
Nome do Forum: ADVPL
Descrição do Forum: Dúvidas sobre a programação em ADVPL
URL:http://www.helpfacil.com.br/display_topic_threads.asp?ForumID=1&TopicID=44493
Data da Impressão: quarta-feira, 18 de setembro de 2024 at 14:39


Topico: If e elseif

Postado por: CAUAN_2024
Assunto: If e elseif
Data Postagem: sexta-feira, 12 de abril de 2024 at 10:44

Bom dia Devs, estou com um problema, estou desenvolvendo um código em que ao usuário colocar uma quantidade, caso o numero colocado seja menor, ira abrir uma tela de mensagem sugerindo uma quantidade melhor(Segue anexo da imagem de exemplo), mas o erro esta que, mesmo colocando o valor sugerido, ainda sim aparece a mensagem, alguém poderia me ajudar?
Segue código abaixo:

      local lRet := .t.
cQtd:= M-> CK_QTDVEN

    if cQtd < 3
        MSGINFO("Melhor quantidade sugerida = 3" )
    elseif (cQtd < 6 .and. cQtd <> 4)
        MSGINFO("Melhor quantidade sugerida = 6 " )
    ELSEIF cQtd < 8
        MSGINFO("Melhor quantidade sugerida = 8 " )
    elseif cQtd < 10
        MSGINFO("Melhor quantidade sugerida = 10 " )
    elseif cQtd < 14 .and. cQtd <> 11
        MSGINFO("Melhor quantidade sugerida = 14" )
    elseif cQtd < 18 .and. cQtd <> 15
        MSGINFO("Melhor quantidade sugerida = 18 " )
    elseif cQtd < 30
        MSGINFO("Melhor quantidade sugerida = 30 " )
    elseif cQtd < 100
        MSGINFO("Melhor quantidade sugerida = 100 " )
    elseif cQtd < 200
        MSGINFO("Melhor quantidade sugerida = 200 " )
    endif


RETURN lRet


Respostas:

Postado Por: RKGIUSTI
Data Postagem: sexta-feira, 12 de abril de 2024 at 11:45

Bom dia Cauan,

Não seria algo assim:

local lRet := .t.
     cQtd:= M-> CK_QTDVEN

    if cQtd < 3
        MSGINFO("Melhor quantidade sugerida = 3" )
        lRet := .f.
    elseif (cQtd > 4 .and. cQtd < 6)
        MSGINFO("Melhor quantidade sugerida = 6 " )
        lRet := .f.
    ELSEIF (cQtd > 6 .and. cQtd < 8)
        MSGINFO("Melhor quantidade sugerida = 8 " )
        lRet := .f.
    elseif(cQtd > 8 .and. cQtd < 10)
        MSGINFO("Melhor quantidade sugerida = 10 " )
        lRet := .f.
    elseif(cQtd > 11 .and. cQtd < 14)
        MSGINFO("Melhor quantidade sugerida = 14" )
        lRet := .f.
    elseif(cQtd > 15 .and. cQtd < 18)
        MSGINFO("Melhor quantidade sugerida = 18 " )
        lRet := .f.
    elseif(cQtd > 18 .and. cQtd < 30)
        MSGINFO("Melhor quantidade sugerida = 30 " )
        lRet := .f.
    elseif(cQtd > 30 .and. cQtd < 100)
        MSGINFO("Melhor quantidade sugerida = 100 " )
        lRet := .f.
    elseif(cQtd > 100 .and. cQtd < 200)
        MSGINFO("Melhor quantidade sugerida = 200 " )
        lRet := .f.
    endif

Abraço.
Raphael



Postado Por: 3FRAIM
Data Postagem: sexta-feira, 12 de abril de 2024 at 13:46

Bom dia Raphael!

O problema acontece porque quando o valor está correto, ele cai sempre no próximo if...

Ex:

// quando cQtd == 3

if cQtd < 3 (falso)
...
elseif cQtd < 6 (verdadeiro)
.../// mostra a mensagem


Segue abaixo sugestão de fonte com solução sem que precise fazer um if pra cada situação.

local lRet   := .T.
local aQtdes := {}
local cQtd   := M->CK_QTDVEN
local ni

aadd(aQtdes, {1,3,3})
aadd(aQtdes, {4,4,4})
aadd(aQtdes, {5,6,6})
aadd(aQtdes, {7,8,8})
aadd(aQtdes, {9,9,10})
aadd(aQtdes, {11,11,11})
aadd(aQtdes, {12,14,14})
aadd(aQtdes, {15,15,15})
aadd(aQtdes, {16,18,18})
aadd(aQtdes, {19,30,30})
aadd(aQtdes, {31,100,100})
aadd(aQtdes, {101,200,200})

ni := aScan(aQtdes, {|x| cQtd >= x[1] .and. cQtd <= x[2] })

if ni > 0 .and. aQtdes[ni][3] > cQtd
    msgInfo("Melhor quantidade sugerida: "+AllTrim(Str(aQtdes[ni][3])) )
    lRet := .F.
endif

return lRet





Postado Por: 3FRAIM
Data Postagem: sexta-feira, 12 de abril de 2024 at 14:10

Bom dia Raphael!

... segue uma pequena melhoria...

local lRet   := .T.
local aQtdes := {}
local cQtd   := M->CK_QTDVEN
local ni

aadd(aQtdes, {1,3})
aadd(aQtdes, {4,4})
aadd(aQtdes, {5,6})
aadd(aQtdes, {7,8})
aadd(aQtdes, {9,10})
aadd(aQtdes, {11,11})
aadd(aQtdes, {12,14})
aadd(aQtdes, {15,15})
aadd(aQtdes, {16,18})
aadd(aQtdes, {19,30})
aadd(aQtdes, {31,100})
aadd(aQtdes, {101,200})

ni := aScan(aQtdes, {|x| cQtd >= x[1] .and. cQtd <= x[2] })

if ni > 0 .and. aQtdes[ni][2] > cQtd
    msgInfo("Melhor quantidade sugerida: "+AllTrim(Str(aQtdes[ni][2])) )
    lRet := .F.
endif

return lRet



Postado Por: RKGIUSTI
Data Postagem: sexta-feira, 12 de abril de 2024 at 15:18

Boa tarde Efraim,

O solicitante não foi eu, foi o Cauan... eu simplesmente apresentei a solução pra ele conforme a necessidade dele e baseado no código que ele forneceu.

A sua lógica também está válida, depende ele decidir o que é melhor pra ele utilizar.

Att.
Raphael Giusti





Postado Por: ROBERTOMEN
Data Postagem: sexta-feira, 12 de abril de 2024 at 15:43

Boa tarde.

Creio que o seu problema não está no IF e sim no M->CK_QTDVEN


Vc está em um Acols e em Acols não existe M->CK_QTDVEN

Vc deve estar em um ponto de entrada da rotina que valida a linha do orçamento:

E para validar tem que ser feito assim:




Local nCK_QTDVEN:= aScan(aHeader,{|x|UPPER(Alltrim(x[2])) == "CK_QTDVEN"})

cQtd:= aCols[n,nCK_QTDVEN]

    if cQtd < 3
        MSGINFO("Melhor quantidade sugerida = 3" )
    elseif (cQtd < 6 .and. cQtd <> 4)
        MSGINFO("Melhor quantidade sugerida = 6 " )
    ELSEIF cQtd < 8
        MSGINFO("Melhor quantidade sugerida = 8 " )
    elseif cQtd < 10
        MSGINFO("Melhor quantidade sugerida = 10 " )
    elseif cQtd < 14 .and. cQtd <> 11
        MSGINFO("Melhor quantidade sugerida = 14" )
    elseif cQtd < 18 .and. cQtd <> 15
        MSGINFO("Melhor quantidade sugerida = 18 " )
    elseif cQtd < 30
        MSGINFO("Melhor quantidade sugerida = 30 " )
    elseif cQtd < 100
        MSGINFO("Melhor quantidade sugerida = 100 " )
    elseif cQtd < 200
        MSGINFO("Melhor quantidade sugerida = 200 " )
    endif



Postado Por: TCHULA
Data Postagem: sexta-feira, 12 de abril de 2024 at 15:52

Boa tarde Cauan.
Tenta desta forma ve se ajuda.

local lRet := .t.
cQtd:= TMP1-> CK_QTDVEN -> Altera o M de memoria para o TMP1 de tabela temporaria que e usada no orçamento de vendas.

    if cQtd < 3
        MSGINFO("Melhor quantidade sugerida = 3" )
    elseif (cQtd < 6 .and. cQtd <> 4)
        MSGINFO("Melhor quantidade sugerida = 6 " )
    ELSEIF cQtd < 8
        MSGINFO("Melhor quantidade sugerida = 8 " )
    elseif cQtd < 10
        MSGINFO("Melhor quantidade sugerida = 10 " )
    elseif cQtd < 14 .and. cQtd <> 11
        MSGINFO("Melhor quantidade sugerida = 14" )
    elseif cQtd < 18 .and. cQtd <> 15
        MSGINFO("Melhor quantidade sugerida = 18 " )
    elseif cQtd < 30
        MSGINFO("Melhor quantidade sugerida = 30 " )
    elseif cQtd < 100
        MSGINFO("Melhor quantidade sugerida = 100 " )
    elseif cQtd < 200
        MSGINFO("Melhor quantidade sugerida = 200 " )
    endif


RETURN lRet




Postado Por: CAUAN_2024
Data Postagem: segunda-feira, 15 de abril de 2024 at 08:38

Muito obrigado gente, funcionou aqui, uma outra ajuda que gostaria de perguntar, como ficaria se eu quisesse validar apenas pra quando for balde?

Tentei da seguinte forma :

      
local aSCK := SCK->(GetArea())
local lRet   := .T.
local aQtdes := {}
local cQtd   := M->CK_QTDVEN

local ni

if ("BL" $ SCK-> CK_UM)

aadd(aQtdes, {1,55,55})
aadd(aQtdes, {56,100,100})
aadd(aQtdes, {101,200,200})
aadd(aQtdes, {201,220,220})
aadd(aQtdes, {221,300,300})
aadd(aQtdes, {301,420,420})
aadd(aQtdes, {421,600,600})

ni := aScan(aQtdes, {|x| cQtd >= x[1] .and. cQtd <= x[2] })

if ni > 0 .and. aQtdes[ni][3] > cQtd
    msgInfo("Melhor quantidade sugerida: "+AllTrim(Str(aQtdes[ni][3])) )
    lRet := .F.
endif

ENDIF

restarea(aSCK)
return lRet




Postado Por: ROBERTOMEN
Data Postagem: sexta-feira, 19 de abril de 2024 at 09:49

Resposta aqui:

https://www.helpfacil.com.br/home.asp?qsTipo=f1&qsInfo1=1&qsInfo2=44499&qsInfo3=1




Imprimir Página | Fechar Janela