Página 1 de 1
Dá pra pesquisar usando DBSeek() com dois campos?
Enviado: 14 Ago 2007 16:14
por miracle
Amigos, estou com um problema. Tenho que fazer uma pesquisa da seguinte forma: localizar o primeiro registro cujo campo empresa tenha valor "X" e cujo campo "y" começe com o valor "Z". Meu código está assim:
Código: Selecionar todos
SET CURSOR ON
cPROCURARPOR = "1"
cLOCALIZAR = SPACE(60)
SET COLOR TO 15/16,16/15
@ 20,00 CLEAR TO 23,79
@ 20,00 TO 23,79
@ 21,02 SAY "1-CODIGO 2-DESCRICAO 3-DESCRIPTION"
@ 22,02 SAY "PROCURAR POR: "
@ 22,16 GET cPROCURARPOR PICTURE "@!" VALID(cPROCURARPOR$"123") SEND COLORSPEC := "16/15, 14/01"
@ 22,18 GET cLOCALIZAR PICTURE "@!" SEND COLORSPEC := "16/15, 14/01"
READ
IF LASTKEY() = 27
cRECARREGAR = "SIM"
nRETORNO = 0
EXIT
ENDIF
IF LEN(TRIM(cLOCALIZAR)) = 0
cRECARREGAR = "SIM"
nRETORNO = 0
EXIT
ENDIF
SELECT C
nINDICE = VAL(cPROCURARPOR)
SET ORDER TO nINDICE
IF DBSEEK(cEMPRESA + ALLTRIM(cLOCALIZAR), .T.)
cRECARREGAR = "SIM"
nRETORNO = 2
EXIT
ELSE
ALERT("NENHUM REGISTRO ENCONTRADO!",{"OK"},"15/16")
INKEY(3)
cRECARREGAR = "SIM"
nRETORNO = 0
LOOP
ENDIF
Esse código deveria localizar no DBEdit o primeiro registro cujo campo empresa possuísse o valor "Miracle" e cujo campo codigo começasse com o valor "caixa" por exemplo
Só que, desse jeito não está funcionando! Alguém sabe de alguma maneira de fazer isso usando o DBSeek, o Locate ou o Seek?
Enviado: 14 Ago 2007 16:56
por miracle
Nooossa! Que pergunta idiota eu fiz!
Seja como for, consegui resolver o problema assim:
Código: Selecionar todos
DO WHILE .T.
SET CURSOR ON
cPROCURARPOR = "1"
cLOCALIZAR = SPACE(60)
SET COLOR TO 15/16,16/15
@ 20,00 CLEAR TO 23,79
@ 20,00 TO 23,79
@ 21,02 SAY "1-CODIGO 2-DESCRICAO 3-DESCRIPTION"
@ 22,02 SAY "PROCURAR POR: "
@ 22,16 GET cPROCURARPOR PICTURE "@!" VALID(cPROCURARPOR$"123") SEND COLORSPEC := "16/15, 14/01"
@ 22,18 GET cLOCALIZAR PICTURE "@!" SEND COLORSPEC := "16/15, 14/01"
READ
IF LASTKEY() = 27
cRECARREGAR = "SIM"
nRETORNO = 0
EXIT
ENDIF
IF LEN(TRIM(cLOCALIZAR)) = 0
cRECARREGAR = "SIM"
nRETORNO = 0
EXIT
ENDIF
SELECT C
IF cPROCURARPOR = "1"
LOCATE FOR EMPRESA = cEMPRESA .AND. CODIGO = ALLTRIM(cLOCALIZAR)
ELSEIF cPROCURARPOR = "2"
LOCATE FOR EMPRESA = cEMPRESA .AND. DESCRICAO = ALLTRIM(cLOCALIZAR)
ELSEIF cPROCURARPOR = "3"
LOCATE FOR EMPRESA = cEMPRESA .AND. DESCRIPTIO = ALLTRIM(cLOCALIZAR)
ENDIF
IF FOUND()
cRECARREGAR = "SIM"
nRETORNO = 2
EXIT
ELSE
ALERT("NENHUM REGISTRO ENCONTRADO!",{"OK"},"15/16")
INKEY(3)
cRECARREGAR = "SIM"
nRETORNO = 0
LOOP
ENDIF
ENDDO
nINDICE = VAL(cPROCURARPOR)
SET ORDER TO nINDICE
Desculpem o incômodo! :{
Enviado: 15 Ago 2007 15:41
por Stanis Luksys
Olá,
Neste caso então seria mais interessante se você utilizasse aquele recurso que é a alma do banco dBase: o Índice.
Em vez de:
Código: Selecionar todos
LOCATE FOR EMPRESA = cEMPRESA .AND. CODIGO = ALLTRIM(cLOCALIZAR)
Tente
Código: Selecionar todos
INDEX ON EMPRESA+CODIGO TO INDNTX
DBSEEK(cEMPRESA+ALLTRIM(cLOCALIZAR))
Aliás me parece que é como está no primeiro código. Porque não funcionava?
Falou!!
Enviado: 15 Ago 2007 16:34
por Eolo
Miracle, o Stanis tem razão, cara. Abandona o LOCATE!
Fazer uma comparação SEEK x LOCATE, pra vc entender. Imagina vc chegando em São Paulo, Capital, tendo que ir até a Rua X:
- no SEEK, vc procura a Rua X em um guia, pega as coordenadas e vai direto a ela.
- no LOCATE, vc chega na primeira rua, no começo da cidade, aí vai checando rua por rua, uma por uma, até conseguir achar a Rua X...
Sacou?
Enviado: 15 Ago 2007 17:06
por Maligno
Abandona o LOCATE!
LOCATE não é o céu na terra, mas eu uso sem medo. O problema do LOCATE é apenas o tamanho do banco de dados. Obviamente, quanto mais registros, mais lento. Isso sim é chato. Mas quando uso, eu diminuo o tamanho da área a ser pesquisada, usando SET SCOPE. Sendo menor a área de busca, fica bem rápido. Aí sim, LOCATE se mostra como uma ferramenta muito boa.
Enviado: 16 Ago 2007 11:18
por miracle
O que acontece é que eu preciso localizar o primeiro registro cujo valor do campo EMPRESA é exatamente igual ao valor da variável cEMPRESA e cujo valor do campo DESCRICAO (por exemplo) comece com "BUMB" e, usando "DBSEEK(cEMPRESA + ALLTRIM(cLOCALIZAR)) me dá sempre "Nenhum registro encontrado!"
Mas eu disse que resolvi e adquiri outro problema... Usando o método LOCATE eu consigo encontrar o registro normalmente e abrí-lo para edição, consulta ou exclusão. O problema é que, agora, não estou conseguindo salvar as alterações nem excluir o registro! O código é o seguinte:
Código: Selecionar todos
READ
IF LASTKEY() = 27
EXIT
ENDIF
nSALVAR = ALERT("SALVAR AS INFORMACOES?",{"SIM","NAO"},"15/16")
IF nSALVAR = 0
EXIT
ELSEIF nSALVAR = 1
SELECT C
SET ORDER TO 1
SEEK cEMPRESA + cCODIGO
IF .NOT. FOUND()
ALERT("REGISTRO INDISPONIVEL NO MOMENTO!",{"OK"},"15/16")
EXIT
ENDIF
IF .NOT. INCLUI(5)
ALERT("REGISTRO INDISPONIVEL NO MOMENTO!",{"OK"},"15/16")
EXIT
ELSE
REPLACE EMPRESA WITH cEMPRESA,;
CODIGO WITH cCODIGO,;
ALTERNATIVO WITH cALTERNATIVO,;
DESCRICAO WITH cDESCRICAO,;
DESCRIPTION WITH cDESCRIPTION,;
PESO WITH nPESO,;
PRECO WITH nPRECO,;
PRICE WITH nPRICE
UNLOCK
COMMIT
ENDIF
ENDIF
Esse problema está me deixando doido! -:] :(Neg :?

´o)
Enviado: 16 Ago 2007 16:16
por ederxc
isso nada de
LOCATE , por que ?? Horas veja o que o Maligno postou , ele ñ tem problemas pq usa em DB pequeno e com
SETSCOP
Cara verifica o seguinte desde o começo!
verifica se o banco de dados é o correto
verifica se criou corretamente o indice
acho que ñ esta funcionando a pesquisa por que voce esta usando um campo caracter e outro numérico , tem que ser igual
muda a forma de pesquisa , eu no seu caso como a pesquisa tem que ter 100% de eficiencia faria assim
Código: Selecionar todos
index on (cEmpresa)+str(nCodigo) to xpesq
cEmpresa="casa do lavrador" //isso é só um ex. de entarda de dados
cCodigo=01
chave=(cEmpresa)+str(nCodigo)
if !dbseek(chave)
alert("essa empresa ñ esta cadastrada")
else
*continua....
:f
Enviado: 16 Ago 2007 16:50
por Maligno
pq usa em DB pequeno e com SETSCOP
Só um complemento, Eder: eu uso LOCATE em arquivos que são até bem grandes. Mas o SET SCOPE me permite diminuir a área de pesquisa, dando a impressão de que o DBF diminuiu. Aí LOCATE fica rápido. Foi isso o que eu quis dizer.

Enviado: 16 Ago 2007 16:54
por ederxc
Maligno escreveu:pq usa em DB pequeno e com SETSCOP
Só um complemento, Eder: eu uso LOCATE em arquivos que são até bem grandes. Mas o SET SCOPE me permite diminuir a área de pesquisa, dando a impressão de que o DBF diminuiu. Aí LOCATE fica rápido. Foi isso o que eu quis dizer.

OK´s !