09.09.2013

Канкарент на основе Java-класса

По шагам:
1. Создаем наш класс
package oracle.apps.test;

import java.io.IOException;

import java.io.PrintWriter;
import java.io.StringWriter;

import java.lang.reflect.InvocationTargetException;

import java.sql.Connection;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;

import oracle.apps.fnd.common.Message;
import oracle.apps.fnd.cp.request.CpContext;
import oracle.apps.fnd.cp.request.JavaConcurrentProgram;
import oracle.apps.fnd.cp.request.LogFile;
import oracle.apps.fnd.cp.request.ReqCompletion;

public class MyJavaTest implements JavaConcurrentProgram {
    public static final String APPLICATION_SHORT_NAME = "XXXX";
    public static final String CONCURRENT_PROGRAM_NAME = "MY_CONC_PROGRAM";
    
    private Connection connection;
    private int requestId;
    private LogFile logFile;
    private ReqCompletion reqCompletion;

    public void initialize(CpContext cpContext) throws SQLException, 
                                                       XMLParseException, 
                                                       SAXException, 
                                                       IOException, 
                                                       InstantiationException, 
                                                       IllegalAccessException, 
                                                       ClassNotFoundException, 
                                                       NoSuchMethodException, 
                                                       InvocationTargetException {
        connection = cpContext.getJDBCConnection();
        requestId = cpContext.getReqDetails().getRequestId();
        logFile = cpContext.getLogFile();
        reqCompletion = cpContext.getReqCompletion();

        Enumeration params = cpContext.getReqDetails().getParaInfo().elements();
        String Value = (String)params.nextElement();
        int fileId = Integer.parseInt(Value);
        // some code
    }

    public void runProgram(CpContext cpContext) {
        try {
            initialize(cpContext);
            // some code
            connection.commit();

            // успешное заверщение канкарента
            Message normComplMessage = new Message("FND", "CONC-CP SUCCESSFUL TERMINATION");
            reqCompletion.setCompletion(ReqCompletion.NORMAL, normComplMessage.getMessageText(cpContext.getResourceStore()));
        } catch (Exception e) {
            reqCompletion.setCompletion(ReqCompletion.ERROR, e.getMessage());
            StringWriter errStringWriter = new StringWriter();
            PrintWriter errPrintWriter = new PrintWriter(errStringWriter, true);
            e.printStackTrace(errPrintWriter);
            logFile.writeln(errStringWriter.toString(), LogFile.ERROR);
        } finally {
            cpContext.releaseJDBCConnection();
        }
    }

}
2. Создаем канкарент


05.09.2013

Пример типа с коллекциями


Например, нужно реализовать настройку в виде нескольких списков (списки товаров и торговых точек, где применяется акция). ID товаров и точек будем хранить в таблице со структурой (Тип сущности {Товар, Точка}, ID). С помощью приведенной ниже методики мы можем хранить оба списка в одном объекте и легко к ним обращаться как к коллекциям. Алгоритм сбора данных инкапсулируется в самом объекте, а выполняется в конструкторе, что позволяет выполнить сбор данных одной строкой кода.
Итак:
Тип строки
create or replace type MY_COLLECTION_ROW is
       object(
          value varchar2(150)
       );
Табличный тип
create or replace type MY_COLLECTION is
       table of MY_COLLECTION_ROW 
Новый тип, содержащий объекты типа MY_COLLECTION
create or replace type MY_COLLECTION_TYPE as object (

       GOODS_LIST                MY_COLLECTION,
       SHOPS_LIST                MY_COLLECTION,

       constructor function MY_COLLECTION_TYPE return self as result,

       member      procedure init_SHOPS_LIST_collection(p_list in out MY_COLLECTION),
       member      procedure init_GOODS_LIST_collection(p_list in out MY_COLLECTION)
)
create or replace type body MY_COLLECTION_TYPE is

       constructor function MY_COLLECTION_TYPE return self as result
       is
       begin
          GOODS_LIST                := new MY_COLLECTION(null); 
          SHOPS_LIST                := new MY_COLLECTION(null);

          init_GOODS_LIST_collection(p_list => GOODS_LIST);
          init_SHOPS_LIST_collection(p_list => SHOPS_LIST);
         return;
       end MY_COLLECTION_TYPE;
       --
       member      procedure init_GOODS_LIST_collection(p_list in out MY_COLLECTION)
       is
         l_line varchar2(150);
         cursor cur is
                    select rownum
                           from dual
                           connect by rownum < 10;
       begin
         open cur;
         loop
           fetch cur into l_line;
           exit when cur%NOTFOUND;
                 p_list.extend;
                 p_list(p_list.last) := MY_COLLECTION_ROW(l_line);
           end loop;
           close cur;
       end init_GOODS_LIST_collection;
       --
       member      procedure init_SHOPS_LIST_collection(p_list in out MY_COLLECTION)
       is
         l_line varchar2(150);
         cursor cur is
                    select rownum
                           from dual
                           connect by rownum < 10;
       begin
         open cur;
         loop
           fetch cur into l_line;
           exit when cur%NOTFOUND;
                 p_list.extend;
                 p_list(p_list.last) := MY_COLLECTION_ROW(l_line);
           end loop;
           close cur;
       end init_SHOPS_LIST_collection;
end;
Обращаемся к данным
declare 
  l_options         MY_COLLECTION_TYPE;
  cursor cur(obj MY_COLLECTION) is select * from table(obj);
  l_tmp_coll        varchar2(150);           
begin
  l_options := new MY_COLLECTION_TYPE();
  open cur(obj => l_options.GOODS_LIST);
  loop
        fetch cur into l_tmp_coll;
        exit when cur%NOTFOUND;
           dbms_output.put_line(l_tmp_coll);
  end loop;
  close cur;
end;