Página 1 de 1
ASCAN()
Enviado: 18 Fev 2008 11:35
por marcos.gurupi
Caros, tenho q imprimir um relatorio que filtre uma determinada palavra no banco de dados, ou seja, no campo OCORRENCIA01 c houver "DEPOSITO" .OR. "DEPOS" ele devera entrar no relatorio, entaum estou usando assim:
ASCAN(campo,"DEPOSITO")
Acontece que o ASCAN estah sempre me retornando 0 quando existe campos com essa palavra (DEPOSITO).
O q estah errado no comando?
Marcos Roberto
Enviado: 18 Fev 2008 11:38
por Pablo César
O comando ASCAN é utilizado para busca em VETORES não em campos de um DBF.
Enviado: 18 Fev 2008 11:44
por Pablo César
Tome cuidado se este campo OCORRENCIA01, for digitado pelo usuário. Pois esse procedimento então, está sujeito a erros. É preferível ser assignado através de um menú onde não permita outra nomenclatura. Desta forma gravaria de forma FIXA e que poderá ser feito indexação nesse campo.
Daí então em lugar de usar ASCAN utilize o SEEK. O LOCATE também poderá servir, mas é desaconselhável quando for previsto uma quantidade muito grande de registros.
Enviado: 18 Fev 2008 11:44
por Maligno
Adicionalmente à palavra do Pablo, aconselho o uso das funções AT() ou RAt() para a busca das palavras contidas no campo. Leia o NG para mais detalhes.
Enviado: 18 Fev 2008 11:47
por janio
Acho que no tópico vc vai encontrar o que precisa.
https://pctoledo.org/forum/viewto ... t=leonardo
Jânio
Enviado: 18 Fev 2008 11:57
por Pablo César
A solução indicada do Janio de fazer uso do AADD, isto é, colocando em vetores, também é uma saída. Aí sim utilizaria-se o ASCAN(). Mas acredito que esta opção poderá ser comprometida se depender da quantidade de registros e excedendo a memória da máquina.
No entanto a velocidade de procura de strings em memória é mais rápida que em disco, depnderá da quantidade de registros para optar entre uma solução e outra. Não tendo como prever, eu sou mais a procura em disco.
Enviado: 18 Fev 2008 12:09
por Maligno
O exemplo postado pelo Eolo, utilizando WildSeek, também pode ser aplicado com a SIX no Clipper. É só o caso de indexar pelo campo alvo e usar a função sx_WildSeek(). Funciona do mesmo jeito: muito rápido. Em alguns casos, instantâneo. Claro que, dependendo da finalidade, etc.., não compense ou não seja necessário.
Enviado: 18 Fev 2008 12:10
por janio
Pablo,
Além do Aadd, me refiro também a função ordwildseek que consta no tópico que indiquei.
Tipo, pode ser feito:
do while ordwildseek("*DEPOSITO*",.t.)
... relatório
...
...
endd
Mas acho que deve haver um INDICE ativo com o campo OCORRENCIA01.
Jânio
Enviado: 18 Fev 2008 12:12
por Maligno
Mas acho que deve haver um INDICE ativo com o campo OCORRENCIA01.
Sem dúvida.
Enviado: 18 Fev 2008 12:16
por Pablo César
Ahh sim, mas pelo que tudo indica esse campo OCORRENCIA01, deve ser para identificar o lançamento de cada registro e se houver a necessiidade de FILTRAR ou separar tais registros, talvez a indexação seria o mais indicado. Só caberia tratar a entrada no campo, no caso. Mas são suposições minhas ainda não sabemos mais sobre o por quê o colega utilizaria o ASCAN. Espero eu não ter me precipitado com a minha conclusão.
Enviado: 18 Fev 2008 18:07
por gvc
Se vc colocar:
<var1> $ <var2>
será retornado .T. se <var1> existir dentro de <var2>
? 'A' $ 'COMPARANDO STRINGS' // retorna .T.
? 'ST' $ 'COMPARANDO STRINGS' // retorna .T.
? 'ando' $ 'COMPARANDO STRINGS' // retorna .F.
? 'ANDO' $ 'COMPARANDO STRINGS' // retorna .T.
? 'B' $ 'COMPARANDO STRINGS' // retorna .F.
O AT() ou RAT() retorna um número indicando a posição da ocorrência e o "$" retorna se existe ou não.
Espero ter ajudado. Boa sorte.
Enviado: 18 Fev 2008 18:17
por Maligno
A solução ideal depende do problema. Mas como resolvê-lo sem sabê-lo?