Página 1 de 1

Tbrowse Extremamente Lento

Enviado: 26 Mai 2009 09:14
por jpalma
Boa dia

Estou necessitando de ajuda para resolver o seguinte problema.
Utilizo o TBROWSE em meus programas para o modulo de cadastro e também no modulo de pedidos de clientes.
No de cadastro não tenho problema porem no de pedidos estou com um PROBLEMÃO.
Na rotina de pedidos a INCLUSÃO e ALTERAÇÃO de dados são efetuados diretamente no DBF e nas celulas do TBROWSE.
Para que isso seja posivel necessito FILTRAR em tempo de execusão o pedido que estou editando/alterando a fim de que não sejam visualizados os produtos de outros pedidos.
Ocorre que quando tenho muitos pedidos emitidos e nos mesmos existem em torno de 10 ou mais produtos o sistema fica EXTREMANENTE lento.

Utilizo CLIPPER 5.2e, indice NTX e compilador BLINKER 7.0.

Segue as rotinas que utilizo:


1-criação do tbrowe

Código: Selecionar todos

  FUNCTION TBRW_PEDIDO(nLinT, nColT, nLinB, nColB)

LOCAL oTB,aArquivo1[0],X

aTitulo1 :=  { 'PRODUTO','QUANT','VL UNIT','VL TOTAL','DESCRICAO DO PRODUTO'}

aCampo1 :=  { 'COD_PRO','QUA_PRO','VAL_UNI','VAL_PRO','DESCRI'}

aPicture1 :=  { '99999','999.999','9999.99','99999.99','@!'}

aArquivo1 := { ,,,, }

oTB := TBROWSEDB(nLinT, nColT, nLinB, nColB)

//TABELA:              1    2    3    4    5    6     7    8    9   10   11
oTB:COLORSPEC :=    "W+/BG,W+/N,R/BG,R/W,W+/R,GR+/W,G+/BG,G+/W,B/BG,B/W,B/W"
oTB:HEADSEP := CHR(205)+CHR(194)+CHR(205)
oTB:COLSEP := " "+CHR(179)+ " "
oTB:FOOTSEP  := CHR(196)+CHR(193)+CHR(196)

FOR X = 1 TO LEN(aCAMPO1)
 IF EMPTY(aARQUIVO1[X])
  IF X = 1
   COLUNA := TBCOLUMNNEW(aTITULO1[X],{||PEDIDO_PRO->COD_PRO})
  ELSEIF X = 2
   COLUNA := TBCOLUMNNEW(aTITULO1[X],{||PEDIDO_PRO->QUA_PRO})
  ELSEIF X = 3
   COLUNA := TBCOLUMNNEW(aTITULO1[X],{||PEDIDO_PRO->VAL_UNI})
  ELSEIF X = 4
   COLUNA := TBCOLUMNNEW(aTITULO1[X],{||PEDIDO_PRO->VAL_PRO})
  ELSEIF X = 5
   COLUNA := TBCOLUMNNEW(aTITULO1[X],{||CAD_PRO->DESCRI})
   COLUNA:WIDTH := 35
  ENDIF
  COLUNA:CARGO := FIELDBLOCK(aCAMPO1[X])
 ELSE
  COLUNA := TBCOLUMNNEW(aTITULO1[X],FIELDWBLOCK(aCAMPO1[X],SELECT(aARQUIVO1[X])))
  COLUNA:CARGO := FIELDWBLOCK(FIELDNAME(X),SELECT(aARQUIVO1[X]))
 ENDIF
 COLUNA:COLORBLOCK := {|| IF(EMPTY(COMPLE),{1,2},{9,10})}
 oTB:ADDCOLUMN(COLUNA)
NEXT

// CHAVE É O CODIGO DO PEDIDO
oTB:GOTOPBLOCK={|| InicFaixa(Chave) }
oTB:GOBOTTOMBLOCK={|| FimdaFaixa(Chave) }
oTB:SKIPBLOCK:={| nParamover | Movereg ( nParamover, Chave ) }
RETURN(oTB)

2- filtro

Código: Selecionar todos

*******************************************
// INICIO ARQUIVO
*******************************************
  FUNCTION InicFaixa( Chave )

DBSEEK( Chave )
RETURN NIL


*******************************************
// FIM ARQUIVO
*******************************************
  FUNCTION FimdaFaixa( Chave )

