Browse: Como alterar nome da coluna?

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: Como alterar nome da coluna?

Mensagem por clodoaldomonteiro »

Bom dia a todos.

Estou usando TBrowse():New() para consultar minhas Arrays incluindo minhas colunas com:

Código: Selecionar todos

   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
... sendo que aAcab é uma array com as informações da da coluna, {Nome, Tamanho, Mascara} e pergunto se durante o uso, teria como alterar o nome da coluna, pois como a ordenação da consulta fica a critério do usuário, quero informar qual coluna está ordenada e em qual sentido?

Desde já agradeço a todos.
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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Browse: Como alterar nome da coluna?

Mensagem por alxsts »

Olá!

Não compilei nem testei. Veja se funciona:

Código: Selecionar todos

FUNCTION SetColHeading( oBr, nCol )

   LOCAL cHeading, nOrder

   // Supondo que dentro da variável cargo de cada coluna esteja armazenado o estado de ordenação da coluna:
   // 0 - Ordem Natural
   // 1 - Ordenação Ascendente
   // 2 - Ordenação Descendente
   
   cHeading := oBr:getColumn( nCol ):heading   // nCol = número da coluna a ter seu cabeçalho alterado
   nOrder   := oBr:getColumn( nCol ):cargo

   cHeading := StrTran( cHeading, "▲", "" )
   cHeading := StrTran( cHeading, "▼", "" )

   Do Case
      Case nOrder == 0
         // Ok
      Case nOrder == 1
         cHeading += " ▼" // Chr(31) ... Ascendente
      Case nOrder == 2
         cHeading += " ▲" // Chr(30) ... Descendente
   End Case

   oBr:getColumn( nCol ):heading := cHeading
   oBr:configure()

RETURN NIL
[]´s
Alexandre Santos (AlxSts)
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: Como alterar nome da coluna?

Mensagem por clodoaldomonteiro »

Muito obrigado, Alexandre Santos, deu blz demais.
Segue os fontes:

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 LIQ_NFConsulta( cCnpj )
   Local aCab := {}, aDados := {}, aDados2 := {}, mAlias := Alias(), i
   Local mHash, x, msg, mJSon, dele_atu := Set(_SET_DELETED, .T.)     //Incluir os Excluidos

   Private aNf

   Begin Sequence

      mSkip := 0
      mTop  := 20

      Do While .t.

         mJSon := SendGetNFe( cCnpj, mSkip, mTop )
         If '"error":' $ mJson
            msg := 'A consulta à Base de Dados de NFe não teve sucesso. Verifique se esta entidade de premissão para usar esta consulta.'
            msg += CRLF + '- Retorno: ' + CRLF + mJson
            MsgAtencao( msg )

            Break
         Endif

         x := hb_jsonDecode(mJSon, @mHash)

         If x > 0

            If Len(mHash["data"]) = 0
               Exit
            Endif

            For i := 1 TO Len(mHash["data"])
               If mHash["data"][i]["tipo_documento"] = 'nota' //.and. cEmitenteCnpj = mHash["data"][i]["emitente_cpf_cnpj"] .and. !mHash["data"][i]["resumo"]
                  AAdd( aDados, {;
                   StrTran( Left(mHash["data"][i]["data_evento"], 19), 'T', ' '),;
                   mHash["data"][i]["emitente_cpf_cnpj"],;
                   PadR(Left(hb_UTF8ToStr( mHash["data"][i]["emitente_nome_razao_social"] ), 100), 100),;
                   If( mHash["data"][i]["resumo"] = .t., 'Sim', 'NÆo'),;
                   mHash["data"][i]["valor_nfe"],;
                   mHash["data"][i]["chave_acesso"],;
                   mHash["data"][i]["id"];            //07
                   })
               Endif
            Next

            aSort(aDados,,, { |x, y| Upper(x[3])+x[1] < Upper(y[3])+y[1] } )

         Else
            Exit
         Endif

         mSkip += mTop

      Enddo

      aCab := {;
       {'Data NF'        , 19, ''},;
       {'CNPJ Emitente'  , 18, '@R 99.999.999/9999-99'},;
       {'RazÆo Social'   , 70, ''},;
       {'Resumo'         , 06, ''},;
       {'Valor NFe'      , 14, '@E 999,999,999.99'},;
       {'Chave de acesso', 44, ''},;
       {'ID'             , 36, ''};
       }

      If Len(aDados) > 0

         SetCursor(0)
         NFeBrowse( 2, 1, p_nNormalMaxRow -1, p_nNormalMaxCol -1, aCab, aDados )
         SetCursor(1)

      Else
         msg := '[NFConsulta] Não Notas Fiscais eletrônicas na base de dados.' + CRLF
         msg += 'CNPJ.: ' + Transform(cCnpj, '@R 99.999.999/9999-99')
         msgAtencao(msg)
      EndIf

   End Sequence

   If !Empty(mAlias)
      Select (mAlias)
   Endif

   Return aNf

   /////////////////////////////////////////////////////////////////////////////
