Página 1 de 1

Browse: Como alterar nome da coluna?

Enviado: 26 Ago 2024 10:15
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.

Browse: Como alterar nome da coluna?

Enviado: 26 Ago 2024 11:54
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

Browse: Como alterar nome da coluna?

Enviado: 26 Ago 2024 14:21
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.

Browse: Como alterar nome da coluna? (Browse RecordSet)

Enviado: 27 Ago 2024 14:35
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
   */

Browse: Como alterar nome da coluna?

Enviado: 27 Ago 2024 18:44
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.

Browse: Como alterar nome da coluna?

Enviado: 28 Ago 2024 15:08
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.

Browse: Como alterar nome da coluna?

Enviado: 29 Ago 2024 13:46
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 )

...
...

Browse: Como alterar nome da coluna?

Enviado: 29 Ago 2024 19:03
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