Imprimi Página | Fechar janela

Ajuda MT103FIM - Execauto

Impresso de: Helpfacil - Portal do conhecimento
Nome do Forum: ADVPL
Descrição do Forum: Dúvidas sobre a programação em ADVPL
URL:http://www.helpfacil.com.br/display_topic_threads.asp?ForumID=1&TopicID=44431
Data da Impressão: quinta-feira, 18 de julho de 2024 at 14:56


Topico: Ajuda MT103FIM - Execauto

Postado por: RAFAROSSI
Assunto: Ajuda MT103FIM - Execauto
Data Postagem: sábado, 3 de fevereiro de 2024 at 10:08

Bom Dia a todos,

Pessoal ainda não tenho muita experiência com ADVPL e por favor gostaria de uma ajuda.

Preciso no momento que a NF for classificada no Protheus eu realize o endereçamento desses saldos. Pensei em usar o MT103FIM, porém não sei se devo trabalhar percorrendo o Acols, ou como o ponto de entrada já vai estar após a inclusão da nota se devo fazer um While na SD1.

Não sei muito bem como montar essa lógica, podem me ajudar por favor? Vou precisar capturar os dados da nota e chamar o execauto do MATA265.

Abraços a todos.


Respostas:

Postado Por: LFCAVALCAN
Data Postagem: sábado, 3 de fevereiro de 2024 at 14:59

Olá,

Recomendo usar o ponto de entrada MT100AGR pois ele é chamado quanto a transação de gravação da nota em si já foi concluida.

Ai você pode usar o DbSeek para posicionar nos itens da nota e checar cada um se a TES movimenta estoque e se o produto controla endereço, se sim ai você precisa gravar o endereçamento chamando a rotina ExecAuto MATA265.



Postado Por: RAFAROSSI
Data Postagem: sábado, 3 de fevereiro de 2024 at 18:10

Muito obrigado pela resposta.

Neste caso, usando o MT100AGR eu percorro o Acols ou faço um While nos itens da nota?

Valeu.



Postado Por: ROBERTOMEN
Data Postagem: segunda-feira, 5 de fevereiro de 2024 at 08:06

Bom dia.

Eu faço desta forma:


**********************
User Function MT100AGR
**********************
Local cQuery := ""

If !(alltrim(FUNNAME())=="MATA103" .and. INCLUI).or.Alltrim(SF1->F1_ESPECIE) == "CTE"
     Return(.t.)
EndIf

If Alltrim(SF1->F1_ESPECIE) $ ‘SPED-NFE-‘    // Esta condição vc analisa se precisa ou não
   
   if select("TRB") > 0 ; TRB->(dbclosearea()) ; endif
   
   cQuery := "SELECT D1_COD,D1_CF,D1_TES,D1_QUANT FROM "+retSqlName("SD1")+" WHERE D1_FILIAL=‘"+SF1->F1_FILIAL+"‘ AND D1_DOC = ‘"+SF1->F1_DOC+"‘ "
   cQuery += "AND D1_SERIE = ‘"+SF1->F1_SERIE+"‘ AND D1_FORNECE=‘"+SF1->F1_FORNECE+"‘ AND D1_LOJA=‘"+SF1->F1_LOJA+"‘ AND D1_GRUPO = ‘2000‘ AND D_E_L_E_T_ = ‘ ‘ "

   TCQUERY cQuery NEW ALIAS "TRB"

   dbSelectArea("TRB")
   dbGoTop()

   do while !TRB->(eof())
      // Aqui vc faz o endereçamento dos saldos, se precisar inclua outros campo ou mesmo um JOIN na query
      TRB->(dbskip())
   enddo
endif


return()



Postado Por: ROBERTOMEN
Data Postagem: segunda-feira, 5 de fevereiro de 2024 at 09:47

Obs:

Altere a query de acordo com a sua necessidade, no exemplo acima vai trazer apenas os produtos do grupo ‘2000‘



Postado Por: RAFAROSSI
Data Postagem: quarta-feira, 7 de fevereiro de 2024 at 11:31

Bom dia,

