Reset pagination van een regio

Waarom zou je de pagination willen resetten? Als je met APEX werkt zul je al snel een keer de volgende melding zien:

Pagination error

Als je in het voorbeeld in figuur 1 een nieuwe regel in de master selecteert, waarbij er minder dan 3 pagina’s detail gegevens zijn, dan zal je bij het detail rapport de eerder genoemde melding krijgen.

Figuur 1

———-                          ———-
| master |                          | detail |
——————————-     ——————————-
| ………                   |     | ………                   |
| ………                   |     | ………                   |
| ………                   |     | ………                   |
| ………                   |     | ………                   |
| ………                   |     | ………                   |
|                             |     |                             |
|                     pag 5/6 |     |                     pag 3/5 |
——————————-     ——————————-

Deze melding kan je voorkomen door zelf de reset pagination te doen. Het resetten van de pagination kun je in APEX doen via de URL.
De URL voor een APEX applicatie ziet er als volgt uit

URL opbouw : f?p=1:2:3:4:5:6:7:8:9
1 – Application ID or alias
2 – Page ID or Alias
3 – Session &SESSION. :APP_SESSION
4 – Request (eg PRINT_REPORT=REPORT_1) &REQUEST. :REQUEST
5 – Debug (YES or NO) &DEBUG. :DEBUG
6 – Cache setting

APP – Clear cache for whole application
SESSION – Clear cache for current user session
RP – Reset pagination
x – Clear cache for page x
y – Clear cache for item y

7 – Comma separated list of page items
8 – Comma separated list of values
9 – Printer friendly mode (either YES or blank)

Zoals je ziet kun je via de URL veel sturing geven aan je pagina. Het gaat nu echter alleen om het “Cache setting” gedeelte waarbij je de tekst “RP” kunt zetten om een reset van de pagination te doen.
Handig? Ja dat wel, alleen wordt op deze manier de pagination gereset voor ALLE regio’s op de pagina. Als je meerdere rapporten in een master-detail constructie op je pagina hebt staan dan worden deze dus allemaal gereset.

Dit kan je voorkomen door in het “Request” gedeelte de tekst “pg_R_XXX” op te nemen, waarbij XXX staat voor het ID van de regio. Het is niet goed om dit ID hard te programmeren omdat het kan wijzigen als je een import van de applicatie doet. Ik heb dit opgelost door een hidden item op te nemen. Dit hidden item geef ik als “Source type” op dat het een “SQL Query” is. In de Source value or expression komt de volgende code:

select ‘pg_R_’||to_char(region_id)
from apex_application_page_regions
where application_id = :app_id
and page_id        = :app_page_id
and static_id      = ‘static value opgegeven bij regio’

Nu kan je dit hidden item op verschillende manieren gebruiken bij het request. Via een javascipt aanroep of link in een rapport.

top.location.href=’f?p=&APP_ID.:125:&APP_SESSION.:&P125_HIDDEN_ITEM_WITH_ID.:&DEBUG.::’

Column linkxx

apex.widget.calendar.ajax_calendar

Pas geleden zag ik een vraag op het APEX Forum over het refreshen van een pagina met een calendar regio.

Het probleem is dat er een LOV-popup item op de pagina staat waarvan de query in de calendar regio gebruikt maakt. Als deze LOV-popup wijzigt moet de calendar regio refreshen met de nieuwe waarde van de LOV-popup. Simpel toch? Ja, dat dacht ik ook maar degene die de vraag stelde zei al van alles geprobeerd te hebben inclusief dynamic actions etc. Nu was ze zover dat haar vraag kwam of ze de pagina kon herladen met javacode zoiets als redirect(this.URL). Iemand gaf haar netjes het antwoord op deze vraag door de juiste javascript code te geven, location.reload().

Mij leek het beter om het probleem zelf (in plaats van de workaround die ze gemaakt had aan te vullen) op te lossen, dus alleen de calendar regio te refreshen zonder de hele pagina te herladen. Apex gebruikt zelf de functie apex.widget.calendar.ajax_calendar om in de calendar te bladeren en van view te veranderen. Standaard wordt op de pagina een aantal buttons geplaatst voor het bladeren en wisselen van view. Door te kijken hoe de buttons de functie aanroepen was mij al snel duidelijk dat dit de juiste manier is.

Kijk op de demo pagina om te zien dat het werkt DEMO Calendar

Hoe heb ik het nu opgelost? Door een dynamic action te maken die afschiet als het item met de LOV-popup wijzigt.
Deze Dynamic action heeft 2 true actions.

1) PL/SQL

declare
cursor c_date is
select HIREDATE
, case when :P4_CALENDAR_TYPE = ‘W’
then HIREDATE-6
else HIREDATE
end
from EMP
where empno = :P4_EMPNO;
begin
open c_date;
fetch c_date into :P4_CALENDAR_DATE,:P4_CALENDAR_DATE_WK;
close c_date;
end;
Page Items to Submit P4_EMPNO,P4_CALENDAR_TYPE
Page Items to Return P4_CALENDAR_DATE,P4_CALENDAR_DATE_WK

