Montag, 20. März 2017

Forms - mit PL/SQL alle Datensätze eines Blocks in eine PL/SQL-Tabelle laden

Während meines jetzigen Projektes hatte ich schon öfter folgende Aufgabe zu lösen: wie bekomme ich denn alle Records eines Datenblocks in eine PL/SQL-Tabelle ? Um damit z.B. andere Berechnungen durchzuführen, Plausibilitäten darüber laufen zu lassen oder andere Listen zu füllen.

Nachdem ich das ein paar Mal gemacht habe, wollte ich mein Vorgehen dabei zum Besten geben.
Wenn man den gesamten Code noch in ein Forms-Package steckt, ist die PL/SQL-Tabelle auch von anderen Codestellen anzusprechen und zu benutzen.

Dafür bastel ich mehr zu allererst einen Record, mit allen Feldern, die ich brauche und darauf basierend eine PL/SQL-Tabelle und eine konkrete Instanz der entsprechenden Speicherstruktur:

   TYPE mein_Record_T IS RECORD (
    Feld1         VARCHAR2(250),
    Feld2         NUMBER := 0,
    Feld3         VARCHAR2(5)
    );

TYPE meine_PLSQLTabelle_T IS TABLE OF mein_Record_T INDEX BY PLS_INTEGER;

meineKonkrete_PLSQLTabelle meine_PLSQLTabelle_T;

Und nun kann ich alle Datensätze des Blocks durchlaufen und in der Objekt-Struktur abspeichern:

  PROCEDURE Fuelle_meine_PLSQLTabelle(meinBlock_I IN VARCHAR2) IS
    meinIndex_V              NUMBER;
  BEGIN
    GO_BLOCK(meinBlock_I);
    FIRST_RECORD;
    LOOP
      meinIndex_V := meineKonkrete_PLSQLTabelle.COUNT;
    
      IF TRIM(NAME_IN(meinBlock_I || '.Feld1')) IS NOT NULL THEN
        meineKonkrete_PLSQLTabelle(meinIndex_V).Feld1 := NAME_IN(meinBlock_I || '.Feld1');
        meineKonkrete_PLSQLTabelle(meinIndex_V).Feld2 := NAME_IN(meinBlock_I || '.Feld2');
        meineKonkrete_PLSQLTabelle(meinIndex_V).Feld3 := NAME_IN(meinBlock_I || '.Feld3');
      END IF;
      
      EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE';
      NEXT_RECORD;
    END LOOP;     
  END Fuelle_meine_PLSQLTabelle;

Dieses Konstrukt konnte ich nun schon ein paar Mal gebrauchen, um mir das Leben mit Daten aus den Datenblöcken zu vereinfachen. Denn ich musste immer alle Daten haben, um damit z.B. andere Daten bewerten zu können. Wenn natürlich die Datenblöcke viele Daten enthalten, dauert der ganze Fetch entsprechend länger. Davon ist meine Maske aber nicht betroffen, und so helfen diese paar Zeilen Code mir ungemein.

Schöne Grüße
Holger

Mittwoch, 1. März 2017

Forms 12c - neue Erkenntnisse mit JNLP und dem Standalone Launcher

Hallo zusammen,

die letzten Tage und Wochen haben wieder neue Erkenntnisse mit den neuen Forms 12c Deployment Optionen gebracht, die es wert sind veröffentlicht zu werden. Ein Community Mitglied hat gesagt, das zeigt die Abgrenzung zwischen Webstart und der Standalone Methode. Von ihm habe ich auch den Lösungshinweis bekommen, wie man mit Webstart verschiedene Zertifikatsquellen einbindet und verarbeitet.

Die erste große Erkenntnis ist: Standalone läßt die Ausführung nicht signierter Jar-Files zu, ob das ein Bug ist, müßte man Michael Ferrante bzw. den Oracle Support fragen. Diese Vermutung bestand seit gestern nach mehreren Fach-Gesprächen über Forms und Java mit dem Community Mitglied.

Als Basis dient meine VM mit Forms 12.2.1.1.0 und bestehenden Sample-Aufrufen. Dafür habe ich aus einem Jar-File die Signatur entfernt.


Nach dem Austausch der Datei in der formsweb.cfg und dem Löschen des Java-Caches hat die Anwendung unerwartet dennnoch gestartet. Der Aufruf war so:



Beim Versuch aus der frmall.jar das Zertifikat zu entfernen, startet die Anwendung nicht mehr.


Diese Versuche laufen zwar nicht auf dem letzten offiziellen Patch, aber dort erwarte ich nichts anderes erstmal. Entweder ein Bug oder ein Feature mit Risiken, neben dem Problem das Cachings der Jar-Files also schon nicht unerheblich. Da macht Webstart doch bislang weniger Mühe.

Zweites Thema des heutigen Postings ist auch direkt die WebstartVariante zum Starten, denn theoretisch hat man mindestens 2 verschiedene Zertifikate, wenn man neben den Standard Oracle Forms Jars auch selbstentwickelte, gekaufte oder freie Jars hat. Diese Dateien müssen dann ja zum Betrieb mit dem Weblogic mit einem offiziell gültigen Zertifikat ausgestattet sein und verschiedene Zertifikate lassen sich nicht zusammen in einer JNLP-Datei einbinden, da muss man doch tricksen.

Der Trick ist recht einfach: pro Zertifikat von einer Trusted Certificate Authority muss eine JNLP-Datei existieren, die dann von der Haupt-JNLP Datei aufgerufen wird. Also bei 3 verschiedenen Zertifikaten auch 3 einzelne  JNLP Dateien.

 Hier ein Beispiel einer Haupt-JNLP Datei, die auf andere JNLP-Dateien verweist:


Und hier ein Ausschnitt aus extensions_1.jnlp:


So lassen sich auf einfache Weise komplexe Strukturen verflachen und auf einzelne Dateien auslagern. Standardmäßig liegen die anderen JNLP-Dateien auch in /forms/java, das kann man aber sicher auch wieder auf andere Folder verbiegen.

Gerade kam die Entwarnung von Frank Hoffmann und dem Test mit Version 12.2.1.2.0. Da ist es so, wie es sein soll und Standalone (fsal) bricht mit Fehler bei der Nicht-Signierung ab:


Puh, dann hat Oracle hier nachgebessert und alles ist hier wieder beim letzten Patch ok.

Viel Spass beim Ausprobieren mit den neuen Deployment Optionen und vielleicht noch mehr Erenntnissen wünscht

Holger