Senhores tentei com o MT100AGR e com o MT103FIM, mas estou tendo um problema, estou seguindo a seguinte lógica (Ainda não está finalizada)

A minha ideia é pegar os dados da nota que entrou e realizar o endereçamento, porém tanto com o MT103FIM quanto com o MT100AGR, a SDA ainda não existe, como posso fazer, alguém tem ideia?

User Function MT103FIM()
     Local nOpcao := PARAMIXB[1]   // Opção Escolhida pelo usuario no aRotina
     Local nConfirma := PARAMIXB[2]   // Se o usuario confirmou a operação de gravação da NFE
     Local aAreaSD1 := SD1->(FwGetArea())
     Local aAreaSDA := SDA->(FwGetArea())
     Local aAreaSDB := SDB->(FwGetArea())
     Local aCabSDA := {}
     Local aItSDB := {}
     Local cQuery   := ""
     Local cFornece := cA100For
     Local cNota    := cNFiscal
     Local cSer     := cSerie
     Local cLoj     := cLoja
     Private lMsErroAuto := .F.

     If nOpcao = 3 .OR. nOpcao = 4 // Incluir ou Classificar

          cQuery := "SELECT SD1.D1_COD, SDA.DA_NUMSEQ, SDA.DA_LOCAL, SD1.D1_QUANT,SDA.DA_SALDO, SDA.DA_DATA,SDA.DA_LOTECTL,SD1.D1_DOC FROM" + RetSqlName("SD1") + " SD1 " + CRLF
          cQuery += "INNER JOIN " + RetSqlName("SDA") + " SDA ON SDA.DA_FILIAL = SD1.D1_FILIAL" + CRLF
          cQuery += "AND SDA.DA_DOC = SD1.D1_DOC" + CRLF
          cQuery += "AND SDA.DA_SERIE = SD1.D1_SERIE" + CRLF
          cQuery += "AND SDA.DA_CLIFOR = SD1.D1_FORNECE" + CRLF
          cQuery += "AND SDA.DA_LOJA = SD1.D1_LOJA" + CRLF
          cQuery += "AND SDA.DA_LOCAL = SD1.D1_LOCAL" + CRLF
          cQuery += "AND SDA.DA_ORIGEM = ‘SD1‘" + CRLF
          cQuery += "AND SDA.DA_SALDO > 0" + CRLF
          cQuery += "AND SDA.D_E_L_E_T_=‘‘" + CRLF
          cQuery += "AND SDA.DA_PRODUTO = SD1.D1_COD" + CRLF
          cQuery += "INNER JOIN " + RetSqlName("SB1") + " SB1 ON SB1.B1_COD = SD1.D1_COD" + CRLF
          cQuery += "AND SB1.D_E_L_E_T_=‘‘" + CRLF
          cQuery += "AND SB1.B1_LOCALIZ = ‘S‘" + CRLF
          cQuery += "WHERE SD1.D1_FILIAL = ‘" +FwxFilial("SD1") + "‘ " + CRLF
          cQuery += "AND SD1.D1_FORNECE = ‘"+cFornece+"‘ " + CRLF
          cQuery += "AND SD1.D1_CF <> ‘6907‘" + CRLF
          cQuery += "AND SD1.D_E_L_E_T_=‘‘" + CRLF
          cQuery += "AND SD1.D1_DOC= ‘"+cNota+"‘ " + CRLF
          cQuery += "AND SD1.D1_SERIE= ‘"+cSer+"‘ " + CRLF
          cQuery += "AND SD1.D1_LOJA=‘"+cLoj+"‘ " + CRLF
          cQuery := ChangeQuery(cQuery)

          TcQuery cQuery New Alias "QRYSD1"

          dbSelectArea("QRYSD1")

          While !QRYSD1->(EOF()) //Enquando não for fim de arquivo

               aCabSDA := {{"DA_PRODUTO", QRYSD1->D1_COD}}

          Enddo

          QRYSD1->(dbCloseArea()) //Fecha a área de trabalho

     Endif

     FwRestArea(aAreaSD1)
     FwRestArea(aAreaSDA)
     FwRestArea(aAreaSDB)

