Página 1 de 2

Como efetuar uma pesquisa por parte do campo

Enviado: 29 Jan 2007 12:55
por nanosoft
Apos terminar um curso na SOS a 12 anos, nunca mais mexi com clipper, mas agora inventei de fazer algo de util e estou montando um controle de estoque.
Esta tudo funcionando redondo a nao ser pela pesquisa.
O problema é que como o sistema é para oficina de eletronica, existem componentes que tem o inicio do codigo alterado pelo seu fabricante ou o final para indicar a sua caracteristica, por exemplo:

un741 / lm741 / ua741
bc548 / bc548a / bc548c


Fiz alguns testes por aqui com comando locate, e ele me listou todas as peças que terminavam com 741, mas no caso do bc548, o que tem final a, b, ou c, não foi listado.
Entao preciso que o sistema busque o codigo no meio dele, para listar todos os componentes que tenham o determiando codigo.

Agradeço deste ja qualquer ajuda

Enviado: 29 Jan 2007 13:08
por Toledo
Marcos,

Se os códigos tiverem sempre esta mesma estrutura (duas letras, três números e um letra) você pode fazer o seguinte usando o LOCATE:

LOCATE FOR SUBS(codigo,3,3)="548"

Abraços,

Como efetuar uma pesquisa por parte do campo

Enviado: 29 Jan 2007 13:17
por nanosoft
Mas ai é que esta o problema.
Nao segue um padrao.
A peça pode vir com codigo:

uml 741, hps 741, cd741, ou mesmo so 741, ou seja varia de fabricante para fabricante.

O codigo da peça, a parte numerica pode ser de ate 7 digitos.

Enviado: 29 Jan 2007 13:43
por Toledo
Então tenta o seguinte:

LOCATE FOR TIRA_LETRA(codigo)="548"

Código: Selecionar todos

PROC TIRA_LETRA(vCod)
LOCAL abc:=" ABCDEFGHIJKLMNOPQRSTUVWXYZ", ret:=vCod
FOR i=1 TO LEN(abc)
 ret = STRTRAN(ret, subs(abc,i,1),"")
NEXT
RETU (ret)
Abraços,

Enviado: 29 Jan 2007 14:38
por Augusto
Desculpem os parceiros aí de cima... em especial o amigo "papa" Toledo... mas acho que o ideal nesse caso seria usar a função AT()...

Tipo assim...

Código: Selecionar todos

p_cod = "548"
use seu_arq
Locate for AT(p_cod,codigo) # 0
O que acham ??

Enviado: 29 Jan 2007 15:03
por MARINI
Acho que o mais facil é usar o $ (contido)

Ex:

IF '548'$campo .OR. '743'$campo .OR. 'A743'$UPPER(campo)...

Como efetuar uma pesquisa por parte do campo

Enviado: 29 Jan 2007 15:12
por nanosoft
No caso o cliente ira entrar com o codigo desejado, pode ser 548, 741, etc.
Entao no lugar do 548, ou do 748, ou qq outro codigo irei colocar o mcod, que é a variavel que pega o valor digitado pelo cliente , é isso?

Enviado: 29 Jan 2007 15:19
por Augusto
Bem... no exemplo que eu dei é P_COD....

Enviado: 29 Jan 2007 16:08
por Maligno
A pesquisa utilizando LOCATE é seqüencial, o que pode acarretar em uma longa espera, dependendo do tamanho do bando de dados.

Acho que o que melhor se encaixa nas necessidades da pesquisa é a função sx_WildSeek() da LIB SIX. Até estranhei que ninguém a tenha indicado. Com ela, o retorno é praticamente instantâneo. Claro que neste caso, o campo precisa fazer parte da chave de índice.

Exemplo: você quer uma lista das variações do amplificador operacional 741. Uma primeira chamada à esta função retornará o primeiro 741. Depois é só seguir na pesquisa, incluindo um argumento extra:

Código: Selecionar todos

lContinue := .f.
aList := {}
while sx_WildSeek("*741",lContinue)
   AAdd(aList,CODIGO)
   lContinue := .t.
end
Mesmo num arquivo muito grande, seria até difícil medir a velocidade da pesquisa, dada a velocidade do retorno.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 29 Jan 2007 16:35
por Augusto
Maligno escreveu:A pesquisa utilizando LOCATE é seqüencial, o que pode acarretar em uma longa espera, dependendo do tamanho do bando de dados.
Da minha parte me limitei a usar o mesmo comando que ele (prá não complicar) por isso não entrei em detalhes se o LOCATE é bom negócio ou não...
De fato eu não uso (nem me lembro de um dia ter usado) o LOCATE exatamente por ser muito lento, independentemente do tamanho do arquivo a ser pesquisado... assim como tbm não uso a que vc sugere... uso outras alternativas as quais estou mais acostumado e que me retornam resultados igualmente rápidos...

Agora é com ele....

Re: Como efetuar uma pesquisa por parte do campo

Enviado: 29 Jan 2007 17:31
por MARINI
nanosoft escreveu:No caso o cliente ira entrar com o codigo desejado, pode ser 548, 741, etc.
Entao no lugar do 548, ou do 748, ou qq outro codigo irei colocar o mcod, que é a variavel que pega o valor digitado pelo cliente , é isso?
No ex que mencionei poderia ser feito atraves de um vetor:

pcod:={}
aadd(pcod,"548")
aadd(pcod,"748")
aadd(pcod,"a743")
for i:=1 to len(pcod)

if achou:=(pcod$campo)
exit
endif
next
if achou
.....
else
....
endif

Enviado: 29 Jan 2007 18:53
por Toledo
Pessoal, imagine os seguintes códigos:

abc741a
sdv741x
gfd1741d
a127412
b741
fds47413a

Observe que o número 741 está contido dentro de todos eles. Então se o Marcos quer apenas os registros que tenha o código 741, e não 1741, 27412, 47413, etc.... ele vai ter que usar alguma função que retire todas as letras e deixe apenas os números, ai sim montar um condição para filtrar apenas aquele código. O operador $ (contém) e a função AT() não vai dar certo e acho que a funão x_WildSeek(), utilizando o exemplo acima, também vai retornar todos os registros.

Abraços,

Enviado: 29 Jan 2007 21:14
por Maligno
e acho que a funão x_WildSeek(), utilizando o exemplo acima, também vai retornar todos os registros.
Sem dúvida, vai. Mas, uma vez montado um escopo com esta função, dentro daquele próprio while ele poderá filtrar da forma que quiser; e muito mais rapidamente do que com um locate.
Muito embora, se fosse comigo, deixaria a filtragem "visual" por conta do usuário. Afinal, foi ele quem entrou o número. Então, selecionar o componente correto passa a ser problema dele. A não ser, claro, que essa filtragem tenha alguma finalidade muito especial, que ele não comentou.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 30 Jan 2007 12:38
por Augusto
Maligno escreveu:Muito embora, se fosse comigo, deixaria a filtragem "visual" por conta do usuário. Afinal, foi ele quem entrou o número. Então, selecionar o componente correto passa a ser problema dele.
Concordo "plenamente"....

Enviado: 30 Jan 2007 14:15
por gvc
Coloque um campo no cadastro de peças para identificar "familia".
Assim as peças:

un741 / lm741 / ua741 são da familia "741"
bc548 / bc548a / bc548c são da familia "548"

Sua pesquisa será pela familia ou pela peça especifica.