Static PROCEDURE NFeBrowse( nLi, nCi, nLf, nCf, aACab, aADados )

   LOCAL lContinue  := .T. ,;
    nKeyPressed := 0,;
    nArryRowNo := 1,;
    i, bBlock, oTBColumn, xVar, oCol, mId

   Private aRetorno := {}

   * Draw a box around Browse window
   If AbreJanela( 'NOTAS FISCAIS ELETRÔNICAS', 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(179) + 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 'Qtd: [' + AllTrim( Transform( Len(aDados), '@E 999,999,999' ) ) + ']' Color corcampo

   @ oBrowse:nBottom + 1, oBrowse:nleft + 1 Say 'Tecle [Enter] para ver itens da NF, [Ctrl+E] para Exportar ou [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 )

      If i = 3
         mTitulo := PadR(aAcab[i, 1], aACab[ i, 2 ] -2) + ' ' + Chr(26)
      Else
         mTitulo := aAcab[i, 1]
      Endif

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

      oBrowse:AddColumn( oTBColumn )

      If i = 3
         oBrowse:getcolumn(i):cargo   := 1
      Else
         oBrowse:getcolumn(i):cargo   := 0
      Endif

   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

         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_ENTER
         oCol  := oBrowse:getColumn(7)  //Id
         mId   := EVal(oCol:block)

         LIQ_NFItens( mId, .f. )

      ElseIf nKeyPressed == K_CTRL_M
         oCol  := oBrowse:getColumn(7)  //Id
         mId   := EVal(oCol:block)

         LIQ_NFManifestacoes( mId, .f. )

      ElseIf nKeyPressed == K_CTRL_E

         mArqXls := DrvDbf + 'XLS\RelaçãoNotasFiscais-' + M->par_aa + '_' + pe_mm + ".xls"

         aCab := {}
         For i := 1 To Len( aACab )
            AAdd(aCab, {;
             aACab[i, 1],;
             Int(aACab[i, 2] * 6 );
             } )
         Next

         If xmlGeraTabela(mArqXls, 'Notas', aCab, aADados, 'Rela‡Æo de Notas fiscais: ')

            msg := 'O arquivo XLS(' + mArqXls + ') foi criado com sucesso. '
            msg += CRLF+ 'Deseja abri-lo?'

            If MsgYesNo( msg )
               AbreArquivo( mArqXls )
            EndIf

         Endif

      ElseIf nKeyPressed == K_CTRL_O
         For i := 1 To Len(aAcab)
            oBrowse:getColumn( i ):heading := aAcab[i, 1]
            //oBrowse:getColumn( i ):cargo   := 0
         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 aRetorno


Function KeyPressed( oBrowse )
   Local nKeyPressed, n

   nKeyPressed := Inkey(0)

   If nKeyPressed == K_MWFORWARD       //1014 Rolar pra cima
      keyboard 5

   Elseif nKeyPressed == K_MWBACKWARD  //1015 Rolar pra baixo
      keyboard 24

   Elseif nKeyPressed == K_LDBLCLK     //1006 duplo clique com esquerdo
      keyboard 13

   Elseif nKeyPressed == K_LBUTTONDOWN     //1002 um clique com esquerdo. move o cursor para a célula clicada

      IF ( n := oBrowse:mRowPos - oBrowse:rowPos ) < 0
         While++ n <= 0
            oBrowse:up()
         EndDo
      ElseIF n > 0
         While --n >= 0
            oBrowse:down()
         EndDo
      EndIf

      IF ( n := oBrowse:mColPos - oBrowse:colPos ) < 0
         While++ n <= 0
            oBrowse:Left()
         EndDo
      ElseIF n > 0
         While --n >= 0
            oBrowse:right()
         EndDo
      EndIf

   EndIf

   Return  nKeyPressed


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

Static FUNCTION TBrApplyKey( oBrowse, nKey )
   LOCAL lRVal := .T., i, oCol

   DO CASE
   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
Abraços.
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: Como alterar nome da coluna? (Browse RecordSet)

Mensagem por clodoaldomonteiro »

Aqui usando o browse com objeto Record Set, e ainda com ordenação variável por coluna.

Código: Selecionar todos

/*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ Empresa.: SIMPLES - SISTEMAS INFORMATIZADOS
\ Programa: SCP_Procedure .PRG
\ Data....: 15-02-05
\ Sistema.: SISTEMA DE CONTABILIDADE PéBLICA - Scp21H
\ Funcao..: Rotinas auxiliares
\ Analista: CLODOALDO MONTEIRO
\ Criacao.: GAS-Pro v4.0o
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
https://pctoledo.org/forum/viewtopic.php?f=4&t=23743
*/

#pragma -w0
#pragma -es0

#include "GAS.CH"     // inicializa constantes manifestas
//#include "FileIO.CH"
#include "TBrowse.ch"
#include "inkey.ch"

Procedure REG_BrowseCtrlZ_RS( cCodigo, cAlias )
   Local mAlias := Alias(), mTotal, mFiltro, msg, mCodigo
   Local mSQL, oRs, oTBrowse, telaSave, co_r, mJanela := 0

   Private cod_sos, cur_sor, ccAlias

   ccAlias := If( Empty( cAlias), Alias(), cAlias )
   mCodigo := cCodigo

   IF nivelop < 3           // se userName nao autorizado,
      Return                // cai fora..
   EndIf

   Set Key K_CTRL_Z TO

   cur_sor := SetCursor(0)     // salva cursor/acende
   cod_sos := 1

   Begin Sequence

      mSQL := "SELECT * "
      mSQL += " FROM Reg"
      mSQL += " Where inStr( '" + ccAlias + "', reg_alias ) <> 0"
      If !Empty( cCodigo)
         mSQL += " AND reg_codigo Like '" + cCodigo + "%'"
      EndIf
      mSQL += " Order By reg_data Desc, reg_hora Desc;"

      oRs := DbfSQLRsOpen(oCnDbf, mSQL)

      WITH OBJECT oRs

      If :RecordCount() = 0

         MsgAtencao( "Nada a consultar para esta tabela" )

         Break

      EndIf

      oTBrowse := { ;
       { "   #   "           , { || oRs:AbsolutePosition() }, '@E 999,999', 7 },;
       { "Data"              , { || Transform(oRs:Fields( "reg_data"   ):Value, '@D') }, '', 10 },;
       { "Hora"              , { || oRs:Fields( "reg_hora"   ):Value }, '', 08 },;
       { "Competˆncia"       , { || oRs:Fields( "reg_compet" ):Value }, '@R 9999/99', 08 },;
       { "Usu rio"           , { || HB_AnsiToOem( oRs:Fields( "reg_usuari" ):Value ) }, '', 20 },;
       { "Tabela"            , { || oRs:Fields( "reg_alias"  ):Value }, '', 10 },;
       { "Acesso C¢digo"     , { || oRs:Fields( "reg_codigo" ):Value }, '', 20 },;
       { "Tipo de movimento" , { || HB_AnsiToOem( oRs:Fields( "reg_tipo"   ):Value ) }, '', 12 },;
       { "Campo/Chave"       , { || oRs:Fields( "reg_campo"  ):Value }, '', 20 },;
       { "Descri‡Æo / Campo chave"       , { || HB_AnsiToOem( oRs:Fields( "reg_titulo" ):Value ) }, '', 30 },;
       { "Conte£do anterior / Mensagem 1", { || HB_AnsiToOem( oRs:Fields( "reg_antes"  ):Value ) }, '', 50 },;
       { "Conte£do atual / Mensagem 2"   , { || HB_AnsiToOem( oRs:Fields( "reg_depois" ):Value ) }, '', 50 },;
       { "IP"                , { || oRs:Fields( "reg_ip"      ):Value }, '', 15 },;
       { "Net Name"          , { || HB_AnsiToOem( oRs:Fields( "reg_NetNam"  ):Value ) }, '', 20 },;
       { "S.O. VersÆo"       , { || HB_AnsiToOem( oRs:Fields( "reg_SOVers"  ):Value ) }, '', 30 },;
       { "S.O. Usu rio"      , { || HB_AnsiToOem( oRs:Fields( "reg_SOuser"  ):Value ) }, '', 30 },;
       { "MAC Rede"          , { || oRs:Fields( "reg_mac"     ):Value }, '', 20 },;
       { "Flag"              , { || oRs:Fields( "flag"        ):Value }, '', 15 };
       }

      BrowseADORS( 2, 1, p_nNormalMaxRow -1, p_nNormalMaxCol -1, oRs, oTBrowse, cAlias, cCodigo )

   END WITH

   oRs:Close()
   oRs := NIL

   End Sequence

   Set Key K_CTRL_Z TO VE_CRUD( )

   SetCursor(cur_sor)                          // restabelece o cursor

   FreeMemory()

   Return


FUNCTION BrowseADORS( nTop, nLeft, nBottom, nRight, oRs, oTBrowse, cTabela, cFiltro, cFilterKey, bKeyboard, bUserFunction, nFixToCol, aADOFilterList, lKeyboard )

   LOCAL oBrowse
   LOCAL lContinue  := .T. ,;
    nKeyPressed := 0,;
    nArryRowNo := 1,;
    i, bBlock, oTBColumn, oCol, xVar, mVar
   Local co_r

   (aADOFilterList)
   (cFilterKey)

   Default( @lKeyboard, .T. )

   If AbreJanela( 'VISUALIZAÇÃO DOS LOGS DA TABELA: ' + cTabela, nTop, nLeft, nBottom, nRight, ) == 0
      MsgError( "Erro ao abrir Janela de dados." )
      Return
   EndIf

   co_r := SetColor( drvcortel )

   Caixa(mold, nTop, nLeft, nBottom, nRight)

   oBrowse := TBrowseNew( nTop  + 1, nLeft, nBottom -1, nRight )

   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: ' + cFiltro + ']' Color corcampo
   @ oBrowse:ntop-1, oBrowse:nRight -13 Say '[Qtd: ' + Transform(oRs:RecordCount(), '@E 999,999]') Color corcampo
   @ oBrowse:nBottom + 1, oBrowse:nleft + 1 Say 'Tecle as [setas] para movimentar ou [ESC] para sair.'

   oBrowse:GoTopBlock      := { || oRs:MoveFirst() }
   oBrowse:GoBottomBlock   := { || oRs:MoveLast() }
   oBrowse:SkipBlock       := { | n | oRsBrowseSkipper( oRs, n ) }

   IF nFixToCol <> NIL
      oBrowse:freeze := nFixToCol
   EndIf

   For i := 1 To Len(oTBrowse)

      oTBColumn        := TBColumn():New( oTBrowse[i, 1], oTBrowse[i, 2] )
      oTBColumn:Picture := oTBrowse[ i, 3 ]
      oTBColumn:Width  := oTBrowse[ i, 4 ]

      oBrowse:AddColumn( oTBColumn )

      oBrowse:getcolumn(i):cargo   := 0

   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

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

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

      EndIf

      nKeyPressed := KeyPressed( @oBrowse )

      If nKeyPressed == K_CTRL_O

         nCol     := oBrowse:colPos
         mNomeCol := oTBrowse[nCol, 1]
         
         For i := 1 To Len(oTBrowse)
            oBrowse:getColumn( i ):heading := oTBrowse[i, 1]
         Next

         If nCol > 1

            cField := oRs:Fields(nCol -1):Name
            oCol     := oBrowse:getColumn(nCol)
            
            mDescend := ''
            If     oBrowse:getColumn( nCol ):cargo = 0
               mDescend := ''

               oCol:heading := PadR(oTBrowse[nCol, 1], oTBrowse[ nCol, 4 ] -2) + ' ' + Chr(26)
               oBrowse:getColumn( nCol ):cargo := 1

            ElseIf oBrowse:getColumn( nCol ):cargo = 1
               mDescend := ' DESC'

               oCol:heading := PadR(oTBrowse[nCol, 1], oTBrowse[ nCol, 4 ] -2) + ' ' + Chr(27)
               oBrowse:getColumn( nCol ):cargo := 2

            ElseIf oBrowse:getColumn( nCol ):cargo = 1
               mDescend := ''

               oCol:heading := PadR(oTBrowse[nCol, 1], oTBrowse[ nCol, 4 ] -2) + ' ' + Chr(26)
               oBrowse:getColumn( nCol ):cargo := 1

            Endif

            oRs:Sort := cField + mDescend

            oRs:MoveFirst()

            oBrowse:configure()

            mDescri := 'Ordem: ' + mNomeCol + ' -> ('+cField+')'
            @ oBrowse:nBottom + 1, oBrowse:nRight - Len(mDescri) -1 Say mDescri Color drvCorHlp

         Endif

      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( p_nNormalMaxCol -1, 0 )

   FechaJanela()

   SetColor( co_r )

   RETURN Nil

