Página 1 de 1

Criando uma consulta

Enviado: 11 Jun 2007 19:38
por Capitão Caverna
Pessoal ja vi alguns topicos aqui no forum, mas axo que devido meu pouco conhecimento nao consegui trazer para minha realidade.,
Tenho uma tabela chamada Cliente e tenho um campo nela chamado nome_clie que é a order 1 da minha tabela.
Gostaria de Saber qual comando usar para que o programa me retornasse apenas o clientes quem contenham a palavra xavier, o banco de dados tem os seguintes registros;

Joao da Silva Xavier
Pedro Xavier Theodoro
Arlindo Campos
Mauricio Moraes
Xavier Pinto
Campos Oliveira

Sera que alguem pode me ajudar ??

Enviado: 11 Jun 2007 20:01
por Augusto

Código: Selecionar todos

use cliente
do while .not. eof()
   if AT("xavier",nome_clie) <> 0
      ? nome_clie
   endif
   skip
enddo
Função AT( ) - Pesquisa sub-cadeia (substring):

Forma: AT(<expressão caracter1>,<expressão caracter2>)
Propósito:
Retorna um número que representa a posição inicial de uma expressão caracter dentro de uma segunda expressão, se a primeira estiver nela contida e retorna 0(zero) se aprimeira não estiver contida na segunda.

Enviado: 11 Jun 2007 20:08
por Maligno
Mas se for assim, é melhor usar um filtro:

Código: Selecionar todos

SET FILTER TO AT("XAVIER",Upper(nome_clie)) > 0
go top
while !EoF()
   ? nome_clie
   CONTINUE
end
SET FILTER TO // desliga o filtro
A função UPPER() garante que nenhum nome será excluído por estar em maiúsculas e/ou minúsculas.
Agora, dependendo do volume de dados, ficará lento de qualquer maneira, seja pelo FILTER ou pelo método de busca um-a-um.
O ideal seria algo como a função sx_WildSeek() da SIX. Com essa função, mesmo com grande volume de dados, a busca é muito rápida.
Se o OP não conhece, é só pesquisar no fórum. Há várias mensagens sobre esta LIB.

Enviado: 11 Jun 2007 20:19
por Augusto
Bastante oportuna sua observação Maligno... obrigado... confesso que me lembrei do LOWER na hora que estava escrevendo o post mais acabei me esquecendo... (é a velhice - hehe) Portando ... lá vai...

Código: Selecionar todos

use cliente 
do while .not. eof() 
   if AT("xavier",LOWER(nome_clie)) <> 0 
      ? nome_clie 
   endif 
   skip 
enddo

Valeu Galera ...

Enviado: 13 Jun 2007 17:35
por Capitão Caverna
Obrigado pelas dicas vou tentar uma por uma, se for possivel gostaria de saber se vcs tem algum exemplo pra me mostrar do sx_WildSeek(). como funciona certinho.

Exemplo do sx_WildSeek

Enviado: 13 Jun 2007 18:09
por Maligno
Retirado do NG:

Código: Selecionar todos

Sx_WildSeek():

Syntax:  Sx_WildSeek( <cSearchStr>, [<lCont>] )

         cSearchStr = The wildcard string to base the search on.
         lCont      = .T. searches from the current record pointer, .F.
                      searches from the top of the DBF (Default).

Returns:  .T. if match is found (also sets found() to .T.), .F. if not
          (also sets found() to .F.).

Description:  Performs a wildcard SEEK on the currently selected tag or
              index.

  NOTE:  This function is NOT supported under SIXNTX.

Examples:

    // To find the first Smith or Smyth
    Sx_WildSeek( "Sm?th" )            // Begin search from Bof()
    Sx_WildSeek( "Sm?th", .T. )       // Begin Search from current recno()

    // To find the first Johnson, Johnston, Johannson, Josephson, etc...)
    Sx_WildSeek( "Jo*son" )