Página 1 de 1

Matrizes p/mais de 5 mil registros

Enviado: 29 Mar 2005 09:23
por Ale SB
Eu tenho um cadastro de clientes, onde criei uma matriz junto com Achoice(), pra procurar registros, mas, meu cliente ja esta com quase 4 mil registros, li q as matrizes so armazenao ate 4096 registros, eh verdade ?
Se for oq devo fazer ?

@braços Ale

Enviado: 29 Mar 2005 09:36
por Alessandro
Ale,

Aconselho a vc utilizar um arquivo temporário, assim vc fica liver desse tipo de problema. É claro que a performance vai cair, mas, fazer o que?

Beleza

Inté

Enviado: 29 Mar 2005 10:45
por vagucs
Sim o array é limitado e concordo plenamente com o alessandro, arquivos temporario ou mesmo indice temporario é a melhor solução, ou mesmo converter para xHarbour pois com ele os arrays não tem limites.

Enviado: 29 Mar 2005 11:09
por Clipper
Talvez eu não tenha entendido.

Mas não é mais fácil usar um DBEDIT() com uma função de busca ?

Até logo.

Marcelo

Enviado: 29 Mar 2005 11:29
por Alessandro
Valeu o comentário de nosso amigo Clipper...

Se vc não tiver que selecionar nada no arquivo, não há necessidade de array nem de arq. temporário, vc usa o dbedit ou o browse diretamento no arquivo.

Blz

Enviado: 29 Mar 2005 14:19
por Ale SB
VALEU GALERA PELAS DICAS;
mas, eu nao sei se vai dar certo usar o Dbedit(), minha pesquisa funciona da segunda maneira;

Ao abrir o arq. de cadastro, o usuario tecla F2 no get do Codigo, para realizar uma pesquisa por cliente, abre-se entao uma tela com todos os clientes cadastrados, na linha 1 conforme ele vai digitando o nome do cliente, a funçao vai buscando o nome corespondente, letra-a-letra, selecionado o Cliente desejado, ENTER, retorna com todos os dados desse cliente pra a tela de cadastro.

A Funçao esta assim:

FUNC PROCREG()
******************************************************************************
*Este exemplo cria uma Picklist com a fun‡ao Achoice(),onde possibilita ao *
* usuario localizar um item na picklist ao digitar os primeiros caracteres, *
* e carrega a matriz original pra uma Matriz paralela que cont‚m o n§ do *
* registro correspondente …quele campo, assim sendo, podemos carregar para *
* uma variavel de memoria o registro selecionado , imprimir-lo na tela, ou *
* e salvar no Banco de Dados. *
Exemplo 5 *
* do Livro do Ramalho (Clipper 5 Vol.1, pg.495), com a rotina Procreg.prg, *
******************************************************************************
*clea
*set color to w+/b+
@ 00,00 clea to 21,79
*@ 00,00 to 21,79 double

elem:= lastrec()
elem1:= lastrec()
l1=04
c1=02
l2=elem + 5
c2=38

IF l2 >=17
l2=17
ENDIF

declare m3[elem], m4[elem]

t= savescreen(00,00,21,79)
go top
set color to gr+/b+,w+/r+

FOR i = 1 to elem//len(m3)
m3 = duto
m4 = recno()
skip
NEXT

choice = achoose( l1, c1, l2, c2, m3, 1 )

