Consulta Browse com linhas com cores diferentes.

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:

Consulta Browse com linhas com cores diferentes.

Mensagem por clodoaldomonteiro »

Olá.
Tenho uma consulta em que quero colocar a linha que tem a primeira coluna "SIM" com a segunda cor de oBrose:colorSpec e não estou sabendo o lugar de colocar a variável colorBlock, ou até de saber se o valor dela está correto.

Código: Selecionar todos

////////////////////////////////////////////////////////////////////////////////
//Fonte: https://vivaclipper.wordpress.com/tag/array-browse/
//Links: https://pctoledo.org/forum/viewtopic.php?f=4&t=9575

#pragma -w0
#pragma -es0

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

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

Function RTP_RetGet(cCodigo, cDia, cMes, cUo, cTipo, cCredor, cNome, cFr, cEstorno)
   Local mRetorno := .f., aCab := {}, aDados := {}, aDados2 := {}, mAlias := Alias(), i
   Local dele_atu := Set(_SET_DELETED, .T.)     //Incluir os Excluidos

   If !USEARQ('RET', .f., 10)
      Return
   EndIf

   Set Filter To If(!Empty( cUo), tuo_codigo = cUo, .t.) .and. ret_tipo + ccr_codigo = cTipo + cCredor .and. ;
    If(mRtpFR > '000', ret_fr = mRtpFR, .t.) .and. ;
    If(cEstorno $ [ N], ret_saldo > 0.00, ret_vlPag > 0.00) .and. ;
     ret_aa + ret_mm + ret_dd <= M->par_aa + cMes + cDia .and. Exportado <> 'S'
   Go Top

   aCab := {;
    {'Status'     , 03, '@!'},;
    {'RET C¢digo' , 06, '999999'},;
    {'Conta PCASP', 11, '@R 99999.99.99'},;
    {'FR'         , 03, '999'},;
    {'UO C¢digo'  , 08, '@R 99.99.99'},;
    {'Ano EMP'    , 04, '9999'},;
    {'EMP N£mero' , 08, '99999999'},;         //05
    {'LIQ N£mero' , 08, '99999999'},;         //08
    {'Data RET'   , 10, '@D'},;               //09
    {'Valor RET'  , 13, '@E 9,999,999.99'},;  //10
    {'Saldo/Pago' , 13, '@E 9,999,999.99'},;  //11
    {'Tipo'       , 02, '99'},;
    {'Credor'     , 06, '999999'};
    }

   Do While !Eof()

      If cEstorno $ [ N]
         mValor := ret_saldo
      Else
         mValor := ret_vlPag
      EndIf

      AAdd(aDados, {'NÆo', ret_codigo, pla_codpla, ret_fr, tuo_codigo,;
       emp_ano, emp_numero, liq_numero, CtoD( Transform(ret_dd + ret_mm + ret_aa, '@R 99/99/9999') ),;
       ret_valor, mValor, ret_tipo, ccr_codigo})

      Skip

   EndDo

   Set(_SET_DELETED, dele_atu)
   Set Filter To

   Begin Sequence
      If Len(aDados) > 0

         SetCursor(0)
         aDados2 := RTP_RetBRow(16, 1, 38, 130, aCab, aDados, 9, cUo, cTipo, cNome)
         SetCursor(1)

         For i := 1 To Len(aDados2)
            If Upper(aDados2[i, 1]) = 'SIM'
               IF !USEARQ('RTLanc', .f., 20, 1)
                  Break
               EndIf

               Ptab(cCodigo, 'RTPag', 1)
               Ptab(aDados2[i, 2], 'RET', 1)
               If i = 1
                  If RTPag->( DbRLock() )
                     RTPag->( DbRecall() )
                  EndIf
                  RTPag->( DbRUnlock() )
               EndIf

               DbAppend()

               Replace;
                rtp_codigo With cCodigo ,;
                ret_codigo With aDados2[i, 2] ,;
                rtp_DD     With cDia ,;
                rtp_MM     With cMes ,;
                tuo_codigo With RET->tuo_codigo ,;
                emp_ano    With RET->emp_ano ,;
                emp_numero With RET->emp_numero ,;
                liq_numero With RET->liq_numero ,;
                pag_numero With RET->pag_numero ,;
                ret_tipo   With cTipo ,;
                cap_codigo With RET->cap_codigo ,;
                pla_codpla With RET->pla_codpla ,;
                ret_fr     With cFr ,;
                ccr_codigo With RET->ccr_codigo ,;
                ccr_cpfcnp With RET->ccr_cpfcnp ,;
                ret_tabela With RET->ret_tabela ,;
                rtl_valor  With aDados2[i, 11]

               If RTPag->(DbRLock())
                  Replace RTPag->rtp_vlTot With RTPag->rtp_vlTot + aDados2[i, 11]
               EndIf

               If RET->(DbRLock())
                  If cEstorno $ [ N]
                     Replace;
                      RET->ret_vlPag With RET->ret_vlPag + aDados2[i, 11]
                  Else
                     Replace;
                      RET->ret_vlPag With RET->ret_vlPag - aDados2[i, 11]
                  EndIf

                  Replace;
                   RET->ret_PagDD With cDia,;
                   RET->ret_PagMM With cMes,;
                   RET->ret_PagAA With M->par_aa,;
                   RET->pgr_codigo With 'RTPag->' + rtp_codigo

                  Replace RET->ret_saldo With RET->ret_valor - RET->ret_vlPag
                  If Empty( RET->guid)
                     RET->guid := NewGuid32()
                  EndIf
               EndIf

            EndIf
         Next

         mRetorno := .t.

      Else
         msg := 'Não encontrei registros de Retenção a pagar com saldo maior que ZERO e não foram Exportados. Inclua manualmente as Retenções.' + CRLF
         msg += 'U.O.: ' + Transform(cUo, '@R 99.99.99') + CRLF
         msg += 'Tipo:' + cTipo + CRLF
         msg += 'Credor: ' + cCredor
         msgAtencao(msg)
         mRetorno := .f.
      EndIf

   End Sequence

   Select (mAlias)

   Return mRetorno

   /////////////////////////////////////////////////////////////////////////////