Return



Postado Por: ROBERTOMEN
Data Postagem: quarta-feira, 7 de fevereiro de 2024 at 14:32

Boa tarde.


Veja no MT100GE2



Postado Por: RAFAROSSI
Data Postagem: quarta-feira, 7 de fevereiro de 2024 at 17:11

Caro Roberto, obrigado pela ajuda.

Vou tentar com esse ponto, porém só uma dúvida observei a documentação https://tdn.totvs.com/pages/releaseview.action?pageId=6085781

E não encontrei a variável nOpc por exemplo para saber se o usuário está incluindo, classificando ou etc. No caso não tem problema de qualquer forma irá passar pelo ponto?

Abraços.



Postado Por: RAFAROSSI
Data Postagem: quinta-feira, 8 de fevereiro de 2024 at 09:15

Bom Dia,

Consegui fazer o ponto dessa forma:

Porém notei que debugando quando rodo a consulta contida na variável cQuery, o banco fica consultando e não sai disso, só depois que eu encerro o processo.

Acredito que vou ter que buscar outro ponto de entrada.

User Function MT100GE2()
     Local nOpc := PARAMIXB[2]   // Opção Escolhida pelo usuario no aRotina
     Local aAreaSD1 := SD1->(FwGetArea())
     Local aAreaSDA := SDA->(FwGetArea())
     Local aAreaSDB := SDB->(FwGetArea())
     Local aCabSDA := {}
     Local aItSDB := {}
     Local cQuery   := ""
     Local cFornece := cA100For
     Local cNota    := cNFiscal
     Local cSer     := cSerie
     Local cLoj     := cLoja
     Private lMsErroAuto := .F.

     If nOpc == 1 // Incluir

          cQuery := "SELECT SD1.D1_COD, SDA.DA_NUMSEQ, SDA.DA_LOCAL, SD1.D1_QUANT,SDA.DA_SALDO, SDA.DA_DATA,SDA.DA_LOTECTL,SD1.D1_DOC FROM" + RetSqlName("SD1") + " SD1 " + CRLF
          cQuery += "INNER JOIN " + RetSqlName("SDA") + " SDA ON SDA.DA_FILIAL = SD1.D1_FILIAL" + CRLF
          cQuery += "AND SDA.DA_DOC = SD1.D1_DOC" + CRLF
          cQuery += "AND SDA.DA_SERIE = SD1.D1_SERIE" + CRLF
          cQuery += "AND SDA.DA_CLIFOR = SD1.D1_FORNECE" + CRLF
          cQuery += "AND SDA.DA_LOJA = SD1.D1_LOJA" + CRLF
          cQuery += "AND SDA.DA_LOCAL = SD1.D1_LOCAL" + CRLF
          cQuery += "AND SDA.DA_ORIGEM = ‘SD1‘" + CRLF
          cQuery += "AND SDA.DA_SALDO > 0" + CRLF
          cQuery += "AND SDA.D_E_L_E_T_=‘‘" + CRLF
          cQuery += "AND SDA.DA_PRODUTO = SD1.D1_COD" + CRLF
          cQuery += "INNER JOIN " + RetSqlName("SB1") + " SB1 ON SB1.B1_COD = SD1.D1_COD" + CRLF
          cQuery += "AND SB1.D_E_L_E_T_=‘‘" + CRLF
          cQuery += "AND SB1.B1_LOCALIZ = ‘S‘" + CRLF
          cQuery += "WHERE SD1.D1_FILIAL = ‘" + FwxFilial("SD1") + "‘ " + CRLF
          cQuery += "AND SD1.D1_FORNECE = ‘"+cFornece+"‘ " + CRLF
          cQuery += "AND SD1.D1_CF <> ‘6907‘" + CRLF
          cQuery += "AND SD1.D_E_L_E_T_=‘‘" + CRLF
          cQuery += "AND SD1.D1_DOC= ‘"+cNota+"‘ " + CRLF
          cQuery += "AND SD1.D1_SERIE= ‘"+cSer+"‘ " + CRLF
          cQuery += "AND SD1.D1_LOJA=‘"+cLoj+"‘ " + CRLF
          cQuery := ChangeQuery(cQuery)

          TcQuery cQuery New Alias "QRYSD1"

          dbSelectArea("QRYSD1")
          QRYSD1->(DbGoTop())

          While !QRYSD1->(EOF()) //Enquando não for fim de arquivo

                //Cabecalho com a informaçãoo do item e NumSeq que sera endereçado.
               aCabSDA := {{"DA_PRODUTO", QRYSD1->D1_COD,Nil},;
                              {"DA_NUMSEQ", QRYSD1->DA_NUMSEQ,Nil},;
                              {"DA_DATA",   QRYSD1->DA_DATA,Nil},;
                              {"DA_LOTECTL", QRYSD1->DA_LOTECTL,Nil}}

               ///Dados do item que será endereçado
               aItSDB := {{"DB_ESTORNO" , " ", Nil},;
                          {"DB_LOCALIZ" ,"LOTEPRD",Nil},;
                            {"DB_QUANT", QRYSD1->D1_QUANT,Nil}}

               //Executa o endere&#1079;amento do item
               MATA265( aCabSDA, aItSDB, 3)
               If lMsErroAuto
                    MostraErro()
               Else
                    FWAlertSuccess("Endereçamento realizado com sucesso!","ExecAuto")
               Endif


          Enddo


          QRYSD1->(dbCloseArea()) //Fecha a área de trabalho

     Endif

     FwRestArea(aAreaSD1)
     FwRestArea(aAreaSDA)
     FwRestArea(aAreaSDB)

