Árvore de páginas

EXECAUTO MATA061 - Amarração Produto x Fornecedor

Produto:

Protheus

Versões:

Todas

Ocorrência:

Rotina Automática - MATA061 (Execauto)

Ambiente:

SIGACOM - Compras

Descrição:Rotina automática que permite a inclusão de amarração produto x fornecedor.
Observação:

Para realizar a opção de alteração e/ou exclusão é necessário que deixe posicionado no registro a ser alterado ou excluído.

Os campos Cod. Fornecedor (A5_FORNECE) e Loja (A5_LOJA), na edição do cadastro os mesmo não podem ser alterados para que se mantenha integridade das informações. O correto é que seja feita a exclusão e assim adicionar o novo fornecedor em uma nova linha (tanto via execauto quanto via tela).

Passo a passo:

Exemplo de inclusão
#Include "Protheus.ch"
#Include "TbiConn.ch"
 
User Function INCMT061()
    Local aCab          As Array 
    Local aItens		As Array
    Local aLinha        As Array
	Local aForn 		As Array
	Local aLoja 		As Array 
	Local aProdF		As Array 
    Local aErro         As Array 

    Local nX            As Numeric 
    Local nY            As Numeric 
    Local nOpc          As Numeric 

    Local lRet          As Logical 

    Local cProd         As Character
    Local cDescProd 	As Character

    Local oModel        As Object
 
    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01" MODULO "COM"
    
        nOpc := 3 
        lRet := .T.

        oModel := FWLoadModel('MATA061')
        oModel:SetOperation(nOpc)
        oModel:Activate()
        
        cProd       := PadR("PRODMATA061XGUI",TamSx3("A5_PRODUTO")[1])
        cDescProd 	:= GetAdvFVal("SB1","B1_DESC",FwxFilial("SB1")+cProd,1)

        aForn		:= {"000001","000002"}
        aLoja		:= {"01","01"}
        aProdF		:= {"PRODX01","PRODX02"}

        aCab    := {}
        aLinha  := {}
        aItens  := {}

        aErro  := {}


        //Cabeçalho
        Aadd(aCab,{'MdFieldSA5','A5_PRODUTO'  ,cProd    ,     Nil})
        Aadd(aCab,{'MdFieldSA5','A5_NOMPROD'  ,cDescProd,     Nil})

        For nX := 1 to Len(aCab)
                If !( oModel:SetValue( aCab[nX][1] , aCab[nX][2] , aCab[nX][3] ) )
                        // Caso a atribuição não possa ser feita, por algum motivo (validação, por exemplo)
                        // o método SetValue retorna .F.
                    lRet := .F.
                    Exit  
                EndIf     
        Next nX
        
        if lRet 

            For nX := 1 to Len(aForn)

                aItens := {}
                //Grid
				Aadd(aItens,{"MdGridSA5","A5_FORNECE"	,PadR(aForn[nX],TamSx3("A5_FORNECE")[1])	,Nil})
                Aadd(aItens,{"MdGridSA5","A5_LOJA"		,PadR(aLoja[nX],TamSx3("A5_LOJA")[1])       ,Nil})        
                Aadd(aItens,{"MdGridSA5","A5_CODPRF"	,PadR(aProdF[nX],TamSx3("A5_CODPRF")[1])	,Nil})
                Aadd(aLinha,aItens)

            Next nX 
            
            For nX := 1 to Len(aLinha)
                
                if nX > 1 
                    //Nova linha na Grid
                    oModel:GetModel("MdGridSA5"):AddLine()
                EndIf    
                
                For nY := 1 to Len(aLinha[nX])
                    
                    If !( oModel:SetValue( aLinha[nX][nY][1] , aLinha[nX][nY][2] , aLinha[nX][nY][3] ) )
                            // Caso a atribuição não possa ser feita, por algum motivo (validação, por exemplo)
                            // o método SetValue retorna .F.
                        lRet := .F.
                        Exit  
                    EndIf
                
                Next nY      
            Next nX

        EndIf 

        If lRet
            lRet := oModel:VldData()
                
            If lRet
                lRet := oModel:CommitData()
            Endif 
        
        EndIf 

        If !lRet
            //-- Busca o Erro do Modelo de Dados
            aErro := oModel:GetErrorMessage()
                    
            //-- Monta o Texto que será mostrado na tela
            AutoGrLog("Id do formulário de origem:" + ' [' + AllToChar(aErro[01]) + ']')
            AutoGrLog("Id do campo de origem: "     + ' [' + AllToChar(aErro[02]) + ']')
            AutoGrLog("Id do formulário de erro: "  + ' [' + AllToChar(aErro[03]) + ']')
            AutoGrLog("Id do campo de erro: "       + ' [' + AllToChar(aErro[04]) + ']')
            AutoGrLog("Id do erro: "                + ' [' + AllToChar(aErro[05]) + ']')
            AutoGrLog("Mensagem do erro: "          + ' [' + AllToChar(aErro[06]) + ']')
            AutoGrLog("Mensagem da solução:"        + ' [' + AllToChar(aErro[07]) + ']')
            AutoGrLog("Valor atribuído: "           + ' [' + AllToChar(aErro[08]) + ']')
            AutoGrLog("Valor anterior: "            + ' [' + AllToChar(aErro[09]) + ']')

            //-- Mostra a mensagem de Erro
            MostraErro()
        EndIf
        
        FwFreeArray(aCab)
        FwFreeArray(aItens)
        FwFreeArray(aLinha)
        FwFreeArray(aForn)
        FwFreeArray(aLoja)
        FwFreeArray(aProdF)
        FwFreeArray(aErro)

        oModel:DeActivate()
        oModel:Destroy()
        
    RESET ENVIRONMENT
    
