TbrowseDB

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

TbrowseDB

Mensagem por jelias »

Amiguinhos,

Tenho um cadastro de pedidos onde estou usando um TbrowseDB. Neste cadastro, tenho um arquivo onde estão os dados do pedido, tais como vendedor, data, condições de pagamento, etc. E tenho outro arquivo onde guardo os itens dos pedidos. Ocorre que para fazer o controle e mostrar somente os itens do pedido, eu faço da seguinte forma:

Código: Selecionar todos

sele AL_PEDID  // Arquivo de Pedido
// Neste arquivo saldo os dados do pedido.

sele AL_ITPED      //Arquivo de Itens do Pedido
DBSETORDER(1)   // (NúmeroCarga+CódigoPedido) 
ORDSCOPE(0,v_Carga+v_CodPedido)
ORDSCOPE(1,v_Carga+v_CodPedido)
DBGOTOP()
//Feito o filtro, todos os itens que irão ser mostrados do TBrowseDB(), pertencem ou atendem a condição do ORDSCOPE(). 
// Acontece que, se eu mudar a ordem do item por exemplo, DBSETORDER(2) (NúmeroCarga+CódigoPedido+CódigoItem) o filtro é perdido e tenho que fazê-lo novamente, aumentando processando e no futuro pode ficar lento, imagino.
// Vocês podem dizer, é só mudar o filtro para DBSETORDER(2) que irá funcionar certinho, correto e já fiz, entretanto o TBROWSEDB coloca os dados na tela por ordem de código e o usuário quer que fique na ordem que ele digitou, rs. Não é fácil.
- Alguém já fez um TBROWSEDB() que não é necessário usar ORDSCOPE(), usando DBSEEK() e controles de limites para mostrar somente os dados necessários?

Sds,

Júlio.
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

TbrowseDB

Mensagem por Eolo »

Código: Selecionar todos

// Acontece que, se eu mudar a ordem do item por exemplo, DBSETORDER(2) (NúmeroCarga+CódigoPedido+CódigoItem) o filtro é perdido e tenho que fazê-lo novamente, aumentando processando e no futuro pode ficar lento, imagino.
// Vocês podem dizer, é só mudar o filtro para DBSETORDER(2) que irá funcionar certinho, correto e já fiz, entretanto o TBROWSEDB coloca os dados na tela por ordem de código e o usuário quer que fique na ordem que ele digitou, rs. Não é fácil.
O que o ORDSCOPE faz é definir um início e um fim "virtuais", baseados no índice setado. Se vc tem um arquivo de nomes, indexado por NOME, e seta o ORDSCOPE pra letra "B", só vão aparecer os nomes iniciados com essa letra. O ORDSCOPE "muda" a letra inicial de A para B, e a letra final de Z para B.

Agora, se vc muda o índice pra um campo DATA, o ORDSCOPE (setado com base na indexação por NOME) não tem como separar só as datas iniciadas com "B"... Por isso, é preciso setar um novo filtro, baseado em datas.

E não se preocupe com lentidão, não vai acontecer. O ORDSCOPE não cria ou recria índices. Ele só define onde o Tbrowse deve iniciar e terminar.
jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

TbrowseDB

Mensagem por jelias »

Agradeço sua ajuda Eolo.

Irei fazer desta forma, sempre que mudar a ordem irei executar o ORDSCOPE() novamente.

Sds,

Júlio.
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

TbrowseDB

Mensagem por alxsts »

Olá!

Creio que a dica do Eolo vai resolver o teu problema. A função OrdScope(), disponível a partir do Clipper 5.3, é muito boa e rápida mas, você tem que "dizer" a ela qual a faixa de chaves no índice o programa deve "enxergar".

Apenas para ilustrar, segue um exemplo, onde as constantes manifestas TOPSCOPE e BOTTOMSCOPE são declaradas em um arquivo de inclusão (Ord.ch):

Código: Selecionar todos

 Examples

     .  This example illustrates using ORDSCOPE() to set various
        scoping limitations on an order:

        USE Friends
        SET INDEX TO Age

        // Make 25 the lowest age in range
        ORDSCOPE(TOPSCOPE, 25)

        // Make 30 the highest age in range
        ORDSCOPE(BOTTOMSCOPE, 30)
        LIST Age                         // Shows records with
                                         // 25 <= Age <= 30

        // Change highest age to 35
        ORDSCOPE(BOTTOMSCOPE, 35)
        LIST Age                         // Shows records with
                                         // 25 <= Age <= 35

        // Reset top boundary
        ORDSCOPE(TOPSCOPE, NIL)
        LIST Age                         // Shows records with
                                         // Age <= 35


        // Reset bottom boundary
        ORDSCOPE(BOTTOMSCOPE, NIL)
        LIST Age                         // Shows all records

 Files   Library is CLIPPER.LIB, header file is Ord.ch.
Uma alternativa, para quem usa Clipper 5.2, seria o conjunto de rotinas do Rick Spence conhecido como TBrowseFW (TBrowse FOR WHILE). Pesquise no fórum se precisar.
[]´s
Alexandre Santos (AlxSts)
Responder