Browse de Array com busca em colunas.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Browse de Array com busca em colunas.

Mensagem por clodoaldomonteiro »

Olá!

Tenho um Browse pra navegar numa array e que saber como colocar uma busca de um determinado valor numa determinada coluna, tipo um SEEK, só q como é array, a rotina deve percorrer a coluna em que está o foco e buscar pelo valor informado pelo usuário.

Por exemplo, a coluna "Nome Credor", onde o usuário quer pesquisar e focar o nome "Francisco", por exemplo, daí o usuário pressionaria Ctrl+F, abria uma tela pra Get do valor a pesquisar, e o ideal, é que a Classe TBrowse tivesse um método Find ou algo assim.

Desde já, fico grato pela ajuda.

Segue meus fontes:

Código: Selecionar todos

#pragma -w0
#pragma -es0

#xtrans  :data   =>   :cargo\[1]
#xtrans  :recno  =>   :cargo\[2]

#include "GAS.ch"
#include "TBrowse.ch"
#include "inkey.ch"

Function EMP_RAPGet( cAlias )
   Local aDados := {}

   If cAlias <> NIL

      Select (cAlias)
      Set Filter To ((emp_valor - emp_vlanu) - emp_totliq > 0.00 .or. emp_totliq - emp_totpag > 0.00) .and.;
       exportado <> 'S'

      Go Top

      Do While !Eof()

         AAdd(aDados, {;
          'NÆo',;
          emp_codigo,;
          emp_numero,;
          emp_dd,;
          emp_mm,;
          emp_uo,;
          (emp_valor - emp_vlanu),;                //07
          (emp_valor - emp_vlanu) - emp_totliq,;   //07
          emp_totliq - emp_totpag,;   //08
          emp_nome,;
          tlc_codigo } )

         Skip

      EndDo
   EndIf

   aSort(aDados,,, { |x, y| x[10]+x[5]+x[4] < y[10]+y[5]+y[4]} )

   Return aDados


   /////////////////////////////////////////////////////////////////////////////
Function EMP_RapBRow(nLi, nCi, nLf, nCf, aACab, aADados )
   LOCAL lContinue  := .T. ,;
    nKeyPressed := 0,;
    nArryRowNo := 1,;
    i, bBlock, oTBColumn, oCol, xVar, mVar
   Private mQtd := 0, aDados := {}

   If Len(aADados)  = 0
      msg := 'Não existe dados a serem importados.'
      MsgAtencao( msg )
      Return aDados
   EndIf

   * Draw a box around Browse window
   If AbreJanela( 'EMPENHOS COM SALDO A IMPORTAR PARA RESTOS A PAGAR:', nLi, nCi, nLf, nCf, ) == 0
      MsgError( "Erro ao abrir Janela de dados." )
      Return
   EndIf

   * Define a new TBrowse object
   oBrowse := TBrowse():New( nLi + 1, nCi, nLf-1, nCf )

   aDados := aAdados
   oBrowse:cargo    := {aDados, 1}
   oBrowse:colorspec := drvcorbox + ", " + drvcorhlp + ", " + drvcorenf + ", " + drvcorGet + ", " + INVCOR(drvcorpad)
   oBrowse:headsep  := chr(205) + chr(203) + chr(205)        // separador do cabecalho (Í-Í)
   oBrowse:colsep   := " " + chr(179) + " "                  // separador das colunas  ( ³ )
   oBrowse:footSep  := chr(205) + chr(202) + chr(205)        // separador do cabecalho (Í-Í)

   @ oBrowse:ntop -1, oBrowse:nleft +1 Say 'Qtd: ' + AllTrim( Str(Len(aDados), 5) ) + ' / ' + AllTrim( Str(mQtd, 5) ) Color corcampo

   @ oBrowse:nBottom + 1, oBrowse:nleft + 1 Say 'Tecle [Enter] para selecionar e [ESC] para sair e continuar o processamento dos [Selecionados].'

   oBrowse:goTopBlock    := {|| oBrowse:recno := 1 }
   oBrowse:goBottomBlock := {|| oBrowse:recno := Len( oBrowse:data ) }
   oBrowse:SkipBlock     := { | nSkip | ArraySkipper( nSkip, oBrowse ) }

   For i := 1 To Len(aAcab)
      bBlock := ArrayBlock( oBrowse, i )

      oTBColumn := TBColumn():New( aAcab[i, 1], bBlock )
      oTBColumn:width   := aACab[ i, 2 ]
      oTBColumn:picture := aACab[ i, 3 ]

      oBrowse:AddColumn( oTBColumn )
   Next

   While lContinue                             // Browse's loop

      IF NextKey() = 0
         oBrowse:RefreshCurrent()
         While .not. oBrowse:stabilize()
         EndDo     // Stabilizing loop

         oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:LeftVisible, oBrowse:RowPos, oBrowse:RightVisible }, { 5, 5 } ) // linha está com o cursor
         oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:ColPos, oBrowse:RowPos, oBrowse:ColPos }, { 2, 2 } ) // linha/coluna está com o cursor

         oCol := oBrowse:getColumn(1)
         mVar := EVal(oCol:block)
         If Left(mVar, 1) = 'S'
            For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas
               oBrowse:getcolumn(i):colorblock := &("{||{2,2}}")
            Next
         Else
            For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas
               oBrowse:getcolumn(i):colorblock := &("{||{1,2}}")
            Next
         EndIf

         IF ! Empty(  oBrowse:Freeze )                                                                       // Marcar parte congelada
            oBrowse:ColorRect( { oBrowse:RowPos, 1, oBrowse:RowPos, oBrowse:Freeze }, { 5, 5 } )
         EndIf

         @ oBrowse:ntop -1, oBrowse:nleft +1 Say 'Qtd: ' + AllTrim( Str(Len(aDados), 5) ) + ' / ' + AllTrim( Str(mQtd, 5) ) Color corcampo

         wvw_DrawFocusRect(, oBrowse:RowPos + nLi + 2, oBrowse:nLeft, oBrowse:RowPos + nLi + 2, oBrowse:nRight ) // linha está com o cursor

      EndIf

      nKeyPressed := Inkey(0)
      lContinue   := TBrApplyKey( oBrowse, nKeyPressed )

      IF nKeyPressed = 0                                     // nao teclou nada, sai pelo
         oBrowse:refreshall()                                // tempo de "refresh" entao
         LOOP                                                // na tela e volta
      EndIf

   EndDo

   SetPos( 23, 0 )

   FechaJanela()

   RETURN aDados