IF LEN( Chave ) = 1
 DBSEEK( UltimaChave( Chave ), .F.)
 DBSKIP(-1)
 RETURN ({|| DBSEEK(UltimaChave( Chave ), .F.), DBSKIP(-1)})
ELSE
 DBSEEK( UltimaChave( Chave ), .T.)
 DBSKIP(-1)
 RETURN ({|| DBSEEK(UltimaChave( Chave ), .T.), DBSKIP(-1)})
ENDIF

RETURN NIL


*******************************************
// ULTIMO REGISTRO
*******************************************
  FUNCTION UltimaChave( Chave )

LOCAL UltimoReg

UltimoReg := STUFF(Chave, LEN(Chave),1,CHR(ASC(RIGHT(Chave,1))+1))
RETURN (UltimoReg)


********************************************************
// FILTRAR DADOS DO ARQUIVO
********************************************************
  FUNCTION MoveReg( nParaMover, Chave )

LOCAL nMovidos := 0

IF nParaMover == 0 .OR. LASTREC() == 0
 DBSKIP(0)
ELSEIF nParaMover > 0 .AND. RECNO() != LASTREC() + 1
 WHILE nMovidos <= nParaMover .AND. ! EOF() .AND. LEFT(&(INDEXKEY(0)),LEN(CHAVE)) == Chave
  DBSKIP(1)
  nMovidos++
 END
 DBSKIP(-1)
 nMovidos--
ELSEIF nParaMover < 0
 WHILE nMovidos >= nParaMover .AND. ! BOF() .AND. LEFT(&(INDEXKEY(0)),LEN(CHAVE)) == Chave
  DBSKIP(-1)
  nMovidos--
 END
 IF !BOF()
  DBSKIP(1)
 ENDIF
 nMovidos++
ENDIF
RETURN (nMovidos)

3- inclusão e alteração

