Donnerstag, 11. Februar 2021

Submit einer Custom APEX Login Page mit der Enter Taste

Hier kommt der nächste neue APEX Post von mir. Thema heute: Submit einer Custom APEX Login Page mit der Enter Taste.

Der Login Screen ist nicht der Standard APEX Login Screen, sondern eine selbst entwickelte Page.



Der Login mit der Maus geht hervorragend, aber es soll auch ein Login mit der Enter Taste möglich sein, wenn man im Item "password" ist.

Ein einfaches Submit when Enter pressed 



reicht leider nicht, da die Login Logik hinter dem Button "Log In" liegt.

Also wird eine neue Dynamic Action auf dem Item "password" angelegt und mit etwas JavaScript gefüttert.


Hier kommt der JavaScript Code für die True-Action.

Und schon führt die Betätigung der Enter Taste die Login-Prozedur aus.


Cheers,

Holger



Dienstag, 2. Februar 2021

Einen modalen Dialog in APEX nach dem Login Vorgang anzeigen

Hallo allerseits,

heute kommt mein 1. Post zum Thema Oracle APEX, mit dem ich nun auch unterwegs bin.

Meine Aufgabe war es, einen modalen Dialog in APEX nach dem Login anzeigen, natürlich nur unter gewissen Bedingungen.

Die PageId des modalen Dialog ist 340.

Zuerst habe ich versucht das Ganze mit einem Branch und einem Page Redirect anzuzeigen.




Aber da das Ganze ja ein modaler Dialog ist, ist nichts passiert. Dann ein wenig im Internet gesucht und die Lösung mit JavaScript gefunden.

Ich habe dazu ein Item PX_URL und eine Dynamic Action beim Page Load angelegt.


Bei Set Value wird die URL für den modalen Dialog zusammengebaut.



Zum Start des Dialoges wird JavaScript aufgerufen.




Und die gesamte Dynamic Action hat noch eine Prüfung in der Datenbank, ob der Dialog angezeigt werden soll.


Nun wird nach einem Login unter gewissen Rollenbedingungen dieser modale Dialog angezeigt.


Viel Spaß damit,

Holger


Update einen Tag später nach einem Hinweis von einem Kollegen: eval ist bdeneklich wegen Sicherheitsbedenken und Malicious Code.

Die Lösung besser apex.navigation.redirect verwenden:

apex.navigation.redirect(apex.item('MY_ITEM').getValue());

Man lernt so viel als #orclapex APEX Rookie :-)

 

Mittwoch, 12. August 2020

komische Zeichen in einem Bericht bei Reports 12c

Hallo,

mir ist wieder etwas Komisches passiert. Dabei habe ich nur einfache Änderungen an einem bestehenden Report eines Bestandskunden gemacht. Das Ergebnis war nicht gut und ist hier als Vorher und Nachher-Bild zu sehen.




Die Rahmenbedingungen bei dem Setup sind:

  • Entwicklungsplattform ist Windows
  • Zielsystem ist Linux
  • Reports Version ist 12.2.1.2.0
  • Zeichensatz ist ein GERMAN_GERMANY.WE8MSWIN1252
Noch etwas zum Schmunzeln: Wenn man diesen Report auf einem Windows-System aufruft, wird alles korrekt dargestellt.

Öffnet man die PDF-Ausgabe von dem Bericht, sieht man, dass sich dort eine Schriftart Symbol eingenistet hat. Dabei soll die alleinige Schrift Times New Roman sein.


Nach einer Suche im MyOracleSupport habe ich die passende Notiz dazu gefunden, DocID 300416.1: Symbol Characters ("Greek") Instead Of Expected Characters Are Displayed in Reports or Reports Parameter Form (Doc ID 300416.1). Grund dafür ist ein Bug: Bug 2906401 FONT ALIASING NOT WORKING FOR ALL FIELDS WITH WE8ISO8859P15 CHARACTERSET

Die empfohlenen Lösungen sind mit einer kompletten Umkonfiguration der Fonts in Reports verbunden.

Das ging aus diversen Gründen im Moment bei dem Kunden nicht und wir haben eine andere Lösung gefunden.

Die Reports werden in das Textformat konvertiert und in dem Text werden alle Textstellen mit charset =178 nach charset =31 geändert und das File wieder in das RDF-Format zurück konvertiert. Das hilft auch, ist aber natürlich im Prinzip bei jeder Anpassung nun zu tun.

Vielleicht kann das ja hier nun jemand noch gebrauchen und sucht dann nicht so lange.

Ciao
Holger




Montag, 6. Juli 2020

