Ponto de entrada mvc - como recuperar dados

Pessoal, bom dia! Tudo bem? Espero que sim.

Estou desenvolvendo um ponto de entrada em MVC para a rotina MATA311 (Modelo 2, onde a tabela NNS representa o cabeçalho e a NNT os itens). Minha intenção é que, ao confirmar a inclusão da solicitação, o ponto de entrada percorra os itens da tabela NNT e aplique uma função baseada no código do produto. Caso essa função retorne um valor negativo para algum item, a inclusão da solicitação deve ser bloqueada.

Estou avaliando os pontos de entrada “FORMPOS”, “MODELPOS” ou “FORMLINEPOS” para implementar essa lógica. No entanto, ainda não consegui entender como acessar as linhas do formulário dentro desses pontos.

Poderiam, por gentileza, me orientar sobre qual o melhor ponto a ser utilizado e como acessar os itens da NNT? Se possível, ficaria muito grato por um exemplo.

Agradeço desde já!

1 curtida

Olá Júlio, segue o que já fiz para inibir a transferência de produto sem saldo, basta adaptar a sua necessidade

2 curtidas

Muito legal o exemplo @lemos.leandro , só não precisaria ficar usando o GoLine(), como é apenas uma validação é mais direto usar o GetValue(cCampo,nLinha) diretamente.

1 curtida

Muito obrigado pelo envio! Estou testando o seu código no momento.

  /*/{Protheus.doc} User Function MATA311
PRODUÇÃO
Ponto de Entrada MVC do Mata311 chamado no momento da validação do form ao efetivar a transferencia
@type Function
@author Leandro Lemos
@since 28/01/2020
@version version
@param param_name, param_type, param_descr
@return return_var, return_type, return_description
@example
(examples)
@see (Pontos de entrada MVC: https://tdn.totvs.com/pages/releaseview.action?pageId=208345968)
*/

User Function MATA311()
    Local aParam := PARAMIXB
    Local cObj
    Local cIdPonto
    Local cIdModel
    Local cProd
    Local cMsg
    Local lValido := .T.
    Local nI := 0

    If aParam != NIL
        cObj      := aParam[1]
        cIdPonto  := aParam[2] //FORMPOS
        cIdModel  := aParam[3] //NTDETAIL
        cProd     := aParam[4]

        //Valida itens durante salvamento
        Do Case
        Case cIdModel == 'NTDETAIL' .and. cIdPonto == 'FORMPOS'
            cMsg := "Produtos sem estoque: " + CRLF
            nQtdeLinhas := cObj:GetQtdLine()

            For nI := 1 To cObj:GetQtdLine()
                cObj:GoLine(nI)
                If !cObj:IsDeleted(nI)
                    dbSelectArea('SB2')
                    dbSetOrder(1) // B2_FILIAL+B2_COD+B2_LOCAL
                    dbSeek(xFilial('SB2')+cObj:GetValue('NNT_PROD'))
                    If (SB2->B2_QATU < cObj:GetValue('NNT_QUANT') /* .OR. SB2->B2_QATU <= 0 */)
                        cMsg += cObj:GetValue('NNT_PROD') + " - Saldo: " + CVALTOCHAR( SB2->B2_QATU ) + CRLF
                        lValido := .F.
                    EndIf
                EndIf
            Next nI

            If (!lValido == .F.)
                Help( , 'Validação de Transferencia' , cMsg, 1, 0,,,,,{ 'Verifique o estoque de alguns itens para efetivar a transferencia'})
            EndCase

        EndIf

        If cIdPonto == "MODELCANCEL"
            cMsg := "Deseja Realmente Sair ?"

            If !( lValido := ApMsgYesNo( cMsg ) )
                Help( , 'Help' , 'Operação nao abortada', 1, 0 )
            EndIf
        EndIf
    EndIf
Return lValido
1 curtida

show, tem tempo que fiz esse do jeito que funcionou ficou hehe

Deu certo! Consegui com a seguinte adaptação:

#INCLUDE ‘PROTHEUS.CH’
#INCLUDE ‘FWMVCDEF.CH’

User Function MATA311()//Nome o ID do Modelo de Dados (Model) ou Nome da rotina
Local aParam := PARAMIXB

Local oObj
Local cIdPonto    := ''
Local cIdModel    := ''
Local cMsg        := ''

Local xRet        := .T.

Local nQtdeLinhas := 0
Local nI          := 0
Local nCusto      := 0

Local cProd       := ''
Local cLocal      := ''


If aParam <> NIL
    oObj     := aParam[1]
    cIdPonto := aParam[2]
    cIdModel := aParam[3]
    
    If cIdModel == 'NNTDETAIL' .and. cIdPonto == 'FORMPOS'
        cMsg := "Os produtos abaixo estão sem custo! Por favor, verificar: " + CRLF
        nQtdeLinhas := oObj:GetQtdLine()

        For nI := 1 To oObj:GetQtdLine()
            oObj:GoLine(nI)
            If !oObj:IsDeleted(nI)
                cProd  := oObj:GetValue('NNT_PROD')
                cLocal := oObj:GetValue('NNT_LOCAL')

                nCusto := U_retCusto(cProd, cLocal)

                If (nCusto == 0 .Or. nCusto == 0.01)
                    cMsg += cProd + CRLF
                    xRet := .F.
                EndIf
            EndIf
        Next nI

        If (xRet == .F.)
            Help(, , "Validação de Transferencia", , cMsg, 1, 0, , , , , , {'Verifique o custo dos produtos ou o tipo de custo selecionado'})
        EndIf
    EndIf
EndIf

Return xRet

User Function TESTEX()

ALert ("passou")

Return

2 curtidas