Clipper On Line • Ver Tópico - Tbrowse com array retornando valor do campo

Tbrowse com array retornando valor do campo

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

Tbrowse com array retornando valor do campo

Mensagempor Ary » 19 Mai 2021 18:11

Bom dia a todos!

Já tive sucesso em conectar ao postgres com harbour, utilizando harbour 3.2, agora estou me ocupando
em transformar o sistema que eu tenho para sql.

Consegui alguns exemplos de tbrowse iniciado a partir de um array, porém não estou imaginando uma forma
de retornar o valor de determinado campo ao final do tbrowse.

No meu sistema, em determinadas consultas (ex: por nome), uma tela com várias opções é mostrada ao usuário
após a pesquisa (por exemplo, após pesquisar por "maria"), e isto é feito atualmente com dbedit, que funciona
muito bem.

Minha ideia é manter a mesma lógica com SQL, usuário pesquisa por "maria", então é apresentado a ele um tbrowse
com as opções e ele seleciona a que deseja.

Já consigo iniciar o tbrowse a partir de um array com o resultado da pesquisa SQL, porém não consegui ainda retornar o valor
de determinado campo (no meu caso, será sempre o valor do campo "registro").

Com o valor desse campo, posso pegar exatamente o registro que desejo para o usuário atualizar, deletar, etc

Obrigado a todos desde já.
Ary
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 24
Data de registro: 17 Abr 2021 17:10
Cidade/Estado: Rio de Janeiro
Curtiu: 21 vezes
Mens.Curtidas: 0 vez

Tbrowse com array retornando valor do campo

Mensagempor alxsts » 20 Mai 2021 00:47

Olá!

Como sabemos, tanto DbEdit quanto TBrowse apresentam dados em forma tabular, ou seja, em linhas e colunas. Internamente, DbEdit utiliza TBrowse.

Logo após definirmos um TBrowse, adicionamos a ele um objeto TbColumn para cada coluna que desejarmos exibir. Cada TbColumn contém um code block para recuperação do conteúdo da respectiva coluna. É este code block que você precisará usar.

À medida que o usuário navega nas linhas do TBrowse, quando ele seleciona uma determinada linha, você saberá qual linha do TBrowse foi selecionada usando
oTBrowse:rowPos()
A coluna onde está o cursor posicionado na linha, você consegue com
oTBrowse:colPos()


Para obter o valor de uma célula da linha onde está posicionado você tem que saber qual coluna precisa pegar. Com isto, basta recuperar a coluna (objeto TbColumn daquela coluna) e avaliar seu code block. Supondo que o TBrowse esteja posicionado na linha desejada e na coluna um e a coluna "registro" que você quer pegar é a décima, use:
xVal := Eval( oTBrowse:getColumn( oTBrowse:10 ):block )

Para pegar exatamente a célula atualmente posicionada, use:
xVal := Eval( oTBrowse:getColumn( oTBrowse:colPos() ):block )

Para um exemplo completo sobre TBrowse com array, veja o tópico Tbrowse com ADO: identificação do campo
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

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

Tbrowse com array retornando valor do campo

Mensagempor Ary » 20 Mai 2021 00:52

Pesquisando na internet, descobri que existe uma função chamada BROWSE2D(), que faz exatamente o que eu preciso, mas não encontro essa função
Ary
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 24
Data de registro: 17 Abr 2021 17:10
Cidade/Estado: Rio de Janeiro
Curtiu: 21 vezes
Mens.Curtidas: 0 vez

Tbrowse com array retornando valor do campo

Mensagempor Ary » 20 Mai 2021 01:24

Obrigado pela explicação, vou tentar e informo o resultado
Ary
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 24
Data de registro: 17 Abr 2021 17:10
Cidade/Estado: Rio de Janeiro
Curtiu: 21 vezes
Mens.Curtidas: 0 vez

Tbrowse com array retornando valor do campo - solução

Mensagempor Ary » 21 Jun 2021 18:14

A coisa ficou assim, espero que seja útil para mais alguém.

A função 'array_select ' pode retornar a posição do cursor dentro da matriz ou o valor da célula

Foi feita tendo como base a sugestão que me deram em uma mensagem anterior

_sql -> Consulta SQL é passada para a função para mostrar ao usuário a mensagem "ORDER BY"

_secs -> Tempo que a consulta sql demorou para processar, para mostrar a mensagem "X linhas em X secs"

Pode melhorar ainda, mas é o que eu precisava


      && CARREGAMENTO DA MATRIZ PARA CHAMAR A FUNÇÃO

      _matriz := {}

      _tb_titl := {"ID", "NOME", "SETOR", "EAN"}

      _tb_pict := {"@E 99999999", "@!S32", "@!S30", "@!"}

      for _i := 1 to _maxrow

         giragira ("Processando " + allstr (_i) + " de " + allstr (_maxrow) + ", [ESC] para terminar")

         _ln := _result:getrow (_i)

         aadd (_matriz, {pg_get (_ln, "id"), pg_get (_ln, "nome"), pg_get (_ln, "setor"), pg_get (_ln, "ean")})

         if esc_foi ()

            exit

         endif

         giragira ("fim")

      next

      && CHAMADA DA FUNÇÃO

      _row := array_select (_matriz, 03, 00, 24, 79, _tb_expr, _tb_titl, _tb_pict, _sql, _secs)

