No desenvolvimento de sistemas legados ou de missão crítica utilizando PowerBuilder e bancos de dados relacionais, o acesso rápido a fragmentos de código testados é essencial. Abaixo, apresentamos uma coleção de técnicas para manipulação de DataWindows, processamento de dados e administração de banco de dados.
1. Limites de Dimensão em DataWindows
Ao projetar relatórios complexos, é importante conhecer os limites de randerização para evitar cortes no layout:
- Orientação Vertical: Largura máxima aproximada de 3350 e altura de 4280 unidades.
- Orientação Horizontal: Largura máxima expandida para 4900 unidades.
2. Manutenção de Banco de Dados (SQL Server)
Para realizar um backup comprimido com acompanhamento de progresso via T-SQL:
BACKUP DATABASE [Nome_DB]
TO DISK = 'D:\Backups\instancia_full.bak'
WITH COMPRESSION, STATS = 5;
3. Manipulação de Arquivos e Diretórios
Para listar pastas e arquivos em um controle ListBox (lb_pastas) a partir de um caminho específico:
string s_diretorio
s_diretorio = Trim(sle_caminho.text)
lb_pastas.DirList(s_diretorio + "*.*", 32784) // 32768 (pastas) + 16 (diretórios)
4. Cálculos de Cores e Desenho Dinâmico
A fórmula para converter componentes RGB em um valor inteiro compatível com o PowerBuilder é:
Valor_Cor = (65536 * Azul) + (256 * Verde) + Vermelho
Para desenhar elementos gráficos em tempo de execução via script no DataWindow:
// Criar um círculo preenchido (ponto sólido)
string s_mod
s_mod = "create ellipse(band=detail x='100' y='100' height='50' width='50' brush.hatch='6' brush.color='255' pen.style='0' pen.width='5' pen.color='16777215')"
dw_1.Modify(s_mod)
// Desenhar uma linha azul
dw_1.Modify("create line(band=detail x1='10' y1='10' x2='200' y2='10' pen.style='0' pen.width='8' pen.color='16711680')")
5. Filtros Dinâmicos em DataWindows
Exemplos de aplicação de filtros em tempo de execução para diferentes tipos de dados:
// Filtro por ID numérico
dw_child.SetFilter("id_depto = " + s_id_logado)
// Filtro por Data e Hora
dw_child.SetFilter("data_registro >= DateTime('" + String(dt_hoje, "yyyy-mm-dd hh:mm:ss") + "')")
// Filtro para valores nulos ou preenchidos
dw_child.SetFilter("IsNull(data_conclusao)")
dw_child.SetFilter("Not IsNull(data_conclusao)")
dw_child.Filter()
6. Recuperação de Metadados e Valores de Exibição
Para obter o texto visível de uma coluna de busca (DropDownDataWindow) ou valores calculados:
// Obtendo o valor visível (lookup) da primeira linha
string s_display
s_display = dw_main.Describe("Evaluate('LookUpDisplay(status_id)', 1)")
// Contagem de colunas e obtenção de nomes dinamicamente
int i_total_cols
string s_nome_col
i_total_cols = Integer(dw_main.Describe("DataWindow.Column.Count"))
s_nome_col = dw_main.Describe("#" + String(i_index) + ".Name")
7. Gerenciamento de Linhas e Buffer
Operações comuns para controle de fluxo de dados na UI:
// Inverter seleção de linha
this.SelectRow(row, Not IsSelected(row))
// Mover linhas entre buffers ou instâncias
dw_origem.RowsMove(1, dw_origem.RowCount(), Primary!, dw_destino, 1, Primary!)
// Inserir e focar
long l_nova_linha
l_nova_linha = dw_1.InsertRow(0)
dw_1.ScrollToRow(l_nova_linha)
dw_1.SetColumn("nome_campo")
dw_1.SetFocus()
8. Integração com JSON e Arquivos (Base64)
Para converter uma string Base64 em um arquivo de imagem físico utilizando objetos de crypto e pintura:
uo_crypto l_crypto
uo_painter l_painter
blob b_imagem
long l_img_id
l_crypto = create uo_crypto
b_imagem = l_crypto.Base64Decode(s_string_b64)
l_painter = create uo_painter
l_img_id = l_painter.CacheImage(b_imagem)
l_painter.SaveImage(l_img_id, "c:\temp\saida.png")
destroy l_crypto
destroy l_painter
9. PL/SQL Oracle: Consultas e Utilidades
Identificar dependências de tabelas para análise de impacto:
-- Localizar objetos que dependem de uma tabela específica
SELECT owner, name, type
FROM all_dependencies
WHERE referenced_name = 'MINHA_TABELA_PATS'
AND type IN ('PROCEDURE', 'PACKAGE BODY', 'VIEW');
Obter informações de contexto da sessão (IP e Host):
SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS') AS ip_cliente,
SYS_CONTEXT('USERENV', 'HOST') AS host_cliente,
SYS_CONTEXT('USERENV', 'CURRENT_USER') AS usuario_atual
FROM DUAL;
Exemplo de loop para processamento de lotes (Batch) no Oracle:
DECLARE
CURSOR c_pacientes IS SELECT id FROM tabela_origem;
v_id NUMBER;
BEGIN
OPEN c_pacientes;
LOOP
FETCH c_pacientes INTO v_id;
EXIT WHEN c_pacientes%NOTFOUND;
INSERT INTO tabela_destino (paciente_id, data_migracao)
VALUES (v_id, SYSDATE);
COMMIT;
END LOOP;
CLOSE c_pacientes;
END;
10. Dicas de Ambiente e Performance
Otimização de Interface: Em sistemas operacionais legados, desativar efeitos visuais avançados em "Propriedades do Sistema > Desempenho" pode reduzir a latência de renderização de DataWindows complexos.
Solução VMware: Caso não consiga instalar o VMware Tools em máquinas virtuais Windows 7, verifique se há uma unidade de disquete virtual conectada nas configurações da VM. Remova o drive de disquete e tente a instalação novamente.