Static PROCEDURE RTP_RetBRow(nLi, nCi, nLf, nCf, aACab, aADados, nColSoma, cUo, cTipo, cNome)

   LOCAL lContinue  := .T. ,;
    nKeyPressed := 0,;
    nArryRowNo := 1,;
    i, bBlock, oTBColumn, oCol, xVar
   Private mVltotal := 0.00, mVar

   * Draw a box around Browse window
   If AbreJanela( 'RETENÇÕES A INCLUIR NO PAGAMENTO:', 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 -3, 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 Say 'Filtro: UO[' + Transform(cUo, '@R 99.99.99')  +;
    '] + Tipo[' + cTipo + '] + Credor[' + Trim(cNome) + ']' + If(mRtpFR > '000', ' + FR[' + mRtpFR + ']', '') Color corcampo

   @ oBrowse:nBottom + 3, oBrowse:nleft + 1 Say 'Tecle [Enter] ou [Ctrl+S-Marca tudo] para selecionar e [ESC] para sair.'

   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 )
      oBrowse:getcolumn(i):cargo   := 0

   Next

   For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas e muda caso Status sela "SIM"
      oBrowse:getcolumn(i):colorblock=&("{||If(BrwStatus(), {2, 2}, 1, 2} ) }")
   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

         oBrowse:refreshall()                                 // refaz so' a linha do browse

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

         @ oBrowse:nBottom + 1, oBrowse:nleft + 01 Say 'Valor selecionado:'
         @ oBrowse:nBottom + 1, oBrowse:nleft + 92 Say Transform(mVlTotal, '@E 99,999,999.99') Color drvCorPad

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

      EndIf

      nKeyPressed := KeyPressed( @oBrowse )

      If nKeyPressed == K_CTRL_C
         oCol  := oBrowse:getColumn( oBrowse:colPos )
         mGet  := EVal(oCol:block)

         WVW_SetClipboard( HB_OemToAnsi( mGet ) )

         DBOX("Valor da c‚lula copiado para  rea de transferˆncia.|" + '"' + Trim(Left( mGet, 80 )) + '"', , , 3,,,,,,drvcorhlp)

      ElseIf nKeyPressed == K_CTRL_O
         For i := 1 To Len(aAcab)
            oBrowse:getColumn( i ):heading := aAcab[i, 1]
         Next

         nPos     := oBrowse:colPos

         oCol     := oBrowse:getColumn(nPos)
         mValor   := EVal(oCol:block)

         If oBrowse:getColumn( nPos ):cargo     = 0
            If Valtype( mValor ) = 'N'
               aSort(aDados,,, { |x, y| x[nPos] < y[nPos] } )
            Else
               aSort(aDados,,, { |x, y| Upper(x[nPos]) < Upper(y[nPos]) } )
            Endif
            oCol:heading := PadR(aAcab[nPos, 1], aACab[ nPos, 2 ] -2) + ' ' + Chr(26)
            oBrowse:getColumn( nPos ):cargo   := 1

         ElseIf oBrowse:getColumn( nPos ):cargo = 1
            If Valtype( mValor ) = 'N'
               aSort(aDados,,, { |x, y| x[nPos] > y[nPos] } )
            Else
               aSort(aDados,,, { |x, y| Upper(x[nPos]) > Upper(y[nPos]) } )
            Endif
            oCol:heading := PadR(aAcab[nPos, 1], aACab[ nPos, 2 ] -2) + ' ' + Chr(27)
            oBrowse:getColumn( nPos ):cargo   := 2

         ElseIf oBrowse:getColumn( nPos ):cargo = 2
            If Valtype( mValor ) = 'N'
               aSort(aDados,,, { |x, y| x[nPos] < y[nPos] } )
            Else
               aSort(aDados,,, { |x, y| Upper(x[nPos]) < Upper(y[nPos]) } )
            Endif
            oCol:heading := PadR(aAcab[nPos, 1], aACab[ nPos, 2 ] -2) + ' ' + Chr(26)
            oBrowse:getColumn( nPos ):cargo   := 1

         Endif

         oBrowse:configure()                                // tempo de "refresh" entao
      Endif

      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


