22 сент. 2008 г.

Новости и сплетни

Где-то далеко-далеко началась Oracle Open World 2008. Видимо из-за этого маститые блоггеры почти ничего не пишут уже больше месяца - готовились, видать. Чтож, будем ждать новостей с того берега океана.
А пока еще одна новость - металинк теперь по умолчанию имеет flex интерфейс. Меньше месяца назад я предполагал, что оракл торопится запустить новую версию как раз к открытию OOW 2008, и оказался прав :)

Ну а дальше сплетни из недостоверных источников. Apex 3.2, как известно, будет уметь мигрировать приложения oracle forms. Так вот эта самая миграция будет возможна двумя способами и оба будут весьма ограничены. Один будет генерить обычные апекс-веб-интерфейсы, а второй будет генерить флэш (возможно это будет флэкс?). Вот это для меня честно говоря удивило. Других изменений в этой версии не ожидается.

А вот версия apex 4 должна будет иметь гораздо больше новых вкусных функциональных возможностей. И выпуск этой версии предполагается до конца этого года! Я так думаю будет некоторая задержка, но видимо ждать осталось недолго.

Но повторюсь: последние 2 новости - это всего лишь сплетни, так что ни за что не ручаюсь.

18 сент. 2008 г.

Документация Apex

С сайта оракла пропала вся документация по Apex. Уж не знаю что они там делают, но вообще последнее время бесят страшно! Оракловые вебы - это какое-то сплошное недорозумение.

Для тех кому критично нужно глянуть что-то в доке и нет локальной копии (как у меня), нашел какое-то зеркало здесь.

16 сент. 2008 г.

Apex. NTLM. XE.

.. и розачарованию моему не было предела!
NTLM аутентификация работать в XE не будет. Ровно как и в 11g с использованием Embedded HTTP Server (aka XMLDB).
Вот соответсвующая строчка в документации:

Unlike mod_plsql, the embedded gateway connects to the database as the special user ANONYMOUS, but accesses database objects with the user privileges assigned to the DAD. The database rejects access if the browser user attempts to connect explicitly with the HTTP Authorization header.


Для тех же, кто использует mod_plsql, инструкция по использованию NTLM лежит здесь

15 сент. 2008 г.

Прощай убунту :(

Вобщем, как это ни прискорбно, на домашней станции ubuntu 8.04 была снесена, как опасная для жизни и здоровья. Вот точно говорят: "Лучшее - враг хорошего". Стояла себе 7.10, не кашляла. Всё стабильно работало. При переезде на новый винт решил поменять. Недели 2 наверное мы с ней сражались.. Итого, дома теперь стоят Windows xp :)
Вобщем, порекоммендовать 8.04 никому не могу. Какая-то она неправильная. Видимо, слишком много взяла от windows :D

10 сент. 2008 г.

We are the champions

В минувшую субботу принял участие в любительском волейбольном турнире за кубок улицы Кубикова :) Вот как этот кубок выглядит:


Надо сказать погода выдалась жаркая, а играть пришлось с 9 утра до 6 вечера. Так что к окончанию турнира я был выжат как лимон. Еще бы, так прыгать :)


Но усилия были не напрасны! Наша команда, а назывались мы Hauzové, заняла первое место!

8 сент. 2008 г.

Apex. Экспорт отчетов.

Как реализовать экспортов отчетов в word, excel и иже своими силами.
Общая идея:
1. Создать таблицу с полем BLOB, куда будут генериться отчеты.
2. Создать OnDemand процесс, который будет из APEX_APPLICATION_PAGE_REGIONS выдергивать запрос для отчета. На основе этого запроса сгенерить xml данные. К этим данным применить xslt stylesheet и результат записывать в созданную до этого таблицу.
3. Написать javascript, который запустит этот процесс, а потом запустит на скачивание сформированный документ.

Ниже приводится "рыба". Понятно, что в итоге можно получить очень гибкую систему, позволяющую иметь полный контроль над выводом отчетов с помощью xslt.
Рабочий пример находится здесь: http://apex.oracle.com/pls/otn/f?p=33753:1:0

Итак, создаем таблицу и последовательность для первичного ключа:

create table breports(
id number(10) constraint pk_breports primary key,
breport blob,
mimetype varchar2(30),
filename varchar2(255),
charset varchar2(10),
created_by varchar2(30),
created_on date default sysdate
)
/
create sequence s_breports start with 1 increment by 1 maxvalue 9999999999
/


Функции:

-- Вспомогательная функция для конвертации в BLOB
create or replace function clob_to_blob(c in clob ) return blob is
pos pls_integer := 1;
buffer raw( 32767 );
res blob;
lob_len pls_integer := dbms_lob.getlength( c );
begin
dbms_lob.createtemporary(res, true);
dbms_lob.open(res, dbms_lob.lob_readwrite);

loop
buffer := utl_raw.cast_to_raw( dbms_lob.substr( c, 16000, pos));

if utl_raw.length( buffer ) > 0 then
dbms_lob.writeappend( res, utl_raw.length( buffer ), buffer );
end if;

pos := pos + 16000;
exit when pos > lob_len;
end loop;

