Exemplo de Grid’s no Protheus (MsNewGetDados)
Irei mostrar uma forma bem simples de criar um grid usando o componente MsNewGetDados
Para mais detalhes do componente acesse a página da Totvs http://tdn.totvs.com/display/public/mp/MsNewGetDados
No exemplo abaixo, irei montar uma tela com um grid exibindo uma coluna com legenda. Separei o fonte em várias funções para melhor entendimento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#Include 'Protheus.ch' //Informa a biblioteca User Function exemplo1() //U_exemplo1() Local aaCampos := {"CODIGO"} //Variável contendo o campo editável no Grid Local aBotoes := {} //Variável onde será incluido o botão para a legenda Private oLista //Declarando o objeto do browser Private aCabecalho := {} //Variavel que montará o aHeader do grid Private aColsEx := {} //Variável que receberá os dados //Declarando os objetos de cores para usar na coluna de status do grid Private oVerde := LoadBitmap( GetResources(), "BR_VERDE") Private oAzul := LoadBitmap( GetResources(), "BR_AZUL") Private oVermelho := LoadBitmap( GetResources(), "BR_VERMELHO") Private oAmarelo := LoadBitmap( GetResources(), "BR_AMARELO") DEFINE MSDIALOG oDlg TITLE "TITULO" FROM 000, 000 TO 300, 700 PIXEL //chamar a função que cria a estrutura do aHeader CriaCabec() //Monta o browser com inclusão, remoção e atualização oLista := MsNewGetDados():New( 053, 078, 415, 775, GD_INSERT+GD_DELETE+GD_UPDATE, "AllwaysTrue", "AllwaysTrue", "AllwaysTrue", aACampos,1, 999, "AllwaysTrue", "", "AllwaysTrue", oDlg, aCabecalho, aColsEx) //Carregar os itens que irão compor o conteudo do grid Carregar() //Alinho o grid para ocupar todo o meu formulário oLista:oBrowse:Align := CONTROL_ALIGN_ALLCLIENT Ao abrir a janela o cursor está posicionado no meu objeto oLista:oBrowse:SetFocus() //Crio o menu que irá aparece no botão Ações relacionadas aadd(aBotoes,{"NG_ICO_LEGENDA", {||Legenda()},"Legenda","Legenda"}) EnchoiceBar(oDlg, {|| oDlg:End() }, {|| oDlg:End() },,aBotoes) ACTIVATE MSDIALOG oDlg CENTERED Return |
Abaixo um exemplo de como é a estrutura para criar o aHeader do meu grid
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
Static Function CriaCabec() Aadd(aCabecalho, {; "",;//X3Titulo() "IMAGEM",; //X3_CAMPO "@BMP",; //X3_PICTURE 3,; //X3_TAMANHO 0,; //X3_DECIMAL ".F.",; //X3_VALID "",; //X3_USADO "C",; //X3_TIPO "",; //X3_F3 "V",; //X3_CONTEXT "",; //X3_CBOX "",; //X3_RELACAO "",; //X3_WHEN "V"}) // Aadd(aCabecalho, {; "Item",;//X3Titulo() "ITEM",; //X3_CAMPO "@!",; //X3_PICTURE 5,; //X3_TAMANHO 0,; //X3_DECIMAL "",; //X3_VALID "",; //X3_USADO "C",; //X3_TIPO "",; //X3_F3 "R",; //X3_CONTEXT "",; //X3_CBOX "",; //X3_RELACAO ""}) //X3_WHEN Aadd(aCabecalho, {; "Tipo",;//X3Titulo() "TIPO",; //X3_CAMPO "@!",; //X3_PICTURE 5,; //X3_TAMANHO 0,; //X3_DECIMAL "",; //X3_VALID "",; //X3_USADO "C",; //X3_TIPO "",; //X3_F3 "R",; //X3_CONTEXT "",; //X3_CBOX "",; //X3_RELACAO ""}) //X3_WHEN Aadd(aCabecalho, {; "Codigo",; //X3Titulo() "CODIGO",; //X3_CAMPO "@!",; //X3_PICTURE 10,; //X3_TAMANHO 0,; //X3_DECIMAL "",; //X3_VALID "",; //X3_USADO "C",; //X3_TIPO "SB1",; //X3_F3 "R",; //X3_CONTEXT "",; //X3_CBOX "",; //X3_RELACAO ""}) //X3_WHEN Aadd(aCabecalho, {; "Descricao",; //X3Titulo() "DESCRICAO",; //X3_CAMPO "@!",; //X3_PICTURE 50,; //X3_TAMANHO 0,; //X3_DECIMAL "",; //X3_VALID "",; //X3_USADO "C",; //X3_TIPO "",; //X3_F3 "R",; //X3_CONTEXT "",; //X3_CBOX "",; //X3_RELACAO ""}) //X3_WHEN Return |
Agora, gero os dados que irão popular meu grid
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Static Function Carregar() Local aProdutos := {} aadd(aProdutos,{"000001","PRODUTO 1","UN"}) aadd(aProdutos,{"000002","PRODUTO 2","UN"}) aadd(aProdutos,{"000003","PRODUTO 3","PC"}) aadd(aProdutos,{"000004","PRODUTO 4","MT"}) aadd(aProdutos,{"000005","PRODUTO 5","PC"}) aadd(aProdutos,{"000006","PRODUTO 6",""}) For i := 1 to len(aProdutos) if(aProdutos[i,3]=="UN") aadd(aColsEx,{oVerde,StrZero(i,3),aProdutos[i,3],aProdutos[i,1],aProdutos[i,2],.F.}) Elseif(aProdutos[i,3]=="PC") aadd(aColsEx,{oAzul,StrZero(i,3),aProdutos[i,3],aProdutos[i,1],aProdutos[i,2],.F.}) Elseif(aProdutos[i,3]=="MT") aadd(aColsEx,{oVermelho,StrZero(i,3),aProdutos[i,3],aProdutos[i,1],aProdutos[i,2],.F.}) Else aadd(aColsEx,{oAmarelo,StrZero(i,3),aProdutos[i,3],aProdutos[i,1],aProdutos[i,2],.F.}) Endif Next //Setar array do aCols do Objeto. oLista:SetArray(aColsEx,.T.) //Atualizo as informações no grid oLista:Refresh() Return |
Na função abaixo, monto a minha legenda que será apresentada
1 2 3 4 5 6 7 8 9 |
Static function Legenda() Local aLegenda := {} AADD(aLegenda,{"BR_AMARELO" ," Tipo não definido" }) AADD(aLegenda,{"BR_AZUL" ," Tipo PC" }) AADD(aLegenda,{"BR_VERDE" ," Tipo UN" }) AADD(aLegenda,{"BR_VERMELHO" ," Tipo MT" }) BrwLegenda("Legenda", "Legenda", aLegenda) Return Nil |
Como podem ver é bem simples a criação do grid, acesse a página do TDN e veja todas as funcionalidades deste componente.
Espero que essa dica tenha sido útil.
4 comentários
Vou precisar de 3 coisas no MsNewGetDados. 1. Coluna de marcação (checkbox); 2. Coluna de indicador colorido (como do artigo); 3. Grid Editável e por apenas uma das colunas, que após a entrada do valor, é chamada uma outra função de recalculo;
Todos esses destalhes são possível neste modelo de browser ? obs.: Vou estar trabalhando com tabela temporária.
Boa tarde Thiago!
O MsNewGetDados não possue esta caracteristica (seria ótimo se tivesse), o que eu normalmente faço quando preciso de algo parecido é usar o TCBrowse, com ele consigo ter o checkbox, legendas e campos editáveis, porém também limitado.
segue um simples exemplo usando o TCBROWSE
No modelo TCBROWSE, conforme mencionado sobre coluna editavel é possivel ter 2 colunas editaveis sendo uma primeira habilitadora para a edição da segunda ?
Bom dia Rodrigo!
No exemplo postado sobre edição com TCBrowse, você pode programar na função fEdita(), tipo, só habilitar se a coluna X estiver com conteúdo.
Veja se dá certo!