poniedziałek, 26 kwietnia 2010

Przekazanie wartości do Filtra Raportu Interaktywnego

Witam

Niedawno miałem proste zadanie stworzenia linku do raportu interaktywnego, który ma być poddany filtrowaniu. Zazwyczaj zadanie takie wykonuje się poprzez utworzenie nowego Items'a na stronie raportu i następnie podpięcie Items'a do źródła raportu interaktywnego. Powstało by zatem coś takiego:

Select name, addres, street
from customers
where name like :P1_NAME

Wszystko fajnie ale co kiedy nasz użytkownik będzie chciał wrócić do podstawowego działania raportu - bez filtrowania ? Należałoby stworzyć przycisk kasujący cache lub wartości sesji dla Items'a P1_NAME. Zakładając, że mamy już całe środowisko raportu interaktywnego to dodawanie kolejnych przycisków wydaje się być mało eleganckie. Dlatego lepiej jest zastosować wbudowaną możliwość linkowania do Raportu interaktywnego z zadaniem filtrowania.

Jak to działa ?

Zacznijmy od przypomnienia składnia adresu URL w APEX:

f?p=APP:PAGE:SESSION:REQUEST:DEBUG:ClearCache:itemNames:itemValues

Aby przekazać wartości filtra do raportu interaktywnego na stronie wystarczy w miejscu itemNames podać odpowiednią nazwę "zmiennej", która będzie odpowiadała za wprowadzenia filtra.

W moim przypadku adres będzie wyglądał następująco:

f?p=2000:1:&SESSION.:::CIR:IRLIKE_NAME:dbe

Jako Items'a użyłem specjalnego ciągu, który składa się z trzech członów:
1. IR
2. LIKE
3. NAME

IR to skrót od interactive Report. LIKE to typ filtrowania natomiast NAME to alias kolumny, która ma być filtrowana.
W polu itemValues umieszczono wartość dla filtra (w tym przypadku dbe).

Dodatkowo możecie zauważyć ze w miejscu ClearCache gdzie zazwyczaj umieszcza się strony, dla których wartości sesji mają być wyczyszczone wpisałem CIR. Wpis ten informuje silnik APEX, że ma wyczyścić wszelkie ustawienia na raporcie interaktywnym - wyczyścić jego stan sesji.

Dodatkowe informacje o filtrach dla Interaktywnych raportów znajdziecie w dokumentacji Oracle tutaj.

środa, 14 kwietnia 2010

Autonomous Transactions - warto wiedzieć

Obecnie pracujemy nad pewnym projektem, który w dużej mierze opiera się na interfejsach. Interfejsy te będą służyły do zaciągania zewnętrznych informacji z kilku systemów. Wszystko było by fajnie jak by dane zewnętrzne wprowadzane do interfejsów były czyste. Niestety, mówimy tutaj o sytuacji idealnej, która występuje jedynie w teorii. Praktyka to wieczna walka z bzdurami, które próbują się wkraść przez wszelkie dziury interfejsów, tu np próba przekazania informacji do naszego systemu z ID (klucz obcy), który nie istnieje u nas (detail nie posiada mastera w naszym systemie) itp itd.
Jeżeli ktoś kiedyś próbował robić integrację wielu systemów to wie o czym mówię.
Jak nad tym wszystkim zapanować ?
Jak kontrolować rekord po rekordzie z obcą informacja, która może zrobić po naszej stronie zupełny mess ?
A na końcu, jak namierzyć winowajcę naszego kłopotu ?

Lekarstwem na to wszystko jest dobry system logowania. Innymi słowy mechanizm, który będzie zapisywał w odpowiednich tabelach wszelkie dodatkowe/wewnętrzne informacje, które dla użytkownika nie wiele mówią ale dla developera/help desku sporo podpowiedzą. Dobry system logowania to bardzo szeroki zakres tematyczny, który nie da się w kilku słowach na blogu przekazać, jednak pierwszą podstawową wskazówką przy budowie takiego właśnie mechanizmy powinna być tak zwana transakcja autonomiczna (Autonomous Transaction).
Co to takiego ? Jest to blok programu pls/sql, który wykonuje się poza głównym mechanizmem. Zatwierdzanie lub ewentualnie wycofywanie transakcji odbywa się niezależnie od programu wywołującego.