Function BrwStatus()
   Local r := .f., oCol

   oCol := oBrowse:getColumn(1)
   mVar := EVal(oCol:block)
   If mVar = 'SIM'
      r:= .t.
   Endif

   Return r


   // This code block uses detached LOCAL variables to
   // access single elements of a two-dimensional array.
FUNCTION ArrayBlock( oTBrowse, nSubScript )
   RETURN {|| oTBrowse:data[ oTBrowse:recno, nSubScript ] }

   // This function navigates the row pointer of the
   // the data source (array)
FUNCTION ArraySkipper( nSkipRequest, oTBrowse )
   LOCAL nSkipped
   LOCAL nLastRec := Len( oTBrowse:data ) // Length of array

   IF oTBrowse:recno + nSkipRequest < 1
      // skip requested that navigates past first array element
      nSkipped := 1 - oTBrowse:recno

   ElseIF oTBrowse:recno + nSkipRequest > nLastRec
      // skip requested that navigates past last array element
      nSkipped := nLastRec - oTBrowse:recno

   Else
      // skip requested that navigates within array
      nSkipped := nSkipRequest
   EndIf

   // adjust row pointer
   oTBrowse:recno += nSkipped

   // tell TBrowse how many rows are actually skipped.
   RETURN nSkipped

   *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   /*
   Handle the (some) keystrokes of user
   */

FUNCTION TBrApplyKey( oBrowse, nKey )
   LOCAL lRVal := .T., i
   Private mVar

   DO CASE
   CASE nKey == K_SPACE .or. nKey == K_ENTER
      oCol := oBrowse:getColumn(1)
      mVar := EVal(oCol:block)

      If Left(mVar, 1) = 'N'
         oCol := oBrowse:getColumn(11)
         mVlTotal += EVal(oCol:block)
         aDados[oBrowse:recno, 1] := 'Sim'
      Else
         oCol := oBrowse:getColumn(11)
         mVlTotal -= EVal(oCol:block)
         aDados[oBrowse:recno, 1] := 'NÆo'
      EndIf

      oBrowse:refreshall()                                 // refaz so' a linha do browse
      ///oBrowse:refreshcurrent()                                 // refaz so' a linha do browse

   CASE nKey == K_CTRL_S
      For i := 1 TO Len(aDados)
         aDados[i, 1] := 'Sim'
      Next
      oBrowse:refreshall()                                 // refaz so' a linha do browse

   CASE nKey == K_CTRL_N
      For i := 1 TO Len(aDados)
         aDados[i, 1] := 'NÆo'
      Next
      oBrowse:refreshall()                                 // 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()

   *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Imagem.png