Código: Selecionar todos

  WHILE .T.
   ORDEM1 += 1
   IF ADIREG(20)
    FIELD->COD_PED := COD_PED1; FIELD->ORDEM := STRZERO(ORDEM1,2,0)
    DBCOMMIT(); DBRUNLOCK()
   ELSE
    MENSAGEM('INCLUSAO NAO FOI EFETUADA','AGUARDE UM TEMPO PARA TENTAR NOVO ACESSO',3)
   ENDIF

   OBJETO_S:PANHOME()
   OBJETO_S:GOBOTTOM()
   OBJETO_S:REFRESHCURRENT()
   WHILE (!OBJETO_S:STABILIZE());END

   W := 1; Y += 1; NAVEGA := ''; VOLTAR := ''; QUA_PRO1 := 0.000
   IF Y = 1
    LINHA1 := LINHA3 := ROW()
    IF LINHA2 = 0; LINHA2 := ROW(); ENDIF
    IF LINHA2 > 11; LINHA2 := 11; ENDIF
   ELSE
    LINHA1 += 1; LINHA3 := LINHA1
    IF LINHA1 > 22; LINHA1 := 22; ENDIF
   ENDIF

   WHILE .T.
    IF NAVEGA # 'PRODUTO'
     OCOLUMN := OBJETO_S:GETCOLUMN(OBJETO_S:COLPOS)
     CAMPO := OCOLUMN:HEADING
     COLUNA1 := COL()
     FORMATO := aPicture1[OBJETO_S:COLPOS]
     OGET := GETNEW(LINHA1,COLUNA1,OCOLUMN:CARGO,CAMPO,FORMATO,'W+/N')
     NAVEGA := ''
    ENDIF
    IF W = 1; COD_PRO3 := COD_PRO; ENDIF
    IF W = 2; QUA_PRO1 := QUA_PRO; ENDIF

    SELECT("PEDIDO_PRO")
    IF BLOQREG(20)
     READMODAL( { OGET },,3600 )
     DBCOMMIT(); DBRUNLOCK()
    ELSE
     MENSAGEM('ALTERACAO NAO FOI EFETUADA','AGUARDE UM TEMPO PARA TENTAR NOVO ACESSO',3)
    ENDIF

    IF LASTKEY() == K_ESC .AND. NAVEGA == 'ESQUERDA'
     W -= 1
     IF W = 3 .AND. NIVEL < '3'; KEYBOARD CHR(K_ENTER); ENDIF
     
     IF W >= 1 .AND. W <= 3; OBJETO_S:LEFT(); ENDIF
     OBJETO_S:REFRESHCURRENT(); WHILE (!OBJETO_S:STABILIZE());END
     IF W = 0; W := 1; ENDIF
     LOOP
    ELSEIF LASTKEY() == K_ESC .AND. NAVEGA == 'DIREITA'
     W += 1
     IF W = 3 .AND. NIVEL < '3'; KEYBOARD CHR(K_ENTER); ENDIF
     
     IF W >= 1 .AND. W <= 3; OBJETO_S:RIGHT(); ENDIF
     OBJETO_S:REFRESHCURRENT(); WHILE (!OBJETO_S:STABILIZE());END
     IF W > 3; W := 3; ENDIF
     LOOP
    ELSEIF LASTKEY() == K_ESC .AND. NAVEGA == 'CIMA'
     LINHA1 -= 1
     OBJETO_S:UP()
     OBJETO_S:REFRESHCURRENT(); WHILE (!OBJETO_S:STABILIZE());END
     IF LINHA1 < LINHA2; LINHA1 := LINHA2; ENDIF
     LOOP
    ELSEIF LASTKEY() == K_ESC .AND. NAVEGA == 'BAIXO'
     LINHA1 += 1
     OBJETO_S:DOWN()
     OBJETO_S:REFRESHCURRENT(); WHILE (!OBJETO_S:STABILIZE());END
     IF LINHA1 > LINHA3; LINHA1 := LINHA3; ENDIF
     IF LINHA1 > 22; LINHA1 := 22; ENDIF
     LOOP
    ELSEIF LASTKEY() == K_ESC .AND. NAVEGA == 'COMPLEMENTO'
     SET KEY K_RIGHT TO
     SET KEY K_LEFT TO
     SET KEY K_DEL TO
     TELA2 := SAVESCREEN(10,20,14,60)
     TELA(10,20,14,60,.T.,JANAZ,' OBSERVACAO PRODUTO ')
     SET KEY K_RIGHT TO
     SET KEY K_LEFT TO
     SET KEY K_DEL TO
     COMPLE1 := COMPLE

     @ 12,25 GET COMPLE1 PICT '@!' COLOR(CORGET)
     READ
     IF BLOQREG(20)
      FIELD->COMPLE := COMPLE1
      DBCOMMIT(); DBRUNLOCK()
     ELSE
      MENSAGEM('INCLUSAO NAO FOI EFETUADA','AGUARDE UM TEMPO PARA TENTAR NOVO ACESSO',3)
     ENDIF
     SET KEY K_RIGHT TO DIREITA()
     SET KEY K_LEFT TO ESQUERDA()
     SET KEY K_DEL TO ATALHO_EXC()
     OBJETO_S:REFRESHCURRENT(); WHILE (!OBJETO_S:STABILIZE());END
     RESTSCREEN(10,20,14,60,TELA2); NAVEGA := ''; LOOP
    ELSEIF LASTKEY() == K_ESC
     EXIT
    ELSEIF LASTKEY() # K_ENTER
     LOOP
    ENDIF

    IF W = 1 .AND. (COD_PRO # COD_PRO3 .OR. EMPTY(COD_PRO3))
     COD_PRO1 := ALLTRIM(COD_PRO)+SPACE(5-LEN(ALLTRIM(COD_PRO)))
     IF EMPTY(COD_PRO1)
      IF !VERIF_PROD('CAD_PRO',@COD_PRO1,,,08,10,22,58)
       SELECT("PEDIDO_PRO"); NAVEGA := 'PRODUTO'; LOOP
      ENDIF
      SELECT("PEDIDO_PRO")
     ENDIF
     IF !CAD_PRO->(DBSEEK(COD_PRO1))
      MENSAGEM('PRODUTO NAO CADASTRADO',,3)
      IF BLOQREG(20)
       FIELD->COD_PRO := ''
       DBCOMMIT(); DBRUNLOCK()
      ELSE
       MENSAGEM('INCLUSAO NAO FOI EFETUADA','AGUARDE UM TEMPO PARA TENTAR NOVO ACESSO',3)
      ENDIF
      NAVEGA := 'PRODUTO'; LOOP
     ENDIF
     NAVEGA := ''

     IF BLOQREG(20)
      FIELD->COD_PRO := COD_PRO1; FIELD->COD_AUX := COD_PED1+COD_PRO1
      FIELD->COD_LOJA := COD_LOJA1; FIELD->QUA_PRO := 1
      DBCOMMIT(); DBRUNLOCK()
     ELSE
      MENSAGEM('INCLUSAO NAO FOI EFETUADA','AGUARDE UM TEMPO PARA TENTAR NOVO ACESSO',3)
     ENDIF

    ELSEIF W = 2
     IF EMPTY(VAL_UNI)
      IF BLOQREG(20)
       FIELD->VAL_UNI := CAD_PRO->PRE_VEN
       DBCOMMIT(); DBRUNLOCK()
      ELSE
       MENSAGEM('INCLUSAO NAO FOI EFETUADA','AGUARDE UM TEMPO PARA TENTAR NOVO ACESSO',3)
      ENDIF
     ENDIF
     IF NIVEL < '3'; KEYBOARD CHR(K_ENTER); ENDIF

    ELSEIF W = 3 .AND. EMPTY(VAL_PRO)
     IF BLOQREG(20)
      FIELD->VAL_PRO := VAL_UNI*QUA_PRO

      IF QUA_PRO = 0
       DBDELETE(); LINHA1 -= 1; LINHA3 -= 1
      ELSEIF LEN(MPRODUTO) > 0
       AADD(mPRONOVO,COD_PRO); AADD(mQTDNOVO,QUA_PRO); AADD(mORDNOVO,ORDEM)
      ENDIF
      DBCOMMIT(); DBRUNLOCK()
     ELSE
      MENSAGEM('INCLUSAO NAO FOI EFETUADA','AGUARDE UM TEMPO PARA TENTAR NOVO ACESSO',3)
     ENDIF

     SELECT("PEDIDO_TOT")
     IF BLOQREG(20)
      FIELD->VAL_PRO += PEDIDO_PRO->VAL_PRO
      IF COD_PED1 <= CONFIG->NUM_PEDIDO; FIELD->VAL_TAXA := VAL_PRO*TAXA1; ENDIF
      FIELD->VAL_TOT := VAL_PRO+VAL_TAXA-VAL_DESC
      IF CONFIG->TIPO_ATD == 'M'; FIELD->SIT := 'A'; ENDIF
      DBCOMMIT(); DBRUNLOCK()
     ELSE
      MENSAGEM('PRODUTO NAO FOI INCLUIDO','AGUARDE UM TEMPO PARA TENTAR NOVO ACESSO',3)
      LOOP
     ENDIF
    ENDIF

    W += 1
    SELECT("PEDIDO_PRO")
    IF W <= 3
     OBJETO_S:RIGHT()
     OBJETO_S:REFRESHCURRENT()
     WHILE (!OBJETO_S:STABILIZE());END
    ENDIF
    
    IF W > 3 .AND. LINHA3 > LINHA1 .AND. LINHA1 # 22
     OBJETO_S:PANHOME()
     OBJETO_S:GOBOTTOM()
     OBJETO_S:REFRESHCURRENT()
     WHILE (!OBJETO_S:STABILIZE());END
     W := 1; LINHA1 := LINHA3
    ELSEIF W > 3
     EXIT
    ENDIF
   END
   IF LASTKEY() == K_ESC .AND. EMPTY(VOLTAR); EXIT; ENDIF
  END

---
Nota da Moderação (Maligno):
A presente mensagem foi editada apenas para a inclusão das tags de apresentação de código fonte. Por favor, no futuro, utilize essas tags, a fim de melhorar a visibilidade do código. Se já é difícil ler código volumoso devidamente indentado, muito pior fica (e dificulta a ajuda) sem essa indentação.

Re: Tbrowse Extremamente Lento

Enviado: 26 Mai 2009 14:52
por filizola
por que vc nao usa arquivo temporario para este fim.

use matriz (arquivo com a estrutura do arquivo pedidos)
arqtemp=alltrim(left(netuse(),8))+".dbf" (arquivo temporario criado com o nome da estacao)
copy stru to (arqtemp)
use (arqtemp)

insira seus itens de pedido

apos confirmacao

Código: Selecionar todos

sele (arqtemp)
go top
do while !eof()
    codigop=codigo
    qtdep=qtde
    vlrp=vlr
    sele pedido
    appe blank
    repla bla bla bal
    sele (arqtemp)
    skip
enddo
e na alteracao vc pesquisa se ja existe o codigo, se sim altere qtd e preco, se nao crie um registro novo no pedido, se tinha e nao tem mais delete no arquivo pedido (no caso da exclusao de itens que tinham no pedido e foram cancelados deve-se seguir o caminho de ida e volta na pesquisa)


---
Nota da Moderação (Maligno):
A presente mensagem foi editada apenas para a inclusão das tags de apresentação de código fonte. Por favor, no futuro, utilize essas tags, a fim de melhorar a visibilidade do código. Se já é difícil ler código alheio (mesmo não tão volumoso) devidamente indentado, fica muito pior sem essa indentação.

Re: Tbrowse Extremamente Lento

Enviado: 27 Mai 2009 16:33
por alaminojunior
Utilizo CLIPPER 5.2e, indice NTX e compilador BLINKER 7.0.
Eu aconselho a começar a migrar tudo para RDD CDX, que além de indolor seria a saída mais rápida. A RDD CDX trabalha com índices muito mais pequenos e velozes, é mais segura, e este filtro que você faz à nível de tBrowse apesar de elegante, pode ser feito com as funções de SCOPE que são muito mais velozes.

Re: Tbrowse Extremamente Lento

Enviado: 27 Mai 2009 22:29
por jpalma
Alamino

Onde posso conseguir exemplos de utilização da RDD CDX ?

grato

Re: Tbrowse Extremamente Lento

Enviado: 28 Mai 2009 08:39
por alaminojunior
Sem querer desmerecer tudo o que já foi postado aqui no fórum, eis os primeiros passos no link abaixo:

http://www.htmlstaff.org/ver.php?id=1079

Mas procure também neste fórum a respeito do RDD CDX, tem muita coisa interessante.

Re: Tbrowse Extremamente Lento

Enviado: 01 Jun 2009 23:53
por alxsts
Olá amigos,

alguns dias já se passaram desde o início deste post. Espero que o OP já tenha resolvido o problema. Mesmo assim, gostaria de dar um palpite:
1 - o Maligno tem razão... código não indentado é uma porcaria pra ser lido. Ainda mais com tudo escrito em maiúsculas...
2 - talvez, nesta altura do campeonato, uma mudança no RDD utilizado (de DBFNTX para DBFCDX), como sugerido anteriormente por outro colega, seja um tanto trabalhosa quanto traumática.
3 - por este motivo, sugiro a utilização das tecnicas criadas pelo "mago" Rick Spence, reunidas sob o codinome TBrowseFW (TBrowse FOR WHILE), num livro do qual não me lembro o título. Trabalhei muito com isso e consegui resultados excelentes. Se necessário posso ajudar com exemplos.

[]´s
AlxSts

Re: Tbrowse Extremamente Lento

Enviado: 02 Jun 2009 12:54
por alaminojunior
alxsts escreveu:por este motivo, sugiro a utilização das tecnicas criadas pelo "mago" Rick Spence, reunidas sob o codinome TBrowseFW (TBrowse FOR WHILE)
Mas isso ele já usa. O ideal seria facilitar as coisas para o tbrowse.
Reafirmo que a saída menos dolorosa e mais rápida é sim a troca de RDD.

Tbrowse Extremamente Lento

Enviado: 02 Jun 2009 16:27
por Pablo César
jpalma, ja pensou em utilizar um TBROWSE de vetores ? As vezes eu utilizo TBROWSE de DBF em conjunto com TBROWSE de vetores. Não uso jamais SET FILTER. A opção de pesquisa com o novo RDD é uma boa, mas talvez não resolva em difinitivo. Não analisei o seu código, mas se a questão é apenas exibir alguns registros-filhos do registro-pai, talvez nem precise fazer TBROWSE. Se apenas deseja visualizar em tela conforme esta navegando pelo TBROWSE (navegando entre registros-pai) e deseja exibir umas poucas linhas (digo pouco porque não dá para exibir utdo em tela), então procure dar apenas un SAY e se o usuário decidir dar um ENTER para edita, aí você edita através de um TBROWSE de vetores. Essa combinação para mim mostra-se muito eficiente. Claro que terá que levar em conta a limitação de número de elementos para o vetor, caso contrário faça o TBROWSE de DBF mesmo.