Página 1 de 1

função que ajude na busca de nome de cliente

Enviado: 10 Out 2013 16:33
por Piqueno
Boa tarde,Preciso de uma função que me retorne o nome de um cliente. digitado em um campo de busca.
Estou usando assim:

Código: Selecionar todos

.
.
 db_contato()	    
		 dbselectarea("contatos")
		 set index to ind_Cnom
..
..
@ 6,10 say "Nome.....:" get cNom picture "@!" valid !empty(cNom)
		 @ 18,10 say "Digite o nome ou Tecle ESC para sair!"
..
..

go top
set softseek on
seek cNom	
* desta forma acima busca o nome, porem não me retorna como queria, gostaria que quando eu digitasse no campo de busca ele me traga o nome correto e que eu possa editar seus dados. se existir dois ou mais contatos com mesmo nome seja mostrado. no dbedit() consigo fazer e como fazer?

função que ajude na busca de nome de cliente

Enviado: 10 Out 2013 16:51
por rochinha
Amiguinho,

Em rela;'ao ao seu c[odigo, n'ao sei se exemplo ou trecho real deve-se estar atento a algumas coisas.

Código: Selecionar todos

db_contato()	
dbselectarea("contatos")
set index to ind_Cnom
A indexacao levara em conta todo o tamanho do campo e seu conteudo, portanto para a pesquisa n'ao falhar ou chegar proximo faca assim

Código: Selecionar todos

go top
set softseek on
seek alltrim(varCnom)
NUNCA edite ou trabalhe com os campos de forma direta. Voce pode travar o acesso ao registro do DBF. Use variaveis.

A partir dai carregue o conteudo dos campos em variaveis, edite normalmente e salve

Código: Selecionar todos

lEditaRegistro = .t.
varRecno = recno()
varCnom = contatos->cnom
varfone = contatos->fone
...
@ 6,10 say "Nome.....:" get varCnom picture "@!" valid !empty(cNom)
@ 8,10 say "Fone......:" get varFone picture "@!"
read
...
if lastkey() <> 27
   * Se ultima tecla n'ao foi ESC continua
   dbselectarea("contatos")
   if lEditaRegistro
      go varRecno
      * pula para o registro
   else
      append blank
      * Se nao estou editando e sim incluindo cria novo registro
      contatos->cnom = varCnom
      contatos->fone = varfone
   endif
endif   

função que ajude na busca de nome de cliente

