Tworzenie linków w Oracle Apex

Oracle Apex posiada mechanizmy bezpieczeństwa które nie pozwalają na łatwe skomponowanie linku który przeniesie nas do rządanej strony w aplikacji. Jest to zabezpieczenie przed tak zwanym "URL tampering". By taki link zadziałał nie wystarczy skleić go wstawiając adres serwera, numer strony, sesje i parametry strony. Oracle Apex wylicza checksums linku specjalnym algorytmem. Zatem jeśli spróbujesz zrobić coś jak "f?p=&APP_ID.:175:&SESSION.:COS::RIR,CIR:IRIN_PARAM:\000040, 000023\" to po prostu nie zadziała. Choć nadal w Google znajdziesz wiele błedny tutoriali że jest inaczej.

Jak zatem tworzyć linki? Poniżej dwa najwygodniejsze sposoby.

Utworzenie linku w procedurze PL/SQL i zwrócenie go jako kolumna

Taka potrzeba pojawia się często przy warunkowym linku; jeśli coś tam to dokądś tam, jeśli inne coś to w inne miejsce...

CASE
       WHEN pr.some_column is NULL THEN
            'f?p=&APP_ID.:150:&SESSION.:OFFE::RIR,CIR'
       ELSE 'f?p=&APP_ID.:150:&SESSION.:OFFE::RIR,CIR:IR_DETAILS:'||lpad(to_char(pr.marker),6,'000000')
END edit_link

Ale nie, tak utworzonej kolumny nie możemy wykorzystać wprost jako link. Użyjemy tę kolumnę jako źródło/parametr linku. Ukrywamy tę kokumnę - Type => Hidden collumn. Potrzebujemy więc jescze jedną wirtualną kolumnę w naszym zapytaniu które jest źródłem naszej strony/raportu w Apex. W SQL dodajemy więc:

'DO_STRONY' AS DO_STRONY

Mamy zatem zatem kolejną wirtualną kolumnę w źródle naszego raportu. Tę kolumnę zamieniamy na link: Type => Link.

Klikamy na "Target" i definiujemy:

Po zapisaniu nasz link będzie funkcjonwać jak należy. Dlaczego tak? Oracle Apex podda źródło tego linku właściwym algorytmom które zrobią z niego użyteczny link.

Sposób nr 2 - użycie apex_util.prepare_url

W poniższym przykładzie zademonstrujemy dwa rozwiązania. Jak otworzyć stronę w używając JavaScript i jak skonstuować właściwy link by to osiągnąć. Zacznijmy od zbudowania właściwej funkcji JavaScript:

var x = apex.item('P313_ARTICLE_NO').getValue();
var url = "f?p=#APP_ID#:314:#SESSION#::NO:RP,314:P314_ARTICLE_NO:#P313_ARTICLE_NO#";
url = url.replace("#APP_ID#", $v("pFlowId"));
url = url.replace("#SESSION#", $v("pInstance"));
url = url.replace("#P313_ARTICLE_NO#", x);
apex.server.process("PREPARE_URL", {
x01: url
  }, {
  success: function(pData) {
   if (pData.success === true) {
     apex.navigation.redirect(pData.url);
   } else {
     console.log("FALSE");
   }
 },
error: function(request, status, error) {
console.log("status---" + status + " error----" + error);
  }
});

Funkcja ta komonuje link i przesyła go do metody apex_util.prepare_url która zwróci działający, poprawny link który użyjemy do przekierowania - apex.navigation.redirect(pData.url). Przygotowanie linku będie zadaniem procesu, Ajax Callback. W menu 'Processing => Ajax Callback' dodaj proces i nazwij go 'PREPARE_URL'. Wybierz typ jako 'PL/SQL Code' i wklej poniższa zawartość:

declare
   result varchar2(32767);
begin
   result:=apex_util.prepare_url(apex_application.g_x01);
   apex_json.open_object;
   apex_json.write('success', true);
   apex_json.write('url', result);
   apex_json.close_object;
exception
 when others then
   apex_json.open_object;
   apex_json.write('success', false);
   apex_json.write('message', sqlerrm);
   apex_json.close_object;
end;

W sposób jak wyżej możesz otworzyć zarówno okno typu modal jak i zwykłą stronę. Powodzenia!