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! :-o
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 :? :P ´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 !