Dit moet natuurlijk aangepast worden naar behoefte. In mijn geval wil ik dat de calendar springt naar de datum waarop de gekozen employee is aangenomen (HIREDATE). Dat ik 6 dagen van de datum afhaal indien het calendar type op Week (W) staat heeft te maken met hoe deze regio met de start datum en de eerste dag van de week omgaat. De regio laat in principe de eerste week na de datum zien. De standaard waarde van zondag voor de eerste dag van de week heb ik niet gewijzigd.

2) Javascript

apex.widget.calendar.ajax_calendar($v(‘P4_CALENDAR_TYPE’),’same’,$v(‘P4_CALENDAR_DATE_WK’));

Deze actie doet de werkelijke refresh. De eerste parameter is om te zorgen dat de gekozen view (Maand,Week,List) gelijk blijft. Met de tweede parameter kan je de pagina naar de volgende (next) of vorige (previous) pagina laten verspringen. Hij hoeft voor ons niet te verspringen omdat wij hem openen op de juiste startdatum die in parameter 3 meegegeven wordt.

Dat is eigenlijk alles. Ik heb echter nog een extra dynamic action toegevoegd die de click van de buttons (Maand, week en list als je die actief hebt op je scherm zoals in mijn geval) afvangt en het event ‘change’ van de LOV-popup activeert. Op deze manier wordt ook na het wisselen van de view de pagina met de juiste datum getoond.

3) Extra

apex.event.trigger(‘#P4_EMPNO’,’change’);

 

Dropdown menu in APEX

Menu

Een van de eerste eisen van een nieuwe APEX applicatie is natuurlijk een “mooi” menu. De eisen, wensen en voorkeuren van een menu willen nog wel eens verschillen. De standaard binnen apex zijn de TABS. Ik persoonlijk vind deze tabs erg lastig en bewerkelijk om te gebruiken. Het zou handig zijn als je een menu kan realiseren met alleen CSS en html. In mijn eigen zoektocht om een goed en degelijk menu te vinden stuitte ik op diversen mogelijkheden maar het beste uitgangspunt was een presentatie die ik ooit gezien heb. In deze oplossing wordt gebruik gemaakt van het CSS Dropdown Menu Framework gecombineerd met een HTML list item en template.
Kijk hier voor een voorbeeld http://apex.oracle.com/pls/apex/f?p=14108:1 

 

CSS dropdown menu framework in het kort:

 

Stappen

  1. Plaats het framework in de image directory van apex
    Ik heb het in de theme directory van mijn eigen theme gedaan
  2. Maak in apex een template voor een list
  3. Maak een list regio aan op de global page (in oudere apex versies pagina 0)

 

Template

Om met het menu te kunnen werken zal er een custom list template worden gemaakt.
Hier staat wat er in de diverse blokken van de template moet worden ingevuld.
 

Before List Entry
List Template Before Rows
<link href=”#IMAGE_PREFIX#themes/theme_200/menu/css/dropdown/dropdown.css” rel=”stylesheet” type=”text/css” />
<link href=”#IMAGE_PREFIX#themes/theme_200/menu/css/dropdown/themes/default/default.advanced.css” rel=”stylesheet” type=”text/css” />
<ul id=”nav” class=”dropdown dropdownhorizontal”>
Template definition
 List Template Current
<li><a href=”#LINK#” class=”currentTab”>#TEXT#</a></li>
 List Template Current with Sublist Items
<li><a href=”#LINK#” class=”currentTab”>#TEXT#</a>
List Template Noncurrent
<li><a href=”#LINK#”>#TEXT#</a></li>
List Template Noncurrent with Sublist Items
<li><a href=”#LINK#”>#TEXT#</a
Before Sublist Entry
Sublist Template Before Rows
 <ul>
 Sublist Enry
 Sublist Template Current
<li><a href=”#LINK#”>#TEXT#</a></li>
 Sublist Template Current with Sublist Items
<li><a href=”#LINK#”>#TEXT# &gt;</a>
 Sublist Template Noncurrent
<li><a href=”#LINK#”>#TEXT#</a></li>
 Sublist Template Noncurrent with Sublist Items
<li><a href=”#LINK#”>#TEXT# &gt;</a>
 After Sublist Entry
Sublist Template After Rows
</ul></li>
 After List Entry
List Template After Rows
</li></ul>

 

 

Tips

List Entry Current for Pages Tpe
Exist SQL Query
List Entry Current for Condition (voorbeeld voor pagina 200)
select null from dual 
 where :app_page_id between 200 and 299

Hier komt de sidebar

Volg ons op

© Orcado B.V. | 1999 - 2013