Urgente: Tbrowse e _GET_

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Eliane
Usuário Nível 2
Usuário Nível 2
Mensagens: 82
Registrado em: 22 Mai 2006 10:17
Localização: Londrina-PR

Urgente: Tbrowse e _GET_

Mensagem por Eliane »

Estou montando uma tabela com o Tbrowse, e cada coluna dá um get em um elemento da matriz. Tipo:

Código Valor RTG data ...

O Tbrowse está Ok. Não consigo no entanto posicionar a coluna corretamente para dar get no valor, rtg, etc, continha sempre na primeira coluna. Já pesquisei no fórum e no google, tentei um monte coisas, mas não deu certo.

Antes de dar get em cada coluna tento o seguinte:

browse := FTBROWSE() // cria objeto de rolagem

// pu_matget1 e demais tem que estar criadas com 1 posi‡Æo senÆo d  erro em ind
// quando faz a primeira estabiliza‡Æo

l_flag := .f.

DO WHILE LASTKEY() <> K_ESC

l_flag := FgetLIN(browse)
l_tecla := FKEYS_TBROWSE(browse)
IF l_tecla = K_END
EXIT
ENDIF

ENDDO


return

******************************************************************************
// 1 -------------------- define objeto TBROWSE
******************************************************************************

**********************
FUNCTION FTBROWSE()
**********************

PUBLIC ind := 1

browse := TBROWSENEW(7,00,20,79)

***************************************************
// skipblock
**************************************************
browse:skipblock := { |aSaltar| l_Saltados:= IF ( ABS(aSaltar) >= ;
IF (aSaltar >= 0, LEN(pu_matget1)-ind,ind-1), ;
IF (aSaltar >= 0, LEN(pu_matget1)-ind,1-ind), aSaltar), ind+=l_Saltados, l_Saltados }

browse:gobottomblock := { || ind := LEN(pu_matget1) }
browse:gotopblock := { || ind := 1 }
browse:headsep := chr(176)
browse:colsep := " "+chr(176)
browse:nbottom := 19
browse:ntop := 7
browse:nleft := 1
browse:nright := 75

// define as colunas
coluna:= TBCOLUMNNEW(" ", { || TRANS(pu_matget1[ind],"XXXXXXXXXX") } )
coluna:heading := "No C¢digo "
coluna:colpos:= 2
browse:addcolumn(coluna)

coluna:= TBCOLUMNNEW("Valor ", { || pu_matget4[ind] } )
coluna:width := 10
coluna:cargo := { || "@z 9999999.99" }
coluna:colpos:= 60
browse:addcolumn(coluna)

coluna:= TBCOLUMNNEW("RTG", { || pu_matget5[ind] } )
coluna:width := 3
coluna:colpos := 70
browse:addcolumn(coluna)

DO WHILE !browse:stabilize() .AND. NEXTKEY()=0
ENDDO

RETURN(browse)
**************************************
FUNCTION FgetLIN(browse)
**************************************
Local l_get := .f.

DO WHILE LASTKEY() <> K_ESC

FgetCOD(browse,ind)
// get no valor
FgetVL(browse,ind)
FgetRTG(browse,ind)
exit

ENDDO

RETURN(.T.)

******************************
FUNCTION FgetCOD(browse,ind)
******************************
LOCAL coluna_get

PRIVATE pr_getlist2 := {} ,;
lin ,;
col


************************************************
* GET na tabela de CODIGO do servico - matget1
************************************************
IF ind > LEN(pu_matget1)
// precisa incluir ¡tem na tabela senÆo d  erro - Insere nova posi‡Æo
AADD(pu_matget1,SPACE(10) )
ENDIF

DO WHILE !browse:stabilize() .AND. NEXTKEY()=0
ENDDO

coluna_get := browse:getcolumn(1)

newOBJGET(pr_getlist2,"pu_matget1[" + STRZERO(ind,2) + "]" , "XXXXXXXXXX")
Newread(pr_getlist2)

browse:configure()
browse:stable := .f.
browse:refreshcurrent()

RETURN(pu_matget1[ind])

******************************
FUNCTION FgetVl(browse,ind)
******************************
LOCAL oBget

PRIVATE pr_getlist2 := {} ,;
lin ,;
col

DO WHILE !browse:stabilize() .AND. NEXTKEY()=0
ENDDO

column := browse:getcolumn(2)
lin := row()

newOBJGET(pr_getlist2, 'pu_matget4[' + STRZERO(ind,2) + ']' , "99999999999.99")
newread(pr_getlist2)

RETURN(pu_matget4[ind])

*************************************************************
FUNCTION newOBJGET(pa_list_get,pa_var_get, pa_pict_get, pa_val_when,pa_val_get)
*************************************************************

pa_val_when := IF (pa_val_when = NIL , '{ || .t. }', '{ || '+pa_val_when+' }')
pa_val_get := IF (pa_val_get = NIL , '{ || .t. }', '{ || '+pa_val_get +' }')

oBget := _get_(&pa_var_get,pa_var_get,pa_pict_get,&pa_val_get,&pa_val_when)

