Versões comparadas
Chave
- Esta linha foi adicionada.
- Esta linha foi removida.
- A formatação mudou.
Conceito
Nesse artigo é apresentado o novo recurso para interceptação do commit e validação do modelo MVC, permitindo uma melhor separação das operações pós gravação de modelo ( integrações com o ERP por exemplo) e validação de modelo, além de permitir o reuso dessas operações em localizações de formulários MVC.
Sobrescrevendo o bloco de Commit.
Atualmente quando é preciso realizar outras operações além da gravação do modelo no Commit do MVC (contabilização, integração fiscal, financeira e etc.) são utilizados os seguintes passos:
- Criação do bloco de commit.
- Dentro da função do bloco é executada a função FWFormCommit, para persistir o modelo.
- Abre as tabelas do modelo e executa a leitura (novamente) do modelo, executando as operações de integração
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
//------------------------------------------------------------------- /*/{Protheus.doc} ModelDef Definição do modelo de Dados Data Model definition @author alvaro.camillo @since 05/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Static Function ModelDef() Local oModel Local oStr1 := FWFormStruct(1,'ZC3') Local oStr2 := FWFormStruct(1,'ZC4') //Bloco a ser executado no Commit Local bCommit := {|oModel| MLOC003Com(oModel) } oModel := MPFormModel():New('MLOC003Old', /*bPre*/, /*bPost*/, bCommit, /*bCancel*/) oModel:SetDescription('Pedidos') oModel:addFields('ZC3MASTER',,oStr1) oModel:addGrid('ZC4DETAIL','ZC3MASTER',oStr2) oModel:SetRelation('ZC4DETAIL', { { 'ZC4_FILIAL', 'xFilial("ZC4")' }, { 'ZC4_COD', 'ZC3_COD' } }, ZC4->(IndexKey(1)) ) Return oModel //-oModel:getModel('ZC3MASTER'):SetDescription('Pedido') oModel:getModel('ZC4DETAIL'):SetDescription('Item do pedido') oModel:AddCalc( 'Totalizador', 'ZC3MASTER', 'ZC4DETAIL', 'ZC4_TOTAL', 'ZC__TOTALPED', 'SUM', /*bCondition*/, /*bInitValue*/,'Total do Pedido' /*cTitle*/, /*bFormula*/) Return oModel //------------------------------------------------------------------- /*/{Protheus.doc} MLOC003Com Função de Commit Commit Function @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Static Function MLOC003Com(oModel) Local cPadrao := "005" // Lançamento padrão a ser configurado no CT5 //Standard entries to be configured on CT5 Local nTotal := 0 // Variável totalizadora da contabilizacao //Variable with accounting total Local aFlagCTB := {} // Array com as informações para a gravação do flag de contabilização do registro//Array with informations for accounting flag record Local nHdlPrv := 0 // Handle (numero do arquivo de trabalho) utilizado na contabilizacao//Handler (working file number) used on accounting Local cLote := LoteCont("FIN") // Lote Contábil do lançamento, cada módulo tem o seu e está configurado na tabela 09 do SX5 //Temporary file used on accounting Local cArquivo := "" // Arquivo temporario usado para contabilizacao Local lMostra := .T. // Verifica se mostra ou nao tela de contabilização Local lAglutina := .F. // Verifica se aglutina lançamentos com as mesmas entidades contábeis Begin Transaction FWFormCommit( oModel ) // Função que verifica se o lançamento padrão foi configurado pelo cliente // Function which verify if the accounting entry was configured by customer If VerPadrao(cPadrao) // Rotina que abre o capa do lote contábil ( Inicio da Contabilização) // Accounting beginning nHdlPrv := HeadProva(cLote,FunName(),Substr(cUsername,1,6),@cArquivo) EndIf ZC4->(dbSetOrder(1))//ZC4_FILIAL+ZC4_COD+ZC4_ITEM ZC0->(dbSetOrder(1))//ZC0_FILIAL+ZC0_COD+ZC0_LOJA ZC1->(dbSetOrder(1))//ZC1_FILIAL+ZC1_COD ZC0->(MsSeek(xFilial("ZC0") + ZC3->(ZC3_CLIENT + ZC3_LOJA) )) If ZC4->(dbSeek( xFilial("ZC4") + ZC3->ZC3_COD )) While ZC4->(!EOF()) .And. ZC4->(ZC4_FILIAL+ZC4_COD) == xFilial("ZC4") + ZC3->ZC3_COD ZC1->(MsSeek(xFilial("ZC4") + ZC4->ZC4_PROD )) If nHdlPrv > 0 aAdd(aFlagCTB,{"ZC4_LA","S","ZC4",ZC4->(Recno()),0,0,0}) // Função que interpreta todas as sequencias de lançamento configurada pelo usuário e cria as linhas de lançamento contábil // Executada uma vez para cada registro que quer ser contabilizado nTotal += DetProva(nHdlPrv,cPadrao,FunName// Function which interpret all sequences of the standard entries and creates the accounting entries. // Executed once for each record which will be accounted for. nTotal += DetProva(nHdlPrv,cPadrao,FunName(),cLote,,,,,,,,@aFlagCTB) Endif ZC4->(dbSkip()) EndDo If nHdlPrv > 0 .And. ( nTotal > 0 ) // Função que fecha o lote contábil // Function that closes the accounting lot RodaProva(nHdlPrv, nTotal) // Função que apresenta a tela de contabilização, realiza aglutinação caso necessária e grava o documento contábil ( CT2 ) cA100Incl(cArquivo,nHdlPrv,// Function that shows the account dialog, performs the grouping if needed and records the accounting document ( CT2 ) cA100Incl(cArquivo,nHdlPrv,3,cLote,lMostra,lAglutina) Endif EndIf End Transaction Return .T. |
Porém essa implementação tem limitações como:
- Uso excessivo de bloco de código com gasto de memória e baixa performance.
- É preciso realizar a leitura novamente dos registros para as operações de integração.
- O controle de transação fica por conta do desenvolvedor.
- Em um fonte localizado não é possível estender o comportamento do commit, incluindo novas operações.
O padrão Observer
O Observer é um padrão de projeto de software que define uma dependência um-para-muitos entre objetos de modo que quando um objeto muda o estado, todos seus dependentes são notificados e atualizados automaticamente. Permite que objetos interessados sejam avisados da mudança de estado ou outros eventos ocorrendo num outro objeto.(https://pt.wikipedia.org/wiki/Observer)
O padrão Observer no MVC Protheus - Utilizando a classe FWModelEvent
Em um fomulário MVC esse padrão é aplicado utilizando os seguintes passos:
- Desenvolver uma classe que herde da classe FWModelEvent.
- Inscrever um objeto dessa classe no modelo.
Desenvolvendo uma classe FWModelEvent
Essa classe será responsável pela a operação que complementa a persistência do modelo e a validação e será chamada toda vez que o formulário onde ele foi inscrito realize o commit ou realize alguma validação
Essa classe deve herdar da classe FWModelEvent e implementar os seguintes métodos:
Aviso | ||
---|---|---|
Painel | ||
| ||
Sintaxe FWModelEvent ():New()-> Objeto FWModelEvent
Descrição Construtor da classe. Método Obrigatório para ser implementado
|
Painel | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||
Sintaxe FWModelEvent ():After(oSubModel, cModelId, cAlias, lNewRecord)
Descrição Método que é chamado pelo MVC quando ocorrer as ações do commit
Parâmetros
|
| |
|
Essa classe deve herdar da classe FWModelEvent e implementar os seguintes métodos:
Painel | ||
---|---|---|
| ||
Sintaxe FWModelEvent ():New()-> Objeto FWModelEvent Descrição Construtor da classe. Método Obrigatório para ser implementado |
Painel | ||
---|---|---|
| ||
Sintaxe FWModelEvent ():Destroy() Descrição Destrutor da classe Utilize para limpar atributos que são array ou objetos. Exemplo Limpeza de array: aSize(aArray, 0) aArray := Nil Limpeza de objeto oObject := Nil |
Painel | |||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||
Painel | |||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||
Sintaxe FWModelEvent ():BeforeAfter(oSubModel, cModelId, cAlias, lNewRecord) Descrição Método que é chamado pelo MVC quando ocorrer as ações do commit Parâmetros cModelId
| |
| | | |
Painel | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||
Sintaxe FWModelEvent ():AfterTTSBefore(oModeloSubModel, cModelId, cAlias, lNewRecord) Descrição Método que é chamado pelo MVC quando ocorrer as ações do após a transação. commit Parâmetros
|
Painel | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||
Sintaxe FWModelEvent ():BeforeTTSAfterTTS(oModel, cModelId) Descrição Método que é chamado pelo MVC quando ocorrer as ações do commit antes da após a transação. Esse evento ocorre uma vez no contexto do modelo principal. Parâmetros
|
Painel | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||
Sintaxe FWModelEvent ():InTTSBeforeTTS(oModel, cModelId) Descrição Método que é chamado pelo MVC quando ocorrer as ações do commit Após as gravações porém Esse evento ocorre uma vez no contexto do modelo principal. Parâmetros
|
Painel | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||
Sintaxe FWModelEvent ():ModelPreVldInTTS(oModel, cModelId) -> lOK
Descrição Método que é chamado pelo MVC quando ocorrer as ações de pre validação do Modeldo commit Após as gravações porém Esse evento ocorre uma vez no contexto do modelo principal. Parâmetros
|
Painel | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||
Sintaxe FWModelEvent ():ModelPosVldActivate(oModel, cModelIdlCopy) -> lOK Descrição Método que é chamado pelo MVC quando ocorrer as ações de pos validação a ativação do Model. Esse evento ocorre uma vez no contexto do modelo principal. Parâmetros
cModelId Caracter Id do submodelo
|
Painel | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
Sintaxe FWModelEvent FWModelEvent (): DeActivate(oModel) Descrição Método que é chamado pelo MVC quando ocorrer a desativação do Model. Esse evento ocorre uma vez no contexto do modelo principal. Parâmetros
|
Painel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sintaxe FWModelEvent (): VldActivate(oModel, cModelIdGridPreVld(oSubModel, cModelID, nLine, cAction, cId, xValue, xCurrentValue) -> lOK Descrição Método que é chamado pelo MVC quando ocorrer as ações de pre validação do GridModel. Esse evento ocorre uma vez no contexto do modelo principal. Parâmetros
nLine | Numérico | Linha do grid | | | | cAction | Caracter | Ação executada no grid, podendo ser: ADDLINE, UNDELETE, DELETE | | | | cId | Caracter | nome do campo | | | | xValue | Variável | Novo valor do campo | | | | xCurrentValue | Variável | Valor atual do campo | | | | |
Painel | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||
Painel | ||||||||||||||||||||||||
| ||||||||||||||||||||||||
Sintaxe FWModelEvent ():GridPosVldModelPreVld(oSubModeloModel, cModelIDcModelId) -> lOK Descrição Método que é chamado pelo MVC quando ocorrer as ações de pós pre validação do GridModel Esse evento ocorre uma vez no contexto do modelo principal. Parâmetros
|
Painel | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||
Sintaxe FWModelEvent ():GridLinePreVldModelPosVld(oSubModel, cModelID, nLine, cAction, cId, xValue, xCurrentValueoModel, cModelId) -> lOK
Descrição Método que é chamado pelo MVC quando ocorrer as ações de pre pos validação da linha do GridModel Esse evento ocorre uma vez no contexto do modelo principal. Parâmetros
|
Painel | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||
nLine | Numérico | Linha do grid | ||||||||||||||||
cAction | Caracter | Ação executada no grid, podendo ser: ADDLINE, UNDELETE, DELETE, SETVALUE, CANSETVALUE, ISENABLE | ||||||||||||||||
cId | Caracter | nome do campo | ||||||||||||||||
xValue | Variável | Novo valor do campo | ||||||||||||||||
xCurrentValue | Variável | Valor atual do campo | ||||||||||||||||
Sintaxe FWModelEvent ():GridPosVld(oSubModel, cModelID) -> lOK Descrição Método que é chamado pelo MVC quando ocorrer as ações de pós validação do Grid Parâmetros
|
Painel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Painel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sintaxe FWModelEvent ():GridLinePosVldGridLinePreVld(oSubModel, cModelID, nLine) -> lOK , cAction, cId, xValue, xCurrentValue) -> lOK Descrição Método que é chamado pelo MVC quando ocorrer as ações de pos pre validação da linha do Grid Parâmetros
| |
|
Painel | |||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||
Sintaxe FWModelEvent ():FieldPreVldGridLinePosVld(oSubModel, cModelID, cAction, cId, xValuenLine) -> lOK
Descrição Método que é chamado pelo MVC quando ocorrer a ação as ações de pos validação da linha do Field Grid Parâmetros
cModelId Caracter
cAction | Caracter | Ação executada no grid, podendo ser: SETVALUE, CANSETVALUE | | | | cId | Caracter | nome do campo | | | | xValue | Caracter | Novo valor do campo | | | |
|
Painel | |||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||
Sintaxe FWModelEvent ():FieldPosVldFieldPreVld(oSubModel, cModelID, cAction, cId, xValue) -> lOK Descrição Método que é chamado pelo MVC quando ocorrer a ação de pre pré validação do Field
Parâmetros
|
Painel | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||
Sintaxe FWModelEvent ():FieldPosVld(oSubModel, cModelID) -> lOK Descrição Método que é chamado pelo MVC quando ocorrer a ação de pós validação do Field Parâmetros
|
Painel | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
Sintaxe FWModelEvent ():GetEvent(cIdEvent) -> oEvent Descrição Método que retorna um evento superior da cadeia de eventos. Parâmetros
|
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
#Include 'Protheus.ch'
#Include 'FWMVCDef.ch'
| ||||||||||||
Bloco de código | ||||||||||||
| ||||||||||||
#Include 'Protheus.ch' #Include 'FWMVCDef.ch' //------------------------------------------------------------------- /*/{Protheus.doc} ML003PRORUS Classe interna implementando o Observer do Commit para atualização de saldo no produto @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Class ML003PRORUS FROM FWModelEvent Method New() Method After() Method GetName() End Class //------------------------------------------------------------------- /*/{Protheus.doc} getName Retorna um nome unico para esse objeto. @author Rodrigo Antonio @version P11.8ML003PRORUS Classe interna implementando o FWModelEvent Intern class inherited from FWModelEvent. @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Class ML003PRORUS FROM FWModelEvent Method After() Method GetNameNew() End Class Method New() Class ML003PRORUS Return "ML003PROCOMMIT" Method After(oModel, cModelId, cAlias, lNewRecord) Class ML003PRORUS If cAlias == "ZC4" .And. lNewRecord ZL1->(dbSetOrder(1))//ZL1_FILIAL+ZL1_COD If ZL1->(MsSeek(xFilial("ZL1") + ZC4->ZC4_PROD )) RecLock("ZL1",.F.) ZL1->ZL1_QTVEND += ZC4->ZC4_QUANT MsUnLock() EndIf EndIf Return Method new() Class ML003PRORUS Return |
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
#Include #Include 'Protheus.ch' #Include 'FWMVCDef.ch' //------------------------------------------------------------------- /*/{Protheus.doc} ML003CTB Classe interna implementando o Observer do CommitFWModelEvent Intern class inherited from FWModelEvent. @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Class ML003CTB FROM FWModelEvent DATA cPadrao // Lançamento padrão a ser configurado no CT5 DATA nTotal // //Standard entries to be configured on CT5 DATA cPadrao //Variável totalizadora da contabilizacao //Variable with accounting total DATA aFlagCTB nTotal // Array com as informações para a gravação do flag de contabilização do registro //Array with informations for accounting flag record DATA nHdlPrv aFlagCTB // Handle (numero do arquivo de trabalho) utilizado na contabilizacao DATA cLote //Handler (working file number) used on accounting DATA cArquivo nHdlPrv // Arquivo temporario usado para contabilizacao //Métodos sobrescritos da classe FWModelEvent //Temporary file used on accounting DATA cArquivo DATA cLote Method new() Method After() Method AfterTTS() Method BeforeTTS() Method getName() Method ModelPosModelPosVld() Method GridLinePreGridLinePreVld() //Métodos específicos da classe Method openCTB() Method closeCTB() Method writeLineCTB() End Class //------------------------------------------------------------------- /*/{Protheus.doc} getName Retorna um nome unico para esse objeto. @author Rodrigo Antonio @version P11.8 /*/ //------------------------------------------------------------------- Method getName() Class ML003CTB Return "ML003CTBCOMMIT" Method Destroy() End Class Method new () Class ML003CTB self:cPadrao := "005" self:nTotal := 0 self:aFlagCTB := {} self:nHdlPrv := 0 self:cLote := "" self:cArquivo := "" Return Method Destroy() Class ML003CTB self:aFlagCTB := aSize(self:aFlagCTB,0) self:aFlagCTB := Nil Return //------------------------------------------------------------------- /*/{Protheus.doc} BeforeTTS Inicio da transação com a abertura do lote contabil Transaction beginning and the oppening of lot accounting @author Rodrigo Antonio @version P12 /*/ //------------------------------------------------------------------- Method BeforeTTS(oModel, cModelId) Class ML003CTB self:openCTB(oModel) Return //------------------------------------------------------------------- /*/{Protheus.doc} After ApósExecutado após a gravaçao de cada linha para realizar detprova lançamento contábil Runs after every line recording to execute the accounting entries @author Rodrigo Antonio @version P12 /*/ //------------------------------------------------------------------- Method After(oModel, cModelId, cAlias, lNewRecord) Class ML003CTB self:writeLineCTB(oModel,cModelId,cAlias,lNewRecord) Return //------------------------------------------------------------------- /*/{Protheus.doc} AfterTTS Fechamento da contabilização. @author Rodrigo Antonio @version P12 /*/ Accounting closing. @author Rodrigo Antonio @version P12 /*/ //------------------------------------------------------------------- Method AfterTTS(oModel, cModelId) Class ML003CTB self:closeCTB(oModel) Return //------------------------------------------------------------------- Method AfterTTS(oModel, cModelId) Class ML003CTB self:closeCTB(oModel) Return Method new () Class ML003CTB self:cPadrao := "005" self:nTotal := 0 self:aFlagCTB := {} self:nHdlPrv := 0 self:cLote := "" self:cArquivo := "" Return /*/{Protheus.doc} openCTB Metodo para ser executado antes da transação para abrir o header de contabilização Method to be executed before the accounting header openning transaction @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //-------------------------------------------------------------------- Method openCTB(oModel) Class ML003CTB /*/{Protheus.doc} openCTB Bloco para ser executado antes da transação para abrir o header de contabilização @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method openCTB(oModel) Class ML003CTB Local lRet := .T. self:cPadrao := "005" // Lançamento padrão a ser configurado no CT5 self:nTotal := 0 // Variável totalizadora da contabilizacao self:aFlagCTB := {} // Array com as informações para a gravação do flag de contabilização do registro self:nHdlPrv := 0 // Handle (numero do arquivo de trabalho) utilizado na contabilizacao/Lançamento padrão a ser configurado no CT5 //Standard entries to be configured on CT5 self:cPadrao := "005" //Variável totalizadora da contabilizacao //Variable with accounting total self:nTotal := 0 //Array com as informações para a gravação do flag de contabilização do registro //Array with informations for accounting flag record self:aFlagCTB := {} //Handle (numero do arquivo de trabalho) utilizado na contabilizacao //Handler (working file number) used on accounting self:nHdlPrv := 0 // Lote Contábil do lançamento, cada módulo tem o seu e está configurado na tabela 09 do SX5 //accounting lot. Each model has a corresponding lot configured on the table 09 of SX5 self:cLote := LoteCont("FIN") //Arquivo Lote Contábil do lançamento, cada módulo tem o seu e está configurado na tabela 09 do SX5temporario usado para contabilizacao //Temporary file used on accounting self:cArquivo := "" // Arquivo temporario usado para contabilizacao // Função que verifica se o lançamento padrão foi configurado pelo cliente // Function which verify if the accounting entry was configured by customer If VerPadrao(self:cPadrao) // Rotina que abre o capa do lote contábil ( Inicio da Contabilização) // Accounting beginning self:nHdlPrv := HeadProva(self:cLote,FunName(),Substr(cUsername,1,6),@self:cArquivo) EndIf Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} writeLineCTB BlocoMetodo para ser executado depois da gravação. Method to be executed after the data recording @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method writeLineCTB(oModel,cModelId,cAlias,lNewRecord) Class ML003CTB Local lRet := .T. Class ML003CTB Local aArea:= GetArea() If cAlias == "ZC4" ZC0->(dbSetOrder(1))//ZC0_FILIAL+ZC0_COD+ZC0_LOJA ZC1->(dbSetOrder(1))//ZC1_FILIAL+ZC1_COD ZC0->(MsSeek(xFilial("ZC0") + ZC3->(ZC3_CLIENT + ZC3_LOJA) )) ZC1->(MsSeek(xFilial("ZC4") + ZC4->ZC4_PROD )) If self:nHdlPrv > 0 aAdd(self:aFlagCTB,{"ZC4_LA","S","ZC4",ZC4->(Recno()),0,0,0}) // Função que interpreta todas as sequencias de lançamento configurada pelo usuário e cria as linhas de lançamento contábil // Executada uma vez para cada registro que quer ser contabilizado // Function which interpret all sequences of the standard entries and creates the accounting entries. // Executed once for each record which will be accounted for. self:nTotal += DetProva(self:nHdlPrv,self:cPadrao,FunName(),self:cLote,,,,,,,,@self:aFlagCTB) Endif Endif RestArea(aArea) Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} closeCTB BlocoMetodo para ser executado depois da transação executado depois da transação. Method to be executed after the transaction. @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method closeCTB(oModel) Class ML003CTB Local lRet := .T. // Verifica se mostra ou nao tela de contabilização // Verify if accounting dialog will to be shown Local lMostra := .T. // Verifica se mostraaglutina lançamentos oucom naoas telamesmas deentidades contabilização Local lAglutina := .F. // Verifica se aglutina lançamentos com as mesmas entidades contábeiscontábeis // Verify if it's needed to group entries with the same accounting entities' Local lAglutina := .F. If self:nHdlPrv > 0 .And. ( self:nTotal > 0 ) // Função que fecha o lote contábil // Function that closes the accounting lot RodaProva(self:nHdlPrv, self:nTotal) // Função que apresenta a tela de contabilização, realiza aglutinação caso necessária e grava o documento contábil ( CT2 ) // Function that shows the account dialog, performs the grouping if needed and records the accounting document ( CT2 ) cA100Incl(self:cArquivo,self:nHdlPrv,3,self:cLote,lMostra,lAglutina) Endif Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} ModelPos BlocoMetodo de pos validação do modelo do modelo. Model post validation method. @author Guilherme Spadaccia @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method ModelPosModelPosVld(oModel, cModelId) Class ML003CTB Local lRet := .T. lRet := _Super:ModelPos(oModel, cModelId) //Defino o model que irei validar //Define which model will be validated If cModelId == 'MLOC003' If oModel:GetValue('ZC3MASTER','ZC3_COD') == "000000" lRet := .F. Help("",1,"VALID",,"Ops,Code código000000 000000is reservado!reserved",1,0) EndIf EndIf Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} GridLinePre BlocoMetodo de pré validação da linha da Grid. Grid line pre validation method. @author Guilherme Spadaccia @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method GridLinePreGridLinePreVld(oSubModel, cModelID, nLine, cAction, cId, xValue, xCurrentValue) Class ML003CTB Local lRet := .T. lRet := _Super:GridLinePre(oSubModel, cModelID, nLine, cAction, cId, xValue, xCurrentValue) If cModelID == "ZC4DETAIL" If cAction == "SETVALUE" .And. cId == "ZC4_QUANT" If xValue%2 > 0 lRet := .F. Help("",1,"VALID",,"Ops,Only sópair podemosquantities vender quantidades pares!are accepted",1,0) EndIf EndIf EndIf Return lRet |
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
#Include 'Protheus.ch' #Include 'FWMVCDef.ch' //------------------------------------------------------------------- /*/{Protheus.doc} ML003CTBRUS Classe interna implementando o Observer do Commit de contabilizacao no padrão Russo FWModelEvent localizando para padrão Russo Intern class inherited from FWModelEvent for russian Standard. @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Class ML003CTBRUS FROM ML003CTBFWModelEvent Method writeLineCTBNew() Method NewAfter() Method ModelPosModelPosVld() Method GridLinePreGridLinePreVld() End Class Method newNew() Class ML003CTBRUS _Super:new() Return //------------------------------------------------------------------- /*/{Protheus.doc} writeLineCTBAfter BlocoMétodo para ser executado depois da gravação. sobrescrito de ML003CTB Method to be executed after the data recording @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method writeLineCTBAfter(oModel,cModelId,cAlias,lNewRecord) Class ML003CTBRUS Local lRet aArea:= .T.GetArea() Local oEventCtb aArea:= GetArea() _Super:writeLineCTB(oModel,cModelId,cAlias,lNewRecord self:GetEvent("ML003CTB") If cAlias == "ZL4" If selfoEventCtb:nHdlPrv > 0 aAdd(selfoEventCtb:aFlagCTB,{"ZL4_LA","S","ZL4",ZL4->(Recno()),0,0,0}) // Função que interpreta todas as sequencias de lançamento configurada pelo usuário e cria as linhas de lançamento contábil // Executada uma vez para cada registro que quer ser contabilizado self// Function which interpret all sequences of the standard entries and creates the accounting entries. // Executed once for each record which will be accounted for. oEventCtb:nTotal += DetProva(selfoEventCtb:nHdlPrv,"006",FunName(),selfoEventCtb:cLote,,,,,,,,@self@oEventCtb:aFlagCTB) Endif Endif RestArea(aArea) Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} ModelPos BlocoMetodo de pos validação do modelo. Esse metódo sobrescreve o método da classe ML003CTB do modelo. Model post validation method. @author Guilherme Spadaccia @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method ModelPosModelPosVld(oModel, cModelId) Class ML003CTBRUS Local lRet := .T. lRet := _Super:ModelPos(oModel, cModelId) //Defino o model que irei validar If cModelId == 'MLOC003' If oModel:GetValue('ZC3MASTER','ZC3_COD') == "000001" lRet := .F. Help("",1,"VALID",,"Ops, códigoCode 000001 reservadois parareserved ain Russia!.",1,0) EndIf EndIf Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} GridLinePre BlocoMetodo de pré validação da linha da Grid. Grid Esseline metódopre sobrescreve o método da classe ML003CTBvalidation method. @author Guilherme Spadaccia @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method GridLinePre(oSubModel, cModelID, nLine, cAction, cId, xValue, xCurrentValue) Class ML003CTBRUS Local lRet := .T. lRet := _Super:GridLinePre Method GridLinePreVld(oSubModel, cModelID, nLine, cAction, cId, xValue, xCurrentValue) Class ML003CTBRUS Local lRet := .T. If cModelID == "ZC4DETAIL" If cAction == "SETVALUE" .And. cId == "ZC4_QUANT" If xValue > 10 lRet := .F. Help("",1,"VALID",,"Ops,Only naquantities Russiaunder só10 podemos vender até 10 unidades!are accepted",1,0) EndIf EndIf EndIf Return lRet |
Inscrever um objeto no modelo.
Nessa etapa, no formulário MVC é preciso inscrever o objeto pelo método InstallEvent:
Painel | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||
Sintaxe MPFormModel():InstallEvent(cIdEvent, cOwner, oEvent)
Descrição Método de inscrição de objeto FwModelEvent
Parâmetros Através do método InstallEvent, é possível encadear dois eventos que estão relacionados, como por exemplo um Parâmetros
Objeto Objeto que herde da classe FwModelEvent()
|
| |||||||||
Aviso | |||||||||
---|---|---|---|---|---|---|---|---|---|
| |||||||||
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
//------------------------------------------------------------------- /*/{Protheus.doc} ModelDef Definição do modelo de Dados Data Model definition @author alvaro.camillo @since 05/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Static Function ModelDef() Local oModel Local oStr1 := FWFormStruct(1,'ZC3') Local oStr2 := FWFormStruct(1,'ZC4') Local oEvent := ML003CTB():New() oModel := MPFormModel():New('MLOC003', /*bPre*/, /*bPost*/, /*bCommit*/, /*bCancel*/) oModel:SetDescription('Pedidos') oModel:addFields('ZC3MASTER',,oStr1) oModel:addGrid('ZC4DETAIL','ZC3MASTER',oStr2) oModel:SetRelation('ZC4DETAIL', { { 'ZC4_FILIAL', 'xFilial("ZC4")' }, { 'ZC4_COD', 'ZC3_COD' } }, ZC4->(IndexKey(1)) ) oModel:getModel('ZC3MASTER'):SetDescription('PedidoPedido') oModel:getModel('ZC4DETAIL'):SetDescription('Item do pedido') oModel:getModel('ZC4DETAIL'):SetDescriptionSetUseOldGrid('Item do.T. pedido') oModel:AddCalc( 'Totalizador', 'ZC3MASTER', 'ZC4DETAIL', 'ZC4_TOTAL', 'ZC__TOTALPED', 'SUM', /*bCondition*/, /*bInitValue*/,'Total do Pedido' /*cTitle*/, /*bFormula*/) oModel:InstallEvent("ML003CTB", /*cOwner*/, oEvent) Return oModel |
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
//------------------------------------------------------------------- /*/{Protheus.doc} ModelDef Definição do modelo de Dados Data Model definition @author alvaro.camillo @since 05/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Static Function ModelDef() Local oModel := FWLoadModel('MLOC003') Local oStr2 := FWFormStruct(1,'ZL4') Local oObsCTB := ML003CTBRUS():New() Local oObsProduto := ML003PRORUS():New() oModel:addGrid('ZL4DETAIL','ZC4DETAIL',oStr2) oModel:SetRelation('ZL4DETAIL', { { 'ZL4_FILIAL', 'xFilial("ZL4")' }, { 'ZL4_COD', 'ZC3_COD' }, { 'ZL4_ITEM', 'ZC4_ITEM' } }, ZL4->(IndexKey(1)) ) oModel:getModel('ZL4DETAIL'):SetDescription('Rateio do Item Russo') oModel:getModel('ZL4DETAIL'):SetOptional(.T.) //Limpa os observer poisInstala o observerevento dade contabilizaçãoatualização seráde herdado saldo //InstalaInstall oBalance evento de contabilizao Russaupdate Event oModel:ChangeEventInstallEvent("ML003CTBCOMMITML00PRORUS", , oObsCTBoObsProduto) //Instala o evento de atualização de saldocontabilizao Russa //Install Russian Accounting Event oModel:InstallEvent(oObsProduto"ML003CTBRUS", "ML003CTB", oObsCTB) Return oModel |
Status do documento | Desenvolvimento |
---|---|
Data | |
Versão | 1.0 |
Autores | Alvaro Camillo Neto |
Índice | ||||||
|