Static FUNCTION TBrApplyKey( oBrowse, nKey )

   LOCAL lRVal := .T., mVar, i

   DO CASE
   CASE nKey == K_ENTER    //K_SPACE
      oCol := oBrowse:getColumn(1)
      mVar := EVal(oCol:block)
      If Left(mVar, 1) = 'N'
         //oCol := oBrowse:getColumn(11)
         mQtd ++ //= EVal(oCol:block)
         aDados[oBrowse:recno, 1] := 'Sim'
         For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas
            oBrowse:getcolumn(i):colorblock := &("{||{2,2}}")
         Next
      Else
         //oCol := oBrowse:getColumn(11)
         mQtd -- //= EVal(oCol:block)
         aDados[oBrowse:recno, 1] := 'NÆo'
         For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas
            oBrowse:getcolumn(i):colorblock := &("{||{1,2}}")
         Next
      EndIf
      oBrowse:refreshcurrent()                                 // refaz so' a linha do browse
   CASE nKey == K_UP
      oBrowse:Up()
   CASE nKey == K_LEFT
      oBrowse:Left()
   CASE nKey == K_RIGHT
      oBrowse:Right()
   CASE nKey == K_DOWN
      oBrowse:down()
   CASE nKey == K_HOME
      oBrowse:home()
   CASE nKey == K_END
      oBrowse:end()
   CASE nKey == K_PGUP
      oBrowse:pageUp()
   CASE nKey == K_PGDN
      oBrowse:pageDown()
   CASE nKey == K_CTRL_PGDN
      oBrowse:goBottom()
   CASE nKey == K_CTRL_PGUP
      oBrowse:goTop()
   CASE nKey == K_ESC
   // End of Browse and program
   lRVal := .F.
   ENDCASE

   RETURN lRVal // TBrApplyKey()

At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Browse de Array com busca em colunas.

Mensagem por clodoaldomonteiro »

Bom, fui fuçando aqui e descobri uma maneira, incluindo as linhas:

Código: Selecionar todos

   CASE nKey == K_CTRL_F
      mNome := DBOX('Informe o Nome do Credor a pesquisar', ,,,, "PESQUISA CREDOR/FORNECEDOR", mNome, "@S50") //Para Getar o nome a pesquisar.
      mNome := AllTrim( mNome )

      x := Ascan(aDados, {|e| Upper(mNome) $ Upper(e[10]) }) //Faz a busca na coluna de nome do Credor
      
      If x > 0

         oBrowse:recNo := x

         oBrowse:refreshAll()
         
      Endif