Desde já agradeço a ajuda.
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:

Consulta Browse com linhas com cores diferentes.

Mensagem por clodoaldomonteiro »

Já consegui fazer com ajudar de uma resposta do Dudu_xbase, em um posto sobre o mesmo assunto.

Código: Selecionar todos

////////////////////////////////////////////////////////////////////////////////
//Fonte: https://vivaclipper.wordpress.com/tag/array-browse/
//Links: https://pctoledo.org/forum/viewtopic.php?f=4&t=9575

#pragma -w0
#pragma -es0

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

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

Function RTP_RetGet(cCodigo, cDia, cMes, cUo, cTipo, cCredor, cNome, cFr, cEstorno)
   Local mRetorno := .f., aCab := {}, aDados := {}, aDados2 := {}, mAlias := Alias(), i
   Local dele_atu := Set(_SET_DELETED, .T.)     //Incluir os Excluidos

   If !USEARQ('RET', .f., 10)
      Return
   EndIf

   Set Filter To If(!Empty( cUo), tuo_codigo = cUo, .t.) .and. ret_tipo + ccr_codigo = cTipo + cCredor .and. ;
    If(mRtpFR > '000', ret_fr = mRtpFR, .t.) .and. ;
    If(cEstorno $ [ N], ret_saldo > 0.00, ret_vlPag > 0.00) .and. ;
     ret_aa + ret_mm + ret_dd <= M->par_aa + cMes + cDia .and. Exportado <> 'S'
   Go Top

   aCab := {;
    {'Status'     , 03, '@!'},;
    {'RET C¢digo' , 06, '999999'},;
    {'Conta PCASP', 11, '@R 99999.99.99'},;
    {'FR'         , 03, '999'},;
    {'UO C¢digo'  , 08, '@R 99.99.99'},;
    {'Ano EMP'    , 04, '9999'},;
    {'EMP N£mero' , 08, '99999999'},;         //05
    {'LIQ N£mero' , 08, '99999999'},;         //08
    {'Data RET'   , 10, '@D'},;               //09
    {'Valor RET'  , 13, '@E 9,999,999.99'},;  //10
    {'Saldo/Pago' , 13, '@E 9,999,999.99'},;  //11
    {'Tipo'       , 02, '99'},;
    {'Credor'     , 06, '999999'};
    }

   Do While !Eof()

      If cEstorno $ [ N]
         mValor := ret_saldo
      Else
         mValor := ret_vlPag
      EndIf

      AAdd(aDados, {'NÆo', ret_codigo, pla_codpla, ret_fr, tuo_codigo,;
       emp_ano, emp_numero, liq_numero, CtoD( Transform(ret_dd + ret_mm + ret_aa, '@R 99/99/9999') ),;
       ret_valor, mValor, ret_tipo, ccr_codigo})

      Skip

   EndDo

   Set(_SET_DELETED, dele_atu)
   Set Filter To

   Begin Sequence
      If Len(aDados) > 0

         SetCursor(0)
         aDados2 := RTP_RetBRow(16, 1, 38, 130, aCab, aDados, 9, cUo, cTipo, cNome)
         SetCursor(1)

         For i := 1 To Len(aDados2)
            If Upper(aDados2[i, 1]) = 'SIM'
               IF !USEARQ('RTLanc', .f., 20, 1)
                  Break
               EndIf

               Ptab(cCodigo, 'RTPag', 1)
               Ptab(aDados2[i, 2], 'RET', 1)
               If i = 1
                  If RTPag->( DbRLock() )
                     RTPag->( DbRecall() )
                  EndIf
                  RTPag->( DbRUnlock() )
               EndIf

               DbAppend()

               Replace;
                rtp_codigo With cCodigo ,;
                ret_codigo With aDados2[i, 2] ,;
                rtp_DD     With cDia ,;
                rtp_MM     With cMes ,;
                tuo_codigo With RET->tuo_codigo ,;
                emp_ano    With RET->emp_ano ,;
                emp_numero With RET->emp_numero ,;
                liq_numero With RET->liq_numero ,;
                pag_numero With RET->pag_numero ,;
                ret_tipo   With cTipo ,;
                cap_codigo With RET->cap_codigo ,;
                pla_codpla With RET->pla_codpla ,;
                ret_fr     With cFr ,;
                ccr_codigo With RET->ccr_codigo ,;
                ccr_cpfcnp With RET->ccr_cpfcnp ,;
                ret_tabela With RET->ret_tabela ,;
                rtl_valor  With aDados2[i, 11]

               If RTPag->(DbRLock())
                  Replace RTPag->rtp_vlTot With RTPag->rtp_vlTot + aDados2[i, 11]
               EndIf

               If RET->(DbRLock())
                  If cEstorno $ [ N]
                     Replace;
                      RET->ret_vlPag With RET->ret_vlPag + aDados2[i, 11]
                  Else
                     Replace;
                      RET->ret_vlPag With RET->ret_vlPag - aDados2[i, 11]
                  EndIf

                  Replace;
                   RET->ret_PagDD With cDia,;
                   RET->ret_PagMM With cMes,;
                   RET->ret_PagAA With M->par_aa,;
                   RET->pgr_codigo With 'RTPag->' + rtp_codigo

                  Replace RET->ret_saldo With RET->ret_valor - RET->ret_vlPag
                  If Empty( RET->guid)
                     RET->guid := NewGuid32()
                  EndIf
               EndIf

            EndIf
         Next

         mRetorno := .t.

      Else
         msg := 'Não encontrei registros de Retenção a pagar com saldo maior que ZERO e não foram Exportados. Inclua manualmente as Retenções.' + CRLF
         msg += 'U.O.: ' + Transform(cUo, '@R 99.99.99') + CRLF
         msg += 'Tipo:' + cTipo + CRLF
         msg += 'Credor: ' + cCredor
         msgAtencao(msg)
         mRetorno := .f.
      EndIf

   End Sequence

   Select (mAlias)

   Return mRetorno

   /////////////////////////////////////////////////////////////////////////////