Suche nach Select * im FormsAPI Master

Heute morgen erhielt ich eine Anfrage vom Service Manager eins Projektes, welches wir in unserem Kontext in der Wartung haben. Themen sind Oracle Forms, Reports, APEX, SQL, PL/SQL und die Datenbank. Die konkrete Bitte lautete: Suche mal nach "SELECT *" in allen Forms- und Reports-Modulen.

Das kann ja nicht so schwer sein dachte ich mir. Aber der FormsAPI Master als Analysetool behandelt das Zeichen * unter anderem als Wildcard. Also kam ich mit der einfachen Suche in dem Tool nicht ans Ziel.


Auch die kurze Suche in den weiten Welten des WWW brachte mir keine Lösung hervor. Eine zielführende Idee ist die Suche mit einem regulären Ausdruck in der "PowerSearch".

Der reguläre Ausdruck könnte dann so sein z.B.:
\s*select\s*[*]



Hier z.B. ein Treffer im Datenmodell eines Reports.


Test bestanden im FormsAPI Master. Hier lassen sich also mächtige Suchen im Quellcode von ganzen Anwendungen absetzen. Wen die Treffermenge noch interessiert: 262 Suchergebnisse gefunden in 481 Source-Objekten. Also knapp bei der Hälfte sind im Datenmodell von Reports, PL/SQL-Code von Objekten solche Suchkriterien gefunden worden.

Happy Searching.

Donnerstag, 18. Juni 2020

Forms-Applikation via Webstart bzw. JNLP im Microsoft Edge Browser direkt starten

Heute habe ich eine sehr interessante Frage im Oracle-Forms Forum gesehen. Jemand wollte seine Forms-Applikation im Microsoft Edge-Browser direkt aufrufen.

Bisher dachte ich, so nicht möglich, weil das eigentlich nicht gehen sollte. Applets werden von den neueren Browsern sowieso geblockt. Der Ersteller wollte die Applikation auch nicht per FSAL starten, sondern Webstart und JNLP verwenden.

Mit Webstart und HTTP-Protokoll geht das nur mit einem Zwischenschritt, indem mal das JNLP-File auf dem Client abspeichern und dann per Doppelklick starten kann.







Ein Schritt zuviel dachte der Anwender zu Recht. Die Lösung fand derjenige selbst, indem man einfach das Aufrufprotokoll im Browser ändert. Von HTTP zu JNLP und nach einem Klick auf Öffnen wird die Applikation direkt gestartet. Es kann aber gut sein, dass dann auf dem Client die Dateiendung JNLP mit dem Programm Java Web Launcher verknüpft sein muss.





Ich nehme stark an, dass das mit neueren JDK Versionen nicht mehr funktionieren wird. Bereits in JDK 11 ist Java Web Start nicht mehr enthalten. Also sicher ein Wechsel zu FSAL nötig. Das wird meiner Meinung nach auch die bislang einzige supportete Aufrufmöglichkeit werden.

Das Verfahren mit JNLP als Protokoll im Aufruf klappt übrigens auch in Google Chrome und Internet Explorer.


Cheers


Montag, 8. Juni 2020

Abhängigkeiten von Objekten ermitteln in der Oracle Datenbank (Dependency analysis)

Quelle: https://www.shutterstock.com/de/image-photo/hand-writing-dependency-marker-concept-background-676194433

Abhängigkeiten von Objekten ermitteln in der Oracle Datenbank ist der Arbeitstitel meines neuesten Eintrages hier. Dazu stehen mit nur die Boardmittel in der Datenbank zur Verfügung und keine externen Tools. Allein die Boardmittel gestatten es, auf mindestens 2 Wegen an diese Informationen zu gelangen.

Eines dieser Mittel ist PL/Scope; ein eher unbekanntes Feature der Oracle-Datenbank, welches ab der Version 11.1.0.7 standardmäßig dabei ist. Mit dem Befehl ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL'; bzw. ab 12.2. ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL,STATEMENTS:ALL'; wird die Datensammlung von PL/Scope aktiviert. Nach der Aktivierung in der Session wird bei jeder Kompilierung von Sourcecode die Abhängigkeitsanalyse durchgeführt. Die Ergebnisse können über verschiedene Data-Dictionary Views ausgelesen werden. PL/Scope habe ich selbst bei meiner Analyse nicht verwendet.

Die Ausgangsfrage des Kunden war: welche Objekte aus Schema 1 werden in Schema 2 oder 3 verwendet? Es gibt aber nicht nur direkte, sondern auch indirekte Abhängigkeiten im Programmcode zu finden. Und wir bewegen uns nicht auf Column-Ebene, sondern Objekt-Ebene.