Os fontes ficaram assim:

Código: Selecionar todos

#pragma -w0
#pragma -es0

#xtrans  :data   =>   :cargo\[1]
#xtrans  :recno  =>   :cargo\[2]

#include "GAS.ch"
#include "TBrowse.ch"
#include "inkey.ch"

Function EMP_RAPGet( cAlias )
   Local aDados := {}

   If cAlias <> NIL

      Select (cAlias)
      Set Filter To ((emp_valor - emp_vlanu) - emp_totliq > 0.00 .or. emp_totliq - emp_totpag > 0.00) .and.;
       exportado <> 'S'

      Go Top

      Do While !Eof()

         AAdd(aDados, {;
          'NÆo',;
          emp_codigo,;
          emp_numero,;
          emp_dd,;
          emp_mm,;
          emp_uo,;
          (emp_valor - emp_vlanu),;                //07
          (emp_valor - emp_vlanu) - emp_totliq,;   //07
          emp_totliq - emp_totpag,;   //08
          emp_nome,;
          tlc_codigo } )

         Skip

      EndDo
   EndIf

   aSort(aDados,,, { |x, y| x[10]+x[5]+x[4] < y[10]+y[5]+y[4]} )

   Return aDados


   /////////////////////////////////////////////////////////////////////////////
Function EMP_RapBRow(nLi, nCi, nLf, nCf, aACab, aADados )
   LOCAL lContinue  := .T. ,;
    nKeyPressed := 0,;
    nArryRowNo := 1,;
    i, bBlock, oTBColumn, oCol, xVar, mVar
   Private mQtd := 0, aDados := {}

   If Len(aADados)  = 0
      msg := 'Não existe dados a serem importados.'
      MsgAtencao( msg )
      Return aDados
   EndIf

   * Draw a box around Browse window
   If AbreJanela( 'EMPENHOS COM SALDO A IMPORTAR PARA RESTOS A PAGAR:', nLi, nCi, nLf, nCf, ) == 0
      MsgError( "Erro ao abrir Janela de dados." )
      Return
   EndIf

   * Define a new TBrowse object
   oBrowse := TBrowse():New( nLi + 1, nCi, nLf-1, nCf )

   aDados := aAdados
   oBrowse:cargo     := {aDados, 1}
   oBrowse:colorspec := drvcorbox + ", " + drvcorhlp + ", " + drvcorenf + ", " + drvcorGet + ", " + INVCOR(drvcorpad)
   oBrowse:headsep   := chr(205) + chr(203) + chr(205)        // separador do cabecalho (Í-Í)
   oBrowse:colsep    := " " + chr(179) + " "                  // separador das colunas  ( ³ )
   oBrowse:footSep   := chr(205) + chr(202) + chr(205)        // separador do cabecalho (Í-Í)

   @ oBrowse:ntop -1, oBrowse:nleft +1 Say 'Qtd: ' + AllTrim( Str(Len(aDados), 5) ) + ' / ' + AllTrim( Str(mQtd, 5) ) Color corcampo

   @ oBrowse:ntop -1, oBrowse:nRight -30 Say ' Tecle [Ctrl+F] para pesquisar ' Color drvcorhlp

   @ oBrowse:nBottom + 1, oBrowse:nleft + 1 Say 'Tecle [Enter] para selecionar e [ESC] para sair e continuar o processamento dos [Selecionados].'

   oBrowse:goTopBlock    := {|| oBrowse:recno := 1 }
   oBrowse:goBottomBlock := {|| oBrowse:recno := Len( oBrowse:data ) }
   oBrowse:SkipBlock     := { | nSkip | ArraySkipper( nSkip, oBrowse ) }

   For i := 1 To Len(aAcab)
      bBlock := ArrayBlock( oBrowse, i )

      oTBColumn := TBColumn():New( aAcab[i, 1], bBlock )
      oTBColumn:width   := aACab[ i, 2 ]
      oTBColumn:picture := aACab[ i, 3 ]

      oBrowse:AddColumn( oTBColumn )
   Next

   While lContinue                             // Browse's loop

      IF NextKey() = 0
         oBrowse:RefreshCurrent()
         While .not. oBrowse:stabilize()
         EndDo     // Stabilizing loop

         oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:LeftVisible, oBrowse:RowPos, oBrowse:RightVisible }, { 5, 5 } ) // linha está com o cursor
         oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:ColPos, oBrowse:RowPos, oBrowse:ColPos }, { 2, 2 } ) // linha/coluna está com o cursor

         oCol := oBrowse:getColumn(1)
         mVar := EVal(oCol:block)
         If Left(mVar, 1) = 'S'
            For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas
               oBrowse:getcolumn(i):colorblock := &("{||{2,2}}")
            Next
         Else
            For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas
               oBrowse:getcolumn(i):colorblock := &("{||{1,2}}")
            Next
         EndIf

         IF ! Empty(  oBrowse:Freeze )                                                                       // Marcar parte congelada
            oBrowse:ColorRect( { oBrowse:RowPos, 1, oBrowse:RowPos, oBrowse:Freeze }, { 5, 5 } )
         EndIf

         @ oBrowse:ntop -1, oBrowse:nleft +1 Say 'Selecionado: ' + AllTrim( Str(mQtd, 5) ) + ' / ' + AllTrim( Str(Len(aDados), 5) ) Color corcampo

         @ oBrowse:nBottom + 1, oBrowse:nRight - 15 Say 'Pos: ' + AllTrim( Str(oBrowse:recNo ) ) +'/'+ AllTrim( Str(Len(aDados), 5) )

         wvw_DrawFocusRect(, oBrowse:RowPos + nLi + 2, oBrowse:nLeft, oBrowse:RowPos + nLi + 2, oBrowse:nRight ) // linha está com o cursor

      EndIf

      nKeyPressed := Inkey(0)
      lContinue   := TBrApplyKey( oBrowse, nKeyPressed )

      IF nKeyPressed = 0                                     // nao teclou nada, sai pelo
         oBrowse:refreshall()                                // tempo de "refresh" entao
         LOOP                                                // na tela e volta
      EndIf

   EndDo

   SetPos( 23, 0 )

   FechaJanela()

   RETURN aDados


