Página 3 de 3

erro no set filter

Enviado: 07 Jul 2014 02:34
por cjp
Meus amigos, estou enfrentando uma situação com uma função que tenho faz tempo, que estava funcionando perfeitamente até há pouco, mas agora parou de funcionar. Não lembro de ter mudado nada na função.

O problema é no set filter, que não está mais filtrando. E só está dando problema quando o campo a ser pesquisado é caractere. Nos demais casos ele filtra corretamente.

Alguém saberia me dizer o que está errado?

A função é a seguinte:

Código: Selecionar todos

dbedit(2,1,maxrow()-2,maxcol(),,"altbase")

function altbase(modo,coluna)
                         local exp :=space(15)
                         local cp :=""
                         local opfs :=0
                         local bsuso :=alias()
                         set cursor on
                         setcancel(.f.)
                         @ 0,31 clear to 0,maxcol()
                         @ 0,45 say alltrim(str(recno()))+"/"+alltrim(str(reccount()))+" registros; campo tipo "+fieldtype(coluna)+", com "+alltrim(str(fieldsize(coluna)))+" caracteres    "

         do case
                            case lastkey()=27
                                    set filter to
                                    set index to
                                    if us="I"
                                        setcancel(.t.)
                                    endif
                                    return(0)
…
                                   case lastkey()=281 //ALT-P
                                           set index to 
                                           set filter to
                                           erase tembol.ntx
                                           usebase(bsuso,"S")
                                           @ maxrow()-10,0 clear to maxrow(),maxcol()
                                           @ maxrow()-6,1 say "Procurar no campo:" //get cp 
                                           linha=maxrow()-8
                                           do while .t.
                                                @ linha,colb prompt field(col)
                                                 linha++
                                                 col++
                                                 if fieldsize(col)=0
                                                    exit
                                                 endif
                                                 if linha>maxrow()
                                                    linha=maxrow()-8
                                                    colb=colb+14
                                                 endif
                                            enddo
                                            menu to opfs
                                            cp=field(opfs)
                                            @ maxrow()-10,0 clear to maxrow(),maxcol()
                                            do case
                                                 case fieldtype(cp)="C"
                                                         @ maxrow()-8,0 say "Procurar por:"get exp pict "@!"
                                                         read
                                                         cFiltro:="exp$upper("+cp+")"

                                                  case fieldtype(cp)="N"
                                                         @ maxrow()-7,10 say "(valor menor)        (valor maior)"
                                                         @ maxrow()-8,0 say "Procurar valores entre:"get v1 pict "9999999.99"
                                                         @ maxrow()-8,37 say "e:"get v2 pict "9999999.99"
                                                         read
                                                         cFiltro:=cp+">="+str(v1)+" .and. "+cp+"<="+str(v2)

                                                  case  fieldtype(cp)="D"
                                                          @ maxrow()-8,0 say "Data:"get dt
                                                          read
                                                          cFiltro:=cp+"=dt"

                                                endcase
                                                if lastkey()#27
                                                   exp=alltrim(exp)
                                                   opfs=0
                                                   @ maxrow(),0 clear to maxrow(),maxcol()
                                                   @ maxrow()-1,1 prompt "Filtrar todas as correspondências"
                                                   @ maxrow()-1,41 prompt "Selecionar a primeira correspondência"
                                                   menu to opfs
                                                   keyb " "
                                                   do case
                                                        case opfs=1
                                                                INDEX ON recno() TAG TEMPB TO TEMPBOL FOR &cFiltro.
                                                        case opfs=2
                                                                go top
                                                                locate for &cFiltro. //exp$(cp)
                                                   endcase
                                               endif
                                               @ maxrow()-5,0 clear to maxrow(),maxcol()
                                               @ maxrow(),1 say "Alt-P - procura/filtra base; Alt-M - mostra estrutura da base; F2 - acresce registros"
                                                return(1)

erro no set filter

