ExecAuto Mata010

Pessoal, bom dia!

Estou desenvolvendo uma rotina para alteração de produtos através do ExecAuto, já adicionei todos os campos que são obrigatórios no meu ambiente, porém, ao executar a rotina, nenhum erro é retornado e a alteração não é efetivada.

Utilizei a documentação da url abaixo, porém, não é informado quais campos devem obrigatoriamente ser utilizados. https://tdn.totvs.com/pages/releaseview.action?pageId=6087457

Segue trecho do código.


      For nX := 1 To Len(aItem)
            If aItem[nX][1]
                // Limpamos o array aProd para que possa receber o próximo produto
                aProd := {}

                aadd(aProd, {"B1_COD", aItem[nX][2], NIL})
                aadd(aProd, {"B1_DESC", aItem[nX][3], NIL})
                aadd(aProd, {"B1_TIPO", aItem[nX][4], NIL})
                aadd(aProd, {"B1_UM", aItem[nX][5], NIL})
                aadd(aProd, {"B1_LOCPAD", aItem[nX][6], NIL})
                aadd(aProd, {"B1_POSIPI", aItem[nX][9], NIL})
                aadd(aProd, {"B1_ORIGEM", aItem[nX][10], NIL})
                aadd(aProd, {"B1_GARANT", aItem[nX][13], NIL})
                aadd(aProd, {"B1_PICM", aItem[nX][14], NIL})
                aadd(aProd, {"B1_IPI", aItem[nX][15], NIL})
                aadd(aProd, {"B1_CONTRAT", aItem[nX][16], NIL})
                aadd(aProd, {"B1_LOCALIZ", aItem[nX][17], NIL})

                RptStatus({|| MSExecAuto({|x,y| Mata010(x,y)}, aProd, 4)}, "Aguarde...", "Atualizando os produtos...")

                // Tratativa para verificar se a alteração apresentou algum erro
                cErro := MostraErro("C:\temp\Log\", "teste.log")
                nLinhaErro := MLCount(cErro)
                cBuffer := ""
                cCampo := ""
                nErrLin := 1
                cBuffer := RTrim(MemoLine(cErro,,nErrLin))

                // Carrega o nome do campo
                While (nErrLin <= nLinhaErro)
                    nErrLin++
                    cBuffer := RTrim(MemoLine(cErro,,nErrLin))
                    If (Upper(SubStr(cBuffer,Len(cBuffer)-7,Len(cBuffer))) == "INVALIDO")
                        cCampo := cBuffer
                        xTemp := AT("-",cBuffer)
                        cCampo := AllTrim(SubStr(cBuffer,xTemp+1,AT(":",cBuffer)-xTemp-2))
                        Exit
                    EndIf
                EndDo
            EndIf
        Next

Bom dia Felipe, neste mesmo link que informou se atente a seguinte informação:

"Com MVC (Versão 12.1.17 outubro/17 e posteriores)"

Creio que sua versão seja mais atual e o cadastro de produto esteja em MVC realize o procedimento se baseando no modelo MVC, segue conforme Link https://tdn.totvs.com/pages/releaseview.action?pageId=6087457:


Com MVC (Versão 12.1.17 outubro/17 e posteriores)

#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"
#INCLUDE 'Protheus.ch'
#INCLUDE 'FWMVCDef.ch'

//------------------------------------------------------------------------
/*
EXEMPLO DE INCLUSÃO MODELO 1
*/
//------------------------------------------------------------------------
User Function m010IncRa()
Local oModel      := Nil
Private lMsErroAuto := .F.

PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01" MODULO "EST"

oModel  := FwLoadModel ("MATA010")
oModel:SetOperation(MODEL_OPERATION_INSERT)
oModel:Activate()
oModel:SetValue("SB1MASTER","B1_COD"        ,"RASB100")
oModel:SetValue("SB1MASTER","B1_DESC"       ,"PRODUTO TESTE 00")
oModel:SetValue("SB1MASTER","B1_TIPO"       ,"PA")
oModel:SetValue("SB1MASTER","B1_UM"     ,"UN")
oModel:SetValue("SB1MASTER","B1_LOCPAD" ,"01")
oModel:SetValue("SB1MASTER","B1_LOCALIZ"    ,"N")


If oModel:VldData()
    oModel:CommitData()
     MsgInfo("Registro INCLUIDO!", "Atenção")
Else
    VarInfo("",oModel:GetErrorMessage())
EndIf       

oModel:DeActivate()
oModel:Destroy()

oModel := NIL

Return Nil
//------------------------------------------------------------------------
/*
EXEMPLO DE INCLUSÃO MODELO 1  (Utilizando a função FwMvcRotAuto apenas em caráter didático)
*/
//------------------------------------------------------------------------
User Function m010Inc1Ra()
Local aDadoscab := {}
Local aDadosIte := {}
Local aItens := {}

Private oModel := Nil
Private lMsErroAuto := .F.
Private aRotina := {}

PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01" MODULO "EST"

oModel := FwLoadModel ("MATA010")

//Adicionando os dados do ExecAuto cab
aAdd(aDadoscab, {"B1_COD" ,"RASB101" , Nil})
aAdd(aDadoscab, {"B1_DESC" ,"PRODUTO TESTE" , Nil})
aAdd(aDadoscab, {"B1_TIPO" ,"PA" , Nil})
aAdd(aDadoscab, {"B1_UM" ,"UN" , Nil})
aAdd(aDadoscab, {"B1_LOCPAD" ,"01" , Nil})
aAdd(aDadoscab, {"B1_LOCALIZ" ,"N" , Nil})

//Chamando a inclusão - Modelo 1
lMsErroAuto := .F.

FWMVCRotAuto( oModel,"SB1",MODEL_OPERATION_INSERT,{{"SB1MASTER", aDadoscab}})

//Se houve erro no ExecAuto, mostra mensagem
If lMsErroAuto
 MostraErro()
//Senão, mostra uma mensagem de inclusão
Else
 MsgInfo("Registro incluido!", "Atenção")
EndIf


Return Nil

//------------------------------------------------------------------------
/*
EXEMPLO DE INCLUSÃO MODELO 2 (Utilizando a função FwMvcRotAuto apenas em caráter didático)
*/
//------------------------------------------------------------------------

User Function m010Inc2Ra()
Local aDadoscab := {}
Local aDadosIte := {}
Local aItens := {}

Private oModel := Nil
Private lMsErroAuto := .F.
Private aRotina := {}

PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01" MODULO "EST"

oModel := FwLoadModel ("MATA010")

//Adicionando os dados do ExecAuto cab
aAdd(aDadoscab, {"B1_COD" ,"RASB102" , Nil})
aAdd(aDadoscab, {"B1_DESC" ,"PRODUTO TESTE" , Nil})
aAdd(aDadoscab, {"B1_TIPO" ,"PA" , Nil})
aAdd(aDadoscab, {"B1_UM" ,"UN" , Nil})
aAdd(aDadoscab, {"B1_LOCPAD" ,"01" , Nil})
aAdd(aDadoscab, {"B1_LOCALIZ" ,"N" , Nil})

//Adicionando os dados do ExecAuto Item
//Produtos alternativos (já deve existir na base)
If "SGI" $ SuperGetMv("MV_CADPROD",,"|SA5|SBZ|SB5|DH5|SGI|")
 aAdd(aDadosIte, {"GI_PRODALT" , "RASB101" , Nil})
 aAdd(aDadosIte, {"GI_ORDEM" , "1" , Nil})
 //no item o array precisa de um nivel superior.
 aAdd(aItens,aDadosIte)
EndIf

//Chamando a inclusão - Modelo 2
lMsErroAuto := .F.

FWMVCRotAuto( oModel,"SB1",MODEL_OPERATION_INSERT,{{"SB1MASTER", aDadoscab},{"SGIDETAIL", aItens}})

//Se houve erro no ExecAuto, mostra mensagem
If lMsErroAuto
 MostraErro()
//Senão, mostra uma mensagem de inclusão
Else
 MsgInfo("Registro incluido!", "Atenção")
EndIf


Return Nil

//------------------------------------------------------------------------
/*
EXEMPLO DE ALTERAÇÃO
*/
//------------------------------------------------------------------------

User Function m010AltRa()
Local oModel := Nil
Private lMsErroAuto := .F.

PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01" MODULO "EST"

//Posiciona
SB1->(DbSetOrder(1))
If SB1->(DbSeek(xFilial("SB1") + "RASB101"))
 oModel := FwLoadModel ("MATA010")
 oModel:SetOperation(MODEL_OPERATION_UPDATE)
 oModel:Activate()
 oModel:SetValue("SB1MASTER","B1_DESC","PRODUTO ALTERADO")

If oModel:VldData()
 oModel:CommitData()
 MsgInfo("Registro ALTERADO!", "Atenção")
 Else
 VarInfo("",oModel:GetErrorMessage())
 EndIf

 oModel:DeActivate()
Else
 MsgInfo("Registro NAO LOCALIZADO!", "Atenção")
EndIf

Return Nil

//------------------------------------------------------------------------
/*
EXEMPLO DE EXCLUSÃO
*/
//------------------------------------------------------------------------

User Function m010ExcRa()
Local oModel := Nil
Private aRotina := {}

PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01" MODULO "EST"
//Posiciona
SB1->(DbSetOrder(1))
If SB1->(DbSeek(xFilial("SB1") + "RASB101"))
 oModel := FwLoadModel ("MATA010")
 oModel:SetOperation(MODEL_OPERATION_DELETE)
 oModel:Activate()

If oModel:VldData()
 oModel:CommitData()
 MsgInfo("Registro EXCLUIDO!", "Atenção")
 Else
 VarInfo("",oModel:GetErrorMessage())
 EndIf

 oModel:DeActivate()
Else
 MsgInfo("Registro NAO LOCALIZADO!", "Atenção")
EndIf

Return Nil

Douglas, boa tarde!

Utilizando o ExecAuto com MVC o produto foi alterado. Só precisei realizar um ajuste em um gatilho nosso, utilizando a função SubStr() para respeitar o tamanho do campo.

Muito obrigado.

Show, muito bem!

Bom dia! Felipe, voce poderia informar se teve algum problema para localizar o produto ou colocar o código que funcionou para voce? eu estou tentando alterar um único campo da SB1 mas da erro dizendo que não existe registro relacionado ao código informado. MAs eu posiciono no registro e até mostro na tela a descrição para conferir se está posicionando corretamente.

Glaudson, bom dia!
Não tive problemas, apenas passando o código do produto funcionou corretamente.
Você está utilizando a função AllTrim() no código do produto? Tive alguns problemas no posicionamento quando eu utilizava essa função.
Se estiver utilizando, sugiro remover e testar novamente.

Boa tarde Felipe! Obrigado pela resposta tao rapida! Cara, seu codigo eh algo assim?

SB1->(DbSetOrder(1))
If SB1->(DbSeek(xFilial(“SB1”) + “01440310001012”))
ALERT(SB1->B1_DESC)
oModel := FwLoadModel (“MATA010”)
oModel:SetOperation(MODEL_OPERATION_UPDATE)
oModel:Activate()
oModel:SetValue(“SB1MASTER”,“B1_CODBAR”,“109978”)

If oModel:VldData()
oModel:CommitData()
MsgInfo(“Registro ALTERADO!”, “Atenção”)
Else
VarInfo(“”,oModel:GetErrorMessage())
EndIf

oModel:DeActivate()
Else
MsgInfo(“Registro NAO LOCALIZADO!”, “Atenção”)
EndIf

como foi sua passagem do codigo do produto? poderia colocar aqui pra eu ver se estou errando?

Glaudson, bom dia! Seu código esta correto, executei ele em minha base e o produto alterou sem problemas.
SB1->(DbSetOrder(1)) If SB1->(DbSeek(xFilial(“SB1”) + aProd[nX][1])) oModel := FwLoadModel(“MATA010”) oModel:SetOperation(MODEL_OPERATION_UPDATE) oModel:Activate() oModel:SetValue(“SB1MASTER”,“B1_ZZCRESP”, aProd[nX][2]) If oModel:VldData() oModel:CommitData() Else VarInfo(“”,oModel:GetErrorMessage()) MsgInfo("Falha ao alterar o produto "+AllTrim(aProd[nX][1]), “Erro”) EndIf oModel:DeActivate() Else MsgInfo(“Produto “+aProd[nX][1]+” não encontrado!”, “Atenção”) EndIf SB1->(DbCloseArea())

Boa noite FElipe!

Realmente nao havia problema no codigo a questao eh que a MATA010 nao consegue tratar alguns dos meus produtos pois sao produtos de grade. É uma limitação da própria rotina. Muito obrigado pela sua ajuda!