Exemplo de Grid’s no Protheus (MsNewGetDados)

Blog Advpl - Share knowledge

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.

msnewgetdados

#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

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

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

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

  1. Thiago Pedro disse:

    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

      Local oOk    := LoadBitmap(GetResources(), "LBOK")
      Local oNo    := LoadBitmap(GetResources(), "LBNO")
      Local oBmpSim:= LoadBitmap( GetResources(), "ENABLE")
      Local oBmpNao:= LoadBitmap( GetResources(), "DISABLE")
      
      oLista := TCBrowse():New(030,000,200,200,,,,oPanel2,,,,,,,,,,,,.F.,,.T.,,.F.,,,)
      oLista:AddColumn(TCColumn():New(" "       	, {|| If(aEtiqueta[oLista:nAt,01],oBmpSim,oBmpNao) },,,,,,.T.,.F.,,,,.F., ) )
      oLista:AddColumn(TCColumn():New(" "       	, {|| If(aEtiqueta[oLista:nAt,02],oOk,oNo) },,,,,,.T.,.F.,,,,.F., ) )
      oLista:AddColumn(TCColumn():New("Pedido"	, {|| aEtiqueta[oLista:nAt,03]},"@!",,,"CENTER", 030,.F.,.F.,,{|| .F. },,.F., ) )
      oLista:AddColumn(TCColumn():New("Cliente"	, {|| aEtiqueta[oLista:nAt,04]},"@!",,,"LEFT"  , 150,.F.,.F.,,,,.F., ) )
      oLista:AddColumn(TCColumn():New("PV Cliente"	, {|| aEtiqueta[oLista:nAt,05]},"@!",,,"CENTER", 050,.F.,.T.,,,,.F., ) )
      oLista:AddColumn(TCColumn():New("Observação" 	, {|| aEtiqueta[oLista:nAt,06]},"@!",,,"LEFT"  , 100,.F.,.T.,,,,.F., ) )
      //A coluna 6 precisa está com a opção de editar .T.
      oLista:SetArray(aEtiqueta)
      oLista:bWhen        := { || Len(aEtiqueta) > 0 }
      oLista:bRClicked    := { || fEdita(@aEtiqueta, oLista, "@!", 6)}  //Irei editar a coluna 6
      oLista:Refresh()		
      
      Static Function fEdita(aArr, oObjeto, cMascara, nPos)
         Local lRet := .t.                         
         lEditCell (@aArr, oObjeto, cMascara, nPos)   	
      Return(lRet)  
      
      • 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!

          //Não testei ainda, mas veja se ajuda em alguma coisa
          
          //altere a coluna 5 para ser editável
          oLista:AddColumn(TCColumn():New("PV Cliente"	, {|| aEtiqueta[oLista:nAt,05]},"@!",,,"CENTER", 050,.F.,.T.,,,,.F., ) )
          oLista:AddColumn(TCColumn():New("Observação" 	, {|| aEtiqueta[oLista:nAt,06]},"@!",,,"LEFT"  , 100,.F.,.T.,,,,.F., ) )
          
          oLista:bRClicked    := { || fEdita(@aEtiqueta, oLista, "@!", 5),fEdita(@aEtiqueta, oLista, "@!", 6)}  //Irei editar a coluna 5 e 6 
          
          //na funcao fEdita()
          Static Function fEdita(aArr, oObjeto, cMascara, nPos)
             Local lRet := .t.     
             if (nPos==6)   //quero habilitar a coluna 6. vou verificar se estou nela, se estiver vou verificar se na coluna5 tem conteudo                
                if !Empty(aEtiqueta[oLista:nAt,05])  //Se tiver conteudo
                   lEditCell (@aArr, oObjeto, cMascara, nPos)   //habilito a coluna 6
                Endif
             else
                lEditCell (@aArr, oObjeto, cMascara, nPos)  //a coluna 5 sempre estará habilitada
             endif
              	
          Return(lRet)
          
Português Português Español Español English English