Enviado: 07 Jul 2014 09:07
por Toledo
Inácio, nesta situação a melhor coisa é tentar analisar o código para tentar descobrir onde está o erro, é o que vai fazer quem tentar lhe ajuda aqui neste tópico.
cjp escreveu:E só está dando problema quando o campo a ser pesquisado é caractere.
Ótimo, isto já vai facilitar, pois teremos que analisar apenas parte do seu código, que serão apenas estas linhas:

Código: Selecionar todos

 case fieldtype(cp)="C"
        @ maxrow()-8,0 say "Procurar por:"get exp pict "@!"
        read
        cFiltro:="exp$upper("+cp+")"
Apenas 4 linhas de código, já vai facilitar bastante.

- No código acima você tem um GET com a variável exp, que você declarou como: exp :=space(15)
- No filtro você está usando uma outra variável cp, que é o campo do arquivo DBF escolhido pelo usuário.
- Na expressão do filtro você está usando a variável exp, que no GET está com Picture "@!" maiúsculas e ainda no filtro usa a função upper() para colocar a campo cp também em maiúsculas.

Então, resumindo, o filtro se baseia no conteúdo da variável exp e no conteúdo do campo escolhido pelo usuário, que é um campo caractere.

Vamos imaginar que o conteúdo de exp e cp sejam estes:

Código: Selecionar todos

exp:="INACIO         "
cp:="INACIO CARVALHO"
Então o seu filtro ficaria assim:

Código: Selecionar todos

"INACIO         "$"INACIO CARVALHO"
Com certeza o resultado do filtro seria .F.

Bom, para que o exemplo acima retornasse .T., a filtro teria que ficar assim:

Código: Selecionar todos

"INACIO"$"INACIO CARVALHO"
Agora já fica fácil descobrir o que falta para que o filtro dê certo:

Tirar os espaços em branco da variável exp.

Abraços,

erro no set filter

Enviado: 07 Jul 2014 12:56
por cjp
Mas, Toledo, observe a linha 65 do meu código, acima. Eu já resolvi isto com exp=alltrim(exp). Inclusive já testei que foram retirados os espaços em branco.

O mais estranho é que, às vezes ele não filtra, exibindo todos os campos da base. Outras vezes ele não exibe nenhum campo da base, mesmo eu tendo certeza de que existem campos que correspondem ao filtro.

erro no set filter

Enviado: 07 Jul 2014 13:10
por Itamar M. Lins Jr.
É ai que está o erro gafanhoto!
Antes de vc aplicar o alltrim na linha 65 vc diz na linha 49: cFiltro:="exp$upper("+cp+")"
Faça assim na linha 49 cFiltro:= " ' "+ alltrim(exp) + " ' $upper("+cp+")" //tudo junto
A variável EXP não é alterada na linha 65 porque já foi executada e atribuida := antes, a não ser que use {||} code block, capisce ?

erro no set filter

Enviado: 07 Jul 2014 15:07
por cjp
Capisce, meu caro. De fato, vc tem razão. Agora funcionou. Muito obrigado.

erro no set filter

Enviado: 08 Jul 2014 02:19
por rochinha
Amiguinho,

Ainda assim depois das colocações dos colegas verifique o seguinte:

Ao pesquisar coloque ambas as variáveis em caixa alta ou baixa, tipo "INACIO"$"inacio loiola" pode retornar .F.

No codigo voce já faz um GET com mascara para permitir entrada em caixa alta mas se na tabela estiver diferente ocorre este problema.

Pode até ser que com voce ou alguém não ocorra, mas estou expondo porque comigo já aconteceu isso fez cair muito cabelo da minha barba.

Só pra reforçar.

erro no set filter

Enviado: 08 Jul 2014 10:25
por cjp
Esse cuidado eu já havia tomado, Rochinha. Veja:

Código: Selecionar todos

case fieldtype(cp)="C"
    @ maxrow()-8,0 say "Procurar por:"get exp pict "@!"
    read
    cFiltro:="exp$upper("+cp+")"
Olhe que já está com a máscara @! pra pegar, e upper() pra comparar.

erro no set filter

Enviado: 08 Jul 2014 14:23
por rochinha
Amiguinho,

Legal, passou despercebido.