Return
Exemplo de alteração
#Include "Protheus.ch"
#Include "RwMake.ch"
#Include "TbiConn.ch"
 
User Function ALTMT061()
    
    Local aDados    As Array
    Local aErro     As Array 

    Local cForn     As Character
    Local cLoja     As Character 
    Local cProd     As Character

    Local lRet      As Logical
    Local lPosic    As Logical 

    Local nY        As Numeric 
    Local nOpc      As Numeric 

    Local oModel    As Object
    Local oGridMod  As Object
 
    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01" MODULO "COM"
 
        cForn       := PadR("000001",TamSx3("A5_FORNECE")[1])
        cLoja       := PadR("01",TamSx3("A5_LOJA")[1])
        cProd       := PadR("PRODMATA061XGUI",TamSx3("A5_PRODUTO")[1])
        
        //Posicionar na SA5 no registro a ser alterado
        DbSelectArea("SA5")
        SA5->(DbSetOrder(1))
        If SA5->(DbSeek(xFilial("SA5") + cForn + cLoja + cProd))
            
            nOpc    := 4 
            aDados  := {}
            aErro   := {}
            lPosic  := .F.
            lRet    := .T.

            oModel      := FWLoadModel('MATA061')
            oGridMod    := oModel:GetModel("MdGridSA5")
            
            oModel:SetOperation(nOpc)
            oModel:Activate()
        
            lPosic := oGridMod:SeekLine({{"A5_FORNECE",cForn},{"A5_LOJA",cLoja},{"A5_PRODUTO",cProd}})
        
            If lPosic       
                Aadd(aDados,{"MdGridSA5","A5_CODPRF"	,PadR("CODPRFFR",TamSx3("A5_CODPRF")[1])	,Nil})
            Endif  

            For nY := 1 to Len(aDados)
                If !( oModel:SetValue( aDados[nY][1] , aDados[nY][2] , aDados[nY][3] ) )
                        // Caso a atribuição não possa ser feita, por algum motivo (validação, por exemplo)
                        // o método SetValue retorna .F.
                    lRet := .F.
                    Exit  
                EndIf     
            Next nY

            If lRet
                lRet := oModel:VldData()
                
                If lRet
                    lRet := oModel:CommitData()
                Endif 
        
            EndIf 
            
            If !lRet
                //-- Busca o Erro do Modelo de Dados
                aErro := oModel:GetErrorMessage()
                        
                //-- Monta o Texto que será mostrado na tela
                AutoGrLog("Id do formulário de origem:" + ' [' + AllToChar(aErro[01]) + ']')
                AutoGrLog("Id do campo de origem: "     + ' [' + AllToChar(aErro[02]) + ']')
                AutoGrLog("Id do formulário de erro: "  + ' [' + AllToChar(aErro[03]) + ']')
                AutoGrLog("Id do campo de erro: "       + ' [' + AllToChar(aErro[04]) + ']')
                AutoGrLog("Id do erro: "                + ' [' + AllToChar(aErro[05]) + ']')
                AutoGrLog("Mensagem do erro: "          + ' [' + AllToChar(aErro[06]) + ']')
                AutoGrLog("Mensagem da solução:"        + ' [' + AllToChar(aErro[07]) + ']')
                AutoGrLog("Valor atribuído: "           + ' [' + AllToChar(aErro[08]) + ']')
                AutoGrLog("Valor anterior: "            + ' [' + AllToChar(aErro[09]) + ']')

                //-- Mostra a mensagem de Erro
                MostraErro()
            EndIf
            
            FwFreeArray(aDados)
            FwFreeArray(aErro)

            oModel:DeActivate()
            oModel:Destroy()
        
        Endif
 
    RESET ENVIRONMENT
 
