No vídeo de hoje, vamos demonstrar como identificar quais são os produtos sem saldo no help MA240NEGAT.
A dúvida de hoje foi feita pelo grande William, onde ele perguntou se há alguma maneira de saber quais são os produtos que apresenta a mensagem MA240NEGAT.
Basicamente fizemos um ponto de entrada onde é percorrido os dados digitados e assim é possível fazer a validação de saldo.
E abaixo o código fonte desenvolvido para exemplificar:
//Bibliotecas
#Include "TOTVS.ch"
#Include "TopConn.ch"
/*/{Protheus.doc} User Function MT261UM
Ponto de entrada paliativo, após fazer validações da quantidade na Transferência Múltipla
@type Function
@author Atilio
@since 25/04/2022
@obs Função esta dentro da validação em A261Quant
Esse p.e. na verdade tem o intuito de fazer a validação entre a quantidade e a
quantidade na segunda unidade de medida (o MV_ESTNEG tem que estar como N)
Porém ele foi usado, caso o retorno seja .F. quer dizer que esta com alguma
falta de estoque, e dessa forma, fazemos a validação percorrendo as linhas,
encontrando o produto, o armazém, e assim fazendo a validação do estoque
para poder mostrar para o usuário, quais são os produtos com a divergência
/*/
User Function MT261UM()
Local aArea := FWGetArea()
Local lRet := ParamIXB[3]
Local nPosProdu := GDFieldPos("D3_COD")
Local nPosQuant := GDFieldPos("D3_QUANT")
Local nPosLocOri := aScan(aHeader, {|x| AllTrim(Upper(x[2])) == "D3_LOCAL"})
//Local nPosLocDes := aScan(aHeader, {|x| AllTrim(Upper(x[2])) == "D3_LOCAL"}, nPosLocOri+1)
Local cMensagem := ""
Local nLinha := 0
Local cQrySaldo := ""
Local nSaldo := 0
Local nQtdDigit := 0
Local cVariavel := ReadVar()
//Se não for de processo automático (ExecAuto)
If ! lAutoma261
//Percorre todas as linhas digitadas
For nLinha := 1 To Len(aCols)
//Zera as variáveis
nSaldo := 0
//Se a linha estiver em memória
If n == nLinha .And. cVariavel == "M->D3_QUANT"
nQtdDigit := &(ReadVar())
Else
nQtdDigit := aCols[nLinha][nPosQuant]
EndIf
//Efetua a busca do Saldo
cQrySaldo := " SELECT " + CRLF
cQrySaldo += " B2_QATU-B2_QACLASS-B2_RESERVA AS TOTAL " + CRLF
cQrySaldo += " FROM " + CRLF
cQrySaldo += " " + RetSQLName("SB2") + " SB2 " + CRLF
cQrySaldo += " WHERE " + CRLF
cQrySaldo += " B2_FILIAL = '" + FWxFilial("SB2") + "' " + CRLF
cQrySaldo += " AND B2_COD = '" + aCols[nLinha][nPosProdu] + "' " + CRLF
cQrySaldo += " AND B2_LOCAL = '" + aCols[nLinha][nPosLocOri] + "' " + CRLF
cQrySaldo += " AND SB2.D_E_L_E_T_ = ' ' " + CRLF
TCQuery cQrySaldo New Alias "QRY_SALDO"
//Se houver dados, atualiza a variável de saldo
If ! QRY_SALDO->(EoF())
nSaldo := QRY_SALDO->TOTAL
EndIf
QRY_SALDO->(DbCloseArea())
//Se o saldo for menor que a quantidade digitada, não vai poder atender a transferência
If nSaldo < nQtdDigit
cMensagem += "<li>Linha '" + cValToChar(nLinha) + "', Produto '" + aCols[nLinha][nPosProdu] + "', Armazém '" + aCols[nLinha][nPosLocOri] + "', foi digitado '" + cValToChar(nQtdDigit) + "' mas tem saldo de apenas '" + cValToChar(nSaldo) + "'!</li>"
EndIf
Next
//Se tem mensagem a ser exibida
If ! Empty(cMensagem)
FWAlertError("Os seguintes produtos, possuem divergência entre a quantidade digitada e o saldo em estoque:<br><ul>" + cMensagem + "</ul>", "Falha nos saldos do Estoque")
EndIf
EndIf
FWRestArea(aArea)
Return lRet
Bom pessoal, por hoje é só.
Abraços e até a próxima.