четверг, 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 комментарий:

  1. Не подскажите как побороть проблемы с кодировкой:
    oracle.apps.fnd.framework.OAException: oracle.jbo.InvalidObjNameException: JBO-25005: ??? ??????? ? ????? ?????? ????????????? ???????? ????????????
    Хочу чтоб выводилось на английском, но не могу найти опцию.

    ОтветитьУдалить