|
Bem Vindo, Visitante
|
Todos os Fórums
ADVPL
|
Imprimir
Enviar Para um Amigo Precisa estar Logado
|
|
|
Assunto: |
Ajuda MT103FIM - Execauto |
|
Versão: |
12.1.2210 |
|
Plataforma: |
Microsoft |
Complemento: |
|
|
DB: |
SQL Server |
Complemento: |
|
|
|
|
|
Mensagem do
RAFAROSSI
em 03/02/2024, 10:08 h
Local: SP Registro: 03/02/2024 Postagens: 10 |
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. |
|
|
Mensagem do
LFCAVALCAN
em 03/02/2024, 14:59 h
Local: SP Registro: 04/06/2018 Postagens: 2 |
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. |
|
|
Mensagem do
RAFAROSSI
em 03/02/2024, 18:10 h
Local: SP Registro: 03/02/2024 Postagens: 10 |
Muito obrigado pela resposta.
Neste caso, usando o MT100AGR eu percorro o Acols ou faço um While nos itens da nota?
Valeu. |
|
|
Mensagem do
ROBERTOMEN
em 05/02/2024, 08:06 h
Local: PR Registro: 04/07/2017 Postagens: 544 |
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() |
|
|
Mensagem do
ROBERTOMEN
em 05/02/2024, 09:47 h
Local: PR Registro: 04/07/2017 Postagens: 544 |
Obs:
Altere a query de acordo com a sua necessidade, no exemplo acima vai trazer apenas os produtos do grupo ‘2000‘ |
|
|
Mensagem do
RAFAROSSI
em 07/02/2024, 11:31 h
Local: SP Registro: 03/02/2024 Postagens: 10 |
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 |
|
|
Mensagem do
ROBERTOMEN
em 07/02/2024, 14:32 h
Local: PR Registro: 04/07/2017 Postagens: 544 |
Boa tarde.
Veja no MT100GE2 |
|
|
Mensagem do
RAFAROSSI
em 07/02/2024, 17:11 h
Local: SP Registro: 03/02/2024 Postagens: 10 |
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. |
|
|
Mensagem do
RAFAROSSI
em 08/02/2024, 09:15 h
Local: SP Registro: 03/02/2024 Postagens: 10 |
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з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 |
|
|
Mensagem do
ROBERTOMEN
em 08/02/2024, 10:23 h
Local: PR Registro: 04/07/2017 Postagens: 544 |
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ç
|
|
|
Mensagem do
RAFAROSSI
em 20/02/2024, 15:45 h
Local: SP Registro: 03/02/2024 Postagens: 10 |
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. |
|
|
Mensagem do
ROBERTOMEN
em 20/02/2024, 17:07 h
Local: PR Registro: 04/07/2017 Postagens: 544 |
Obrigado por postar a solução...
importante para consultas futuras ! |
|
Para postar no Fórum você precisa efetuar o seu login ou se registrar
|
|