Página 1 de 1

Tbrowse com array retornando valor do campo

Enviado: 19 Mai 2021 18:11
por Ary
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á.

Tbrowse com array retornando valor do campo

Enviado: 20 Mai 2021 00:47
por alxsts
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

Código: Selecionar todos

oTBrowse:rowPos()
A coluna onde está o cursor posicionado na linha, você consegue com

Código: Selecionar todos

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:

Código: Selecionar todos

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

Código: Selecionar todos

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

Tbrowse com array retornando valor do campo

Enviado: 20 Mai 2021 00:52
por Ary
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

Tbrowse com array retornando valor do campo

Enviado: 20 Mai 2021 01:24
por Ary
Obrigado pela explicação, vou tentar e informo o resultado

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

Enviado: 21 Jun 2021 18:14
por Ary
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

Código: Selecionar todos


		&& 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_*/


Tbrowse com array retornando valor do campo

Enviado: 22 Jun 2021 12:59
por alxsts
Olá!

Muito bom! Parabéns!