ExecAuto do Retornar do Pedido de Vendas | Ti Responde 0085

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. Fabio Cerri de Souza disse:

    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.

  2. Fabio Cerri de Souza disse:

    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.

Deixe uma resposta

Terminal de Informação