&&----------------------------------------------------------------
* June 19, 2021 - 11:30:17 PM
*
* Sistema.....: PROTEUS II
* Linguagem...: xBase.
* Compilador..: HARBOUR 3.2.0DEV (R2104142025)
* Autor.......: Ariobar Lima Pontes.
* Email.......: ariobar.pontes@gmail.com
*
/* ARRAY_SELECT */

#include "box.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "tbrowse.ch"

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

function array_select (_carga, _lin_ini, _col_ini, _lin_fim, _col_fim, _tb_expr, _tb_titl, _tb_pict, _sql, _secs)

local _anterior := savescreen (_lin_ini, _col_ini, _lin_fim, _col_fim)

local _i, _inkey, _bblock, _otbrowse, _otbcolumn

local _order_by := rat ("ORDER BY", upper (_sql))

local _order := substr (_sql, _order_by, len (_sql))

local _return := 0

dispbox (_lin_ini, _col_ini, _lin_fim, _col_fim, B_SINGLE + chr (32), "W+/B")

_otbrowse         := tbrowse ():new (_lin_ini + 1, _col_ini + 1, _lin_fim - 3, _col_fim - 1)

_otbrowse:cargo      := {_carga, 1} && _otbrowse:cargo := {directory ("*.*"), 1} ???

_otbrowse:headsep   := chr (196)

_otbrowse:colsep   := chr (179) && " " + chr (179) + " "

_otbrowse:colorspec   := "W+/B, B/W, W+/R, W+/BG, GR+/GR"

*** NAVIGATION CODE BLOCKS FOR ARRAY ***

_otbrowse:gotopblock   := {||_otbrowse:recno := 1}

_otbrowse:gobottomblock   := {||_otbrowse:recno := len (_otbrowse:data)}

_otbrowse:skipblock      := {|_nskip| arrayskipper (_nskip, _otbrowse)}

*** CREATE TBCOLUMN OBJECTS AND ADD THEM TO TBROWSE OBJECT ***

for _i := 1 to len (_tb_titl)

   *** CODE BLOCK FOR INDIVIDUAL COLUMNS OF THE ARRAY ***

   _bblock      := arrayblock (_otbrowse, _i)

   _otbcolumn   := tbcolumn ():new (_tb_titl [_i], _bblock)

   _otbcolumn:picture := _tb_pict [_i]

   _otbrowse:addcolumn (_otbcolumn)

next

/* MONTAGEM DA TELA */

@ _lin_fim - 2, _col_ini + 1, _lin_fim - 2, _col_fim - 1 box replicate (chr (196), 9) color "W+/B"

if empty (_secs)

   @ _lin_fim - 1, 02 say alltrim (str (len (_carga))) + " linhas" color "W+/B"

else

   @ _lin_fim - 1, 02 say alltrim (str (len (_carga))) + " linhas em " + alltrim (str (_secs)) + " secs" color "W+/B"

endif

@ _lin_fim - 1, 42 say _order color "W+/B"

&& DISPLAY BROWSER AND PROCESS USER INPUT

do while .t.

   setcursor (3)

   _otbrowse:forcestable ()
   
   _inkey := inkey (0)
   
   if _otbrowse:applykey (_inkey) == TBR_EXIT

      exit

   endif

   do case

   case _inkey == K_ENTER

***      _return := eval (_otbrowse:getcolumn (1):block) && RETORNA VALOR DA CÉLULA DA COLUNA 1

      _return := _otbrowse:recno && RETORNA A POSIÇÃO DENTRO DA MATRIZ PASSADA

      exit

   case _inkey == K_ESC

      exit

   endcase

enddo

restscreen (_lin_ini, _col_ini, _lin_fim, _col_fim, _anterior)

return _return

/* ARRAYBLOCK */

&& THIS CODE BLOCK USES DETACHED LOCAL VARIABLES TO
&& ACCESS SINGLE ELEMENTS OF A TWO-DIMENSIONAL ARRAY.

function arrayblock (_otbrowse, _nsubscript)

return {||_otbrowse:data [_otbrowse:recno, _nsubscript]}

/* ARRAYSKIPPER */

&& THIS FUNCTION NAVIGATES THE ROW POINTER OF THE
&& THE DATA SOURCE (ARRAY)

function arrayskipper (_nskiprequest, _otbrowse)

local _nlastrec := len (_otbrowse:data) && LENGTH OF ARRAY

local _nskipped := 0

do case

case _otbrowse:recno + _nskiprequest < 1 && SKIP REQUESTED THAT NAVIGATES PAST FIRST ARRAY ELEMENT

   _nskipped := 1 - _otbrowse:recno

case _otbrowse:recno + _nskiprequest > _nlastrec && SKIP REQUESTED THAT NAVIGATES PAST LAST ARRAY ELEMENT
     
   _nskipped := _nlastrec - _otbrowse:recno

otherwise && SKIP REQUESTED THAT NAVIGATES WITHIN ARRAY

   _nskipped := _nskiprequest

endcase

_otbrowse:recno += _nskipped && ADJUST ROW POINTER

&& TELL TBROWSE HOW MANY ROWS ARE ACTUALLY SKIPPED.

return _nskipped

/*_END_OF_FILE_*/

Anexos
Screenshot_2.png
Screenshot_2.png (9.23 KiB) Visualizado 858 vezes
Ary
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 24
Data de registro: 17 Abr 2021 17:10
Cidade/Estado: Rio de Janeiro
Curtiu: 21 vezes
Mens.Curtidas: 0 vez

Tbrowse com array retornando valor do campo

Mensagempor alxsts » 22 Jun 2021 12:59

Olá!

Muito bom! Parabéns!
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

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




Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 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