Poglądowo wygląda to mniej więcej tak:
załóżmy że mamy tabele LOG z jedną kolumną OPIS varchar2(4000) teraz tworzymy bardzo prosty system zapisu autonomicznego do tebaeli LOG

create or replace procedure loguj_autonomiczna_transakcja (OPISx varchar2)
is
--1 element autonomicznej transakcji
PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN
INSERT INTO LOG (OPIS) VALUES (to_char(SYSDATE,'dd/mm/yyyy hh24:mi:ss ')||OPISx);
--2 element aytonomicznej transakcji (oczywiście może też być rollback)
COMMIT;
end;


A teraz tworzymy zupełnie niezależny program który ma swoją logikę (przykład poglądowy)

begin program_wywolujacy
rozne_mechanizmy programu wywolujacego;
loguj_autonomiczna_transakcja(informajce_z_mechanizmów);

loop programu_wywolujacego
loguj_autonomiczna_transakcja(informajce_z_loop-a);
end loop;

end program_wywolujacy;

I co nam da taki mechanizm, a no to, że jak wystąpi jakiś błąd to nam nie wycofa (usunie) wszystkiego z tabeli LOG ponieważ każdy krok jest osobno commit-owany niezależnie od programu wywołującego. Dzięki temu będziemy mogli w łatwy sposób znaleźć miejsce wywrotki programu głównego, będziemy mieli zapis wartości zmiennych czasu i wszelkich innych (pewnego rodzaju czarna skrzynka programu).
Nie jest to może ściśle związane z APEX-em, ale jeżeli robiłeś chociaż raz średniej wielkości system, który wymagał pewenego nadzoru to pewenie wiesz o czym piszę.
Oczywiście projekt o którym wspominam na samym początku wpisu robimy w APEX-ie : )

środa, 7 kwietnia 2010

ORACLE 11g R2 for Windows

Musiało upłynąć prawie 8 miesięcy od wypuszczenia wersji Oracle 11g R2 pod linuxa aby ukazała się też wersja pod Windows. Właśnie od wczoraj w dziale downlad.oracle.com można pobrać najnowszą wersję pełnej wersji Oracle 11g R2 for windows.

UPDATE - APEX Developer Certified Expert

W poprzednim wpisie na temat Certyfikacji APEX obiecałem ze postaram się potwierdzić że wystarczy tylko zdać jeden egzamin i będzie certyfikat. Więc nie mam oficjalnej odpowiedzi ale czytając Blogi pracowników Oracle mogę na 99% stwierdzić że jest tak jak założyłem czyli tylko zdanie jednego egzaminu (1Z1-450) pozwoli otrzymać Certyfikat. Tutaj można przeczytać wpis na ten temat (jest to Blog Patrick-a Wolf-a jednego z głównych programistów Oracle APEX)
Dodatkowo powstała mini strona opisująca jak się przygotować do egzaminu.

czwartek, 1 kwietnia 2010

Nowe propozycje szkoleń Oracle APEX

Uruchomiliśmy nową edycją szkoleń Oracle APEX, tym razem rozbudowaną o nowe lokalizacje oraz wyższy poziom (dla średnio zaawansowanych).

Tak więc pierwsze nowe szkolenie dla średnio zaawansowanych odbędzie się w warszawie a tydzień poźniej we Wrocławiu.



Dodatkowo powtarzamy szkolenie na poziomie podstawowym z tym, że tylko w Warszawie.



Gorąco zachęcam do udziału w szkoleniu, z pewnością każdy znajdzie coś dla siebie.

Ps.
Ostatnio nieco zaniedbaliśmy opis technologii na rzecz szkoleń, proszę wybaczcie postaramy się to w niedługim czasie odmienić.