Static FUNCTION TBrApplyKey( oBrowse, nKey )
   LOCAL lRVal := .T., mVar, i, mNome := Space(50), x

   DO CASE
   CASE nKey == K_ENTER    //K_SPACE
      oCol := oBrowse:getColumn(1)
      mVar := EVal(oCol:block)
      If Left(mVar, 1) = 'N'
         //oCol := oBrowse:getColumn(11)
         mQtd ++ //= EVal(oCol:block)
         aDados[oBrowse:recno, 1] := 'Sim'
         For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas
            oBrowse:getcolumn(i):colorblock := &("{||{2,2}}")
         Next
      Else
         //oCol := oBrowse:getColumn(11)
         mQtd -- //= EVal(oCol:block)
         aDados[oBrowse:recno, 1] := 'NÆo'
         For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas
            oBrowse:getcolumn(i):colorblock := &("{||{1,2}}")
         Next
      EndIf
      
      oBrowse:refreshcurrent()                                 // refaz so' a linha do browse\
      
   CASE nKey == K_CTRL_F
      mNome := DBOX('Informe o Nome do Credor a pesquisar', ,,,, "PESQUISA CREDOR/FORNECEDOR", mNome, "@S50") //Para Getar o nome a pesquisar.
      mNome := AllTrim( mNome )

      x := Ascan(aDados, {|e| Upper(mNome) $ Upper(e[10]) }) //Faz a busca na coluna de nome do Credor
      
      If x > 0

         oBrowse:recNo := x

         oBrowse:refreshAll()
         
      Endif
      
   CASE nKey == K_UP
      oBrowse:Up()
   CASE nKey == K_LEFT
      oBrowse:Left()
   CASE nKey == K_RIGHT
      oBrowse:Right()
   CASE nKey == K_DOWN
      oBrowse:down()
   CASE nKey == K_HOME
      oBrowse:home()
   CASE nKey == K_END
      oBrowse:end()
   CASE nKey == K_PGUP
      oBrowse:pageUp()
   CASE nKey == K_PGDN
      oBrowse:pageDown()
   CASE nKey == K_CTRL_PGDN
      oBrowse:goBottom()
   CASE nKey == K_CTRL_PGUP
      oBrowse:goTop()
   CASE nKey == K_ESC
   // End of Browse and program
   lRVal := .F.
   ENDCASE

   RETURN lRVal // TBrApplyKey()

Fica pra ajudar os interessados.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Responder