Static PROCEDURE RTP_RetBRow(nLi, nCi, nLf, nCf, aACab, aADados, nColSoma, cUo, cTipo, cNome)

   LOCAL lContinue  := .T. ,;
    nKeyPressed := 0,;
    nArryRowNo := 1,;
    i, bBlock, oTBColumn, oCol, xVar
   Private mVltotal := 0.00, mVar

   * Draw a box around Browse window
   If AbreJanela( 'RETENÇÕES A INCLUIR NO PAGAMENTO:', 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 -3, 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 Say 'Filtro: UO[' + Transform(cUo, '@R 99.99.99')  +;
    '] + Tipo[' + cTipo + '] + Credor[' + Trim(cNome) + ']' + If(mRtpFR > '000', ' + FR[' + mRtpFR + ']', '') Color corcampo

   @ oBrowse:nBottom + 3, oBrowse:nleft + 1 Say 'Tecle [Enter] ou [Ctrl+S-Marca tudo] para selecionar e [ESC] para sair.'

   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 )
      oBrowse:getcolumn(i):cargo   := 0

   Next

   For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas e muda caso Status sela "SIM"
      oBrowse:getcolumn(i):colorblock={||If(Left(aDados[oBrowse:cargo[2], 1], 1) = 'S', {2,2}, {1,2} ) }
   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

         nPoint := oBrowse:RowPos
         
         oBrowse:refreshall()                                 // refaz so' a linha do browse

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

         @ oBrowse:nBottom + 1, oBrowse:nleft + 01 Say 'Valor selecionado:'
         @ oBrowse:nBottom + 1, oBrowse:nleft + 92 Say Transform(mVlTotal, '@E 99,999,999.99') Color drvCorPad

         @ oBrowse:nBottom + 2, oBrowse:nleft + 100 Say nPoint

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

      EndIf

      nKeyPressed := KeyPressed( @oBrowse )

      If nKeyPressed == K_CTRL_C
         oCol  := oBrowse:getColumn( oBrowse:colPos )
         mGet  := EVal(oCol:block)

         WVW_SetClipboard( HB_OemToAnsi( mGet ) )

         DBOX("Valor da c‚lula copiado para  rea de transferˆncia.|" + '"' + Trim(Left( mGet, 80 )) + '"', , , 3,,,,,,drvcorhlp)

      ElseIf nKeyPressed == K_CTRL_O
         For i := 1 To Len(aAcab)
            oBrowse:getColumn( i ):heading := aAcab[i, 1]
         Next

         nPos     := oBrowse:colPos

         oCol     := oBrowse:getColumn(nPos)
         mValor   := EVal(oCol:block)

         If oBrowse:getColumn( nPos ):cargo     = 0
            If Valtype( mValor ) = 'N'
               aSort(aDados,,, { |x, y| x[nPos] < y[nPos] } )
            Else
               aSort(aDados,,, { |x, y| Upper(x[nPos]) < Upper(y[nPos]) } )
            Endif
            oCol:heading := PadR(aAcab[nPos, 1], aACab[ nPos, 2 ] -2) + ' ' + Chr(26)
            oBrowse:getColumn( nPos ):cargo   := 1

         ElseIf oBrowse:getColumn( nPos ):cargo = 1
            If Valtype( mValor ) = 'N'
               aSort(aDados,,, { |x, y| x[nPos] > y[nPos] } )
            Else
               aSort(aDados,,, { |x, y| Upper(x[nPos]) > Upper(y[nPos]) } )
            Endif
            oCol:heading := PadR(aAcab[nPos, 1], aACab[ nPos, 2 ] -2) + ' ' + Chr(27)
            oBrowse:getColumn( nPos ):cargo   := 2

         ElseIf oBrowse:getColumn( nPos ):cargo = 2
            If Valtype( mValor ) = 'N'
               aSort(aDados,,, { |x, y| x[nPos] < y[nPos] } )
            Else
               aSort(aDados,,, { |x, y| Upper(x[nPos]) < Upper(y[nPos]) } )
            Endif
            oCol:heading := PadR(aAcab[nPos, 1], aACab[ nPos, 2 ] -2) + ' ' + Chr(26)
            oBrowse:getColumn( nPos ):cargo   := 1

         Endif

         oBrowse:configure()                                // tempo de "refresh" entao
      Endif

      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