Static FUNCTION TBrApplyKey( oBrowse, nKey )

   LOCAL lRVal := .T., mVar, i

   DO CASE
   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_CTRL_HOME
      oBrowse:panHome()

   CASE nKey == K_CTRL_END
      oBrowse:panEnd()

   CASE nKey == K_ESC
      lRVal := .F.

   ENDCASE

   RETURN lRVal // TBrApplyKey()


STATIC FUNCTION oRsBrowseSkipper( oRs, nSkip )

   LOCAL nRec := oRs:AbsolutePosition()

   IF ! oRs:Eof()
      oRs:Move( nSkip )
      IF oRs:Eof()
         oRs:MoveLast()
      EndIf

      IF oRs:Bof()
         oRs:MoveFirst()
      EndIf
   EndIf

   RETURN oRs:AbsolutePosition() - nRec

   /*
   IF ( bAction := SetKey( nKey ) ) <> NIL
      EVal( bAction, ProcName(), ProcLine(), ReadVar() )
   EndIf

   //nMRow := MRow()
   //nMCol := MCol()

   DO CASE
   CASE nKey > 999
      //DO CASE
      //CASE mBrzMove( oBrowse, nMRow, nMCol, nTop + 1, nLeft + 1, nBottom - 1, nRight - 1 )
      //CASE mBrzClick( oBrowse, nMRow, nMCol )
         //   nKey := 0
         //   KEYBOARD Chr( K_ENTER )
         //   LOOP
      //ENDCASE
   CASE nKey == K_ENTER .and. bUserFunction == NIL

      Do While ! oBrowse:Stable
         oBrowse:Stabilize()
      EndDo

      IF bKeyboard <> NIL
         IF Valtype( EVal( bKeyboard ) ) == "N"
            //Errorsys_WriteErrorLog( "KEYBOARD numérico no BROWSEADO", 2 )
            cKeyboard := LTrim( Str( EVal( bKeyBoard ), 16, 0 ) ) + Chr( K_ENTER )
            IF lKeyBoard
               KEYBOARD cKeyBoard
            EndIf
         Else
            cKeyboard := EVal( bKeyBoard ) + Chr( K_ENTER )
            IF lKeyboard
               KEYBOARD cKeyboard
            EndIf
         EndIf
      EndIf

      EXIT

   CASE nkey == K_CTRL_PGDN ;  nKey := 0; oBrowse:GoBottom() ; LOOP
    CASE nkey == K_CTRL_PGUP ;  nKey := 0; oBrowse:GoTop() ;    LOOP
    CASE nkey == K_DOWN ;       nKey := 0; oBrowse:Down()    ;  LOOP
    CASE nkey == K_HOME ;       nKey := 0; oBrowse:GoTop() ;    LOOP
    CASE nkey == K_END ;        nKey := 0; oBrowse:GoBottom() ; LOOP
    CASE nkey == K_LEFT ;       nKey := 0; oBrowse:Left() ;     LOOP
    CASE nkey == K_RIGHT ;      nKey := 0; oBrowse:Right() ;    LOOP
    CASE nkey == K_PGDN ;       nKey := 0; oBrowse:PageDown() ; LOOP
    CASE nkey == K_PGUP ;       nKey := 0; oBrowse:PageUp() ;   LOOP
    CASE nkey == K_UP ;         nKey := 0; oBrowse:Up() ;       LOOP
    CASE nKey == K_ESC ;   EXIT
    CASE nKey == K_ALT_F
   CASE nKey == K_BS
   //CASE IsRange( nKey, 32, 127 ) .and. cFilterKey <> NIL .and. ! cnSQL:Eof()
   ENDCASE

   IF bUserFunction <> NIL

      Do While ! oBrowse:Stable
         oBrowse:Stabilize()
      EndDo

      SET CURSOR ON
      EVal( bUserFunction, oBrowse, nKey, cnSQL )
      oBrowse:RefreshAll()
   EndIf

   nKey := 0 // para refresh

   EndDo

   FechaJanela()

   SetColor( co_r )

   RETURN cKeyboard
   */
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse: Como alterar nome da coluna?