1. Fall: die direkte Abhängigkeit

BEGIN
    FOR rec IN (  SELECT DISTINCT owner, name, type, referenced_owner, referenced_name, referenced_type
                                , referenced_link_name, dependency_type
                    FROM all_dependencies o
                   WHERE o.referenced_owner = '&v_schema'
                     AND owner != referenced_owner
                ORDER BY o.TYPE, name)
    LOOP
        DBMS_OUTPUT.put_line ('Object: ' || rec.owner || '.' || rec.name || ', Typ: ' || rec.type || ' <> Quell-Object: ' || rec.referenced_owner || '.' || rec.referenced_name || ', Typ: ' || rec.referenced_type);
    END LOOP;
END;
/
Das Suchschema bzw. Quellschema wird über die Variable v_schema abgefragt und es werden keine Referenzen aus dem eigenen Schema berücksichtigt.

2. Fall: die indirekte Abhängigkeit

Nicht ganz so einfach ist es, wenn die Abhängigkeiten "versteckt" sind. Gegeben ist das Quellschema 1, das viele Kopien wie ein Schema 2,3, oder 4 hat. Gesucht sind nun die Stellen im Zielschema, bei denen im Programmcode steht: Quellschema(1, 2, 3, 4).Quellobjekt, also z.B. TESTSCHEMA1.OBJEKT1, TESTSCHEMA2.OBJEKT2. 

Das Quellschema hat immer das gleiche Namenssuffix, z.B. TESTSCHEMA, daher gebe ich das auch fest im Suchstring an. Aber der numerische Anteil vom Owner TESTSCHEMA(1, 2, 3, 4) wird im Programmcode über eine Funktion dynamisch ermittelt. Dafür verwende ich dann das folgende SQL-Statement.

    FOR rec1 IN (SELECT table_name
                   FROM all_tables o
                  WHERE o.owner = '&v_schema'
                                         )
    LOOP
        FOR rec IN (SELECT rec.owner, rec.name, rec.TYPE, TRIM (rec.TEXT) TEXT
                      FROM all_source rec
                     WHERE owner IN ('ZIELSCHEMA1', 'ZIELSCHEMA2')
                       AND UPPER (text) LIKE '%TESTSCHEMA%.' || rec1.table_name || '%'
                   )
        LOOP
            DBMS_OUTPUT.put_line ('Object: ' || rec.owner || '.' || rec.name || ', Typ: ' || rec.TYPE || ', Source: ' || rec.TEXT);
        END LOOP;
    END LOOP;
END;
/
Das dynamische SQL im Programmcode ist dann z.B. SELECT Spalte1 FROM 'TESTSCHEMA' || get_user_id() || '.OBJEKT1'. Den ganzen Suchvorgang kann man dann auch auf Views, Procedures, Functions und Packages erweitern, indem man statt all_tables aus dem Dictionary all_objects verwendet.

Der 2. Fall ist sehr wichtig für den Kunden, weil er nicht genau weiß, welche genauen Objekte aus dem  TESTSCHEMA 1-x im Zielschema verwendet werden, daher kann nicht mit dem Operator IN auf ein paar wenige bekannte Objektnamen abgefragt werden.

Ich gebe zu, der hier beschriebene Fall ist speziell und sicher nicht alltäglich. Viel öfter kommen die Fragen: wird das Objekt X irgendwo verwendet oder in welchen DML-Statements taucht Objekt X auf? Aber vielleicht ist das Verfahren ja als Schablone für jemanden zu gebrauchen.

Montag, 23. Dezember 2019

APEX ADMIN Passwort zurücksetzen

Dies ist mein erster Post mit dem neuen Thema Oracle APEX. Ich habe in meiner Oracle Datenbank in Docker die APEX Version auf 19.2 migriert und konnte mich danach nicht mehr bei APEX anmelden, da ich das Admin Passwort nicht mehr wusste. Der Vorgang funktioniert wohl auch, wenn der ADMIN User gelockt ist.


Aber ich habe mindestens einen Beitrag gefunden, wie man wieder ein Reset machen kann. Ob der Weg auch supported ist, ist mir dann aber nicht bekannt.

Was muss ich also genau tun? Auf jeden Fall ein paar Befehle mit einen SYS-User ausführen mit SQL und PL/SQL.



Nun das Passwort ändern:


Eine andere Möglichkeit ist es noch, als SYS-User das File @apxchpwd.sql
auszuführen.


Nun aber angenehme und erholsame Feiertage und einen guten Rutsch.


Viele Grüße
Holger