Clipper On Line • Ver Tópico - cor no tbrowse

cor no tbrowse

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

Moderador: Moderadores

 

cor no tbrowse

Mensagempor alxsts » 06 Set 2021 19:41

Olá!

cjp escreveu:{ "PONTOS", { || oRs:ToStr( "PONTOS", 6 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;


Você quer pintar a coluna "PONTOS" de vermelho. Nela não existe a palavra "TOTAL". Note que a palavra total está na coluna "COMIDA". Da forma como está fazendo não vai dar certo. Você tem que pintar a coluna "PONTOS" baseado no conteúdo de outra coluna, a coluna "COMIDA".
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

cor no tbrowse

Mensagempor cjp » 07 Set 2021 00:03

Você quer pintar a coluna "PONTOS" de vermelho. Nela não existe a palavra "TOTAL". Note que a palavra total está na coluna "COMIDA". Da forma como está fazendo não vai dar certo. Você tem que pintar a coluna "PONTOS" baseado no conteúdo de outra coluna, a coluna "COMIDA".


É esse o problema. Não sei como fazer isto.

Fico pensando se não seria mais fácil colocar o que está querendo dentro do próprio banco de dados, como VIEW ou PROCEDURE.
E o próprio banco retornar a configuração do browse.


Não faço ideia de como fazer isto.

Mover conexão, criação da lista de campos, rotinas de usuário, etc.
Centenas de rotinas diferentes no mesmo fonte.
O que tem de genérico nisso?


A lista de campos não mesmo, nem as rotinas de usuário. Eu estava falando só da conexão em si. Mas, provavelmente, a lista de campos depende da conexão, né? Então, não daria para deixar a lista de campos na específica e passar a conexão para a genérica, como eu estava imaginando fazer.

Eu também, se a outra funciona, verifique se esse iif() é válido.


Ainda não entendi. Não achei nenhum iif().
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

cor no tbrowse

Mensagempor JoséQuintas » 07 Set 2021 11:51

Na verdade o IF() seria IIF().
Isso vai retornar verdadeiro ou falso, e conforme o verdadeiro ou falso é onde atribui as cores.
Se essa expressão não retornar verdadeiro, não vai mudar de cor nunca.
Isso é justamente a decisão se vai trocar a cor ou não.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18162
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor JoséQuintas » 07 Set 2021 14:00

{ | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) }


E antes que diga.... "não entendo de codeblock"....
Pronto, aqui não é codeblock:
If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) 


É isso acima que decide qual vai ser a cor, se a condição for verdadeira é numa cor, senão é em outra
Se essa condição não serve, troque pra outra.
X é o conteúdo da coluna a ser pintada.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18162
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor JoséQuintas » 07 Set 2021 21:18

cjp escreveu:Eu estava falando só da conexão em si. Mas, provavelmente, a lista de campos depende da conexão, né? Então, não daria para deixar a lista de campos na específica e passar a conexão para a genérica, como eu estava imaginando fazer.


Antes de pensar em mover essa conexão, deveria se perguntar... porque precisa desse fonte de conexão?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18162
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor cjp » 07 Set 2021 23:40

É isso acima que decide qual vai ser a cor, se a condição for verdadeira é numa cor, senão é em outra
Se essa condição não serve, troque pra outra.
X é o conteúdo da coluna a ser pintada.


Eu entendi isso.
Só não entendi ainda como determinar o X.
Tentei fazer assim:

         { "PONTOS",     { || oRs:ToStr( "PONTOS", 9, 1 ) }, { | x |  If( At( "TOTAL ", Upper( "COMIDA" ) ) > 0, { 5, 5 }, { 1, 2 } ) } }


Mas dá erro na compilação (Incomplet statement or unbalanced delimite).
Não vejo isso nessa linha, que está (no meu modo de ver) igual à outra.

A ideia é: se tem "TOTAL" no campo comida, o campo x (que, no caso, é o campo PONTOS) deve ficar em vermelho.

Antes de pensar em mover essa conexão, deveria se perguntar... porque precisa desse fonte de conexão?


Não entendi. Como não precisaria dessa fonte de conexão? Preciso pegar os dados do banco de dados.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

cor no tbrowse

Mensagempor JoséQuintas » 08 Set 2021 07:20

cjp escreveu:Mas dá erro na compilação (Incomplet statement or unbalanced delimite).
Não vejo isso nessa linha, que está (no meu modo de ver) igual à outra.


Tá igual não. E vai piorar.
Começa que, a lista de campos não é igual.
Complicado porque mistura array de array contendo codeblock, tanto array quanto codeblock usam {} como delimitadores.
aList := { ;
{ }, ;
{ }, ;
{ } }


cjp escreveu:At( "TOTAL ", Upper( "COMIDA" ) )


Com certeza Upper( "COMIDA" ) significa tão somente "COMIDA".
Preciso lembrar que nas colunas já usou o campo comida?? só olhar como é que se pega o campo comida.

cjp escreveu:Não entendi. Como não precisaria dessa fonte de conexão? Preciso pegar os dados do banco de dados.


É sempre mesma conexão, é sempre mesmo banco de dados, é sempre mesma rotina.
Não achou estranho ficar criando a mesma coisa milhares de vezes?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18162
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor JoséQuintas » 08 Set 2021 07:27

Não entendo... não entendo... não entendo... não entendo...
E nesse não entendo, tá sempre perguntando.

@ 0, 0 SAY Upper( "COMIDA" )


Isso acima pega algum conteúdo de algum campo?
Foi isso que colocou no browse.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18162
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor JoséQuintas » 08 Set 2021 17:28

Só um comentário:

Tenho postado assim, que é pra você mesmo encontrar a solução.
O fonte é seu, o banco de dados é seu, você deve saber como faz pra mostrar um campo na tela.
É só substituir essa parte pelo equivalente ao seu campo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18162
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor cjp » 08 Set 2021 19:58

Tenho postado assim, que é pra você mesmo encontrar a solução.
O fonte é seu, o banco de dados é seu, você deve saber como faz pra mostrar um campo na tela.
É só substituir essa parte pelo equivalente ao seu campo.


Eu entendo. Aliás, este post tem servido muito mais para eu aprender do que para resolver o problema específico propriamente.

Isso acima pega algum conteúdo de algum campo?
Foi isso que colocou no browse.


De fato, agora vejo que não faz sentido. Tentei também com upper(comida), dando o mesmo erro.

Tá igual não. E vai piorar.
Começa que, a lista de campos não é igual.
Complicado porque mistura array de array contendo codeblock, tanto array quanto codeblock usam {} como delimitadores.


Esta parte é que eu não consigo entender.

Preciso lembrar que nas colunas já usou o campo comida?? só olhar como é que se pega o campo comida.


Sim, já usei, mas ainda não entendi como usá-la aqui.

Tentando colocar as ideias em ordem para tentar te entender: começo esta função recebendo por parâmetro o seguinte cSql: select data,hora,comida,quantidade,pontos,id from pontos where data='"+dtsql(dt)+"' order by hora. Daí executo este sql, portanto, peguei o campo comida.
Daí crio a array com a lista de campos, desta forma:

      aCamposList := { ;
         { "DATA",       { || oRs:ToDate( "DATA" ) } }, ;
         { "HORA",       { || oRs:ToString( "HORA", 8 ) } }, ;
         { "COMIDA",     { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
         { "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 )  } }, ;
         { "PONTOS",     { || oRs:ToStr( "PONTOS", 9, 1 ) }, { | x |  If( At( "TOTAL ", Upper( COMIDA ) ) > 0, { 5, 5 }, { 1, 2 } ) } }


Na última linha desta array está dando o erro. Tomei ela por modelo da terceira linha, tentando mudar o que deveria, mas não acertei isso.

Vc disse que o x é o campo que desejo pintar com cor diferente (no caso, PONTOS; na terceira linha é COMIDA), mas ainda não entendi bem de onde sai esse x.

Em suma, ainda estou totalmente perdido nesta questão.

É sempre mesma conexão, é sempre mesmo banco de dados, é sempre mesma rotina.
Não achou estranho ficar criando a mesma coisa milhares de vezes?


Não sei se te entendi. Vc está falando de fazer uma só conexão e manter ela ativa em todo o sistema. Já tentei isso no passado, sem sucesso.

Milhares de vezes?
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

cor no tbrowse

Mensagempor alxsts » 09 Set 2021 02:35

Olá!
Capturar.JPG

Alexandre Santos escreveu:
// O code block abaixo define a cor das colunas 3 (comida) e 5 (pontos).
//
// Um code block, em xBase, é um tipo de dados como outro qualquer
// da linguagem. Assim como o tipo date armazena datas, o numeric
// números, etc..., o code block armazena uma peça de código executável.
// Esta peça de código pode ser uma chamada simples a uma função ou
// até mesmo o conteúdo completo de um arquivo .PRG. Code blocks são
// semelhantes a expressões macro (&) mas muito mais rápidos pois são
// resolvidos em tempo de compilação, ao passo que macros são compiladas
// em tempo de execução.
// Code blocks sozinhos não fazem nada, alem de armazenar o conteúdo.
// Para executar o código que armazenam, dependem de funções que manipulam
// code blocks (AEval(), AScan(), ASort(), DbEval(), Eval(), HEval()).
//
// No caso do code block abaixo, "x" é uma vaiável LOCAL criada e visível
// apenas dentro do code block, durante sua execução. Ela serve para
// receber um parâmetro, como em uma função qualquer. Ex: f(x).
// "x" é apenas o nome da variável (parâmetro) e poderia ser qualquer
// outro nome válido para variáveis em Harbour como, por exemplo,
// ? Eval( { |celula| QOut( celula ) } ) -> exibirá na tela o conteúdo passado
// para o parâmetro "celula".
// ? Eval( { |x,y| QOut( x + y ) } ) -> exibirá na tela a soma de x e y.
//
// Um TBrowse exibe, em formato tabular, os dados da fonte de dados a ele
// associada e possui um objeto TBColumn para cada coluna a ser exibida.
// A interseção de uma linha e uma coluna é chamada de célula.
// Entre outras informações, os objetos TBColumn opcionalmente armazenam
// as cores e formatos (pictures) a serem aplicados a cada célula, além
// do bloco de recuperação de dados da coluna.
// O code block abaixo será o "color block" das colunas 3 e 5 do TBrowse.

// Durante o processo de estabilização do TBrowse, as linhas de dados
// são lidas da fonte de dados (pode ser DBF, Array, ADO), é feito o
// cálculo de quantas linhas caberão na janela definida para o TBrowse,
// conforme a posição do registro atual da fonte de dados. Definidos
// os registros que serão exibidos na tela, inicia-se o processo de
// pintura dos dados, linha a linha e coluna a coluna. Durante este
// processo, para cada célula é avaliado o code block de recuperação de
// dados da coluna Eval( oColumn:block ). O resultado desta operação
// traz o conteúdo da célula, que é então passado para outros métodos
// existentes no objeto TBColumn. O code block abaixo, está armazenado
// na variável colorBlock de cada objeto TBColumn do browse. No momento
// da pintura das células, este valor (conteúdo da célula) é passado para
// o code block abaixo e é recebido pelo mesmo como o parâmetro "x".

bColor := ;
{ |x| If( At( "TOTAL ", Upper( Eval( oBrowse:getColumn( 3 ):block ) ) ) > 0, { 5, 5 }, { 1, 2 } ) }


/*
Exibição das linhas de um Record set ADO usando TBrowseDB()
Alexandre Santos
Compilar: Hbmk2 tbado hbwin.hbc
*/

#pragma -w3
#pragma -es2
#include "tbrowse.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "hbgtinfo.ch"
#include "box.ch"
#include "set.ch"
#include "hbclass.ch"

#include "ado.ch"

REQUEST HB_CODEPAGE_PTISO

FUNCTION Tbrowseado(cSql)
   LOCAL oRs, aCamposList
   LOCAL oCN :=ConexaoMySQL( "xxx.com.br", "xxx", "xxx", "xxx" )
   LOCAL tela :=savescreen(0,0,maxrow(),maxcol())
   LOCAL oBrowse, bColor, bUserFunction

   // coloquei aqui o meu SQL para teste...
   cSQL := If( cSQL == NIL, "SELECT * FROM tbDieta;", cSQL )
   
   Set( _SET_CODEPAGE, "PTISO" )
   Set( _SET_EVENTMASK, INKEY_ALL + HB_INKEY_GTEVENT - INKEY_MOVE )
   SET DATE BRITISH

   SetMode( 35, 90 )

*   hb_gtInfo( HB_GTI_WINTITLE , "TBrowse colorBlock() com Acesso ao MySQL via ADO" )
*   hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
   SetColor( "W/B","N/W",,,"W/B" )

   CLS

   // O code block abaixo define a cor das colunas 3 (comida) e 5 (pontos).
   //
   // Um code block, em xBase, é um tipo de dados como outro qualquer
   // da linguagem. Assim como o tipo date armazena datas, o numeric
   // números, etc..., o code block armazena uma peça de código executável.
   // Esta peça de código pode ser uma chamada simples a uma função ou
   // até mesmo o conteúdo completo de um arquivo .PRG. Code blocks são
   // semelhantes a expressões macro (&) mas muito mais rápidos pois são
   // resolvidos em tempo de compilação, ao passo que macros são compiladas
   // em tempo de execução.
   // Code blocks sozinhos não fazem nada, alem de armazenar o conteúdo.
   // Para executar o código que armazenam, dependem de funções que manipulam
   // code blocks (AEval(), AScan(), ASort(), DbEval(), Eval(), HEval()).
   //
   // No caso do code block abaixo, "x" é uma vaiável LOCAL criada e visível
   // apenas dentro do code block, durante sua execução. Ela serve para
   // receber um parâmetro, como em uma função qualquer. Ex: f(x).
   // "x" é apenas o nome da variável (parâmetro) e poderia ser qualquer
   // outro nome válido para variáveis em Harbour como, por exemplo,
   // ? Eval( { |celula| QOut( celula ) } ) -> exibirá na tela o conteúdo passado
   // para o parâmetro "celula".
   // ? Eval( { |x,y| QOut( x + y ) } ) -> exibirá na tela a soma de x e y.
   //
   // Um TBrowse exibe, em formato tabular, os dados da fonte de dados a ele
   // associada e possui um objeto TBColumn para cada coluna a ser exibida.
   // A interseção de uma linha e uma coluna é chamada de célula.
   // Entre outras informações, os objetos TBColumn opcionalmente armazenam
   // as cores e formatos (pictures) a serem aplicados a cada célula, além
   // do bloco de recuperação de dados da coluna.
   // O code block abaixo será o "color block" das colunas 3 e 5 do TBrowse.

   // Durante o processo de estabilização do TBrowse, as linhas de dados
   // são lidas da fonte de dados (pode ser DBF, Array, ADO), é feito o
   // cálculo de quantas linhas caberão na janela definida para o TBrowse,
   // conforme a posição do registro atual da fonte de dados. Definidos
   // os registros que serão exibidos na tela, inicia-se o processo de
   // pintura dos dados, linha a linha e coluna a coluna. Durante este
   // processo, para cada célula é avaliado o code block de recuperação de
   // dados da coluna Eval( oColumn:block ). O resultado desta operação
   // traz o conteúdo da célula, que é então passado para outros métodos
   // existentes no objeto TBColumn. O code block abaixo, está armazenado
   // na variável colorBlock de cada objeto TBColumn do browse. No momento
   // da pintura das células, este valor (conteúdo da célula) é passado para
   // o code block abaixo e é recebido pelo mesmo como o parâmetro "x".

   bColor := ;
      { |x| If( At( "TOTAL ", Upper( Eval( oBrowse:getColumn( 3 ):block ) ) ) > 0, { 5, 5 }, { 1, 2 } ) }

   aCamposList := { ;
                    { "DATA",       { || oRs:ToDate( "DATA" ) } }, ;
                    { "HORA",       { || oRs:ToString( "HORA", 8 ) } }, ;
                    { "COMIDA",     { || oRs:ToString( "COMIDA", 30 ) }, bColor }, ;
                    { "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 ) } }, ;
                    { "PONTOS",     { || oRs:ToStr( "PONTOS", 6 ) }, bColor }, ;
                    { "ID",         { || oRs:ToStr( "ID", 6 ) } } }

   //@ 4, MaxRow() SAY Padr( "Obtendo informa‡?es...", 22 ) COLOR "W+/W"
   @ 4, MaxCol() SAY Padr( "Obtendo informa‡?es...", 22 ) COLOR "W+/W"

   oCn:open()
   oRs := oCn:Execute( cSql )

   IF oRs == NIL .OR. oRs:Eof()
      Hb_Alert( "N?o foi poss¡vel obter dados para exibi‡?o",, "W+/B" )
      RETURN NIL
   ENDIF

   SuperADO( oRs )
   oBrowse := CriaBrowse( 2, 2, MaxRow() - 5, MaxCol() - 2, oRs, aCamposList )

   bUserFunction := { |oBrowse, aCamposList, nKey| RotinaUsuario( oBrowse, aCamposList, nKey ) }

   TBrowseADO2( oBrowse, oRs, aCamposList, bUserFunction )

   If oRs != NIL .And. oRs:state() = adStateOpen
      oRs:close()
   Endif

   If oCn != NIL .And. oCn:state = adStateOpen
      oCn:close()
   Endif

   oCn := NIL
   oRs := NIL

   rest scre from tela
RETURN Nil

FUNCTION TBrowseADO2( oBrowse, oRs, aCamposList, bRotinaUsuario )
   //LOCAL oBrowse, nKey
   LOCAL  nKey, nRetCode

   //oBrowse := CriaBrowse( oRs, aCamposList )

   DispBox( oBrowse:nTop - 1, oBrowse:nLeft - 1, oBrowse:nBottom, oBrowse:nRight + 1, B_SINGLE )

   DO WHILE .T.

      oBrowse:refreshCurrent()
      DO WHILE ! oBrowse:Stable()
         oBrowse:Stabilize()
      ENDDO

      // Paint TBrowse current line...
      oBrowse:ColorRect( { oBrowse:RowPos, oBrowse:LeftVisible, oBrowse:RowPos, oBrowse:RightVisible }, { 2, 1 } )
      // ... and current cell in different colors
      If ( oBrowse:colPos == 3 .Or. oBrowse:colPos == 5 ) .And. At( "TOTAL ", Upper( Eval( oBrowse:getColumn( 3 ):block ) ) ) > 0
         oBrowse:ColorRect( { oBrowse:rowPos, oBrowse:colPos, oBrowse:rowPos, oBrowse:colPos }, { 7, 7 } )
      Else
         oBrowse:ColorRect( { oBrowse:rowPos, oBrowse:colPos, oBrowse:rowPos, oBrowse:colPos }, { 3, 2 } )
      Endif

      @ oBrowse:nBottom + 2, 3 SAY Padr( " Registro " + Ltrim( Str( oRs:AbsolutePosition ) ) + " de " + Ltrim( Str( oRs:recordCount ) ) + " ", 20 ) COLOR "N/W"

      nKey := Inkey(0)
      IF ( nRetCode := oBrowse:applyKey( nKey ) ) == TBR_EXIT
         EXIT
      ELSEIF nRetCode == TBR_EXCEPTION
         IF Valtype( bRotinaUsuario ) == "B"
            DO WHILE ! oBrowse:Stable
               oBrowse:Stabilize()
            ENDDO
            // Note que um code block se comporta como um objeto...
            // invoca o m‚todo Eval() do code block
            bRotinaUsuario:eval( oBrowse, oRs, nKey )
            oBrowse:RefreshAll()
         ENDIF   
      ENDIF
   ENDDO

   RETURN Nil

STATIC FUNCTION CriaBrowse( nTop, nLeft, nBottom, nRight, oRs, aCamposList )
   LOCAL oBrowse, oColumn, aItem, nLen, nCont
   
   // TODO: colocar valores default em nTop, nLeft, nBottom, nRight
   //oBrowse := TBrowse():new( 02, 3, MaxRow() - 3, MaxCol() - 3 )
   oBrowse := TBrowse():new( nTop, nLeft, nBottom, nRight )
   oBrowse:headSep       := Chr(196) + Chr(194) + Chr(196)
   oBrowse:colSep        := " " + Chr(179) + " "
   oBrowse:footSep       := Chr(196) + Chr(193) + Chr(196)
   oBrowse:goTopBlock    := { || oRs:moveFirst() }
   oBrowse:goBottomBlock := { || oRs:moveLast() }
   oBrowse:skipBlock     := { |n| ADORecordSetSkipper( oRs,n ) }
   oBrowse:colorSpec     := "W/B,N/GR*,N/W*,W+/R,R+/B,R/W*,R+/W*"

   IF aCamposList == Nil
      nLen := oRs:fields():count() - 1
      FOR nCont := 0 TO nLen
         oColumn := TBColumnNew( oRs:fields( nCont ):name(), ADORecordSetFieldBlock( oRs, nCont ) )
         oColumn:width := Max( Min( oRs:Fields( nCont ):definedSize,50), Len( oRs:fields( nCont ):name ) ) + 5
         oBrowse:addColumn( oColumn )
      NEXT
   ELSE
      FOR EACH aItem IN aCamposList
         oColumn := TBColumnNew( aItem[1], aItem[2] )
         IF Len( aItem ) > 2
            oColumn:ColorBlock := aItem[3]
         ENDIF
         oBrowse:AddColumn( oColumn )
      NEXT
   ENDIF
RETURN oBrowse

STATIC FUNCTION ADORecordSetFieldBlock( oRs, i, xVal )
   LOCAL bRet

   IF xVal == NIL
      IF oRs:Eof()
         bRet := { || Space( Max( oRs:Fields( i ):DefinedSize , Len( oRs:Fields( i ):name ) ) ) }
      ELSE
         bRet := { || oRs:Fields( i ):value }
      ENDIF
   ELSE
      bRet := { |xVal| oRs:Fields( i ):Value := xVal }
   ENDIF

RETURN bRet

STATIC FUNCTION ADORecordSetSkipper(oRecordSet,nSkip)
   LOCAL nRec := oRecordSet:AbsolutePosition

   IF ! ( oRecordSet:eof )
      oRecordSet:Move( nSkip )

      IF oRecordSet:eof
         oRecordSet:moveLast()
      ENDIF

      IF oRecordSet:bof
         oRecordSet:moveFirst()
      ENDIF
   ENDIF

RETURN (oRecordSet:AbsolutePosition - nRec)

   
STATIC FUNCTION ConexaoMySQL( cServer, cDatabase, cUser, cPassword )

   LOCAL oCn := win_OleCreateObject("ADODB.Connection")

   oCn:ConnectionString := "DRIVER={MariaDB ODBC 3.1 Driver};TCPIP=1;SERVER=" + ;
      cServer + ";Database=" + cDatabase + ";UID=" + cUser + ";PWD=" + cPassword + ";PORT=3306"
   oCn:CursorLocation   := 3

RETURN oCn

FUNCTION SuperADO( oRs )

   __ObjAddMethod( oRs, "TOSTRING", @ADOToString() )
   __ObjAddMethod( oRs, "TONUMBER", @ADOToNumber() )
   __ObjAddMethod( oRs, "TODATE",   @ADOToDate() )
   __ObjAddMethod( oRs, "TOSTR",    @ADOToStr() )

RETURN Nil

STATIC FUNCTION ADOToDate( cField )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "D"
      x := Ctod("")
   ENDIF
RETURN x

STATIC FUNCTION ADOToString( cField, nLen )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "C"
      x := ""
   ENDIF
   IF nLen != Nil
      x := Pad( x, nLen )
   ENDIF
RETURN x

STATIC FUNCTION ADOToNumber( cField )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "N"
      x := 0
   ENDIF

RETURN x

STATIC FUNCTION ADOToStr( cField, nLen, nDec )
   LOCAL x, Self := QSelf()

   x := ::Fields( cField ):Value
   IF ValType( x ) != "N"
      x := 0
   ENDIF
   IF nLen == Nil
      x := Str( x )
   ELSEIF nDec == Nil
      x := Str( x, nLen )
   ELSE
      x := Str( x, nLen, nDec )
   ENDIF

RETURN x

STATIC FUNCTION RotinaUsuario( oBrowse, oRs, nKey )
   IF nKey == K_F5
      Alert( "Foi teclado F5;;Coluna 'COMIDA' = " + oRs:ToString( "COMIDA" ) )
   ENDIF

RETURN 1
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

cor no tbrowse

Mensagempor JoséQuintas » 09 Set 2021 09:03

Errado.
Olhando o próprio browse, testar no campo comida:

"TOTAL" $ oRs:ToString( "COMIDA" )

que também serve seu uso anterior: oRs:Fields( "COMIDA" ):Value

Sobre o erro, já mostrei:
{ ;
{}, ;
{}, ;
{} }


O último campo sempre tem o encerramento da lista, uma "}" a mais.
E pelo mesmo motivo comentei que, o que atrapalha é tanto array/codeblock junto, acaba não enxergando direito o início/fim de cada um.

E pelo outro comentário: como mostra na tela?

@ 0, 0 say oRs:Fields( "COMIDA" ):Value


Então... é isso que vai usar, ou o jeito antigo: oRs:Fields( "COMIDA" ):Value ou o jeito novo: oRs:ToString( "COMIDA" )

O que o Alexandre mostrou NÃO daria pra usar.
Porque? porque na montagem da lista NÃO EXISTE oBrowse.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18162
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor JoséQuintas » 09 Set 2021 09:23

Comentário adicional:

Equivalente em DBF, seria arquivo->Comida
Equivalente em ADO, oRs:Fields( "COMIDA" ):Value ou no modificado, oRs:ToString( "COMIDA" )

Só pra explicar de um jeito mais conhecido.
Conforme o DBF muda de registro, o conteúdo também muda, e o mesmo acontece com ADO.
Então... é só pegar do registro atual e pronto.
o { | x | seria o conteúdo da coluna atual, o que não serve pra esse caso.
Se colocar nos dois casos, ou até em todas as colunas, pra escolher a cor conforme o conteúdo do campo comida, tudo bem.

Só lembrando, senão vai ter erro de compilação:
Nesse caso o codeblock NÃO TEM parâmetro X. Vai usar { || e não { | x |
Senão vai dar erro de declarou x e não usou. (na compilação -w3 -es2).
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18162
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor JoséQuintas » 09 Set 2021 19:18

Voltando à conexão:

Talvez esteja confundindo conexão e recordset.

Conexão = a conexão com o servidor, pode abrir/fechar quando quiser.
Pode inclusive abrir no início do aplicativo e fechar no final.
Infelizmente, pra servidor externo, se houver limite de usuários, manter aberta vai afetar esse limite.

Recordset = uma espécie de arquivo temporário. obrigatoriamente tem que fechar, pra que ele seja destruído.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18162
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor cjp » 10 Set 2021 00:54

bColor := ;
{ |x| If( At( "TOTAL ", Upper( Eval( oBrowse:getColumn( 3 ):block ) ) ) > 0, { 5, 5 }, { 1, 2 } ) }


Desta forma ficou mais fácil para eu entender.

Entretanto, ao testar, está dando erro na getColumn. Não sei como resolver.

O último campo sempre tem o encerramento da lista, uma "}" a mais.
E pelo mesmo motivo comentei que, o que atrapalha é tanto array/codeblock junto, acaba não enxergando direito o início/fim de cada um.


Consegui resolver este erro.

Então... é isso que vai usar, ou o jeito antigo: oRs:Fields( "COMIDA" ):Value ou o jeito novo: oRs:ToString( "COMIDA" )


Agora entendi aqui também.

Equivalente em DBF, seria arquivo->Comida
Equivalente em ADO, oRs:Fields( "COMIDA" ):Value ou no modificado, oRs:ToString( "COMIDA" )

Só pra explicar de um jeito mais conhecido.
Conforme o DBF muda de registro, o conteúdo também muda, e o mesmo acontece com ADO.
Então... é só pegar do registro atual e pronto.
o { | x | seria o conteúdo da coluna atual, o que não serve pra esse caso.
Se colocar nos dois casos, ou até em todas as colunas, pra escolher a cor conforme o conteúdo do campo comida, tudo bem.

Só lembrando, senão vai ter erro de compilação:
Nesse caso o codeblock NÃO TEM parâmetro X. Vai usar { || e não { | x |
Senão vai dar erro de declarou x e não usou. (na compilação -w3 -es2).


Aqui também entendi.

Mas ainda assim está dando erro nos parâmetros: acesso de array.

Por favor, veja o que ainda estou fazendo errado:

      aCamposList := { ;
         { "DATA",       { || oRs:ToDate( "DATA" ) } }, ;
         { "HORA",       { || oRs:ToString( "HORA", 8 ) } }, ;
         { "COMIDA",     { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
         { "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 )  } }, ;
         { "PONTOS",     ;
         { || oRs:ToStr( "PONTOS", 9, 1 ) }, ;
         { ||  If( At( "TOTAL ", oRs:ToString( "COMIDA" ) ) > 0, { 5, 5 }, { 1, 2 } ) }, ;
         }, ;
         }


Voltando à conexão:

Talvez esteja confundindo conexão e recordset.

Conexão = a conexão com o servidor, pode abrir/fechar quando quiser.
Pode inclusive abrir no início do aplicativo e fechar no final.
Infelizmente, pra servidor externo, se houver limite de usuários, manter aberta vai afetar esse limite.

Recordset = uma espécie de arquivo temporário. obrigatoriamente tem que fechar, pra que ele seja destruído.


Aqui não sei se entendi.
Entendo a diferença entre a conexão e o recordset.
Mas vc tinha falado

É sempre mesma conexão, é sempre mesmo banco de dados, é sempre mesma rotina.
Não achou estranho ficar criando a mesma coisa milhares de vezes?


Então, pelo que eu havia entendido, vc estava falando da conexão, que não precisaria ficar conectando sempre.
E agora vc disse que "pode abrir/fechar quando quiser".
Isso é que não estou entendendo.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Anterior Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot], Google Adsense [Bot] e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro