[Tutorial] Mostrando apenas linhas únicas na DataWindow (PowerBuilder)

A resposta obvia para este post seria: Utilize o DISTINCT na hora de fazer o select no banco.  Infelizmente, a vida nem sempre é tão simples assim. O que mostro neste post é uma forma alternativa (e mais trabalhosa do que utilizar o distinct), mas que vai te dar um caminho a mais para conseguir este resultado.

Para contextualizar, imagine uma Datawindow com o seguinte select:

SELECT cli_id, cli_nome, cli_telefone, cli_email FROM tb_cliente

Como as colunas de ID costumam a ser únicas, vamos mostrar eliminar linhas de clientes que tenham o nome (cli_nome) duplicado.

Os passos que devem ser feitos para conseguir isso são:

1.Vamos fazer com que a Datawindow parece de se atualizar visualmente, para ganharmos performance:

dw_1.SetRedraw(false)

2.Agora vamos ordenar a Datawindow pelas colunas que serão utilizadas.

dw_1.SetSort("cli_name a")
dw_1.Sort()

 

3.O próximo passo é criar uma expressão para filtrar a DataWindow. Ela que será responsável por encontrar e esconder as linhas que serão consideradas como duplicadas.

dw_1.SetFilter("IsNull(cli_nome[-1]) OR cli_nome[-1] <> cli_nome")
dw_1.filter()

 

4.Neste momento sua Datawindow já está filtrada, mas lembre-se que desligamos as atualizações visuais. Então agora temos que liga-las novamente.

dw_1.SetRedraw(true)

 

Se você quiser utilizar mais uma coluna para verificar se a linha é duplicada ou não, basta acrescenta-la nas expressões de sort e filter.

Dica: Se você utilizar uma função que faça apenas este processamento na Datawindow, para fins de organização do fonte, você pode utilizar o comando post, para “agendar” o SetRedraw(true). Exemplo:

dw_1.SetRedraw(false)
dw_1.post SetRedraw(true)

O comando dw_1.post SetRedraw(true) faz uma espécie de agendamento daquele comando. Ele será executado assim que o evento ou função atual acabarem. Isso ajuda em termos de organização do fonte, pois você mantem coisas similares agrupadas e não corre o risco de esquecer de ligar o SetRedraw no final da função/evento.

 

Espero ter ajudado.

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, PowerBuilder and tagged , , .