lin := oBget:row()
//col: = Obget:col()

SetPos(lin,col)
*** adiciona o campo/variavel em getlist para dar get
AADD(pa_list_get, oBget )

RETURN(pa_var_get)

FUNCTION NEWREAD(pr_getlist2,oBget)

READMODAL(PR_GETLIST2)

RETURN(pr_getlist2)
[/code]
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Bom dia Eliane,

confesso que dei uma olhada bem por cima do seu código, mas eu preferiria trabalhar encima do fonte que estou te mandando. Desculpa, mas achei um pouco confusso e ora também tem algumas declarações que por causa disso não conseguí compilar. Também seria bom que quando você postasse seu código-fonte, você utilizasse os recursos de edição "Code" do FORUM. Assim a exibição do seu código irá respeitar os espeaços e tabulações necessárias para melhor compreensão.

Estou mandando um programinha simples, mas que te dará outra visão. Mandei para nanesecco@hotmail.com

Um clip-abraço :)Pos
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Eliane:

Consegiu resolver com o email que o nosso colega Pablo mandou ??

qualquer coisa prende o grito.......

Abraços
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Pois é, Eliane. Não sei se você recebeu meu email ou não. POis seu email é do MSN e as vezes o meu do TERRA bloqueia. Mas espero que você esteja em andamento, o seu silêncio é sinal de que você está em andamento com a sua adaptação (assim espero).

Um clip-abraço :)Pos
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Eliane,

Deixa eu dar um palpite, dizer do jeito mais "simples" que eu faço isso.

Eu montei um TBrowse() "caseiro", usando do original (que acho mesmo complicado de usar) só o mínimo necessário pra abrir o DBF, estabilizar, mostrar os campos na tela, permitir a navegação e ficar esperando o usuário teclar alguma coisa, com um refresh a cada X tempo.

Aliás, eu mostro os campos todos concatenados, com só um AddColumn(). Crio colunas adicionais só se os campos concatenados não couberem na largura (80) da tela. Com isso, o Hilite pega a linha inteira (e não campo a campo) e, se for mais de uma tela, o usuário pode navegar entre elas com as setas direita/esquerda de direção. E, se precisar congelar colunas, eu simplesmente repito os campos desejados em todos os itens do array... Com isso, consigo "congelar" colunas até no meio da tela, se desejar.

Aí, dentro da função de usuário do TBrowse(), depois do INKEY() que fica monitorando o teclado, eu montei um DO CASE que chama funções aplicáveis a cada caso:

Código: Selecionar todos

inkey(5)
do case
  case lastkey()=13 // ENTER? Edição do registro
    if rotina=="NOMES"
      nome_edita()
    elseif rotina=="PRODUTOS"
      produto_edita()
    endi
  case lastkey()=-4 // F5? Deleção de registro
    if rotina=="NOMES"
      nome_deleta()
    elseif rotina=="PRODUTOS"
      produto_deleta()
  *...
  * essa variável ROTINA é global e seu valor é sempre alterado
  * no início de cada rotina, aí eu sei, dentro da função do TBrowse,
  * de onde veio a chamada.
endc
Na função Nome_edita(), por exemplo, eu bloqueio o registro, jogo o conteúdo dos campos para variáveis, limpo a tela e faço os GETs (das variáveis) distribuidos onde eu quiser em uma NOVA tela ("Edição"). O usuário altera o que for necessário e, se teclar F10 (no meu caso), a rotina faz o REPLACE do que foi alterado, UNLOCKa e termina (se o usuário teclar ESC, pula o REPLACE). E aí o comando volta pro TBrowse(), reixibindo a tela com a lista de registros...

Com isso,
- eu não deixo o usuário alterar o DBF diretamente. Ele mexe nas variáveis e, se alterar algum campo chave e mandar salvar, eu peço pra ele confirmar a alteração (usuário dá ENTER sem pensar e depois reclama que o registro se alterou sozinho...).
- eu posso usar o espaço inteiro da tela (24x80) para os GETs, ou mesmo usar mais de uma tela se necessário. No TBrowse, vc fica limitado à linha e às 80 colunas, não permitindo a visualisação de todos os campos em conjunto.
- no caso de serem poucos campos (por exemplo QUANT, CODIGO, DESCRICAO, UNITARIO), que cabem nas 80 colunas, eu faço o GET sem apagar a tela do TBrowse(): é só fazer @row(),10 get CODIGO, @row,20 get DESCRICAO etc.
- fico livre das "complicações" do TBrowse()... Na hora de fazer alguma manutenção, fica mais fácil.

Eolo
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Oi Eliane,

Fico feliz que tenha sido muito útil os exemplos que te mandei. Agora achei este outro exemplo que vale a pena ver também:
https://pctoledo.org/forum/viewto ... hada#24138

Espero que você consiga dominar o TBROWSE, pois para todos nós é muito poderoso.

Um clip-abraço. :)Pos

Obs.: Pelo teu silêncio... acho que você está mandando a ver (muito ocupada desenvolvendo, digo)
Responder