No vídeo de hoje, vamos demonstrar em como fixar botões em uma barra com FWmBrowse.
A dúvida de hoje, nos perguntaram, se seria possível em uma FWmBrowse com tabela temporária, modificar a ordem dos botões que ficam fixados.
Pensando nisso, montamos esse exemplo, onde demonstramos em como manipular o atributo aButtonsOrder do oConfig do Browse.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas #Include "Totvs.ch" #Include "FWMVCDef.ch" //Variveis Estaticas Static cTitulo := "Tabela Temporária - " /*/{Protheus.doc} User Function zVid0108 Cadastro de temporária @author Atilio @since 06/03/2024 @version 1.0 @obs Baseado no exemplo 22 de Temporária em MVC - https://terminaldeinformacao.com/2022/09/19/temporaria-em-mvc-com-fwtemporarytable-ti-responde-022/ /*/ User Function zVid0108() Local aArea := FWGetArea() Local oBrowse Local aCampos := {} Local aColunas := {} Local aPesquisa := {} Private aRotina := {} Private cAliasTmp := GetNextAlias() //Definicao do menu aRotina := MenuDef() //Campos da temporária aAdd(aCampos, {"TMP_COD", "C", 06, 0}) aAdd(aCampos, {"TMP_DES", "C", 50, 0}) aAdd(aCampos, {"TMP_VAL", "N", 10, 0}) aAdd(aCampos, {"TMP_DAT", "D", 08, 0}) //Cria a temporária oTempTable := FWTemporaryTable():New(cAliasTmp) oTempTable:SetFields(aCampos) oTempTable:AddIndex("1", {"TMP_COD"} ) oTempTable:Create() cTitulo += oTempTable:GetRealName() //Definindo as colunas que serão usadas no browse aAdd(aColunas, {"Codigo", "TMP_COD", "C", 06, 0, "@!"}) aAdd(aColunas, {"Descricao", "TMP_DES", "C", 50, 0, "@!"}) aAdd(aColunas, {"Valor", "TMP_VAL", "N", 10, 0, "@E 9,999,999.99"}) aAdd(aColunas, {"Data", "TMP_DAT", "D", 08, 0, "@D"}) //Adiciona os indices para pesquisar /* [n,1] Título da pesquisa [n,2,n,1] LookUp [n,2,n,2] Tipo de dados [n,2,n,3] Tamanho [n,2,n,4] Decimal [n,2,n,5] Título do campo [n,2,n,6] Máscara [n,2,n,7] Nome Físico do campo - Opcional - é ajustado no programa [n,3] Ordem da pesquisa [n,4] Exibe na pesquisa */ aAdd(aPesquisa, {"Codigo", {{"", "C", 6, 0, "Codigo", "@!", "TMP_COD"}} } ) //Criando o browse da temporária oBrowse := FWMBrowse():New() oBrowse:SetAlias(cAliasTmp) oBrowse:SetTemporary(.T.) oBrowse:SetFields(aColunas) oBrowse:DisableDetails() oBrowse:SetDescription(cTitulo) oBrowse:SetSeek(.T., aPesquisa) //Define as posições dos botões que serão exibidos oBrowse:oConfig:aButtonsOrder := {} aAdd(oBrowse:oConfig:aButtonsOrder, "Incluir") aAdd(oBrowse:oConfig:aButtonsOrder, "Visualizar") aAdd(oBrowse:oConfig:aButtonsOrder, "Alterar") aAdd(oBrowse:oConfig:aButtonsOrder, "Excluir") oBrowse:Activate() oTempTable:Delete() FWRestArea(aArea) Return Nil /*/{Protheus.doc} MenuDef Menu de opcoes na funcao zVid0108 @author Atilio @since 06/03/2024 @version 1.0 /*/ Static Function MenuDef() Local aRotina := {} //Adicionando opcoes do menu ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.zVid0108" OPERATION 1 ACCESS 0 ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.zVid0108" OPERATION 3 ACCESS 0 ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zVid0108" OPERATION 4 ACCESS 0 ADD OPTION aRotina TITLE "Excluir" ACTION "VIEWDEF.zVid0108" OPERATION 5 ACCESS 0 Return aRotina /*/{Protheus.doc} ModelDef Modelo de dados na funcao zVid0108 @author Atilio @since 06/03/2024 @version 1.0 /*/ Static Function ModelDef() Local oModel := Nil Local oStTMP := FWFormModelStruct():New() //Na estrutura, define os campos e a temporária oStTMP:AddTable(cAliasTmp, {'TMP_COD', 'TMP_DES', 'TMP_VAL', 'TMP_DAT'}, "Temporaria") //Adiciona os campos da estrutura oStTmp:AddField(; "Codigo",; // [01] C Titulo do campo "Codigo",; // [02] C ToolTip do campo "TMP_COD",; // [03] C Id do Field "C",; // [04] C Tipo do campo 06,; // [05] N Tamanho do campo 0,; // [06] N Decimal do campo Nil,; // [07] B Code-block de validação do campo Nil,; // [08] B Code-block de validação When do campo {},; // [09] A Lista de valores permitido do campo .T.,; // [10] L Indica se o campo tem preenchimento obrigatório FwBuildFeature( STRUCT_FEATURE_INIPAD, "Iif(!INCLUI,"+cAliasTmp+"->TMP_COD,'')" ),; // [11] B Code-block de inicializacao do campo .T.,; // [12] L Indica se trata-se de um campo chave .F.,; // [13] L Indica se o campo pode receber valor em uma operação de update. .F.) // [14] L Indica se o campo é virtual oStTmp:AddField(; "Descricao",; // [01] C Titulo do campo "Descricao",; // [02] C ToolTip do campo "TMP_DES",; // [03] C Id do Field "C",; // [04] C Tipo do campo 50,; // [05] N Tamanho do campo 0,; // [06] N Decimal do campo Nil,; // [07] B Code-block de validação do campo Nil,; // [08] B Code-block de validação When do campo {},; // [09] A Lista de valores permitido do campo .T.,; // [10] L Indica se o campo tem preenchimento obrigatório FwBuildFeature( STRUCT_FEATURE_INIPAD, "Iif(!INCLUI,"+cAliasTmp+"->TMP_DES,'')" ),; // [11] B Code-block de inicializacao do campo .F.,; // [12] L Indica se trata-se de um campo chave .F.,; // [13] L Indica se o campo pode receber valor em uma operação de update. .F.) // [14] L Indica se o campo é virtual oStTmp:AddField(; "Valor",; // [01] C Titulo do campo "Valor",; // [02] C ToolTip do campo "TMP_VAL",; // [03] C Id do Field "N",; // [04] C Tipo do campo 10,; // [05] N Tamanho do campo 02,; // [06] N Decimal do campo Nil,; // [07] B Code-block de validação do campo Nil,; // [08] B Code-block de validação When do campo {},; // [09] A Lista de valores permitido do campo .F.,; // [10] L Indica se o campo tem preenchimento obrigatório FwBuildFeature( STRUCT_FEATURE_INIPAD, "Iif(!INCLUI,"+cAliasTmp+"->TMP_VAL,'')" ),; // [11] B Code-block de inicializacao do campo .F.,; // [12] L Indica se trata-se de um campo chave .F.,; // [13] L Indica se o campo pode receber valor em uma operação de update. .F.) // [14] L Indica se o campo é virtual oStTmp:AddField(; "Data",; // [01] C Titulo do campo "Data",; // [02] C ToolTip do campo "TMP_DAT",; // [03] C Id do Field "D",; // [04] C Tipo do campo 08,; // [05] N Tamanho do campo 0,; // [06] N Decimal do campo Nil,; // [07] B Code-block de validação do campo Nil,; // [08] B Code-block de validação When do campo {},; // [09] A Lista de valores permitido do campo .F.,; // [10] L Indica se o campo tem preenchimento obrigatório FwBuildFeature( STRUCT_FEATURE_INIPAD, "Iif(!INCLUI,"+cAliasTmp+"->TMP_DAT,'')" ),; // [11] B Code-block de inicializacao do campo .F.,; // [12] L Indica se trata-se de um campo chave .F.,; // [13] L Indica se o campo pode receber valor em uma operação de update. .F.) // [14] L Indica se o campo é virtual //Instanciando o modelo oModel := MPFormModel():New("zVid108M",/*bPre*/, /*bPos*/,/*bCommit*/,/*bCancel*/) oModel:AddFields("FORMTMP",/*cOwner*/,oStTMP) oModel:SetPrimaryKey({'TMP_COD'}) oModel:SetDescription("Modelo de Dados do Cadastro "+cTitulo) oModel:GetModel("FORMTMP"):SetDescription("Formulário do Cadastro "+cTitulo) Return oModel /*/{Protheus.doc} ViewDef Visualizacao de dados na funcao zVid0108 @author Atilio @since 06/03/2024 @version 1.0 /*/ Static Function ViewDef() Local oModel := FWLoadModel("zVid0108") Local oStTMP := FWFormViewStruct():New() Local oView := Nil //Adicionando campos da estrutura oStTmp:AddField(; "TMP_COD",; // [01] C Nome do Campo "01",; // [02] C Ordem "Codigo",; // [03] C Titulo do campo "Codigo",; // [04] C Descricao do campo Nil,; // [05] A Array com Help "C",; // [06] C Tipo do campo "@!",; // [07] C Picture Nil,; // [08] B Bloco de PictTre Var Nil,; // [09] C Consulta F3 Iif(INCLUI, .T., .F.),; // [10] L Indica se o campo é alteravel Nil,; // [11] C Pasta do campo Nil,; // [12] C Agrupamento do campo Nil,; // [13] A Lista de valores permitido do campo (Combo) Nil,; // [14] N Tamanho maximo da maior opção do combo Nil,; // [15] C Inicializador de Browse Nil,; // [16] L Indica se o campo é virtual Nil,; // [17] C Picture Variavel Nil) // [18] L Indica pulo de linha após o campo oStTmp:AddField(; "TMP_DES",; // [01] C Nome do Campo "02",; // [02] C Ordem "Descricao",; // [03] C Titulo do campo "Descricao",; // [04] C Descricao do campo Nil,; // [05] A Array com Help "C",; // [06] C Tipo do campo "@!",; // [07] C Picture Nil,; // [08] B Bloco de PictTre Var Nil,; // [09] C Consulta F3 .T.,; // [10] L Indica se o campo é alteravel Nil,; // [11] C Pasta do campo Nil,; // [12] C Agrupamento do campo Nil,; // [13] A Lista de valores permitido do campo (Combo) Nil,; // [14] N Tamanho maximo da maior opção do combo Nil,; // [15] C Inicializador de Browse Nil,; // [16] L Indica se o campo é virtual Nil,; // [17] C Picture Variavel Nil) // [18] L Indica pulo de linha após o campo oStTmp:AddField(; "TMP_VAL",; // [01] C Nome do Campo "03",; // [02] C Ordem "Valor",; // [03] C Titulo do campo "Valor",; // [04] C Descricao do campo Nil,; // [05] A Array com Help "N",; // [06] C Tipo do campo "@E 9,999,999.99",; // [07] C Picture Nil,; // [08] B Bloco de PictTre Var Nil,; // [09] C Consulta F3 .T.,; // [10] L Indica se o campo é alteravel Nil,; // [11] C Pasta do campo Nil,; // [12] C Agrupamento do campo Nil,; // [13] A Lista de valores permitido do campo (Combo) Nil,; // [14] N Tamanho maximo da maior opção do combo Nil,; // [15] C Inicializador de Browse Nil,; // [16] L Indica se o campo é virtual Nil,; // [17] C Picture Variavel Nil) // [18] L Indica pulo de linha após o campo oStTmp:AddField(; "TMP_DAT",; // [01] C Nome do Campo "04",; // [02] C Ordem "Data",; // [03] C Titulo do campo "Data",; // [04] C Descricao do campo Nil,; // [05] A Array com Help "D",; // [06] C Tipo do campo "@D",; // [07] C Picture Nil,; // [08] B Bloco de PictTre Var Nil,; // [09] C Consulta F3 .T.,; // [10] L Indica se o campo é alteravel Nil,; // [11] C Pasta do campo Nil,; // [12] C Agrupamento do campo Nil,; // [13] A Lista de valores permitido do campo (Combo) Nil,; // [14] N Tamanho maximo da maior opção do combo Nil,; // [15] C Inicializador de Browse Nil,; // [16] L Indica se o campo é virtual Nil,; // [17] C Picture Variavel Nil) // [18] L Indica pulo de linha após o campo //Criando a view que será o retorno da função e setando o modelo da rotina oView := FWFormView():New() oView:SetModel(oModel) oView:AddField("VIEW_TMP", oStTMP, "FORMTMP") oView:CreateHorizontalBox("TELA",100) oView:EnableTitleView('VIEW_TMP', 'Dados - '+cTitulo ) oView:SetCloseOnOk({||.T.}) oView:SetOwnerView("VIEW_TMP","TELA") Return oView
Bom pessoal, por hoje é só.
Abraços e até a próxima.