Dispara Trigger no acesso JDBC/ODBC

Discussão em 'Banco de Dados / Database' iniciado por gbouvie, Fevereiro 23, 2010.

  1. gbouvie

    gbouvie Membro Participativo

    Estou fazendo o acesso via JDBC a um banco e preciso que ao criar um registro em uma tabela específica, seja disparada uma trigger para gerar uma título no contas a receber via a API crapi001 do EMS 2.04 com progress 10.1A. Porém quando crio o registro na tabela, a trigger que está cadastrada no banco não é disparada. Li a respeito e realmente a trigger não é disparada nesses casos.

    Como faço para disparar essa trigger? Ou para disparar uma trigger que chama essa API?

    Obrigado!
  2. kirchner

    kirchner Membro Participativo Moderador

    gbouvie,

    Quando você faz acesso via ODBC/JDBC, o mecanismo no banco de dados é diferente. Existe uma interface nativa SQL que processa as suas requisições.
    Esta interface SQL não é integrada com a 4GL, por este motivo as triggers 4GL que você possui nas tabelas não executam. Por que as triggers 4GL não executam? Porque no Progress essas triggers são de CLIENT, e não do banco. A interface 4GL não permite triggers de banco de dados. Quando você executa via SQL, o client progress (prowin32/_progress) não está ativo, logo não é possível executá-las.

    O que você precisa é criar uma trigger SQL. O Progress só suporta a criação de triggers SQL em linguagem Java, não há outra opção.
    Nessa trigger você faz o que quiser, inclusive acessar um AppServer.


    Abraço,
    Marcos
  3. gbouvie

    gbouvie Membro Participativo

    Marcos!

    Obrigado pela dica. Não tenho muito conhecimento do Appserver. Temos uma aplicação rodando dessa forma: a integração entre HCM e EMS para geração de titulos no contas a pagar. Saberia me dar um exemplo de chamar o app server via uma trigger SQL. Quanto a criar o AppServer sabemos como criar.

    Mais uma vez obrigado!

    Giovani Bouvié
  4. kirchner

    kirchner Membro Participativo Moderador

    Giovani,

    Eu evito programar java tanto quando possível, mas uma vez acabei fazendo uma trigger (procurei aqui, mas não tenho mais). Não é nada de absurdo e tem documentação e exemplos no manual (acho que nos KBs também).

    Não tem um exemplo de uma TR que acesse o AppServer. Para isto você terá que criar um proxy de java para seus programas (usa o programa Proxy Generator, tem no manual também) e fazer sua trigger chamar este cara. Nunca fiz, mas na teoria é possível.

    Se você programa java com frequência verá que não é tão difícil assim...


    Abraço,
    Marcos
  5. kirchner

    kirchner Membro Participativo Moderador

    Giovani,

    Estava organizando as coisas aqui na máquina e achei a trigger :)

    DROP TRIGGER Copia.TR_Item;

    Código:
    CREATE TRIGGER Copia.TR_Item
    AFTER INSERT
    ON Copia.Item
    REFERENCING NEWROW
    FOR EACH ROW
    IMPORT
    	import java.sql.*;
    	import java.math.*;
    BEGIN
    	Integer v1, v3, v6, v7, v8, v9;
    	String v2, v5;
    	BigDecimal v4;
    
    	v1 = (Integer)NEWROW.getValue(1, INTEGER);
    	v2 = (String)NEWROW.getValue(2, VARCHAR);
    	v3 = (Integer)NEWROW.getValue(3, INTEGER);
    	v4 = (BigDecimal)NEWROW.getValue(4, DECIMAL);
    	v5 = (String)NEWROW.getValue(5, VARCHAR);
    	v6 = (Integer)NEWROW.getValue(6, INTEGER);
    	v7 = (Integer)NEWROW.getValue(7, INTEGER);
    	v8 = (Integer)NEWROW.getValue(8, INTEGER);
    	v9 = (Integer)NEWROW.getValue(9, INTEGER);
    
    	SQLIStatement stmt = new SQLIStatement("INSERT INTO PUB.Item VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
    	stmt.setParam(1, v1);
    	stmt.setParam(2, v2);
    	stmt.setParam(3, v3);
    	stmt.setParam(4, v4);
    	stmt.setParam(5, v5);
    	stmt.setParam(6, v6);
    	stmt.setParam(7, v7);
    	stmt.setParam(8, v8);
    	stmt.setParam(9, v9);
    	stmt.execute();
    
    
    	stmt = new SQLIStatement("DELETE FROM Copia.Item WHERE ItemNum = ?");
    	stmt.setParam(1, v1);
    	stmt.execute();
    END;
    É uma trigger simples e para um propósito específico. Cada vez que alguém insere um registro na tabela Copia.Item (que é uma cópia da tabela PUB.Item do banco sports ou sports2000), a trigger extrai os valores inseridos, insere os mesmos dados na PUB.Item e apaga o Copia.Item inserido. É uma "casca". Você pode personalizar como quiser.
  6. gbouvie

    gbouvie Membro Participativo

    Marcos!

    Sua dica foi muito útil para mim.

    Obrigado

    Giovani Bouvié

Compartilhe esta Página