Mensagem por JoséQuintas »

As rotinas ficaram boas.

Sugestões:

Já que a assinatura sugere harbour:

Aplicando filtro no inkey, já transforma uso do mouse de uma vez, sem precisar colocar em cada browse e em outros lugares
Tem até control-c, control-v

Código: Selecionar todos

   hb_gtInfo( HB_GTI_INKEYFILTER, { | nKey | MyInkeyFilter( nKey ) } )
...
/*
ZE_INKEYFILTER
José Quintas
*/

#include "hbgtinfo.ch"
#include "inkey.ch"

FUNCTION MyInkeyFilter( nKey )

   LOCAL nBits, lIsKeyCtrl

   nBits      := hb_GtInfo( HB_GTI_KBDSHIFTS )
   lIsKeyCtrl := ( nBits == hb_BitOr( nBits, HB_GTI_KBD_CTRL ) )
   SWITCH nKey
   CASE HB_K_CLOSE     ; RETURN K_ESC
   //CASE HB_K_RESIZE    ; wvgSetAppWindow():InvalidateRect(); wvgSetAppWindow():Refresh(); RETURN Nil
   //CASE HB_GTE_RESIZED ; wvgSetAppWindow():InvalidateRect(); wvgSetAppWindow():Refresh(); RETURN Nil
   CASE K_MWBACKWARD   ; RETURN K_DOWN
   CASE K_MWFORWARD    ; RETURN K_UP
   CASE K_RBUTTONDOWN  ; RETURN K_ESC
   CASE K_RBUTTONUP    ; RETURN 255 // Nil/0 is used to exit on some routines
   CASE K_RDBLCLK      ; RETURN K_ESC
   CASE K_TAB          ; RETURN K_DOWN
   CASE K_SH_TAB       ; RETURN K_UP
   CASE K_CTRL_V
      IF lIsKeyCtrl
         hb_GtInfo( HB_GTI_CLIPBOARDPASTE )
         RETURN Nil
      ENDIF
   CASE K_CTRL_C
      IF lIsKeyCtrl
         IF GetActive() != Nil
            hb_gtInfo( HB_GTI_CLIPBOARDDATA, Transform( GetActive():VarGet(), "" ) )
            RETURN Nil
         ENDIF
      ENDIF
   ENDSWITCH

   RETURN nKey