Return
Exemplo de alteração e exclusão de linha
#INCLUDE 'RWMAKE.CH'
#INCLUDE 'TBICONN.CH'
#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'FWMVCDEF.CH'
 
User Function MyMata061()
 
    Local nLenProd  := 0        //-- Controle de tamanho de campo de produto
    Local lOk       := .T.      //-- Controle de validação e commit
    Local aErro     := {}       //-- Recebe msg de erro de processamento
    Local oModel061 := NIL      //-- Modelo de Dados Mata061
    Local oModelGrid:= NIL      //-- Modelo de Dados Grid
    Local cProd     := "PR-001" //-- Produto a ser alterado
    Local cForn     := ""       //-- Fornecedor posiciondo
    Local cLoja     := ""       //-- Loja do Fornecedor posicionado
    Local cForn01   := "000002" //-- Fornecedor a ser alterado
    Local cLoja01   := "01"     //-- Loja do Fornecedor a ser alterado
    Local cForn02   := "000005" //-- Fornecedor a ser excluido
    Local cLoja02   := "01"     //-- Loja do Fornecedor a ser excluido
    Local nX        := 0
    

    //-- Inicializa o ambiente
    PREPARE ENVIRONMENT EMPRESA "01" FILIAL "01" MODULO "COM"
     
    nLenProd := TamSX3("A5_PRODUTO")[1] //-- Obtem tamanho do campo A5_PRODUTO
    DbSelectArea("SA5")
    SA5->(DbSetOrder(2)) //-- A5_FILIAL+A5_PRODUTO+A5_FORNECE+A5_LOJA
 
    // Posiciona na amarração
    If SA5->(DbSeek(xFilial("SA5") + Padr(cProd, nLenProd) + cForn01 + cLoja01))
 
         
        //-- Carrega o modelo de dados e seleciona a operação de aprovação (UPDATE)
        oModel061 := FWLoadModel('MATA061')
        oModel061:SetOperation( MODEL_OPERATION_UPDATE ) // Alteração
        oModel061:Activate()

        oModelGrid := oModel061:GetModel('MdGridSA5')

        // Percorre a Grid para posicionar os itens a alterar e excluir
        For nX := 1 to oModelGrid:Length()
	    	oModelGrid:GoLine(nX)
	    	If !oModelGrid:Isdeleted() //Verifica se a linha está deletada
	    		cForn := oModelGrid:GetValue('A5_FORNECE')
                cLoja := oModelGrid:GetValue('A5_LOJA')

                // Verifica se é o Fornecedor a alterar
                If cForn+cLoja == cForn01+cLoja01
                    oModelGrid:SetValue('A5_CODPRF','Teste alteração') // Altera campo
                Endif

                // Verifica se é o Fornecedor a excluir
                If cForn+cLoja == cForn02+cLoja02
                    oModelGrid:DeleteLine() // Deleta linha do Fornecedor
                Endif
	    	EndIf	
	    Next nX
 
        //-- Valida o formulário
        lOk := oModel061:VldData()
 
        If lOk
            //-- Se validou, grava o formulário
            lOk := oModel061:CommitData()
        EndIf
 
        //-- Avalia erros
        If !lOk
            //-- Busca o Erro do Modelo de Dados
            aErro := oModel061:GetErrorMessage()
                  
            //-- Monta o Texto que será mostrado na tela
            AutoGrLog("Id do formulário de origem:" + ' [' + AllToChar(aErro[01]) + ']')
            AutoGrLog("Id do campo de origem: "     + ' [' + AllToChar(aErro[02]) + ']')
            AutoGrLog("Id do formulário de erro: "  + ' [' + AllToChar(aErro[03]) + ']')
            AutoGrLog("Id do campo de erro: "       + ' [' + AllToChar(aErro[04]) + ']')
            AutoGrLog("Id do erro: "                + ' [' + AllToChar(aErro[05]) + ']')
            AutoGrLog("Mensagem do erro: "          + ' [' + AllToChar(aErro[06]) + ']')
            AutoGrLog("Mensagem da solução:"        + ' [' + AllToChar(aErro[07]) + ']')
            AutoGrLog("Valor atribuído: "           + ' [' + AllToChar(aErro[08]) + ']')
            AutoGrLog("Valor anterior: "            + ' [' + AllToChar(aErro[09]) + ']')
 
            //-- Mostra a mensagem de Erro
            MostraErro()
        EndIf
 
        //-- Desativa o modelo de dados
        oModel061:DeActivate()
 
    Else
        MsgInfo("Documento não encontrado!", "MyExec061")
    EndIf
     
    //-- Finaliza o ambiente
    RESET ENVIRONMENT
 
Return Nil