Function BrwStatus()
   Local r := .f., oCol

   oCol := oBrowse:getColumn(1)
   mVar := EVal(oCol:block)
   If mVar = 'SIM'
      r:= .t.
   Endif

   Return r


   // This code block uses detached LOCAL variables to
   // access single elements of a two-dimensional array.
FUNCTION ArrayBlock( oTBrowse, nSubScript )
   RETURN {|| oTBrowse:data[ oTBrowse:recno, nSubScript ] }

   // This function navigates the row pointer of the
   // the data source (array)
FUNCTION ArraySkipper( nSkipRequest, oTBrowse )
   LOCAL nSkipped
   LOCAL nLastRec := Len( oTBrowse:data ) // Length of array

   IF oTBrowse:recno + nSkipRequest < 1
      // skip requested that navigates past first array element
      nSkipped := 1 - oTBrowse:recno

   ElseIF oTBrowse:recno + nSkipRequest > nLastRec
      // skip requested that navigates past last array element
      nSkipped := nLastRec - oTBrowse:recno

   Else
      // skip requested that navigates within array
      nSkipped := nSkipRequest
   EndIf

   // adjust row pointer
   oTBrowse:recno += nSkipped

   // tell TBrowse how many rows are actually skipped.
   RETURN nSkipped

   *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   /*
   Handle the (some) keystrokes of user
   */

FUNCTION TBrApplyKey( oBrowse, nKey )
   LOCAL lRVal := .T., i
   Private mVar

   DO CASE
   CASE nKey == K_SPACE .or. nKey == K_ENTER
      oCol := oBrowse:getColumn(1)
      mVar := EVal(oCol:block)

      If Left(mVar, 1) = 'N'
         oCol := oBrowse:getColumn(11)
         mVlTotal += EVal(oCol:block)
         aDados[oBrowse:recno, 1] := 'Sim'
      Else
         oCol := oBrowse:getColumn(11)
         mVlTotal -= EVal(oCol:block)
         aDados[oBrowse:recno, 1] := 'NÆo'
      EndIf

      oBrowse:refreshall()                                 // refaz so' a linha do browse
      ///oBrowse:refreshcurrent()                                 // refaz so' a linha do browse

   CASE nKey == K_CTRL_S
      For i := 1 TO Len(aDados)
         aDados[i, 1] := 'Sim'
      Next
      oBrowse:refreshall()                                 // refaz so' a linha do browse

   CASE nKey == K_CTRL_N
      For i := 1 TO Len(aDados)
         aDados[i, 1] := 'NÆo'
      Next
      oBrowse:refreshall()                                 // 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()

   *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