Num determinado ponto tem

Código: Selecionar todos

IF x > 0
   um grande if
else
   exit
endif
sugiro trocar pra

Código: Selecionar todos

IF x <= 0
   EXIT
ENDIF
um grande if que deixou de ser
Assim enxerga o "ELSE" logo de cara, não depende de ficar paginando fonte.

E nesta parte aqui

Código: Selecionar todos

For i := 1 TO Len(mHash["data"])
   If mHash["data"][i]["tipo_documento"] = 'nota' //.and. cEmitenteCnpj = mHash["data"][i]["emitente_cpf_cnpj"] .and. !mHash["data"][i]["resumo"]
      AAdd( aDados, {;
         StrTran( Left(mHash["data"][i]["data_evento"], 19), 'T', ' '),;
         mHash["data"][i]["emitente_cpf_cnpj"],;
         PadR(Left(hb_UTF8ToStr( mHash["data"][i]["emitente_nome_razao_social"] ), 100), 100),;
         If( mHash["data"][i]["resumo"] = .t., 'Sim', 'NÆo'),;
         mHash["data"][i]["valor_nfe"],;
         mHash["data"][i]["chave_acesso"],;
         mHash["data"][i]["id"];            //07
         })
   Endif
Next
Talvez não faça parte do seu dia a dia.... mas é interessante o FOR/EACH

