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âmetrosParâmetros
| | |
| | |
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.
Parâmetros 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 Model
Parâmetros
do 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 (): GridPreVld(oSubModel, cModelID, nLine, cAction, cId, xValue, xCurrentValue) -> lOK DeActivate(oModel) Descrição Método que é chamado pelo MVC quando ocorrer as ações de pre validação do Grid
Parâmetros a desativação do Model. Esse evento ocorre uma vez no contexto do modelo principal. Parâmetros
|
Painel | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
| ||||||||||||||||
cModelId | Caracter | Id do submodelo |
|
|
| |||||||||||||
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 | ||||||||||||||||
Sintaxe FWModelEvent (): VldActivate(oModel, cModelId) -> lOK Descrição Método que é chamado pelo MVC quando ocorrer as ações de validação do Model. Esse evento ocorre uma vez no contexto do modelo principal. Parâmetros
|
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 Grid
Parâmetros Model 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) -> , 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 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||
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' //------------------------------------------------------------------- /*/{Protheus.doc} ML003PRORUS Classe interna implementando o ObserverFWModelEvent Intern doclass Commitinherited para atualização de saldo no produtofrom FWModelEvent. @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Class ML003PRORUS FROM FWModelEvent Method After() Method New() End Class Method New() Class ML003PRORUS Return 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 |
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 DATA aFlagCTB //Variable Arraywith com asaccounting total DATA nTotal //Array com as informações para a gravação do flag de contabilização do registro DATA nHdlPrv // //Array with informations for accounting flag record DATA 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 //Temporary file used on accounting DATA cArquivo DATA cLote Method new() Method After() Method AfterTTS() Method BeforeTTS() Method ModelPosVld() Method GridLinePreVld() Method openCTB() Method closeCTB() Method writeLineCTB() End Class 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 @author Rodrigo Antonio @version P12 /*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. Accounting closing. @author Rodrigo Antonio @version P12 /*/ //------------------------------------------------------------------- Method AfterTTS(oModel, cModelId) Class ML003CTB self:closeCTB(oModel) Return //------------------------------------------------------------------- /*/{Protheus.doc} openCTB BlocoMetodo 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 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--------- Method openCTB(oModel) Class ML003CTB //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 Lotetemporario Contábilusado dopara lançamento,contabilizacao cada módulo tem o seu e está configurado na tabela 09 do SX5 //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 // FunçãoFunction quewhich verificaverify seif othe lançamento padrãoaccounting foientry configuradowas peloconfigured clienteby 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 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 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. // ExecutadaExecuted umaonce vezfor paraeach cadarecord registrowhich quewill querbe seraccounted contabilizadofor. self:nTotal += DetProva(self:nHdlPrv,self:cPadrao,FunName(),self:cLote,,,,,,,,@self:aFlagCTB) Endif Endif RestArea(aArea) Return //------------------------------------------------------------------- /*/{Protheus.doc} closeCTB BlocoMetodo para ser 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. Local lMostra := .T. // Verifica se mostra ou nao tela de contabilização Local lAglutina // Verify if accounting dialog will to be shown Local lMostra := .F. T. // Verifica se aglutina lançamentos com as mesmas entidades contá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 ) // FunçãoFunction quethat apresentashows a telathe deaccount contabilizaçãodialog, realizaperforms the aglutinaçãogrouping casoif necessárianeeded eand gravarecords othe documentoaccounting contábildocument ( CT2 ) cA100Incl(self:cArquivo,self:nHdlPrv,3,self:cLote,lMostra,lAglutina) Endif Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} ModelPos BlocoMetodo de pos validação do modelo. Model post validation method. @author Guilherme Spadaccia @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method ModelPosVld(oModel, cModelId) Class ML003CTB Local lRet := .T. //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 GridLinePreVld(oSubModel, cModelID, nLine, cAction, cId, xValue, xCurrentValue) Class ML003CTB Local lRet := .T. 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 interna implementando o 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 FWModelEvent Method New() Method After() Method ModelPosVld() Method GridLinePreVld() End Class Method New() Class ML003CTBRUS 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 After(oModel,cModelId,cAlias,lNewRecord) Class ML003CTBRUS Local aArea:= GetArea() Local oEventCtb := self:GetEvent("ML003CTB") If cAlias == "ZL4" If oEventCtb:nHdlPrv > 0 aAdd(oEventCtb: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 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. // ExecutadaExecuted umaonce vezfor paraeach cadarecord registrowhich quewill querbe seraccounted contabilizadofor. oEventCtb:nTotal += DetProva(oEventCtb:nHdlPrv,"006",FunName(),oEventCtb:cLote,,,,,,,,@oEventCtb:aFlagCTB) Endif Endif RestArea(aArea) Return //------------------------------------------------------------------- /*/{Protheus.doc} ModelPosVldModelPos BlocoMetodo de pos validação do modelo. Model Essepost metódo sobrescreve o método da classe ML003CTBvalidation method. @author Guilherme Spadaccia @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method ModelPosVld(oModel, cModelId) Class ML003CTBRUS Local lRet := .T. //Defino o model que irei validar If cModelId == 'MLOC003' If oModel:GetValue('ZC3MASTER','ZC3_COD') == "000001" lRet := .F. Help("",1,"VALID",,"Ops, código 000001 reservado para a Russia!",1,0) //oModel:SetErrorMessage( , , , ,, "Ops, código 000001 reservado para a Russia!" "",1,"VALID",,"Code 000001 is reserved in Russia.",1,0) EndIf EndIf Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} GridLinePreVldGridLinePre 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 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, na Russia só podemos vender até 10 unidades!",1,0) //oSubModel:Getmodel():SetErrorMessage( , , , ,, "Ops, na Russia só podemos vender até 10 unidades!" ) Help("",1,"VALID",,"Only quantities under 10 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 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 pois Instala 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 | ||||||
|