É basicamente aqui que acontece a coisa:

Código: Selecionar todos

   For i := 1 TO oBrowse:colcount                       // atualiza as cores das colunas e muda caso Status sela "SIM"
      oBrowse:getcolumn(i):colorblock={||If(Left(aDados[oBrowse:cargo[2], 1], 1) = 'S', {2,2}, {1,2} ) }
   Next
Fica aqui pra ajudar a quem interessar.
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
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

Consulta Browse com linhas com cores diferentes.

Mensagem por Fernando queiroz »

Código: Selecionar todos

					@ 2,30 BROWSE oBrowse1 ARRAY  OF oPage1  SIZE 1018,420 STYLE WS_BORDER + WS_VSCROLL + WS_HSCROLL ;
							ON CLICK {|| ::nProdutos_Id:=LTRIM(str(oDlg:oPage1:oBrowse1:aArray[ oDlg:oPage1:oBrowse1:nCurrent, 1])) ,  ;
										 ::manutencao( "ALTERAR" ) , oDlg:oPage1:oBrowse1:aArray := ::manutencaoCarrega( "WHERE produtos.BLOQUEADO = '0' ORDER BY produtos.DESPRO limit 50" ), ;
										 oPage1:obrowse1:REFRESH()};
							ON KEYDOWN {| oBrowse1, nKeyPress | ::manutencaoOnKeyDown( oDlg, oBrowse1, nKeyPress,  @cProgressKey ) };
							ON POSCHANGE {|| iif( oBrowse1:nCurrent <= Len( oBrowse1:aArray ), ::nProdutos_Id:=LTRIM(str(oBrowse1:aArray[oBrowse1:nCurrent, 1])), ) }

							oBrowse1:nHeadRows := 2
							oBrowse1:oStyleHead := BrowseStyleHead
							oBrowse1:headColor := BrowseheadColor
							oBrowse1:oFont := HFont():Add( '',0,-15,700,,,)	
							oBrowse1:freeze := 2
							oBrowse1:aArray := {}


							oBrowse1:AddColumn( HColumn():New( "ID",hwg_ColumnArBlock(),"N",13,0,.F.,1,2,,,,,,,,,,))
							oBrowse1:AddColumn( HColumn():New('* DESCRIÇÃO/NOME PRODUTO', hwg_ColumnArBlock() ,'C',75, 0 ,.F.,1,,,,,,,;
										{|| oBrowse1:aArray := ::manutencaoCarrega( "WHERE produtos.BLOQUEADO = '0' ORDER BY produtos.DESPRO " ),obrowse1:Refresh() } ,,,,))
							oBrowse1:AddColumn( HColumn():New('Unidade', hwg_ColumnArBlock() ,'C',9, 0 ,.F.,1,,,,,,,,,,,))		
							oBrowse1:AddColumn( HColumn():New('Estoque;Loja', hwg_ColumnArBlock() ,'N',14, 3 ,.F.,1,2,,,,,,,,,,))	  // somente para correcao
							oBrowse1:AddColumn( HColumn():New('Estoque;Deposito', hwg_ColumnArBlock() ,'N',14, 3 ,.F.,1,2,,,,,,,,,,))                      // somente para correcao
							oBrowse1:AddColumn( HColumn():New('Estoque;Minimo', hwg_ColumnArBlock() ,'N',10, 0 ,.F.,1,2,,,,,,,,,,))                      // somente para correcao					
							oBrowse1:AddColumn( HColumn():New('OBSERVAÇÕES;*', hwg_ColumnArBlock() ,'C',27, 0 ,.F.,1,,,,,,,; 
										{|| oBrowse1:aArray := ::manutencaoCarrega( "WHERE produtos.BLOQUEADO = '0' ORDER BY produtos.CODREF LIMIT 50" ),obrowse1:Refresh(), hwg_WriteStatus( oDlg,2,"Ordem: OBSERVAÇÕES") } ,,,,))
							oBrowse1:AddColumn( HColumn():New('Preço;Custo', hwg_ColumnArBlock() ,'N',14, 2 ,.F.,1,2,'@E 999,999.9999',,,,,,,,,))
							oBrowse1:AddColumn( HColumn():New('Preço;Venda', hwg_ColumnArBlock() ,'N',14, 2 ,.F.,1,2,'@E 999,999.9999',,,,,,,,,))		
							oBrowse1:AddColumn( HColumn():New('GTIN', hwg_ColumnArBlock() ,'N',17, 0 ,.F.,1,0,,,,,,,,,,))
							oBrowse1:AddColumn( HColumn():New('NCM', hwg_ColumnArBlock() ,'N',10, 0 ,.F.,1,2,,,,,,,,,,))
							oBrowse1:AddColumn( HColumn():New('CEST', hwg_ColumnArBlock() ,'C',9, 0 ,.F.,1,2,,,,,,,,,,))
							oBrowse1:AddColumn( HColumn():New('Tipo', hwg_ColumnArBlock() ,'C',14, 0 ,.F.,1,1,,,,,,,,,,))
							oBrowse1:AddColumn( HColumn():New('Operador/Computador', hwg_ColumnArBlock() ,'C',60, 0 ,.F.,1,,,,,,,,,,,))	
							oBrowse1:AddColumn( HColumn():New('S', hwg_ColumnArBlock() ,'N',5, 0 ,.F.,0,,,,,,,,,,,))	
							oBrowse1:AddColumn( HColumn():New('M', hwg_ColumnArBlock() ,'N',5, 0 ,.F.,0,,,,,,,,,,,))
							oBrowse1:AddColumn( HColumn():New('Regra', hwg_ColumnArBlock() ,'N',8, 0 ,.F.,0,,,,,,,,,,,))

							FOR EACH oColuna IN oBrowse1:aColumns
								oColuna:bColorBlock := { || ;
								iif( oBrowse1:nCurrent > Len( oBrowse1:aArray ), BrowseBarColorPrimary, ;
								iif( oBrowse1:aArray[ oBrowse1:nCurrent, 15 ] == 1, BrowseBarColorSecondary, ;
								iif( oBrowse1:aArray[ oBrowse1:nCurrent, 16 ] == 1, BrowseBarColorTerciary, ;
								BrowseBarColorPrimary ) ) ) }
							NEXT
							oBrowse1:lInfocus := .T.
				endif

			oPage1:EndPage()
