[Tutorial] Mostrando apenas linhas únicas na DataWindow (PowerBuilder)
Overview
Neste post, vamos explorar uma jornada além do uso do comando DISTINCT para alcançar um resultado crucial: eliminar duplicatas em seus dados de clientes. Embora o caminho apresentado seja mais minucioso, ele promete abrir novas portas para a otimização de dados. Preparado para mergulhar nesta aventura pelo universo do PowerBuilder e suas possibilidades?
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.