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 @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 //------------------------------------------------------------------- /*/{Protheus.doc} MLOC003Com Função de Commit @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 Local nTotal := 0 // Variável totalizadora da contabilizacao Local aFlagCTB := {} // Array com as informações para a gravação do flag de contabilização do registro Local nHdlPrv := 0 // Handle (numero do arquivo de trabalho) utilizado na contabilizacao Local cLote := LoteCont("FIN") // Lote Contábil do lançamento, cada módulo tem o seu e está configurado na tabela 09 do SX5 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 If VerPadrao(cPadrao) // Rotina que abre o capa do lote contábil ( Inicio da Contabilização) 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(),cLote,,,,,,,,@aFlagCTB) Endif ZC4->(dbSkip()) EndDo If nHdlPrv > 0 .And. ( nTotal > 0 ) // Função que fecha o lote contábil 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,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:
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
|
Painel | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||
Sintaxe FWModelEvent ():Before(oSubModel, cModelId, cAlias, lNewRecord)
Descrição Método que é chamado pelo MVC quando ocorrer as ações do commit
Parâmetros
|
Painel | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||
Sintaxe FWModelEvent ():AfterTTS(oModel, cModelId)
Descrição Método que é chamado pelo MVC quando ocorrer as ações do após a transação.
Parâmetros
|
Painel | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||
Sintaxe FWModelEvent ():BeforeTTS(oModel, cModelId)
Descrição Método que é chamado pelo MVC quando ocorrer as ações do commit antes da transação.
Parâmetros
|
Painel | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||
Sintaxe FWModelEvent ():InTTS(oModel, cModelId)
Descrição Método que é chamado pelo MVC quando ocorrer as ações do commit Após as gravações porém
Parâmetros
|
Painel | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||
Sintaxe FWModelEvent ():ModelPreVld(oModel, cModelId) -> lOK
Descrição Método que é chamado pelo MVC quando ocorrer as ações de pre validação do Model
Parâmetros
|
Painel | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||
Sintaxe FWModelEvent ():ModelPosVld(oModel, cModelId) -> lOK
Descrição Método que é chamado pelo MVC quando ocorrer as ações de pos validação do Model
Parâmetros
|
Painel | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||
Sintaxe FWModelEvent ():GridPreVld(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 Grid
Parâmetros
|
Painel | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||
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 | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||
Sintaxe FWModelEvent ():GridLinePreVld(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 da linha do Grid
Parâmetros
|
Painel | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||
Sintaxe FWModelEvent ():GridLinePosVld(oSubModel, cModelID, nLine) -> lOK
Descrição Método que é chamado pelo MVC quando ocorrer as ações de pos validação da linha do Grid
Parâmetros
|
Painel | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||
Sintaxe FWModelEvent ():FieldPreVld(oSubModel, cModelID, cAction, cId, xValue) -> lOK
Descrição Método que é chamado pelo MVC quando ocorrer a ação de pos 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 pre validação do Field
Parâmetros
|
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 NewAfter() Method AfterNew() End Class Method GetNameNew() Class End 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 'Protheus.ch' #Include 'FWMVCDef.ch' //------------------------------------------------------------------- /*/{Protheus.doc} getNameML003CTB RetornaClasse uminterna nomeimplementando unicoo paraObserver essedo objeto.Commit @author Rodrigo Antonioalvaro.camillo @since 06/09/2016 @version P111.80 /*/ //------------------------------------------------------------------- Method GetName() 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 'Protheus.ch' #Include 'FWMVCDef.ch' //------------------------------------------------------------------- /*/{Protheus.doc} ML003CTB Classe interna implementando o Observer do Commit @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 // Variável totalizadora da contabilizacao DATA aFlagCTB // Array com as informações para a gravação do flag de contabilização do registro DATA nHdlPrv // Handle (numero do arquivo de trabalho) utilizado na contabilizacao DATA cLote DATA cArquivo // Arquivo temporario usado para contabilizacao //Métodos sobrescritos da classe FWModelEvent Method new() Method After() Method AfterTTS() Method BeforeTTS() Method getName() Method ModelPos() Method GridLinePre() //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" Class ML003CTB FROM FWModelEvent DATA cPadrao // Lançamento padrão a ser configurado no CT5 DATA nTotal // Variável totalizadora da contabilizacao DATA aFlagCTB // Array com as informações para a gravação do flag de contabilização do registro DATA nHdlPrv // Handle (numero do arquivo de trabalho) utilizado na contabilizacao DATA cLote DATA cArquivo // Arquivo temporario usado para contabilizacao Method new() Method After() Method AfterTTS() Method BeforeTTS() Method ModelPosVld() Method GridLinePreVld() Method openCTB() Method closeCTB() Method writeLineCTB() End Class Method new () Class ML003CTB self:cPadrao := "005" self:nTotal := 0 self:aFlagCTB := {} self:nHdlPrv := 0 self:cLote := "" self:cArquivo := "" Return //------------------------------------------------------------------- /*/{Protheus.doc} BeforeTTS Inicio da transação com a abertura do lote contabil @author Rodrigo Antonio @version P12 /*/ //------------------------------------------------------------------- Method BeforeTTS(oModel, cModelId) Class ML003CTB self:openCTB(oModel) Return //------------------------------------------------------------------- /*/{Protheus.doc} After Após gravaçao de cada linha para realizar detprova @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 /*/ //------------------------------------------------------------------- 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----- Method AfterTTS(oModel, cModelId) Class ML003CTB self:closeCTB(oModel) Return //------------------------------------------------------------------- /*/{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 self:cLote := LoteCont("FIN") // Lote Contábil do lançamento, cada módulo tem o seu e está configurado na tabela 09 do SX5 self:cArquivo := "" // Arquivo temporario usado para contabilizacao // Função que verifica se o lançamento padrão foi configurado pelo cliente If VerPadrao(self:cPadrao) // Rotina que abre o capa do lote contábil ( Inicio da Contabilização) self:nHdlPrv := HeadProva(self:cLote,FunName(),Substr(cUsername,1,6),@self:cArquivo) EndIf Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} writeLineCTB Bloco para ser executado depois da gravação. @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method writeLineCTB(oModel,cModelId,cAlias,lNewRecord) Class ML003CTB Local lRet := .T. 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 self:nTotal += DetProva(self:nHdlPrv,self:cPadrao,FunName(),self:cLote,,,,,,,,@self:aFlagCTB) Endif Endif RestArea(aArea) Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} closeCTB Bloco para ser executado depois da transação. @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 := .F. // Verifica se aglutina lançamentos com as mesmas entidades contábeis If self:nHdlPrv > 0 .And. ( self:nTotal > 0 ) // Função que fecha o lote contábil 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 ) cA100Incl(self:cArquivo,self:nHdlPrv,3,self:cLote,lMostra,lAglutina) Endif Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} ModelPos Bloco de pos validação do modelo. @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 If cModelId == 'MLOC003' If oModel:GetValue('ZC3MASTER','ZC3_COD') == "000000" lRet := .F. Help("",1,"VALID",,"Ops, código 000000 reservado!",1,0) EndIf EndIf Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} GridLinePre Bloco de pré validação da linha da Grid. @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, só podemos vender quantidades pares!",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 @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} writeLineCTB Bloco para ser executado depois da gravação. sobrescrito de ML003CTB @author alvaro.camillo @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method writeLineCTBAfter(oModel,cModelId,cAlias,lNewRecord) Class ML003CTBRUS Local lRet := .T. ML003CTBRUS Local aArea:= GetArea() _Super:writeLineCTB(oModel,cModelId,cAlias,lNewRecordLocal oEventCtb := 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 selfoEventCtb:nTotal += DetProva(selfoEventCtb:nHdlPrv,"006",FunName(),selfoEventCtb:cLote,,,,,,,,@self@oEventCtb:aFlagCTB) Endif Endif RestArea(aArea) Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} ModelPosModelPosVld Bloco de pos validação do modelo. Esse metódo sobrescreve o método da classe ML003CTB. @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",,("",1,"VALID",,"Ops, código 000001 reservado para a Russia!",1,0) //oModel:SetErrorMessage( , , , ,, "Ops, código 000001 reservado para a Russia!",1,0 ) EndIf EndIf Return lRet //------------------------------------------------------------------- /*/{Protheus.doc} GridLinePreGridLinePreVld Bloco de pré validação da linha da Grid. Esse metódo sobrescreve o método da classe ML003CTB. @author Guilherme Spadaccia @since 06/09/2016 @version 1.0 /*/ //------------------------------------------------------------------- Method GridLinePreGridLinePreVld(oSubModel, cModelID, nLine, cAction, cId, xValue, xCurrentValue) Class ML003CTBRUS 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 > 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!" ) 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(oEvent)
Descrição Método de inscrição de objeto FwModelEvent
Parâmetros
|
Aviso | ||
---|---|---|
| ||
|
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
//------------------------------------------------------------------- /*/{Protheus.doc} ModelDef Definição do modelo de Dados @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('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*/) oModel:InstallEvent(oEvent) Return oModel |
Bloco de código | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
//------------------------------------------------------------------- /*/{Protheus.doc} ModelDef Definição do modelo de Dados @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 o observer da contabilização será herdado //Instala o evento de contabilizao Russa oModel:ChangeEvent("ML003CTBCOMMIT", oObsCTB) //Instala o evento de atualização de saldo oModel:InstallEvent(oObsProduto) Return oModel |
Status do documento | Desenvolvimento |
---|---|
Data | |
Versão | 1.0 |
Autores | Alvaro Camillo Neto |
Índice | ||||||
|
...