Clipboard_05-26-2025_01.jpg
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Consulta Browse com linhas com cores diferentes.

Mensagem por JoséQuintas »

Tenho uma rotina genérica:

Código: Selecionar todos

FUNCTION Tobrowse( oTBrowse, oMyBrowse )

   LOCAL nCont, oColumn

   oMyBrowse:headsep   := "-"
   oMyBrowse:colsep    := " "
   oMyBrowse:ColorSpec := SetColTBrowse() // lista de cores
   FOR nCont = 1 TO Len( oTBrowse )
      oColumn := TBColumnNew( oTBrowse[ nCont, 1 ], oTBrowse[ nCont, 2 ] )
      IF Len( oTBrowse[ nCont ] ) > 2
         oColumn:ColorBlock := oTBrowse[ nCont, 3 ] // codeblock das cores
      ENDIF
      oMyBrowse:AddColumn( oColumn )
   NEXT

   RETURN NIL
No módulo, crio um array com titulo, coluna, e cores, este último quando precisa.

Código: Selecionar todos

oTBrowse := { ;
   { "titulo", { || campo }, { iif( condicao, {1,2}, {3,4}  ) } }, ;
   { "outro", { || campo } } }
Ou isso, ou se forem todos coloco no final de uma vez.

Código: Selecionar todos

FOR EACH aItem IN oTBrowse
   AAdd( aItem, { || iif( condicao, { 1,2}, { 3,4} ) } )
NEXT
A lista de cores, uso por número: ao invés de "W/N", uso "7/0"

Código: Selecionar todos

FUNCTION SetColorTbrowse()

   RETURN SetColorSay() + "," + SetColorFocus() + ",7/5,7/8,7/6,7/8,12/1,14/1,3/1"
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder