set filter em função de usuário

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

set filter em função de usuário

Mensagem por cjp »

Colegas, estou tentando usar um set filter em uma função de usuário, deixando ao usuário a escolha do filtro e do campo a filtrar.

Tentei assim:

Código: Selecionar todos

@ maxrow(),0 clear to maxrow(),maxcol()

@ maxrow(),1 say "Procurar: "get exp 

@ maxrow(),20 say "No campo: "get cp

read

if lastkey()#27

   exp=alltrim(exp)

   @ maxrow(),0 clear to maxrow(),maxcol()

   @ maxrow(),1 prompt "Filtrar todas as correspondências"

   @ maxrow(),41 prompt "Selecionar a primeira correspondência"

   menu to opfs

   cls

   do case

        case opfs=1

                set filter to exp(field(cp))

        case opfs=2

                go top

                locate for exp$(field(cp))

   endcase

endif


Não está funcionando, não localiza nem filtra as expressões que realmente constam na base.


Estou desconfiado que o problema seria na escolha do campo da base.


Alguém saberia me dizer o que está errado?
Inacio de Carvalho Neto
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

set filter em função de usuário

Mensagem por Kapiaba »

Olá, não seria melhor voce usar ORDSCOPE() ou INDICE TEMPORARIO EM MEMÓRIA?

Muito mais rápido e mais eficiente.

abs,
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

set filter em função de usuário

Mensagem por cjp »

E como eu faço isso? Não sei trabalhar com isso, nem achei ajuda no NG pra isso.

Dá uma luz, por favor.
Inacio de Carvalho Neto
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

set filter em função de usuário

Mensagem por Kapiaba »

Olá, de uma olhadinha aqui porfa.

http://fivewin.com.br/index.php?/topic/ ... ntry257998

uso a bastante tempo e garanto que é muito melhor que SER FILTER.

abs.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

set filter em função de usuário

Mensagem por cjp »

Fiz assim e funcionou perfeitamente:

Código: Selecionar todos

			     @ maxrow(),0 clear to maxrow(),maxcol()
				 @ maxrow(),1 say "Procurar: "get exp pict "@!"
				 @ maxrow(),20 say "No campo: "get cp //pict "@!"
				 read
				 if lastkey()#27
				    exp=alltrim(exp)
					cp=alltrim(cp)
			        @ maxrow(),0 clear to maxrow(),maxcol()
					@ maxrow(),1 prompt "Filtrar todas as correspondências"
					@ maxrow(),41 prompt "Selecionar a primeira correspondência"
					menu to opfs
                    keyb " "
					cFiltro:="exp$upper("+cp+")"
					do case
					   case opfs=1
                            INDEX ON data TAG TEMPBOL TO TEMPBOL FOR &cFiltro.							
					   case opfs=2
                            go top
							locate for &cFiltro. //exp$(cp)
					endcase
				 endif
Muito obrigado.
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

set filter em função de usuário

Mensagem por cjp »

Amigos,

Estou tentando modificar um pouco esta função, para só pedir o campo para indexação se for realmente necessário (já que o que eu preciso mesmo não é a indexação, e sim o filtro; poderia até suprimi-la, se fosse possível), mas estou tendo dificuldade.

Fiz assim:

Código: Selecionar todos

			     @ maxrow()-10,0 clear to maxrow(),maxcol()
				 @ maxrow()-8,1 say "Procurar no campo:"
				 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=45
					endif
				 enddo
				 menu to opfs
				 cp=field(opfs)
			     @ maxrow()-10,0 clear to maxrow(),maxcol()
				 @ maxrow()-8,0 say "Procurar por:"get exp pict "@!"
				 read
				 col=1
			     do while .t.
				    if field(col)="DATA" .or. "DT"$field(col)
					   cpf=field(col)
					   exit
					else
					   col++
					   if fieldsize(col)=0
				          @ maxrow(),43 say "Indexando por:"get cpf
				          read
					      exit
					   endif
					endif
				 enddo
				 
				 if lastkey()#27
				    exp=alltrim(exp)
                    opfs=0
			        @ maxrow(),0 clear to maxrow(),maxcol()
					@ maxrow(),1 prompt "Filtrar todas as correspondências"
					@ maxrow(),41 prompt "Selecionar a primeira correspondência"
					menu to opfs
                    keyb " "
					cFiltro:="exp$upper("+cp+")"
					do case
					   case opfs=1
                            INDEX ON &cpf TAG TEMPBOL TO TEMPBOL FOR &cFiltro.							
					   case opfs=2
                            go top
							locate for &cFiltro. //exp$(cp)
					endcase
				 endif
			     @ maxrow()-5,0 clear to maxrow(),maxcol()
Estranhamente, está dando o erro:

Código: Selecionar todos

Error BASE/1003  Variável não existe: DATA"
Na seguinte linha:

Código: Selecionar todos

                            INDEX ON &cpf TAG TEMPBOL TO TEMPBOL FOR &cFiltro.							
Não sei de onde ele está tirando essa variável DATA, que eu não estou usando. Já conferi que a variável cpf, no exemplo que estou usando, é DTCAMYLLA, correspondente a um campo da base em edição. Também conferi que cFiltro corresponde ao objeto de pesquisa digitado pelo usuário.

Só não sei o conteúdo de TEMPBOL, pois copiei esse exemplo de um post deste fórum, sem entender muito bem. Mas também já conferi que TEMPBOL não está anteriormente definido.

Alguém saberia me dizer a razão desse erro?
Inacio de Carvalho Neto
Responder