Código: Selecionar todos

FOR EACH aItem IN mHash["data"]
   If aItem["tipo_documento"] = 'nota' //.and. cEmitenteCnpj = aItem["emitente_cpf_cnpj"] .and. !aItem["resumo"]
      AAdd( aDados, {;
         StrTran( Left(aItem["data_evento"], 19), 'T', ' '),;
         aItem["emitente_cpf_cnpj"],;
         PadR(Left(hb_UTF8ToStr( aItem["emitente_nome_razao_social"] ), 100), 100),;
         If( aItem["resumo"] = .t., 'Sim', 'NÆo'),;
         aItem["valor_nfe"],;
         aItem["chave_acesso"],;
         aItem["id"];            //07
         })
   Endif
Next
Pra efeito comparativo com o FOR/NEXT, seria algo parecido com isto

Código: Selecionar todos

FOR nCont = 1 TO Len( mHash[ "data" ] )
   aItem := mHash[ "data" ][ nCont ]
   ...
Nota: Obrigatoriamente a variável usada no FOR/EACH precisa ser declarada LOCAL.
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/
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: Como alterar nome da coluna?

Mensagem por clodoaldomonteiro »

Aqui a função para navegar com Mouse.

Código: Selecionar todos

Function KeyPressed( oBrowse )
   Local nKeyPressed, n

   nKeyPressed := Inkey(0)

   If nKeyPressed == K_MWFORWARD       //1014 Rolar pra cima
      keyboard 5

   Elseif nKeyPressed == K_MWBACKWARD  //1015 Rolar pra baixo
      keyboard 24

   Elseif nKeyPressed == K_LDBLCLK     //1006 duplo clique com esquerdo
      keyboard 13

   Elseif nKeyPressed == K_LBUTTONDOWN     //1002 um clique com esquerdo. move o cursor para a célula clicada

      IF ( n := oBrowse:mRowPos - oBrowse:rowPos ) < 0
         While++ n <= 0
            oBrowse:up()
         EndDo
      ElseIF n > 0
         While --n >= 0
            oBrowse:down()
         EndDo
      EndIf

      IF ( n := oBrowse:mColPos - oBrowse:colPos ) < 0
         While++ n <= 0
            oBrowse:Left()
         EndDo
      ElseIF n > 0
         While --n >= 0
            oBrowse:right()
         EndDo
      EndIf

   EndIf

   Return  nKeyPressed

Abraços.
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: Como alterar nome da coluna?

Mensagem por clodoaldomonteiro »

Implementado mais hotKeys.
Control T para tamanho da coluna e Control P para pesquisar por um valor.

Código: Selecionar todos

 
...
...
     nKeyPressed := KeyPressed( @oBrowse )

      If nKeyPressed == K_CTRL_O

         nCol     := oBrowse:colPos
         mNomeCol := oTBrowse[nCol, 1]

         For i := 1 To Len(oTBrowse)
            oBrowse:getColumn( i ):heading := oTBrowse[i, 1]
         Next

         If nCol > 1

            cField := oRs:Fields(nCol -1):Name
            oCol     := oBrowse:getColumn(nCol)

            mDescend := ''
            If     oBrowse:getColumn( nCol ):cargo = 0
               mDescend := ''

               oCol:heading := PadR(oTBrowse[nCol, 1], oTBrowse[ nCol, 4 ] -2) + ' ' + Chr(26)
               oBrowse:getColumn( nCol ):cargo := 1

            ElseIf oBrowse:getColumn( nCol ):cargo = 1
               mDescend := ' DESC'

               oCol:heading := PadR(oTBrowse[nCol, 1], oTBrowse[ nCol, 4 ] -2) + ' ' + Chr(27)
               oBrowse:getColumn( nCol ):cargo := 2

            ElseIf oBrowse:getColumn( nCol ):cargo = 1
               mDescend := ''

               oCol:heading := PadR(oTBrowse[nCol, 1], oTBrowse[ nCol, 4 ] -2) + ' ' + Chr(26)
               oBrowse:getColumn( nCol ):cargo := 1

            Endif

            oRs:Sort := cField + mDescend

            oRs:MoveFirst()

            oBrowse:configure()

            mDescri := 'Ordem: ' + mNomeCol + ' -> ('+cField+')'
            @ oBrowse:nBottom + 1, oBrowse:nRight - Len(mDescri) -1 Say mDescri Color drvCorHlp

         Endif

      ElseIf nKeyPressed == K_CTRL_P

         nCol     := oBrowse:colPos
         mNomeCol := oTBrowse[nCol, 1]

         mValor := Space(50)

         msg    := "Pesquisar valor na coluna: " + mNomeCol
         mValor := DBOX("Pesquisar por:",,,,, msg, mValor, '@S30')

         If !Empty( mValor ) .and. LastKey() <> K_ESC

            oRs:MoveFirst()  // Vai para o início do RecordSet
            x := ''
            DO WHILE ! oRs:Eof()

               IF Upper(AllTrim(mValor)) $ Upper(AllTrim( oRs:Fields(nCol - 1):Value ))
                  oBrowse:RefreshCurrent()
                  EXIT
               ENDIF

               x := Upper(AllTrim( oRs:Fields(nCol - 1):Value ))
               
               oRs:MoveNext()

            ENDDO

            IF oRs:Eof()
               Msg := "Valor não encontrado na coluna " + HB_OemToAnsi( mNomeCol ) + '(' + oRs:Fields(nCol -1):Name + ')'
               msg += CRLF + 'Valor pesquisado: ' + Trim(mValor)
               //msg += CRLF + 'Valor pesquisado: ' + Trim(x)
               
               MsgAtencao( msg )
               
               oRs:MoveFirst()
            ENDIF

         Endif

         oBrowse:configure()

      ElseIf nKeyPressed == K_CTRL_T

         nCol     := oBrowse:colPos
         mNomeCol := oTBrowse[nCol, 1]

         mT := oBrowse:getColumn( nCol ):width

         Do While .t.
            msg:= "Largura da coluna: " + mNomeCol
            mT := DBOX("Novo tamanho",,,,, msg, mT, '@E 999')

            If LastKey() = K_ESC
               Exit
            Endif

            If mT < 3 .or. mT > 100
               msg := 'Não é permitido tamanhos de colunas menor que 3 ou maior que 100.'
               MsgAtencao(msg)
               Loop
            Endif

            Exit

         Enddo

         oBrowse:getColumn( nCol ):width := mT

         oBrowse:configure()

      Endif

      lContinue  := TBrApplyKey( oBrowse, nKeyPressed )

...
...
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse: Como alterar nome da coluna?

Mensagem por JoséQuintas »

Só esqueceu que está usando ADO e não DBF.
Ao invés de DO WHILE ! Rs:Eof()

Rs:Find "campo=valor"
Rs:Filter "campo=valor"

A expressão será em SQL do ADO, pode usar LIKE, AND, OR, e outros, mas find só aceita um campo.

https://www.w3schools.com/asp/met_rs_find.asp

https://www.w3schools.com/asp/prop_rs_filter.asp
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