IF choice = 0
@ l2+1,c1+2 say "Foi Teclado ESC"
ELSE
goto m4[choice]
IF lastkey() = 13
xcodu = codu
keyboard chr(13)
restscreen(00,00,21,79,t)
ENDIF
ENDIF
RETURN
*****************
*FUNیES
*****************************************************************************
* -----------------------------------------------------------------------------
func achoose
* -----------------------------------------------------------------------------
parameters t, l, b, r, array, larray, achoose_initial
private achoice_initial, scan_string, scan_return, scan_start, choice, ;
lines, lower, line, i, j
achoice_initial := achoose_initial
scan_string := ''
scan_return := 1
scan_start := 1
lines := b-t-1
@ t, l to b, r double
sim_cursor(t-2, l+1,'_')
do while .t.
choice = achoice(t + 1, l + 1, b - 1, r - 1, ;
array, larray, "AChooseFun", achoice_initial)
do case
case scan_return = -1
exit
case scan_return = 0
@ t - 2, l+1 say scan_string
@ b+1,l+1 say '<nÆo encontrado>' color 'w+/r'
scan_string = left(scan_string, len(scan_string) - 1)
otherwise
achoice_initial = scan_return
@ t-2, l + 1 say padr(scan_string,r-(l+1))
sim_cursor(t-2,l+1+len(scan_string),'_')
@ b+1, l+1 say space(17)
endcase
enddo
return choice
* -----------------------------------------------------------------------------
FUNC AChooseFun
* -----------------------------------------------------------------------------
PARAMETERS status, current_index
PRIVATE request
stroke = lastkey()
do case
case status = 1
request = AchoiceBoa()
case status = 2
request = AchoiceEoa()
case status = 3
request = AChooseExcept(stroke, current_index)
otherwise
request = 2
endcase
return request
* -----------------------------------------------------------------------------
FUNC AChooseExcept
* -----------------------------------------------------------------------------
parameters action_key, current
private n
do case
case action_key = 1 // home
keyboard chr(31)
return 2
case action_key = 6 // end
keyboard chr(30)
return 2
case action_key = 27 // esc
scan_return = -1
return 0
case action_key = 13 // enter
scan_return = -1
return 1
case action_key = 8 .or. action_key = 19 // Backspace or seta esquerda
scan_string = ;
if(len(scan_string) = 0, '', LEFT(scan_string, LEN(scan_string) - 1))
for n = 1 to len(array)
if lower(array[n]) = lower(scan_string)
scan_return = n
exit
endif
next
if n > len(array)
scan_return = 0
endif
RETURN 0

CASE action_key < 32
RETURN 2

CASE LEN(scan_string) = LEN(array[1])
scan_return = -1
RETURN 1

OTHERWISE
scan_string = scan_string + CHR(action_key)
scan_start = IF(scan_return > 0, scan_return, scan_start)
scan_start = IF(scan_start = 0, 1, scan_start)
* for n = scan_start to len(array)
for n = 1 to len(array)
if lower(array[n]) = lower(scan_string)
scan_return = n
exit
endif
next
if n > len(array)
scan_return = 0
endif
RETURN 0
ENDCASE
* -----------------------------------------------------------------------------
FUNC AchoiceBoa
* -----------------------------------------------------------------------------
@ t-2, l - 1 say [ ]
RETURN 2
* -----------------------------------------------------------------------------
FUNC AchoiceEoa
* -----------------------------------------------------------------------------
@ b, l - 1 say [ ]
RETURN 2
* -----------------------------------------------------------------------------
FUNC AScanSoft
* -----------------------------------------------------------------------------
PARAMETERS array, value, start
i = IF(PCOUNT() = 3, start, 1)
DO WHILE .T.
IF TYPE('array') $ 'UL'
i = IF(TYPE('array[1]') = 'U', 0, i)
EXIT
ENDIF
IF value <= array
EXIT
ENDIF
i = i + 1
ENDDO
RETURN i
* -----------------------------------------------------------------------------
func sim_cursor
* -----------------------------------------------------------------------------
parameters row, col, cur_sor
@ row, col say cur_sor
return nil

**************************
Com o Dbedit(), daria pra fazer o mesmo ?

Enviado: 29 Mar 2005 14:42
por Clipper
Isso é moleza no Dbedit().

Pegue abaixo uma função de exemplo que eu mesmo fiz, ela busca conforme você vai digitando o nome do produto.

www.zitinformatica.com/clipper/edita.zip

Dê <Enter> no código e depois digite um nome de produto do tipo :

JOELHO TIGRE

Veja como é simples a função e você poderá usá-la para busca em qualquer arquivo, lembro que o arquivo deverá estar indexado pelo campo que se quer procurar.

Se não me engano na seção downloads do Toledo tem outro exemplo de busca letra por letra com uso do Dbedit()

Até logo.

Marcelo

Enviado: 29 Mar 2005 16:04
por Ale SB
Muito boa sua funçao Marcelo, eh bem mais simples e parece atender com perfeiçao minhas nessecidades.

A noite vou fazer substituir ela pela minha funçao, no sistema, depois te aviso do resultado, por hora obrigado!!!

@braços Ale :xau