Datensatz im Bericht verschieben

01.
Juni
2018
Veröffentlicht von: Martina Meiszies

In diesem Monatstipp wird beschrieben, wie man einen Datensatz im Bericht in APEX nach oben oder nach unten verschieben kann.

Dieses Beispiel ist aus einer Anforderung heraus entstanden, dass in einer Produktion mehrere Anlagen durchlaufen werden. Diese Anlagen sollen in einer bestimmten Reihenfolge angeordnet sein und es soll zusätzlich die Möglichkeit bestehen, die Anlagen in ihrer Reihenfolge zu verschieben.

VORAUSSETZUNG

Um das Beispiel zu vereinfachen wird hier mit der Tabelle Kette gearbeitet. Die verschiedenen Farben veranschaulichen die Anlagen:

create table Kette 
 (Position number, 
  Farbe    varchar2(10));
insert into Kette (Position, Farbe) values (1, 'weiß');
insert into Kette (Position, Farbe) values (2, 'rosa');
insert into Kette (Position, Farbe) values (3, 'rot');
insert into Kette (Position, Farbe) values (4, 'orange');
insert into Kette (Position, Farbe) values (5, 'gelb');
insert into Kette (Position, Farbe) values (6, 'grün');
insert into Kette (Position, Farbe) values (7, 'blau');
insert into Kette (Position, Farbe) values (8, 'lila');
insert into Kette (Position, Farbe) values (9, 'braun');
insert into Kette (Position, Farbe) values (10, 'schwarz');
commit;

IN APEX 5.1

wird ein interaktiver Bericht mit folgender SQL-Abfrage benutzt:

select Position,
        Farbe,
        APEX_ITEM.CHECKBOX2(  p_idx => 1,
                      p_value => Position,
                   p_attributes => 'class="boxes"') "Auswählen"
   from Kette
   order by Position;

Die Funktion APEX_ITEM.CHECKBOX2 legt in der Spalte “Auswählen” Kontrollkästchen an.

In den Filtereigenschaften dieser Spalte wird bei „Sicherheit: Escape bei Sonderzeichen“ Nein eingestellt.

Für Nachrichten gibt es das Element P26_MOVE_MESSAGE vom Typ „Nur anzeigen“ ohne Label. 

Es werden zwei Schaltflächen benötigt, um die Datensätze nach oben oder nach unten zu verschieben.

Die Schaltfäche „NachObenVerschieben“ hat eine dynamisch Aktion „NachOben“: 

Die 1. True Aktion ist „JavaScript-Code“ ausführen:

var f01_array = [];
/* Die Werte der einzelnen Kontrollkästchen im obigen Array forcieren: */
$('.boxes:checked').each(function() {
     f01_array.push($(this).val());
});
/* AJAX-Prozess ausführen, um die Zeilen zu verschieben und das F01-Array zu übergeben:*/
apex.server.process( "MOVE_UP", 
     { f01 : f01_array },
    {dataType: 'text'}
);

Die 2. True Aktion ist „Seite weiterleiten“ (Submit Page), damit der Bericht die geänderten Datensätze anzeigt.

Equivalent dazu gibt es auf der Schaltfläche „NachUntenVerschieben“ die dynamische Aktion
"NachUnten“ mit 2 True Aktionen:

Die 1. True Aktion ist wieder „JavaScript-Code“ ausführen:

var f01_array = [];
/* Die Werte der einzelnen Kontrollkästchen im obigen Array forcieren: */
$('.boxes:checked').each(function() {
   f01_array.push($(this).val());
});
/* AJAX-Prozess ausführen, um die Zeilen zu verschieben und das F01-Array zu übergeben:*/
apex.server.process( "MOVE_DOWN", 
   { f01 : f01_array },
  {dataType: 'text'}
 );

Die 2. True Aktion ist wieder „Seite weiterleiten“ (Submit Page).


Dann gibt es die „Ajax Callback“-Prozesse, die durch den jeweiligen JavaScript Code aufgerufen werden:

Um den Datensatz nach oben zu verschieben:

Name: MOVE_UP
Type: PL/SQL Code
Source:
declare 
 v_count number := 0;
 v_pos number   := 0;
 v_farbe varchar2(32);
begin
 :P26_MOVE_MESSAGE := NULL;
 for i in 1..apex_application.g_f01.count
 loop
  v_count := v_count+1;
  select Position, Farbe
   into v_pos, v_farbe
   from Kette
   where Position = apex_application.g_f01(i);
 end loop;
 
 if v_pos = 1 then
   :P26_MOVE_MESSAGE := 'Sie können den ersten Datensatz nicht nach oben verschieben!';
 else 
  if v_count = 1 then
   update Kette
    set Position = 0
    where Position = (v_pos-1);
   update Kette
    set Position = (v_pos-1)
    where Position = v_pos;
   update Kette
    set Position = (v_pos)
    where Position = 0;
  else
   if v_count > 1 then
     :P26_MOVE_MESSAGE := 'Um zu verschieben können Sie nur einen Datensatz auswählen!';
   end if;
  end if;
 end if;
end;

Um den Datensatz nach unten zu verschieben:

Name: MOVE_DOWN
Type: PL/SQL Code
Source:
declare 
 v_count number := 0;
 v_pos   number := 0;
 v_pos_max number;
 v_farbe varchar2(32);
begin
 :P26_MOVE_MESSAGE := NULL;
 for i in 1..apex_application.g_f01.count
 loop
  v_count := v_count+1;
  select Position, Farbe
   into v_pos, v_farbe
   from Kette
   where Position = apex_application.g_f01(i);
 end loop;
 select max(Position)
  into v_pos_max
  from Kette;
 
 if v_count > 1 then
   :P26_MOVE_MESSAGE := 'Um zu verschieben können Sie nur einen Datensatz auswählen!';
 else 
  if v_pos = v_pos_max then
    :P26_MOVE_MESSAGE := 'Sie können den letzten Datensatz nicht nach unten verschieben!';
  else
   if v_count = 1 then 
    :P26_MOVE_MESSAGE := NULL;
    update Kette
     set Position = 0
     where Position = (v_pos+1);
    update Kette
     set Position = (v_pos+1)
     where Position = v_pos;
    update Kette
     set Position = (v_pos)
     where Position = 0;
   end if;
  end if;
 end if;
end;

Jetzt können im Bericht die Datensätze verschoben werden, hierzu im Kontrollkästchen den Datensatz markieren und die Schaltfläche „Nach Oben Verschieben“ oder „Nach Unten Verschieben“ benutzen.

Wird versucht, den ersten Datensatz nach oben oder den letzten Datensatz nach unten zu verschieben, werden Mitteilungen ausgeben wie:

'Sie können den ersten Datensatz nicht nach oben verschieben!'

Und 

 'Sie können den letzten Datensatz nicht nach unten verschieben!'

Achtung, es kann immer nur ein Datensatz zum Verschieben ausgewählt werden, ansonsten erscheint die Mitteilung:

'Um zu verschieben können Sie nur einen Datensatz auswählen!'
Um diese Nachrichten hervorzuheben, kann der Text rot anzeigt werden.
Dazu wird in den Filtereigenschaften der Seite bei CSS, Inline folgendes mitgegeben:

.rot {
  color: red !important;
}

und in den Filtereigenschaften des Elements P26_MOVE_MESSAGE bei Erweitert und CSS-Klassen: rot.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.