Página 1 de 1
ASCAN() Me ajudem please!!!
Enviado: 01 Fev 2007 10:08
por kirua
Ola pessoal eu sou novo por aki acabei de fazer o meu cadastro, mas isso não vem ao caso XD......
eu tenho q fazer um sisitema de busca no sistema mas não estou conseguindo usar a função ASCAN(), não consigo entender de jeito nenhum sera q alguem poderia me explicar???.......
Agradeço desde ja....
Enviado: 01 Fev 2007 11:13
por gvc
Do NG.
ASCAN()
Varre um vetor procurando um valor ou até que um bloco retorne verdadeiro (.T.)
Sintaxe
ASCAN(<aDestino>, <ProcuraExp>, [<nInicio>], [<nCont>]) --> nParouEm
Argumentos
<aDestino> ‚ o vetor a ser varrido.
<ProcuraExp> pode ser um valor simples a ser procurado, ou um bloco de código. Caso <ProcuraExp> seja um valor simples, este poder ser do tipo numérico, lógico, data, ou caractere.
<nInicio> ‚ o elemento a partir do qual ter in¡cio a pesquisa. Se este argumento nao for especificado, a posição inicial padrao ‚ um.
<nCont> ‚ a quantidade de elementos que serao varridos a partir da posição inicial. Caso este argumento nao seja especificado, todos os elementos, desde o elemento inicial at‚ o final do vetor, serão varridos.
Retorno
ASCAN() retorna um valor numérico que representa a posição ocupada no vetor pelo último elemento varrido. Se <ProcuraExp> for um valor simples, ASCAN() retorna a posição do primeiro elemento que corresponder ao valor procurado, ou zero caso nao haja correspondência. Se <ProcuraExp> for um bloco de código, ASCAN()retorna a posição do elemento onde o bloco retornou verdadeiro (.T.).
Descrição
ASCAN() ‚ uma função de tratamento de vetor que varre um vetor procurando um valor especificado e opera da mesma forma que o comando SEEK quando pesquisa um valor simples. O valor <ProcuraExp> ‚ comparado ao elemento de vetor destino que começa com o caractere mais esquerda no elemento destino e prossegue até que nao haja mais nenhum caractere em <ProcuraExp>. Caso não haja correspondência, ASCAN() vai para o próximo elemento no vetor.
Como ASCAN() utiliza o operador (=) para comparações, ele ‚ sens¡vel ao status de EXACT. Caso EXACT esteja ON, o elemento de vetor destino deve ser exatamente igual ao resultado de <ProcuraExp> para que haja correspondência.
Se o argumento de <ProcuraExp> seja um bloco de código, ASCAN() varre o vetor <aDestino> executando o bloco para cada elemento acessado. a medida em que cada elemento ‚ encontrado, ASCAN() passa o valor do elemento como um argumento para o bloco de código, e depois executa um EVAL() no bloco. A operação de pesquisa pára quando o bloco de código retorna verdadeiro (.T.), ou quando ASCAN() atinge o último elemento no vetor.
Exemplos
O exemplo a seguir demonstra a pesquisa em um vetor de três elementos utilizando valores simples e um bloco de código como critérios de pesquisa. Os critérios do bloco de código ilustram como executar uma pesquisa que nao faz diferenciação entre maiúsculas e minúsculas:
aArray := { "Tom", "Mary", "Sue" }
? ASCAN(aArray, "Mary") // Resulta: 2
? ASCAN(aArray, "mary") // Resulta: 0
//
? ASCAN(aArray, { |x| UPPER(x) == "MARY" }) // Resulta: 2
Este exemplo demonstra como continuar a pesquisa dos múltiplos tipos de um argumento de pesquisa após ter sido encontrada uma correspondência:
LOCAL aArray := { "Tom", "Mary", "Sue", "Mary" }, nStart := 1
//
// Pegar ultima posicao de elemento de vetor
nAtEnd := LEN(myVetor)
WHILE (nPos := ASCAN(aArray, "Mary", nStart)) > 0
? nPos, aArray[nPos]
//
// Pegar nova posicao inicial e testar condicao de limite
IF (nStart := ++nPos) > nAtEnd
EXIT
ENDIF
ENDDO
----------------
Boa sorte. Espero ter ajudado.
Enviado: 01 Fev 2007 11:21
por kirua
GVC...
tipo eu uso o CLIPPER 5.3
eu quero usar o acan pra fazer pequisa (para o cliente fazer pesquisa).
mas eu não consigo tipo
O meu codigo esta assim:
Function vtpesquisa
Local vtpesquisa_vt := {}
Local save_v
SetColor ("0/8*")
@ 09, 24, 10, 40 Box []
@ 09, 24 Say "Pesquisar"
SetColor("15/9")
save_v:= savescreen(0,0,24,79)
Do while .T.
vtpesquisa_vt := {}
For i := 1 To len(vtCadastro)
AADD(vtpesquisa_vt,vtCadastro[1])
Next
vtpesquisa_vt := Asort (vtpesquisa_vt, {|A, B | A > B })
elemento := ACHOICE(10,24,19,40,vtpesquisa_vt,.T.)
If Lastkey()=27
Return
EndIf
SetColor("15/9")
@ 07, 00 Clear To 18, 49
@ 07, 00 To 18, 49 double
@ 08, 01 To 10, 48
@ 6, 2, 7, 3 Box []
@ 09, 02 Say "Cadastro Pessoal:"
@ 11, 02 Say "Nome: "
@ 12, 02 Say "Rg..: CPF.......: "
@ 13, 02 Say "Data Nasc: Local nasc: "
@ 14, 02 Say "End.: "
@ 15, 02 Say "Num.: Cep.: Fone: "
@ 16, 02 Say "Loca: "
@ 17, 02 Say "Cid.: Est.: "
@ 11, 08 Say vtCAdastro[elemento][1]
@ 12, 08 Say vtCAdastro[elemento][2] pict "99.999.999-9"
@ 12, 34 Say vtCAdastro[elemento][3] pict "999.999.999-99"
@ 13, 13 Say vtCAdastro[elemento][4]
@ 13, 32 Say vtCAdastro[elemento][5]
@ 14, 08 Say vtCAdastro[elemento][6]
@ 15, 08 Say vtCAdastro[elemento][7] pict "9999"
@ 15, 19 Say vtCAdastro[elemento][8] pict "999.99-999"
@ 15, 36 Say vtCAdastro[elemento][9]
@ 16, 08 Say vtCAdastro[elemento][10]
@ 17, 08 Say vtCAdastro[elemento][11]
@ 17, 39 Say vtCAdastro[elemento][12]
Inkey(0)
Restscreen(0,0,24,79,save_v)
ENDDO
Return
mas não é o q eu queria com isso eu só listei os cadastro e eu num quero isso eu tenho q usar o comando "ASCAN()" mas eu ja revirei a net inteira tentando entender o raio dessa função mas não consigo
Obrigado
Sera q ninguem sabe?
Enviado: 01 Fev 2007 12:41
por kirua
Por favor gente se alguem sabe do q eu to falando me ajuda e quem não intendeu o q eu disse me pergunta ok?
Obrigado.
By Kirua
Enviado: 01 Fev 2007 17:07
por gvc
Pelo seu código fonte, vc esta montando o array com o algum campo, provavelmente nome.
Abre um achoice para o usuário selecionar.
Após a seleção, mostra os dados completos na tela.
A pergunta é: Para quê vc quer usar o ASCAN?
Explique melhor o quê vc quer fazer. Pode ser até em portugues estruturado. (Acredite, esta turma aqui faz de tudo para entender um ao outro).
Ah! Acerte o seu sistema.
**********************************
Function vtpesquisa
Local vtpesquisa_vt := {}
Local save_v
SetColor ("0/8*")
@ 09, 24, 10, 40 Box []
@ 09, 24 Say "Pesquisar"
SetColor("15/9")
save_v:= savescreen(0,0,24,79)
vtpesquisa_vt := {}
For i := 1 To len(vtCadastro)
AADD(vtpesquisa_vt,vtCadastro[1])
Next
vtpesquisa_vt := Asort (vtpesquisa_vt, {|A, B | A > B })
Do while .T.
elemento := ACHOICE(10,24,19,40,vtpesquisa_vt,.T.)
If elemento = 0
Return
EndIf
SetColor("15/9")
@ 07, 00 Clear To 18, 49
@ 07, 00 To 18, 49 double
@ 08, 01 To 10, 48
@ 6, 2, 7, 3 Box []
@ 09, 02 Say "Cadastro Pessoal:"
@ 11, 02 Say "Nome: "
@ 12, 02 Say "Rg..: CPF.......: "
@ 13, 02 Say "Data Nasc: Local nasc: "
@ 14, 02 Say "End.: "
@ 15, 02 Say "Num.: Cep.: Fone: "
@ 16, 02 Say "Loca: "
@ 17, 02 Say "Cid.: Est.: "
@ 11, 08 Say vtCAdastro[elemento][1]
@ 12, 08 Say vtCAdastro[elemento][2] pict "99.999.999-9"
@ 12, 34 Say vtCAdastro[elemento][3] pict "999.999.999-99"
@ 13, 13 Say vtCAdastro[elemento][4]
@ 13, 32 Say vtCAdastro[elemento][5]
@ 14, 08 Say vtCAdastro[elemento][6]
@ 15, 08 Say vtCAdastro[elemento][7] pict "9999"
@ 15, 19 Say vtCAdastro[elemento][8] pict "999.99-999"
@ 15, 36 Say vtCAdastro[elemento][9]
@ 16, 08 Say vtCAdastro[elemento][10]
@ 17, 08 Say vtCAdastro[elemento][11]
@ 17, 39 Say vtCAdastro[elemento][12]
Inkey(0)
Restscreen(0,0,24,79,save_v)
ENDDO
Return
Enviado: 14 Fev 2007 00:20
por luiz antonio da silva
É KIRUA, como disse o amigo gvc, sem saber para que vc quer usar o ASCAN() fica um pouco dificil ajudar, mas vamu lá.....rs
vc pode usar o ASCAN() para:
- saber em qual posição(ões) exata(s) uma informação se encontra dentro de uma matriz ou de uma variavel ou banco de dados, quantas vezes essa informação se repete, fora ainda junções que se pode fazer com outros comandos.
exemplo simples:
use
use clientes alias cli shared
// nome, endereco, cidade, estado...etc
aChei:={}
pesquisarPor:="Pedro"
dbgotop()
while !eof()
if ascan(cli->nome, pesquisarPor)<>0
aadd( achei, cli->nome, cli->endereco, str(recno(),?) )
endif
skip
enddo
use
Resumo.rs..: se o conteudo campo do banco de dados informado for igual a "Pedro" então ascan retorna nesse caso a posição (coluna) onde "Pedro" está dentro deste campo, assim sendo, <>0, sua condição é verdadeira, adiciona-se então no array ACHEI, as informações de interesse, se "Pedro" não existir neste campo, o ASCAN() vair retornar 0, nesse caso é falso, passado por ASCAN() lê novo registro até encontrar final de arquivo.
se quer saber qual posição foi encontrada, faz assim.
posicao:=ascan(basedepesquisa, itemprocurado)
o ASCAN() vai ser encerrado nesse caso na primeira condição verdadeira que encontrar, ignorando todo o resto.
blz..
Enviado: 15 Fev 2007 15:15
por kirua
AH tah agora eu entendi....
vlw msm cara