Página 1 de 1

tbrowse usando arrays

Enviado: 18 Mar 2005 14:59
por Machado_s
Olá a todos. :D
Caros irmãos estou tentando utilizar o tbrowse ( 1vez) em uma tela de pedidos. E estou tendo dificuldade em montar esta estrutura.

Tenho dois dbf:
1) Principal aonde eu guardo os itens principais: numero, emissao, saida, cliente, tabela, prazo e etc. Tenho dois índices: numero e emissao.

2) Secundário aonde eu tenho o movimento: numero, produto, peso, qtd, preço e etc.. Neste tenho só um índice: numero

Eu sei q tenho q utilizar um dbf temporário para digitar cada item de um novo pedido e após a confirmação do mesmo atualizo os dois dbf´s (primário e secundário). Ok!


A QUESTÂO É:
Gostaria q na 1 tela o tbrowse me exibisse os registros pela data da emissão. Isto é ao abrir a tela de pedidos, ela exibisse somente os pedidos daquela data.
Devo utilizar um array para fazer este tipo de estrutura?
Como fazer?
Ela não ficaria lenta com o passar do dia? Digamos uns 100 pedidos diários.
Como incluir registros numa array dentro do tbrowse ?
Como atualizo os meus dbf nessa situação?
Amigos realmente estou precisando realmente te ajuda nestas questões. Preciso desesperadamente de uma solução.
:-O

Segue abaixo o prg da abertura da tela

(só como exemplos )
USE PREPED1 INDEX PPED1,PPED2 ALIAS PED1 NEW
USE PREPED2 INDEX PPED21 ALIAS PED2 NEW

WHIL TRUE
SETCOLOR(drvcort1+","+drvcorget+",,,"+corcampo)
mDATA:= DATAC
@ ls+2, cs+2 say "Data da Opera‡Æo =[ / / ]"
@ ls+2, cs+21 get mData Pict "@D"
Dre()
If LASTKEY() == K_ESC
Exit
Endi

SELE PED1
DBSetOrder(2)
DBSeek( DTOS(mData) )

PBROW(ls+1,cs+1,li-1,ci-1)

ENDD
CLOSE ALL
RETURN


FUNCTION PBROW(nTopo,nEsq,nBase,nDir)
LOCAl oTbr := TBrowseDB(nTopo,nEsq,nBase,nDir), nKey, bFilter, bTela
bTela:= SaveTela(nTopo,nEsq,nBase,nDir)
oTbr:AddColumn( TbColumnNew("Pedido ", {|| TRANS(PRPED1->numero,"99999999") }) )
oTbr:AddColumn( TbColumnNew("EmissÆo", {|| TRANS(PRPED1->emissao,"@D") }) )
oTbr:AddColumn( TbColumnNew("Sa¡da ", {|| TRANS(PRPED1->saida,"@D") }) )
oTbr:AddColumn( TbColumnNew("Prz", {|| PRPED1->prazo }) )
oTbr:AddColumn( TbColumnNew("Compra ", {|| TRANS(PRPED1->debito,"@E 999,999.99") }))
oTbr:colorspec := "r/w,w+/bg,g/bg,w+/w,n/gb"
oTbr:HeadSep:="Ä"
oTbr:ColSep :="³"

Whil .t.

whil !oTbr:stabilize() .and. NEXTKEY() == 0
endd
nKey:= Inkey(0)

DO Case
Case nkey == K_UP
oTbr:up()
Case nkey == K_HOME
oTbr:home()
Case nkey == K_DOWN
oTbr:down()
Case nkey == K_PGUP
oTbr:pageUp()
Case nkey == K_LEFT
oTbr:left()
Case nkey == K_RIGHT
oTbr:right()
Case nkey == K_PGDN
oTbr:pageDown()
Case nKey == K_ESC; EXIT
Other
oTbr:refreshCurrent()
ENDCase
oTbr:refreshCurrent()
Endd
RestoreTela (bTela)
RETU(.t.)


No Aguardo amigos.. Um abraço.


Machado_s
dilsonmachado@hotmail.com.br
ds_machado@ig.com.br

"Sábio é aquele que conhece os limites da própria ignorância".
(Sócrates)

Enviado: 28 Mar 2005 18:36
por MARCELOG
Oi, não sou programador, ou sou?

Gosto de Clipper e daquelas telas rápidas sem muita "frescura" e estou tentado criar um sistema para controlar o meu pequeno escritório.

Introdução há parte, o negócio é o seguinte.

Como vc está trabalhando com banco de dados, pode criar o tbrowse com TBROWSEDB mesmo.

Na sua rotina de criação, crie mais um parâmetro que receberá o objeto da procura (a data da emissão).

Então, você abre (ou ativa a área) em que se encontra o banco de dados e coloca como o índice ativo aquele que contém o objeto da procura (emissão).

Depois, é só definir GOTOPBLOCK, GOBOTTOMBLOCK e SKIPBLOCK.

GOTOPBLOCK deve conter o bloco que verifica a primeira ocorrência ou vai para o final do arquivo se não encontrar:
{||DbSeek(xemissao,.F.)}

GOBOTTOMBLOCK deve conter o bloco que verifica a última ocorrência ou vai para o final do arquivo se não encontrar:
{||iiF(DbSeek(Prox(xemissao),.F.),dBsKIP(-1),dBsKIP(0)}

*Prox é uma função que você deve criar para para verificar/ aumentar um 1 a chave de pesquisa.
Assim, se você procura a data de 01/01/2005, a função Prox deve retornar 02/02/2005.

No bloco acima, você, querendo filtrar o dia 01/01/2005, procura no índice o dia 02/02/2005 e volta um registro (DbSkip(-1)). Sacou?

Agora é a rabeira.

SKIPBLOCK deve conter uma rotina que verifica como, quando, quanto e para onde saltar.

Postei um tópico com o título TBROWSE FILTRADA DE NOVO, vai lá, cópia e manda brasa.

PS: cada vez em que há uma estabilização do objeto, os três métodos acima são avaliados.

Assim, se você aperta a tecla seta para cima, o Tbrowse informa para SKIPBLOCK que quer subir uma linha (-1).

A SKIPBLOCK verifica se pode fazer isto sem ultrapassar GOTOPBLOCK, o mesmo ocorrendo se a tecla apertada for seta para baixo(1), em relação a GOBOTTOMBLOCK.

A minha rotina funciona 100%, o único problema, e eu estou querendo saber porque, é a necessidade da avaliação do GOTOPBLOCK ser realizada externamente, ou seja, não está dentro do método.

Espero ter ajudado, qualquer dúvida, tamos aí UAI!

MGS

Enviado: 29 Mar 2005 19:41
por Machado_s
Caro Marcelog agradeço m+ pela dica, valeu mesmo.
Vou utilizar a sua sugestão em meu projeto. Postarei mais tarde o resultado.

Um abraço.

Machado_s
dilsonmachado@hotmail.com.br