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".cjp escreveu:{ "PONTOS", { || oRs:ToStr( "PONTOS", 6 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
cor no tbrowse
Moderador: Moderadores
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
cor no tbrowse
Olá!
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
cor no tbrowse
É esse o problema. Não sei como fazer isto.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".
Não faço ideia de 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.
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.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?
Ainda não entendi. Não achei nenhum iif().Eu também, se a outra funciona, verifique se esse iif() é válido.
Inacio de Carvalho Neto
- JoséQuintas
- Administrador

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

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
cor no tbrowse
Código: Selecionar todos
{ | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) }
Pronto, aqui não é codeblock:
Código: Selecionar todos
If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } )
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 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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
cor no tbrowse
Antes de pensar em mover essa conexão, deveria se perguntar... porque precisa desse fonte de conexão?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.
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/
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/
cor no tbrowse
Eu entendi isso.É 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.
Só não entendi ainda como determinar o X.
Tentei fazer assim:
Código: Selecionar todos
{ "PONTOS", { || oRs:ToStr( "PONTOS", 9, 1 ) }, { | x | If( At( "TOTAL ", Upper( "COMIDA" ) ) > 0, { 5, 5 }, { 1, 2 } ) } }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.
Não entendi. Como não precisaria dessa fonte de conexão? Preciso pegar os dados do banco de dados.Antes de pensar em mover essa conexão, deveria se perguntar... porque precisa desse fonte de conexão?
Inacio de Carvalho Neto
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
cor no tbrowse
Tá igual não. E vai piorar.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.
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.
Código: Selecionar todos
aList := { ;
{ }, ;
{ }, ;
{ } }
Com certeza Upper( "COMIDA" ) significa tão somente "COMIDA".cjp escreveu:At( "TOTAL ", Upper( "COMIDA" ) )
Preciso lembrar que nas colunas já usou o campo comida?? só olhar como é que se pega o campo comida.
É sempre mesma conexão, é sempre mesmo banco de dados, é sempre mesma rotina.cjp escreveu:Não entendi. Como não precisaria dessa fonte de conexão? Preciso pegar os dados do banco de dados.
Não achou estranho ficar criando a mesma coisa milhares de vezes?
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
cor no tbrowse
Não entendo... não entendo... não entendo... não entendo...
E nesse não entendo, tá sempre perguntando.
Isso acima pega algum conteúdo de algum campo?
Foi isso que colocou no browse.
E nesse não entendo, tá sempre perguntando.
Código: Selecionar todos
@ 0, 0 SAY Upper( "COMIDA" )
Foi isso que colocou no browse.
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
cor no tbrowse
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.
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 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/
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/
cor no tbrowse
Eu entendo. Aliás, este post tem servido muito mais para eu aprender do que para resolver o problema específico propriamente.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.
De fato, agora vejo que não faz sentido. Tentei também com upper(comida), dando o mesmo erro.Isso acima pega algum conteúdo de algum campo?
Foi isso que colocou no browse.
Esta parte é que eu não consigo entender.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.
Sim, já usei, mas ainda não entendi como usá-la aqui.Preciso lembrar que nas colunas já usou o campo comida?? só olhar como é que se pega o campo comida.
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:
Código: Selecionar todos
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 } ) } }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.
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.É sempre mesma conexão, é sempre mesmo banco de dados, é sempre mesma rotina.
Não achou estranho ficar criando a mesma coisa milhares de vezes?
Milhares de vezes?
Inacio de Carvalho Neto
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
cor no tbrowse
Olá!
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 } ) }
Código: Selecionar todos
/*
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)
Alexandre Santos (AlxSts)
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
cor no tbrowse
Errado.
Olhando o próprio browse, testar no campo 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?
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.
Olhando o próprio browse, testar no campo comida:
Código: Selecionar todos
"TOTAL" $ oRs:ToString( "COMIDA" )
Sobre o erro, já mostrei:
Código: Selecionar todos
{ ;
{}, ;
{}, ;
{} }
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?
Código: Selecionar todos
@ 0, 0 say oRs:Fields( "COMIDA" ):Value
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 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/
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/
- JoséQuintas
- Administrador

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

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
cor no tbrowse
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.
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 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/
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/
cor no tbrowse
Desta forma ficou mais fácil para eu entender.bColor := ;
{ |x| If( At( "TOTAL ", Upper( Eval( oBrowse:getColumn( 3 ):block ) ) ) > 0, { 5, 5 }, { 1, 2 } ) }
Entretanto, ao testar, está dando erro na getColumn. Não sei como resolver.
Consegui resolver este erro.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.
Agora entendi aqui também.Então... é isso que vai usar, ou o jeito antigo: oRs:Fields( "COMIDA" ):Value ou o jeito novo: oRs:ToString( "COMIDA" )
Aqui também entendi.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).
Mas ainda assim está dando erro nos parâmetros: acesso de array.
Por favor, veja o que ainda estou fazendo errado:
Código: Selecionar todos
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 } ) }, ;
}, ;
}Aqui não sei se entendi.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.
Entendo a diferença entre a conexão e o recordset.
Mas vc tinha falado
Então, pelo que eu havia entendido, vc estava falando da conexão, que não precisaria ficar conectando sempre.É sempre mesma conexão, é sempre mesmo banco de dados, é sempre mesma rotina.
Não achou estranho ficar criando a mesma coisa milhares de vezes?
E agora vc disse que "pode abrir/fechar quando quiser".
Isso é que não estou entendendo.
Inacio de Carvalho Neto
