PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 25 → Wx - Busca incremental autocomplete, busca filtrada, busca ao digitar exibe os dados do retorno de cada tecla digitada, busca com like
Wx - Busca incremental autocomplete, busca filtrada, busca ao digitar exibe os dados do retorno de cada tecla digitada, busca com like
Débuté par adrianoboller, 10 mar. 2016 12:22 - 8 réponses
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 10 mars 2016 - 12:22
Prezados,

Segue aqui a técnica para a Busca filtrada incremental.

A cada tecla digitada faz isso no embed evento modifiy do campo faz a consulta no banco de dados

TableDeleteAll(nome da tabela)
consulta com parâmetro
HExecuteQuery(com a consulta usando conteins = like)
For each qyery
TableAdd(.......
END
TableDisplay(nome da tabela,taReExecuteQuery)
TableDisplay(nome da tabela,taInit)


A lógica é básica:
1 - limpar controle Table, looper, combo.... ou outro controle similar.
2 - buscar registros do que tem no campo de edição
3 - preencher controle com o retorno da busca no banco a cada tecla editada, como faz muito rápido da o efeito esperado.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 10 mars 2016 - 17:11
Passo a passo:





-- Script generated by WinDev on 10/03/2016 11:22:04
-- Tables of Help.wda analysis
-- for Generic SQL (ANSI 92)

-- Creating the T000_Enderecos table
CREATE TABLE "T000_Enderecos" (
"T000_ID" NUMERIC(19,0) PRIMARY KEY ,
"T000_Endereco" VARCHAR(50) ,
"T000_Numero" INTEGER ,
"T000_Bairro" VARCHAR(50) ,
"T000_Cidade" VARCHAR(50) ,
"T000_UF" VARCHAR(2) ,
"T000_CEP" VARCHAR(8) );


Query





SELECT
T000_Enderecos.T000_ID AS T000_ID,
T000_Enderecos.T000_Endereco AS T000_Endereco,
T000_Enderecos.T000_Numero AS T000_Numero,
T000_Enderecos.T000_Bairro AS T000_Bairro,
T000_Enderecos.T000_Cidade AS T000_Cidade,
T000_Enderecos.T000_UF AS T000_UF,
T000_Enderecos.T000_CEP AS T000_CEP
FROM
T000_Enderecos
WHERE
T000_Enderecos.T000_Endereco LIKE %{pEndereco}%


Tela





O Browserlist deve ser do tipo programado





Código no campo de busca:





//Busca incremental

bTemRegistros is boolean

TableDeleteAll(TABLE_QRY_Select_Endereco_Filtrado)

ok is boolean = HExecuteQuery(QRY_Select_Endereco_Filtrado, hQueryDefault, EDT_Busca_incremental)

IF ok = True THEN

FOR EACH QRY_Select_Endereco_Filtrado

bTemRegistros = HFound(QRY_Select_Endereco_Filtrado)

IF bTemRegistros = True THEN

TableAdd(TABLE_QRY_Select_Endereco_Filtrado, QRY_Select_Endereco_Filtrado.T000_ID + TAB +...
QRY_Select_Endereco_Filtrado.T000_Endereco + TAB +...
QRY_Select_Endereco_Filtrado.T000_Numero + TAB +...
QRY_Select_Endereco_Filtrado.T000_Bairro + TAB +...
QRY_Select_Endereco_Filtrado.T000_Cidade + TAB +...
QRY_Select_Endereco_Filtrado.T000_UF + TAB +...
QRY_Select_Endereco_Filtrado.T000_CEP)
END

END

END

TableDisplay(TABLE_QRY_Select_Endereco_Filtrado,taReExecuteQuery)

TableDisplay(TABLE_QRY_Select_Endereco_Filtrado,taInit)


Resultado





:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 10 mars 2016 - 17:17
Ao abrir a janela

Query sem filtro: QRY_Select_Endereco

SELECT
T000_Enderecos.T000_ID AS T000_ID,
T000_Enderecos.T000_Endereco AS T000_Endereco,
T000_Enderecos.T000_Numero AS T000_Numero,
T000_Enderecos.T000_Bairro AS T000_Bairro,
T000_Enderecos.T000_Cidade AS T000_Cidade,
T000_Enderecos.T000_UF AS T000_UF,
T000_Enderecos.T000_CEP AS T000_CEP
FROM
T000_Enderecos


Código no open da janela:

//Busca incremental

bTemRegistros is boolean

TableDeleteAll(TABLE_QRY_Select_Endereco_Filtrado)

ok is boolean = HExecuteQuery(QRY_Select_Endereco, hQueryDefault)

IF ok = True THEN

FOR EACH QRY_Select_Endereco_Filtrado

bTemRegistros = HFound(QRY_Select_Endereco_Filtrado)

IF bTemRegistros = True THEN

TableAdd(TABLE_QRY_Select_Endereco_Filtrado, QRY_Select_Endereco_Filtrado.T000_ID + TAB +...
QRY_Select_Endereco_Filtrado.T000_Endereco + TAB +...
QRY_Select_Endereco_Filtrado.T000_Numero + TAB +...
QRY_Select_Endereco_Filtrado.T000_Bairro + TAB +...
QRY_Select_Endereco_Filtrado.T000_Cidade + TAB +...
QRY_Select_Endereco_Filtrado.T000_UF + TAB +...
QRY_Select_Endereco_Filtrado.T000_CEP)
END

END

END

TableDisplay(TABLE_QRY_Select_Endereco_Filtrado,taReExecuteQuery)

TableDisplay(TABLE_QRY_Select_Endereco_Filtrado,taInit)


Resultado:





Pronto

Simples Assim... agora é só juntar o quebra cabeças do que ja postei e ter os recursos que precisa.

Forte abraço e bons estudos.

Ahhh... não esqueça de dar o joinha se gostou do post!

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 10 mars 2016 - 17:22
Correção do código acima, a query é não filtrada, mostra todos os registros

//Carga ao abrir a janela

bTemRegistros is boolean

TableDeleteAll(TABLE_QRY_Select_Endereco_Filtrado)

ok is boolean = HExecuteQuery(QRY_Select_Endereco, hQueryDefault)

IF ok = True THEN

FOR EACH QRY_Select_Endereco

bTemRegistros = HFound(QRY_Select_Endereco)

IF bTemRegistros = True THEN

TableAdd(TABLE_QRY_Select_Endereco_Filtrado, QRY_Select_Endereco.T000_ID + TAB +...
QRY_Select_Endereco.T000_Endereco + TAB +...
QRY_Select_Endereco.T000_Numero + TAB +...
QRY_Select_Endereco.T000_Bairro + TAB +...
QRY_Select_Endereco.T000_Cidade + TAB +...
QRY_Select_Endereco.T000_UF + TAB +...
QRY_Select_Endereco.T000_CEP)
END

END

END

TableDisplay(TABLE_QRY_Select_Endereco_Filtrado,taReExecuteQuery)

TableDisplay(TABLE_QRY_Select_Endereco_Filtrado,taInit)


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membre enregistré
2 messages
Posté le 10 mars 2016 - 20:12
Obrigado Adriano. Só faltou colocar que o ideal é criar um índice no campo que utilizamos na pesquisa.
Membre enregistré
2 messages
Posté le 10 mars 2016 - 21:41
MAURICIOBS escreveu:
> Obrigado Adriano. Só faltou colocar que o ideal é criar um índice no campo que utilizamos na pesquisa.

Me enganei, revi o código e observei que tu utiliza LIKE %string% então realmente o índice não traz benefício, traria se fosse LIKE string%
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 15 mars 2016 - 22:27
Prezado Mauricio

Funciona perfeitamente, claro pode por indice pode agilizar dependendo do tamanho da base de dados.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 09 juin 2017 - 13:44
Prezados,

A evolução desse código é usando Fulltext na pesquisa em vez de Like!

https://forum.pcsoft.fr/fr-FR/pcsoft.br.windev/2388-como-criar-motor-busca-sua-aplicacao-fulltext/read.awp…

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 09 juin 2017 - 15:35
Complemento









https://help.windev.com/en-US/…

// Clears the content of the previous assisted input
AssistedInputDeleteAll(EDT_Cities)
// Performs the search with the term typed ("NEW" for example)
HExecuteQuery(QRY_FindCity, hQueryDefault, "NEW")
// Browse the results
FOR EACH QRY_FindCity
// Builds the line to display
sValueFound = gFontBold(True) + gPen(LightRed) + "NEW" + ...
gFontBold(False) + gPen(Black)
// Adds the line to the assisted input
AssistedInputAdd(EDT_Cities, sValueFound)
END


O princípio da entrada assistida em um controle de edição é direto: quando o usuário começa a digitar um controle de edição, uma lista é expandida automaticamente abaixo do controle, propondo os valores que começam com o texto atualmente digitado.
A entrada assistida pode ser implementada a partir do editor ou pode ser personalizada por programação.

WINDEV Mobile
Entrada assistida em uma janela

WINDEV Mobile Vários tipos de entrada assistida estão disponíveis:
Entrada assistida "Navegação": o controle de edição está vinculado a um item encontrado em um arquivo de dados ou em uma consulta. O WINDEV gerencia a exibição de dados na lista de acordo com a entrada.
WINDEV Entrada assistida programada: a entrada assistida é realizada a partir de uma lista personalizada de dados. A exibição dos dados na lista de acordo com a entrada é personalizada.
Assistindo entrada assistida
WINDEV Mobile Para implementar a entrada assistida "Navegação":
Na janela de descrição do controle de edição:
Verifique se o controle de edição está vinculado a um item encontrado em um arquivo de dados ou em uma consulta (guia "Link").
Cuidado: o item deve ser uma chave.
Na guia "Detalhes", marque "Entrada assistida (ligação necessária)".
Valide a janela da descrição do controle de edição.
Em tempo de execução, assim que a primeira letra é digitada no controle, as letras correspondentes a um elemento encontrado no arquivo de dados são propostas automaticamente.

Entrada assistida programada
A entrada assistida programada pode ser usada em qualquer controle de edição (vinculado ou não a um item encontrado em um arquivo de dados).
Para usar a entrada assistida programada:
Inicialize a lista de elementos levados em conta pela entrada assistida via AssistedInputAdd .
No código "Sempre que modificado" do controle:
Limpe a lista de sugestões ( AssistedInputDeleteAll ).
Recriar a lista de elementos propostos de acordo com os caracteres digitados ( AssistedInputAdd ).
Use AssistedInputOpen para abrir a lista de elementos propostos pela entrada assistida .
Nota: Para destacar os termos digitados pelo usuário, você pode usar o gPen e o gFontBold .

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 09 juin 2017 - 15:42