Guia de Referência Técnica: Snippets para PowerBuilder, SQL Server e Oracle

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.

Tags: PowerBuilder oracle-plsql SQL-Server datawindow sybase

Publicado em 7-6 00:19