No vídeo de hoje, vamos demonstrar em como executar automaticamente (ExecAuto) a rotina de Retornar do Pedido de Venda (A410ProcDv).
A dúvida de hoje, nos perguntaram, se seria possível acionar o Retornar automaticamente do Pedido de Venda em uma customização.
Pensando nisso, montamos esse exemplo, onde montamos as variáveis necessárias e acionamos a A410ProcDv via MsExecAuto.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "TOTVS.ch"
#Include "TopConn.ch"
/*/{Protheus.doc} User Function zVid0085
Teste de ExecAuto de Retornar
@type Function
@author Atilio
@since 27/06/2023
/*/
User Function zVid0085()
Local aArea := FWGetArea()
Local cQueryDoc := ""
//Variáveis passadas dentro do ExecAuto
Local cAliasDoc := "SF1"
Local nPrimRec := 0
Local nOpcExec := 4
Local lUsaForn := .T.
Local cCodForn := "F00003"
Local cLojaForn := "01"
Local cFiltrDoc := ""
//Variáveis private do execauto
Private lMsErroAuto := .F.
Private lForn := lUsaForn
Private l410Auto
Private INCLUI := .T.
Private aRotina := FWLoadMenuDef("MATA410")
//Busca os documentos que serão retornados
cQueryDoc := " SELECT " + CRLF
cQueryDoc += " SF1.R_E_C_N_O_ AS SF1REC, " + CRLF
cQueryDoc += " SD1.R_E_C_N_O_ AS SD1REC, " + CRLF
cQueryDoc += " D1_DOC, " + CRLF
cQueryDoc += " D1_SERIE, " + CRLF
cQueryDoc += " D1_ITEM " + CRLF
cQueryDoc += " FROM " + CRLF
cQueryDoc += " " + RetSQLName("SD1") + " SD1 " + CRLF
cQueryDoc += " INNER JOIN " + RetSQLName("SF1") + " SF1 ON ( " + CRLF
cQueryDoc += " F1_FILIAL = D1_FILIAL " + CRLF
cQueryDoc += " AND F1_DOC = D1_DOC " + CRLF
cQueryDoc += " AND F1_SERIE = D1_SERIE " + CRLF
cQueryDoc += " AND F1_FORNECE = D1_FORNECE " + CRLF
cQueryDoc += " AND F1_LOJA = D1_LOJA " + CRLF
cQueryDoc += " AND SF1.D_E_L_E_T_ = ' ' " + CRLF
cQueryDoc += " ) " + CRLF
cQueryDoc += " WHERE " + CRLF
cQueryDoc += " D1_FILIAL = '" + FWxFilial("SD1") + "' " + CRLF
cQueryDoc += " AND D1_FORNECE = '" + cCodForn + "' " + CRLF
cQueryDoc += " AND D1_LOJA = '" + cLojaForn + "' " + CRLF
cQueryDoc += " AND D1_TIPO NOT IN ('B', 'D') " + CRLF
cQueryDoc += " AND D1_QUANT > D1_QTDEDEV " + CRLF
cQueryDoc += " AND D1_EMISSAO >= '20230601' " + CRLF
cQueryDoc += " AND SD1.D_E_L_E_T_ = ' ' " + CRLF
TCQuery cQueryDoc New Alias "QRY_DOC"
//Se tem dados
If ! QRY_DOC->(EoF())
//Percorre os dados e vai montando o filtro
While ! QRY_DOC->(EoF())
cFiltrDoc += Iif(! Empty(cFiltrDoc), ", ", "") + cValToChar(QRY_DOC->SD1REC)
//Se o primeiro recno da SF1, ainda estiver vazio
If Empty(nPrimRec)
nPrimRec := QRY_DOC->SF1REC
EndIf
QRY_DOC->(DbSkip())
EndDo
//Adiciona dizendo que será um filtro do campo recno
cFiltrDoc := "SD1.R_E_C_N_O_ IN (" + cFiltrDoc + ")" + CRLF
//Adiciona um ultimo parenteses para não dar erro no execauto (ele abre o parenteses mas não fecha)
cFiltrDoc += ")"
EndIf
QRY_DOC->(DbCloseArea())
//Se houver documentos
If ! Empty(cFiltrDoc)
//Define se irá ser uma execução automática ou não
If FWAlertYesNo("Você deseja executar automaticamente (SIM) ou exibir a tela antes de confirmar (NÃO)?", "Atenção - Retornar")
l410Auto := .T.
Else
l410Auto := .F.
EndIf
//Posiciona no primeiro documento da SF1
DbSelectArea("SF1")
SF1->(DbGoTo(nPrimRec))
//Parâmetros da A410ProcDV:
// a = cAlias
// b = nReg
// c = nOpc
// d = lFornece
// e = cFornece
// f = cLoja
// g = cDocSF1
MSExecAuto({|a, b, c, d, e, f, g| A410ProcDv(a, b, c, d, e, f, g)}, cAliasDoc, nPrimRec, nOpcExec, lUsaForn, cCodForn, cLojaForn, cFiltrDoc)
//Se houve erro, mostra a mensagem
If lMsErroAuto
MostraErro()
EndIf
EndIf
FWRestArea(aArea)
Return
/*/{Protheus.doc} User Function M410PCDV
Ponto de entrada, na inserção da linha do retornar (caso queira tratar algum documento no momento que ta sendo inserido no aCols)
@type Function
@author Atilio
@since 27/06/2023
/*/
User Function M410PCDV()
Local aArea := FWGetArea()
Local nPosDoc := GDFieldPos("C6_NFORI")
Local nLinha := Len(aCols)
//Se veio da rotina de retornar
If FWIsInCallStack("u_zVid0085")
//Valida o campo de documento
Alert("Documento de número: " + aCols[nLinha][nPosDoc])
EndIf
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Boa tarde,
Consegui fazer o rotina funcionar, porém preciso que seja retornado uma quantidade parcial.
Tem alguma parametro que define a quantidade? não encontrei documentação desse ExecAuto e
Bom dia Fabio, tudo joia?
Com quantidade parcial nunca trabalhei.
Pelos parâmetros recebidos no ExecAuto da A410ProcDv, acredito que não tenha essa possibilidade.
Se for o caso, você pode tentar abrir um chamado na TOTVS e solicitar a documentação da rotina, às vezes pode ser algum parâmetro no -F12- da rotina ou alguma coisa assim, vai que estão construindo a documentação do TDN, ai já ajudaria.
Tenha uma ótima e abençoada terça feira.
Um forte abraço.
Entendi,
Eu estou tentando fazer direto pelo execauto MATA410, com as quantidades que são necessárias, quando faço a operação via browser e aperto F4 pra vincular a NF de Origem o pedido grava corretamente. Porém mesmo preenchendo as informações para o execauto apresenta erro.
“Inconsistência nos Itens”, mas não exibe exatamente o erro.
Mesmo preenchendo os campos C6_NFORI, C6_IDENTB6, C6_SERIORI, C6_ITEMORI os campos que são preenchidos ao selecionar via F4 no browser.
Bom dia Fabio, tudo joia?
Que estranho, era pra ele acusar a mensagem.
Tenta usar a FWVetByDic linha a linha, pra não ver se é algum gatilho impactando.
Outro teste também, é com rpo zerado, pra ver se é alguma customização (tipo ponto de entrada impactando).
Tenha uma ótima e abençoada quarta feira.
Um forte abraço.