#INCLUDE "RWMake.ch" #INCLUDE "Totvs.ch" #INCLUDE "ParmType.ch" //############################################################################# //##+==========+==========+=======+====================+======+=============+## //##|Programa | ASATF04 | Autor | Cirilo Rocha | Data | 05/12/2022 |## //##+==========+==========+=======+====================+======+=============+## //##|Descr. | Exemplo de tela MVC Modelo 2 |## //##| | |## //##+==========+==========+=================================================+## //##| DATA | ANALISTA | MANUTENÇÃO EFETUADA |## //##+==========+==========+=================================================+## //##| | | |## //##| | | |## //##| | | |## //##+==========+==========+=================================================+## //############################################################################# #DEFINE cAliasCac 'ZZN' #DEFINE cTitulo 'Cadastro de '+U_CXX2Titulo(cAliasCac) Static aCpoCab := {'ZZN_FILIAL','ZZN_ID'} AS Array //Campos que aparecem no cabecalho do Modelo 2 //-------------------------------------------------------------------------------------------------------- User Function ASATF04() //Declaracao de variaveis---------------------------------------------------------------------- Private oMBrw AS Object //Privado por causa das legendas // Instanciamento da Classe de Browse oMBrw := FWMBrowse():New() // Definição da tabela do Browse oMBrw:SetAlias(cAliasCac) // Definição da legenda // oMBrw:AddLegend( "A1_PESSOA=='J'", "YELLOW" , "Juridica") // oMBrw:AddLegend( "A1_PESSOA=='F'", "BLUE" , "Fisica" ) // Definição de filtro //oMBrw:SetFilterDefault( "A1_PESSOA=='J'" ) // Titulo da Browse oMBrw:SetDescription(cTitulo) // Opcionalmente pode ser desligado a exibição dos detalhes //oMBrw:DisableDetails() // Ativação da Classe oMBrw:Activate() Return Nil //############################################################################# //##+==========+==========+=======+====================+======+=============+## //##|Programa | MenuDef | Autor | Cirilo Rocha | Data | 29/05/2019 |## //##+==========+==========+=======+====================+======+=============+## //##|Descr. | Uma função MenuDef define as operações quer serão realiza- |## //##| | das pela aplicação, tais como inclusão, alteração, etc.. |## //##+==========+============================================================+## //############################################################################# Static Function MenuDef() //Declaracao de variaveis---------------------------------------------------------------------- Local aRotina := {} AS Array //Inicializa Variaveis------------------------------------------------------------------------- aAdd( aRotina,{'Visualizar' , 'VIEWDEF.ASATF04' , 0, OP_VISUALIZAR , 0, NIL } ) aAdd( aRotina,{'Incluir' , 'VIEWDEF.ASATF04' , 0, OP_INCLUIR , 0, NIL } ) aAdd( aRotina,{'Alterar' , 'VIEWDEF.ASATF04' , 0, OP_ALTERAR , 0, NIL } ) aAdd( aRotina,{'Excluir' , 'VIEWDEF.ASATF04' , 0, OP_EXCLUIR , 0, NIL } ) aAdd( aRotina,{'Copiar' , 'VIEWDEF.ASATF04' , 0, OP_COPIA , 0, NIL } ) //aAdd( aRotina,{'Legenda' , 'U_CXLegenda' , 0, OP_VISUALIZAR , 0, NIL } ) Return aRotina //############################################################################# //##+==========+==========+=======+====================+======+=============+## //##|Programa | ModelDef | Autor | Cirilo Rocha | Data | 29/05/2019 |## //##+==========+==========+=======+====================+======+=============+## //##|Descr. | Nesta função são definidas as regras de negócio ou modelo |## //##| | de dados (Model). |## //##+==========+============================================================+## //############################################################################# Static Function ModelDef() //Declaração de Variáveis---------------------------------------------------------------------- Local oModel AS Object Local oGrid AS Object Local oStruCab AS Object Local oStruGrid AS Object //Inicializa Variaveis------------------------------------------------------------------------- oStruCab := FWFormStruct(1 ,; cAliasCac ,; {|cCpo| CpoCab(cCpo) }) oStruGrid := FWFormStruct(1 ,; cAliasCac ) // Cria o objeto do Modelo de Dados oModel := MPFormModel():New('ASATF04M' ,; /*bPreVld*/ ,; //02 bPreVld { |oMod| TudoOK( oMod ) } ,; //03 bPostVld /*bCommit*/ ,; //04 bCommit /*bCancel*/ ) //05 bCancel //Agora, define no modelo de dados, que terá um Cabeçalho e uma Grid apontando para estruturas acima oModel:AddFields('ZZNMASTER', NIL, oStruCab) oModel:SetPrimaryKey({"ZZN_FILIAL", "ZZN_ID"}) //Grid oModel:AddGrid( 'MODEL_ZZN' ,; //01 cID Modelo 'ZZNMASTER' ,; //02 cIDOwner oStruGrid ,; //03 oStruct /*bLinePre*/ ,; //04 bLinePre {|oMod| LinhaOK(oMod,'ZZN') } ,; //05 Validação equivale ao LinhaOK {|oMod,nLin,cOper| LinhaPre(oMod,'ZZN',nLin,cOper) } ,; //06 bPre /*bPost*/ ,; //07 bPost /*bLoad*/ ) //08 bLoad //Monta o relacionamento entre Grid e Cabeçalho, as expressões da Esquerda representam o campo da Grid e da direita do Cabeçalho oModel:SetRelation('MODEL_ZZN', {; {'ZZN_FILIAL', 'FWxFilial("ZZN")'},; {"ZZN_ID" , "ZZN_ID"}; }, (cAliasCac)->(IndexKey(1))) oGrid := oModel:GetModel( 'MODEL_ZZN' ) oGrid:SetOptional( .F. ) // oGrid:SetUniqueLine( { 'ZZN_ITEM' } ) //Chave única da grid // oGrid:SetMaxLine(99) oGrid:SetDescription( 'Descrição dos Itens (ZZN)' ) Return oModel //############################################################################# //##+==========+==========+=======+====================+======+=============+## //##|Programa | ViewDef | Autor | Cirilo Rocha | Data | 29/05/2019 |## //##+==========+==========+=======+====================+======+=============+## //##|Descr. | Com a função FWLoadModel obtemos o modelo de dados (Model) |## //##| | que está definido em um fonte, no nosso caso é o próprio |## //##| | fonte, mas nada impediria que usássemos o modelo de qual- |## //##| | quer outro fonte em MVC, com isso podemos reaproveitar um |## //##| | mesmo modelo de dados (Model) em mais de uma interface |## //##| | (View). |## //##+==========+============================================================+## //############################################################################# Static Function ViewDef() //Na montagem da estrutura da visualização de dados, vamos chamar o modelo criado anteriormente, no cabeçalho vamos mostrar somente 3 campos, e na grid vamos carregar conforme a função fViewStruct Local oView AS Object Local oModel AS Object Local oStruCab AS Object Local oStruGRID AS Object //Inicializa Variaveis------------------------------------------------------------------------- oModel := FWLoadModel('ASATF04') //Carrega só campos do cabeçalho oStruCab := FWFormStruct(2 ,; cAliasCac ,; {|cCpo| CpoCab(cCpo) }) //Carrega os demais campos oStruGRID := FWFormStruct(2 ,; cAliasCac ,; {|cCpo| .Not. CpoCab(cCpo) }) //Define que no cabeçalho não terá separação de abas (SXA) //oStruCab:SetNoFolder() //Cria o View oView:= FWFormView():New() oView:SetModel(oModel) //Cria uma área de Field vinculando a estrutura do cabeçalho com ZZNMASTER, e uma Grid vinculando com MODEL_ZZN oView:AddField('CABEC', oStruCab, 'ZZNMASTER') oView:AddGrid ('GRID_ITENS', oStruGRID, 'MODEL_ZZN' ) //O cabeçalho (MAIN) terá 25% de tamanho, e o restante de 75% irá para a GRID oView:CreateHorizontalBox("BOX_SUPERIOR", 25) oView:CreateHorizontalBox("BOX_INFERIOR", 75) //Vincula o MAIN com a CABEC e a GRID com a GRID_ITENS oView:SetOwnerView('CABEC', 'BOX_SUPERIOR') oView:SetOwnerView('GRID_ITENS', 'BOX_INFERIOR') oView:EnableControlBar(.T.) //Define o campo incremental da grid como o ZZN_ITEM //oView:AddIncrementField('GRID_ITENS', 'ZZN_ITEM') Return oView //------------------------------------------------------------------------------------------------- //FILTRA QUAIS CAMPOS CONSTAM NO CABEÇALHO //------------------------------------------------------------------------------------------------- Static Function CpoCab(cCampo AS Characer) AS Character Return ( aScan(aCpoCab,{|x| x == AllTrim(cCampo) }) > 0 ) //############################################################################# //##+==========+==========+=======+====================+======+=============+## //##|Programa | TudoOK | Autor | Cirilo Rocha | Data | 29/05/2019 |## //##+==========+==========+=======+====================+======+=============+## //##|Descr. | Função para validar o tudo ok da tela |## //##+==========+==========+=================================================+## //##| DATA | ANALISTA | MANUTENÇÃO EFETUADA |## //##+==========+==========+=================================================+## //##| | | |## //##| | | |## //##| | | |## //##+==========+==========+=================================================+## //############################################################################# Static Function TudoOK( oModel ) //Declaracao de variaveis---------------------------------------------------------------------- Local lRet AS Logical Local oSubMod AS Object //Parametros da rotina------------------------------------------------------------------------- ParamType 0 VAR oModel AS Object //Inicializa Variaveis------------------------------------------------------------------------- lRet := .T. oSubMod := oModel:GetModel('ZZNMASTER') //Validacoes----------------------------------------------------------------------------------- ////////////////COLOQUE AQUI AS VALIDAÇÕES Return lRet //############################################################################# //##+----------+----------+-------+--------------------+------+-------------+## //##|Programa | LinhaOK | Autor | Cirilo Rocha | Data | 01/12/2022 |## //##+----------+----------+-------+--------------------+------+-------------+## //##|Descr. | Função para validar a linha da Grid |## //##+----------+----------+-------------------------------------------------+## //##| DATA | ANALISTA | MANUTENÇÃO EFETUADA |## //##+----------+----------+-------------------------------------------------+## //##| | | |## //##| | | |## //##| | | |## //##+----------+----------+-------------------------------------------------+## //############################################################################# Static Function LinhaOK(oModel ,; //01 oModel cGrid ); //02 cGrid AS Logical //Declaracao de variaveis---------------------------------------------------------------------- Local lRet AS Logical Local nOperation AS Numeric /*Integer*/ //Parametros da rotina------------------------------------------------------------------------- ParamType 0 VAR oModel AS Object ParamType 1 VAR cGrid AS Character //Inicializa Variaveis------------------------------------------------------------------------- lRet := .T. nOperation := oModel:GetOperation() //Validacoes----------------------------------------------------------------------------------- ////////////////COLOQUE AQUI AS VALIDAÇÕES Return lRet