return res; -- res is open here
end clob_to_blob;
/

-- функция экспорта отчета
create or replace
function export_report(p_app number, p_page number, p_region varchar2) return number as
l_query clob;
l_str varchar2(4000);
l_stylesheet xmltype := xmltype('<?xml version="1.0" ?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><html><body><table><tr><xsl:for-each select="./ROW[1]/*"><xsl:call-template name="header"/></xsl:for-each></tr><xsl:apply-templates select="ROW"/></table></body></html></xsl:template><xsl:template match="ROW"><tr><xsl:for-each select="./*"><xsl:call-template name="data"/></xsl:for-each></tr></xsl:template><xsl:template name="header"><td><xsl:value-of select="name(.)"/></td></xsl:template><xsl:template name="data"><td><xsl:value-of select="text()"/></td></xsl:template></xsl:stylesheet>');
l_mimetype varchar2(30) := 'application/msword';
l_filename varchar2(30);
l_charset varchar2(30) := 'UTF8';
l_created_by varchar2(30) := v('APP_USER');
l_ln number;
l_null varchar2(30);
begin

select region_source into l_query
from APEX_APPLICATION_PAGE_REGIONS
where application_id = p_app
and page_id = p_page
and region_name = p_region;

select s_breports.nextval into l_ln from dual;
l_filename := 'report_'||to_char(l_ln)||'.doc';

l_str := 'insert into breports (id, breport, mimetype, filename, charset, created_by)
select '||to_char(l_ln)||', clob_to_blob(xmltransform(d,s).getclobval()), '''||l_mimetype||''', '''||l_filename||''', '''||l_charset||''', '''||l_created_by||''' from (select xmlagg(column_value) d from table(xmlsequence(cursor('||l_query||')))) xd, (select xmltype('''||l_stylesheet.getclobval()||''') s from dual) xs';
execute immediate l_str using l_null;
commit;
return l_ln;
exception
when no_data_found
then return 0;
end export_report;


В приложении создадим три айтема уровня приложения: TEMP_ITEM_1, TEMP_ITEM_2, TEMP_ITEM_3
И OnDemand процесс:

declare
l_ret number;
begin
l_ret := export_report(:TEMP_ITEM_1, :TEMP_ITEM_2, :TEMP_ITEM_3);
htp.p(apex_util.get_blob_file_src('P2_BREPORT', l_ret));
end;


Дальше финт ушами: нужно мастером создать форму на основе таблицы BREPORTS.Обозначить первичный ключ ID, источник ключа Existing trigger. Из колонок выбрать только BREPORT и не создавать никаких кнопок типа delete и update... В созданной странице (пусть это будет PAGE 2), нужно зайти в свойства айтема P2_BREPORT (типа File Browse) и изменить свойство Source на BREPORT:MIMETYPE:FILENAME::CHARSET:attachment:Download. Это нужно для работы функции apex_util.get_blob_file_src в OnDemand процессе: там параметр 'P2_BREPORT' - имя айтема File Browse на этой форме.

Теперь на странице с отчетом нужно в header вписать скрипт:

<script language="JavaScript" type="text/javascript">
function exportReport(pApp, pPage, pRegion){
var get = new htmldb_Get(null,$x('pFlowID').value,'APPLICATION_PROCESS=EXPORT_REPORT',1);
get.add('TEMP_ITEM_1', pApp);
get.add('TEMP_ITEM_2', pPage);
get.add('TEMP_ITEM_3', pRegion);
gRet = get.get(null);
get = null;
open(gRet, '_parent');
}
</script>


И последнее, в области отчета создать элемент Display as Text (does not save state) у которого source =

<a href="javascript:exportReport(&APP_ID.,&APP_PAGE_ID., 'Report')">Export to Word</a>

Здесь внимание: 'Report' - это имя region'а c отчетом.

Собственно всё.

5 сент. 2008 г.

apex.oracle.com

Вот как лежит apex.oracle.com :)

4 сент. 2008 г.

Хромированный Apex

Тут на днях наделал шуму выпуск гуглом нового браузера Chrome. Оставлю за кадром свои личные пристрастия к браузером, а отмечу лишь то, ради чего можно установить этот браузер разработчикам приложений на Oracle Apex.

1. Создание ярлыков приложений. Эта функция позволяет создать на рабочем столе ярлык, который запустит апекс приложение без всяких лишних браузеровских меню и панелей. Удобно например создать ярлык для Application Builder'а:


2. Растягивающиеся textarea! Наверное самая "вкусная" фича при разработке в апексе. В Firefox для этого приходилось устанавливать Apex Builder plugin.


3. Встроенный оттладчик html/javascript/css - Chrome Inspector. Собственно местная альтернатива Firebug:


В целом для разработки вполне пригоден без лишней плагиноустановки. Неплохой ход от гугла.

2 сент. 2008 г.

Custom authentication Apex

Долгое время собирался написать сам, но за неимением времени лучше дам ссылку на хорошую заметку, как реализовать свою аутентификацию для приложения Apex. Ничего сложного. Таблица с пользователями и паролями + пакет для управления. Читать здесь.