Página 1 de 1

TbrowseDB

Enviado: 06 Nov 2013 09:16
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.

TbrowseDB

Enviado: 06 Nov 2013 10:43
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.

TbrowseDB

Enviado: 06 Nov 2013 20:44
por jelias
Agradeço sua ajuda Eolo.

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

Sds,

Júlio.

TbrowseDB

Enviado: 07 Nov 2013 00:21
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.