Return



Postado Por: ROBERTOMEN
Data Postagem: quinta-feira, 8 de fevereiro de 2024 at 10:23

Bom dia.

o banco fica consultando e não sai disso.............

R: Pode ser pelo fato do registro ainda estar preso, tente colocar um NOLOCK, em todas as minhas queries eu uso para evitar conflitos registro preso x consulta.


SELECT SD1.D1_COD, SDA.DA_NUMSEQ, SDA.DA_LOCAL, SD1.D1_QUANT,SDA.DA_SALDO, SDA.DA_DATA,SDA.DA_LOTECTL,SD1.D1_DOC FROM " + RetSqlName("SD1") + " SD1 (NOLOCK)


teste ai.


Abç




Postado Por: RAFAROSSI
Data Postagem: terça-feira, 20 de fevereiro de 2024 at 15:45

Consegui desta forma:

User Function SF1100I()
     Local cprod:=""
     Local _area := Getarea()
     Local _aSD1 := SD1->(Getarea())
     Local _aItensSDB := {}
     Local aCabSDA := {}
     Local aItSDB := {}
     Private     lMsErroAuto := .f.
     Private     lMsHelpAuto := .f.

     DbSelectArea("SD1")
     DbSetOrder(1)
     DbGoTop()
     if DbSeeK(xFilial()+SF1->F1_DOC+SF1->F1_SERIE+SF1->F1_FORNECE+SF1->F1_LOJA)
          while !eof() .and. xFilial()+SF1->F1_DOC+SF1->F1_SERIE+SF1->F1_FORNECE+SF1->F1_LOJA==SD1->D1_FILIAL+SD1->D1_DOC+SD1->D1_SERIE+SD1->D1_FORNECE+SD1->D1_LOJA
               If SD1->D1_CF <> ‘6907‘ .AND. SD1->D1_FORNECE <> ‘18958970‘
                    cprod:=Alltrim(SD1->D1_COD)
                    DbSelectArea("SB1")
                    DbSetOrder(1)
                    if DbSeeK(xFilial()+SD1->D1_COD)
                         if SB1->B1_LOCALIZ=="S"
                              DbSelectArea("SDA")
                              DbSetOrder(1)//DA_FILIAL+DA_PRODUTO+DA_LOCAL+DA_NUMSEQ+DA_DOC+DA_SERIE+DA_CLIFOR+DA_LOJA
                              if DbSeeK(xFilial()+SD1->D1_COD+SD1->D1_LOCAL+SD1->D1_NUMSEQ+SD1->D1_DOC+SD1->D1_SERIE+SD1->D1_FORNECE+SD1->D1_LOJA)
                                   if SDA->DA_SALDO>0
                                        aAdd(aItSDB,{"DB_ITEM"       ,SD1->D1_ITEM,Nil})
                                        aAdd(aItSDB,{"DB_ESTORNO"," " ,Nil})
                                        aAdd(aItSDB,{"DB_PRODUTO",SD1->D1_COD,Nil})
                                        if !empty(Alltrim(SDA->DA_LOTECTL))
                                             aAdd(aItSDB,{"DB_LOTECTL", SDA->DA_LOTECTL,NIL})
                                        endif
                                        aAdd(aItSDB,{"DB_LOCAL"      ,SDA->DA_LOCAL,Nil})
                                        aAdd(aItSDB,{"DB_LOCALIZ" ,"LOTEPDR",Nil})
                                        aAdd(aItSDB,{"DB_DATA"    ,date() ,Nil})
                                        aAdd(aItSDB,{"DB_QUANT"   ,SDA->DA_SALDO,Nil})

                                        aAdd(_aItensSDB,aitSDB)

                                        aCabSDA := {{"DA_FILIAL" ,SDA->DA_FILIAL ,Nil},;
                                             {"DA_PRODUTO"            ,SDA->DA_PRODUTO ,Nil},;
                                             {"DA_LOCAL"            ,SDA->DA_LOCAL ,Nil},;
                                             {"DA_NUMSEQ"            ,SDA->DA_NUMSEQ ,Nil},;
                                             {"DA_DOC"                 ,SDA->DA_DOC ,Nil},;
                                             {"DA_CLIFOR"            ,SDA->DA_CLIFOR ,Nil},;
                                             {"DA_LOJA"                 ,SDA->DA_LOJA ,Nil}}

                                        DbSelectArea("SBE")
                                        DbSetOrder(1)//BE_FILIAL+BE_LOCAL+BE_LOCALIZ
                                        if !DbSeeK(xFilial()+SDA->DA_LOCAL+DA_LOTECTL)
                                             reclock("SBE",.t.)
                                             SBE->BE_FILIAL := xFilial("SBE")
                                             SBE->BE_LOCAL   := SDA->DA_LOCAL
                                             SBE->BE_LOCALIZ := "LOTEPDR"
                                             MsUnlock()
                                        endif
                                        if Len(aCabSDA)>0 .and. len(_aItensSDB)>0
                                             _aSD1 := SD1->(getarea())
                                             _aSDA := SDA->(getarea())
                                             nModuloOld := nModulo
                                             nModulo := 4
                                             MATA265( aCabSDA, _aItensSDB, 3)
                                             nModulo := nModuloOld
                                             restarea(_aSDA)
                                             restarea(_aSD1)
                                             If lMsErroAuto
                                                  mostraerro("\logs\")
                                             endif
                                        endif//if do len(aCabSDA)
                                   ELSE
                                        _A := "ELSE DO DA_SALDO"
                                   endif //IF DO DA_SALDO
                              ELSE
                                   _A := "ELSE DO SDA"
                              endif //IF DA SDA
                         ELSE
                              _A := "ELSE DO B1_LOCALIZ"
                         endif //if do B1_LOCALIZ E D1_LOCAL
                    ELSE
                         _A := "ELSE DO SB1"
                    endif //IF DO SB1
                    DbSelectArea("SD1")
                    dbskip()
               Endif
          enddo
     endif //IF DO SD1

     restarea(_aSD1)
     restarea(_area)
//FINAL TRATAMENTO PARA ENDEREÇAR AUTOMATICAMENTE


return

Valeu pela ajuda.



Postado Por: ROBERTOMEN
Data Postagem: terça-feira, 20 de fevereiro de 2024 at 17:07

Obrigado por postar a solução...

importante para consultas futuras !




Imprimir Página | Fechar Janela