Indo Além do Fixo: Criando um Gerador de Scripts SQL Dinâmico e Configurável pelo Usuário
Explica como a funcionalidade "Script Livre" transformou a aplicação em uma plataforma de automação, permitindo que os próprios usuários criassem lógicas de script SQL personalizadas.
Nos artigos anteriores, exploramos a jornada de transformar um processo de carga de dados de uma semana para 15 minutos. Anteriormente vimos como uma arquitetura flexível (leia também o artigo "Construindo um Motor de ETL Flexível") e um pipeline de dados otimizado (leia também o artigo "Otimização Extrema em C++") foram cruciais. Agora, vamos abordar a pergunta que define a longevidade de qualquer ferramenta interna: o que acontece quando surge uma nova demanda, completamente diferente das que foram planejadas? A resposta tradicional é acionar um desenvolvedor. A nossa resposta foi criar o "Script Livre".
Minha Visão: Separar o Motor da Lógica
A funcionalidade de Script Livre representa a evolução final da nossa aplicação. A minha ideia é simples, mas poderosa: eu queria que o nosso programa fornecesse o motor – a capacidade de ler uma planilha, iterar sobre as linhas e substituir variáveis – enquanto o usuário fornece a lógica – o template do script SQL a ser executado.
Essa separação é a chave para uma flexibilidade quase ilimitada. Com essa arquitetura, nossa ferramenta não precisava mais saber 'como' fazer um problema A ou problema B. Ela só precisa saber como pegar dados de colunas e inseri-los em um texto pré-definido pelo usuário. Isso transforma a aplicação de um "fazedor de tarefas" em uma "plataforma de automação".
A Interface do Poder: Anatomia da Tela de Script Livre
Para dar esse poder ao usuário, criamos uma interface simples, mas completa, que permite a configuração de qualquer script baseado em linhas de uma planilha. A interface é dividida em quatro partes essenciais:
- O Cabeçalho(ScriptCab): Uma área de texto onde o usuário insere o código que deve ser executado apenas uma vez, no início do script. É o local perfeito para blocos DECLARE, criação de tabelas temporárias ou qualquer outra configuração inicial.
- O Coração do Loop(ScriptMei): Esta é a parte mais importante. Aqui, o usuário escreve o template SQL que será repetido para cada linha da planilha. Para inserir os dados dinâmicos, ele utiliza placeholders que chamamos de "variáveis livres", como
<var1>,<var2>, etc. - O Final(ScriptFim): Similar ao cabeçalho, este bloco é executado uma única vez, no final de tudo. É ideal para comandos de COMMIT, END;, DROP TABLE ou qualquer outra operação de limpeza e finalização.
- O Mapeamento(Definicção das Variáveis): Esta é a tela que conecta os dados à lógica. Ao acioná-la, o usuário vê uma interface onde pode associar as colunas da sua planilha (ex: "ID_CLIENTE") às variáveis livres que usou no template (ex: Var1). Ele também pode definir o tipo de dado para formatação correta (texto, número, data).
Um Exemplo Prático: Do CSV ao Script Final em Minutos
Vamos imaginar uma nova demanda: "Precisamos reativar um lote de clientes. Temos uma planilha com as colunas ID_CLIENTE e DATA_REATIVACAO."
Com a ferramenta de Script Livre, o usuário, sem precisar de um desenvolvedor, faria o seguinte:
- Carrega a Planilha: Seleciona o arquivo Excel/CSV com os dados.
- Abre a Tela de Script Livre: Navega até a funcionalidade correspondente.
- Mapeia as Variáveis: Na tela de mapeamento (VariaveisLivre.cpp), ele associa:
- Coluna ID_CLIENTE -> Var1 (tipo: Número)
- Coluna DATA_REATIVACAO -> Var2 (tipo: Data)
- Escreve os Templates:
- ScriptMei: UPDATE CLIENTES SET STATUS = 'ATIVO', DATA_MODIFICACAO = TO_DATE('
<var2>', 'DD/MM/YYYY') WHERE ID_CLIENTE =<var1>; - ScriptFim: COMMIT;
- ScriptMei: UPDATE CLIENTES SET STATUS = 'ATIVO', DATA_MODIFICACAO = TO_DATE('
Ao clicar em "Processar", o motor da aplicação lê a planilha, e para cada linha, preenche o template do ScriptMei, gerando um arquivo .sql final pronto para ser executado:
Snippet de Código 1:
UPDATE CLIENTES SET STATUS = 'ATIVO', DATA_MODIFICACAO = TO_DATE('09/10/2025', 'DD/MM/YYYY') WHERE ID_CLIENTE = 101;
UPDATE CLIENTES SET STATUS = 'ATIVO', DATA_MODIFICACAO = TO_DATE('09/10/2025', 'DD/MM/YYYY') WHERE ID_CLIENTE = 254;
UPDATE CLIENTES SET STATUS = 'ATIVO', DATA_MODIFICACAO = TO_DATE('09/10/2025', 'DD/MM/YYYY') WHERE ID_CLIENTE = 312;
-- ... e assim por diante para todas as linhas.
COMMIT;
A Loucura Genial: Agregação com a Cláusula IN
A funcionalidade não parou por aí. Percebemos que, em muitos casos, repetir o mesmo comando UPDATE milhares de vezes não era a forma mais performática de interagir com o banco de dados. E se quiséssemos, por exemplo, atualizar o mesmo campo para todos os clientes da lista?
Para isso, implementamos uma opção de "agregação". O usuário pode configurar a ferramenta para, em vez de repetir o ScriptMei, pegar todos os valores de uma variável (ex: <var1>) de todas as linhas e consolidá-los em um único local no script.
Usando o mesmo exemplo, o usuário poderia configurar o template da seguinte forma:
Snippet de Código 2:
ScriptMei: UPDATE CLIENTES SET STATUS = 'ATIVO' WHERE ID_CLIENTE IN (<var1>);
E instruir o sistema a agregar os valores de <var1>. O resultado seria uma única query, muito mais eficiente:
Snippet de Código 3:
UPDATE CLIENTES SET STATUS = 'ATIVO' WHERE ID_CLIENTE IN (101, 254, 312, ...);
//final da formatação de código
Essa funcionalidade demonstrou um nível de maturidade da ferramenta, mostrando que ela não só automatizava tarefas, mas também as executava da forma mais otimizada possível.
Conclusão: De uma Ferramenta a uma Plataforma
A jornada que compartilhamos foi de transformação. Começamos com um problema grave de performance e rigidez. A solução passou por uma reescrita focada em flexibilidade e em um pipeline de dados otimizado. Mas o passo final, a criação do Script Livre, foi o que realmente mudou o jogo.
Ele transformou uma aplicação que resolvia um conjunto finito de problemas em uma plataforma de automação de propósito geral. O gargalo deixou de ser o tempo de desenvolvimento para atender novas demandas. Ao dar ao usuário o poder de definir sua própria lógica, criamos uma solução verdadeiramente escalável, que cresce e se adapta junto com as necessidades do negócio. E essa, talvez, seja a maior lição de todas: o software mais poderoso é aquele que empodera seus usuários.