Kolorowanie rekordów w Oracle Apex
Czyli jak zrobić kolorwanie wierszy w zależności od wartości w kolumnach.
Oracle Apex posiada dostępną także dla użytkownika aplikacji opcję oznaczania rekordów w zależności od wartości w kolumnach. Opcja ta jest dostępna poprzez wybranie z menu 'Actions' Format => Highlight. Po wybraniu tej opcji mamy menu tworzenia warunku po którego spełnieniu rekordy, ich tło i/lub tekst, będzie wyróżniony wybranym kolorem. Możemy kolorować wiersz lub komórkę. Warunków może być wiele i możemy je zapisać do ponownego użycia.
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
Deadlock, Database is locked
SQLITE_BUSY
W artykule SQLite jako baza danych tranformacji Pentaho opisywaliśmy jak użyteczna jest to baza danych. Minmalistyczna, wszystko zawarte w jednym pliku, bardzo szybka. Ale baza ta potrafi miec czkawki przy wiekszej ilosci danych. Nawet jeśli program który jej używa zamyka połączenia (Pentaho robi to domyślnie), sama baza jest nadal zajęta sobą i nie reaguje na czas. Żadne żonglowanie ilością sesji, ilością połączeń tutaj nie pomoże. W efekcie wywołanie następnego połączenia do tabeli/bazy powoduje komunikat SQLException: [SQLITE_BUSY] The database file is locked (database is locked)... lub podobny.
Zauważyć to można np. przy kasowaniu dużej ilości danych z tabeli. Zatem należy unikać takich operacji jeśli mamy wiele rekordów w tabeli (dziesiątki, setki tysięcy...). Co prawda baza SQLite przy wykonywaniu DELETE FROM table używa "TRUNCATE optimizera" ale rezultat jest kiepski. Rozwiązaniem może być użycie DROP TABLE i utworzenie tabeli na nowo.
Dodatkowe zalecenie to większe odstępy czasowe między komendami które wykonują operacje na bazie danych.
Oracle Apex - Wykonywanie procedury PL/SQL z poziomu JavaScript
Czasami w aplikacji web zachodzi konieczność połaczenia informacji pobranych z bazy z tymi które właśnie wprowadza użytkownik. Pełnego zestawu potrzebnych informacji nie ma ani w bazie, ani w formularzu użytkownika - trzeba te części połączyć.
To co jest po stronie klienta, w przeglądarce, najlepiej odczytać używając JavaScript. To co jest w tabeli, pisząc kod PL/SQL. Jak to połączyć? Używając metody AJAX. Za wikipedia:
Asynchroniczny JavaScript i XML (Asynchronous JavaScript and XML, AJAX) – technika tworzenia aplikacji internetowych, w których interakcja użytkownika z serwerem odbywa się bez przeładowywania całego dokumentu, w sposób asynchroniczny. Ma to umożliwiać bardziej dynamiczną interakcję z użytkownikiem niż w tradycyjnym modelu, w którym każde żądanie nowych danych wiąże się z przesłaniem całej strony HTML.