Enviado: 10 Out 2013 18:20
por Piqueno
:{ Obrigado..

função que ajude na busca de nome de cliente

Enviado: 11 Out 2013 01:47
por rochinha
Amiguinho,

Corrigindo:

Código: Selecionar todos

lEditaRegistro = .t.
varRecno = recno()
varCnom = contatos->cnom
varfone = contatos->fone
...
@ 6,10 say "Nome.....:" get varCnom picture "@!" valid !empty(cNom)
@ 8,10 say "Fone......:" get varFone picture "@!"
read
...
if lastkey() <> 27
   * Se ultima tecla n'ao foi ESC continua
   dbselectarea("contatos")
   if lEditaRegistro
         go varRecno
         * pula para o registro
   else
         append blank
   endif
   * Se nao estou editando e sim incluindo cria novo registro
   contatos->cnom = varCnom
   contatos->fone = varfone
endif

função que ajude na busca de nome de cliente

Enviado: 23 Out 2013 14:18
por ribass@osite.com.br

Código: Selecionar todos

*****************************************************************************
Static Function Busca_Cli(w_Cli)
*****************************************************************************
IF EMPTY(w_Cli)
   RETURN(.F.)
ENDIF
Men([Aguarde, Procurando ...],-1)
Select CadCli
Set Order to 2 &&->Indice Nome
LOCATE FOR ALLTRIM(w_Cli)$raza_CLIE
IF !FOUND()
  TONE(1400,1); Men([Nome Não Localizado !],2)
  w_Cli:=SPACE(45)
  RETURN(.F.)
ENDIF
w_SAIR:=.F.
DO WHILE .T.
  wCODI_CLIE:=IIF(FOUND(),CODI_CLIE,SPACE(5))
  wRAZA_CLIE:=IIF(FOUND(),RAZA_CLIE,SPACE(45))
  wTIPO_CLIE:=IIF(FOUND(),TIPO_CLIE,SPACE(1))
  wENDE_CLIE:=IIF(FOUND(),ENDE_CLIE,SPACE(40))
  wBAIR_CLIE:=IIF(FOUND(),BAIR_CLIE,SPACE(20))
  wMUNI_CLIE:=IIF(FOUND(),MUNI_CLIE,SPACE(15))
  wCEP_CLIE :=IIF(FOUND(),CEP_CLIE ,SPACE(8))
  wUF_CLIE  :=IIF(FOUND(),UF_CLIE  ,SPACE(2))
  wCGC_CLIE :=IIF(FOUND(),CGC_CLIE ,SPACE(14))
  wINSC_CLIE:=IIF(FOUND(),INSC_CLIE,SPACE(16))
  wFANTASIA :=IIF(FOUND(),FANTASIA,SPACE(20))
  SETCOLOR(cor[11]); @ 06,28 SAY IIF(EOF(),[         ],IIF(wTIPO_CLIE=[J],[JUR¡DICA ],[F¡SICA   ]))
  SETCOLOR(cor[14])
  @ 06,13 SAY wCODI_CLIE PICT [@R 9.9999]
  @ 06,26 SAY wTIPO_CLIE PICT [!]
  @ 07,13 SAY wRAZA_CLIE PICT [@!]
  @ 07,59 SAY wFANTASIA  PICT [@!]
  @ 08,13 SAY wENDE_CLIE PICT [@!]
  @ 08,62 SAY wBAIR_CLIE PICT [@!S16]
  @ 09,13 SAY wMUNI_CLIE PICT [@!S18]
  @ 09,37 SAY wCEP_CLIE  PICT [@R 99999-999]
  @ 09,55 SAY wUF_CLIE   PICT [@!]
  @ 10,13 SAY wCGC_CLIE  PICT w_CGC
  @ 10,56 SAY wINSC_CLIE PICT [@!]
  IF w_SAIR
    EXIT
  ENDIF
  IF FOUND()
    SETCOLOR([R*/BG])
    @ 07,12+AT(ALLTRIM(w_VARIAVEL),raza_CLIE) SAY ALLTRIM(w_VARIAVEL) PICT [@!]
    SETCOLOR(cor[14])
    IF !Conf([CONTINUA PESQUISA ?])
      w_SAIR:=.T.
      GO BOTT; SKIP
      LOOP
    ENDIF
    Men([Aguarde, Procurando ...],-1)
    CONT
  ELSE
    TONE(1400,1); Men([Final do Arquivo !],2)
    w_SAIR:=.T.
  ENDIF
ENDDO
SETCOLOR(cor[1])
RETURN(.F.)

função que ajude na busca de nome de cliente

Enviado: 23 Out 2013 15:29
por Eolo

Código: Selecionar todos

Select CadCli
Set Order to 2 &&->Indice Nome
LOCATE FOR ALLTRIM(w_Cli)$raza_CLIE
...
CONT
Ribas,
1. O LOCATE não respeita índices abertos em conjunto com o DBF. Ele procura sequencialmente, a partir do recno()=1, registro por registro (na ordem física dos registros), até que a condição seja encontrada. O CONT[inue] continua a busca a partir de onde parou. Então, pode deletar essa linha "Set Order to", não está sendo usada.

2. Por isso, o LOCATE é um processo MUITO lento. Se o DBF tem 1 milhão de registros e o que vc procura está entre os 10 últimos, o LOCATE vai checar 999.990 registros antes de achar alguma coisa...

Tem que partir pra outra solução. Dá uma pesquisada no Forum, esse assunto já foi amplamente comentado.