среда, 14 декабря 2011 г.

Работа с REF CURSOR в OA Framework

Допустим, есть функция, возвращающая REF CURSOR
CREATE OR REPLACE PACKAGE XX_TST AS
TYPE crResultSet is REF CURSOR;

function getCursor () return crResultSet;
END XX_TST;

CREATE OR REPLACE PACKAGE BODY XX_TST AS
  function getCursor () return crResultSet IS
  retCursor crResultSet;
  begin
    open retCursor for
    SELECT dummy from dual;
    return retCursor;
  
  end getCursor;

END XX_TST;
Для того, чтобы получить записи из курсора, нужно использовать метод getObject в классе OracleCallableStatement

В Application Module добавляем в раздел import и в нужный метод следующий код
imports:

  import oracle.jdbc.OracleCallableStatement;
  import oracle.jdbc.OracleResultSet;
  import java.sql.Connection;
  import java.sql.SQLException;


В метод:
    try {
    Connection conn = getOADBTransaction().getJdbcConnection();
    OracleCallableStatement mainSt = (OracleCallableStatement)conn.prepareCall("begin :1 := XX_TST.getCursor(); end;");
    mainSt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
    mainSt.executeQuery();

    // Получаем результирующий набор из ref курсора
    OracleResultSet mainRs = (OracleResultSet)mainSt.getObject(1);

    // Получаем записи из курсора
    while (mainRs.next())
    {
       ...
    }
    
    } catch (java.sql.SQLException sql_e)
    {
      
    }

четверг, 8 декабря 2011 г.

Работа с объектами БД из OA Framework

Доработаем пример, представленный в предыдущем посте, добавим поле, кнопку и по нажатию на кнопку будем передавать значение поля в функцию в пакете БД и возвращать результат.
Нажатием правой кнопкой мыши на регионе верхнего уровня (pageLayoutRN) создадим регион типа messageComponentLayout, и в нем создадим элемент типа messageTextInput. Таким же образом на уровне pageLayoutRN создадим кнопку типа submitButton. Указываем свойства Prompt у поля и у кнопки. Это текст, который будет выводиться перед полем и на кнопке.


Создадим контроллер для обработки событий на форме. Щелкаем правой кнопкой мыши на регионе верхнего уровня pageLayoutRN и выбираем пункт “Set New Controller”. Так как контроллеры должны располагаться в каталоге webui, указываем имя пакета xx.oracle.apps.per.xx_xxx_demo.webui. Так же указываем имя нового класса, имена классов должны заканчиваться на CO.


JDeveloper создает шаблон контроллера с 2мя методами, 3 метод processFormData по умолчанию не создается в шаблоне.



Подготовим функцию с 2мя параметрами, один параметр IN и один - OUT

create or replace package xx_xxx_demo_p is 
  function xx_tst (p_value in varchar2, p_error_txt out varchar2) return number; 
end xx_xxx_demo_p; 
/ 

create or replace package body xx_xxx_demo_p is 

function xx_tst (p_value in varchar2, p_error_txt out varchar2) return number is 
begin 
    if p_value = 'ERROR' THEN 
      p_error_txt := 'Ошибка в функции'; 
      return -1; 
    else 
      p_error_txt := 'Завершено без ошибок'; 
      return 0; 
    end if; 
  end; 

end xx_xxx_demo_p;
/

В контроллер в раздел import добавляем
import oracle.apps.fnd.framework.OAApplicationModule; import java.io.Serializable; import oracle.apps.fnd.framework.OAException;
В контроллере в методе processFormRequest после super.processFormRequest(pageContext, webBean); пишем:

if ( pageContext.getParameter("submitBTN") != null) {
  OAApplicationModule am = pageContext.getApplicationModule(webBean);
  Serializable params[] = { pageContext.getParameter("field1") };

  am.invokeMethod("callFunction", params);
  // Если нет ошибок, выводим сообщение

  pageContext.putDialogMessage(new OAException("Ошибок нет", OAException.INFORMATION));

 }
Если нажата кнопка с ID “submitBTN”, то в переменную am получаем Application Module, присоединенный к региону, на который ссылается webBean. Затем формируем массив параметров и передаем их в вызов метода callFunction. Это сделано для того, чтобы вынести логику работы с БД из уровня CONTROLLER в уровень MODEL. Теперь необходимо реализовать метод callFunction для вызова созданной ранее функции.

