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.


