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