Выбираем AM и открываем xxXXXDemoAMImpl.java класс.


Добавляем в раздел import: import oracle.jdbc.OracleCallableStatement; import java.sql.Connection; import java.sql.SQLException; import oracle.jdbc.OracleTypes; import oracle.apps.fnd.framework.OAException;
Указываем, что метод callFunction может генерировать исключения типа SQLException. Дописываем справа от метода “throws SQLException”.Добавляем в метод callFunction код вызова функции в БД. Теперь объявление метода выглядит так:

public void callFunction(String val) throws SQLException

{
Connection conn = getOADBTransaction().getJdbcConnection();
String l_sql = "BEGIN :1 := xx_xxx_demo_p.xx_tst(:2, :3); end; ";
OracleCallableStatement ocs = (OracleCallableStatement)conn.prepareCall(l_sql);
ocs.registerOutParameter(1, OracleTypes.NUMBER);
ocs.setString(2, val);
ocs.registerOutParameter(3, OracleTypes.VARCHAR);
ocs.executeUpdate();

int res = ocs.getInt(1);

String err = ocs.getString(3);

if (res == -1)
  throw new OAException(err, OAException.ERROR);

}
Снова запускаем страницу и вводим какой нибудь текст в поле. Результат ни иллюстрации ниже.



Если текст появляется на странице в нечитаемом виде (неправильная кодировка), то идем в настройки проекта и в разделе Compiler выставляем кодировку windows-1251, или Cp1251, изначально, скорее всего, стоит Cp1252 кодировка. 


Пересобираем проект и снова запускаем страницу. Теперь вводим в поле значение ERROR, результат на иллюстрации ниже.

четверг, 1 декабря 2011 г.

Создание простейшей OAF страницы

Создадим простую OAF страницу. Щелкаем правой клавишей на проекте и выбираем пункт “New”


Выбираем раздел Web Tier -> OA Components, указываем элемент “Page” и указываем название страницы. Имена страниц желательно называть <Имя>PG. В поле Package указываем пакет, который мы указывали при создании данного проекта.


Теперь надо ограничить проект, чтобы не отображались файлы, принадлежащие другим проектам. Открываем свойства проекта и в Project Content указываем в Java Content путь к myprojects каталогу и ниже, в разделе Included указываем путь к каталогу, находящемся перед webui и server.


Затем удаляем все из раздела Resources


Минимальный набор OAF компонентов для запуска страницы – page и Application Module, так что
теперь нам нужно создать Application Module(далее AM). Щелкаем правой клавишей мыши на имени проекта и выбираем “New”, затем выбираем пункт Application Module в разделе Business Tier -> ADF Business Tier.


Поскольку объекты слоя Model должны быть расположены в каталогах server, при создании AM, указываем Package: xx.oracle.apps.per.xx_xxx_demo.server. Указываем имя нового AM ( желательно, чтобы имена Application Module'ей заканчивались на AM )


Поскольку View Object'ов у нас пока нет, то 2й шаг пропускаем.

На 3м шаге указываем AM, который мы хотим использовать как вложенный в наш новый AM. Поскольку таких AM у нас пока нет, то 3й шаг тоже пропускаем.

На 4м шаге указываем Generate Java file(s) для Application Module Class: xxXXXDemoAMImpl. Это означает, что мы сможем реализовывать какие либо методы на уровне AM, например, обращаться в БД, фиксировать транзакции и.т.д. Вторую опцию можно не указывать.

Выбираем созданную ранее страницу и в ней выбираем регион region1, являющийся компонентом самого верхнего уровня и имеющий тип - pageLayout, переименовываем его в pageLayoutRN, например, и указываем в property inspector свойство AM Definition, равное созданному ранее AM, например xx.oracle.apps.per.xx_XXX_demo.server.xxXXXDemoAM.


На этом же регионе указываем свойства Window Title ( название окна в браузере ) и Title (Заголовок страницы )



Пробуем запустить страницу ( щелчок правой кнопкой на странице -> Run).


Если все было указано правильно, увидим следующее