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

Freitag, 13. Dezember 2019

Oracle Forms 12c in der Cloud provisionieren

Lange ist mein letzter Blog Post her und kurz vor Weihnachten muss noch etwas Neues her dachte ich mir. Vor 1 Woche war ich bei Oracle in der Geschäftsstelle München zu Besuch für einen 2-tägigen Workshop Oracle Cloud Native. Da haben wir verschiedene Cloud Services kennen gelernt und in Hands On Labs für verschiedene Demos benutzt. Dabei gab es als Goodie auch einen 30 tägigen Oracle Cloud Demo Account mit einiges Credits oben drauf.

Darauf habe ich schon länger gewartet, weil ich doch Oracle Forms 12c in der Cloud mal ausprobieren wollte. In der Theorie lautet die Ansage: in 15 Minuten ist alles lauffähig. Ich kann getrost sagen, das ist wahr. Es hat zwar mehrere Versuche gebraucht, aber dann war der Erfolg da.

Wie man das in einem Basic Setup hin bekommt, möchte ich heute demonstrieren. Los geht es mit einem Oracle Cloud Marketplace Image für Forms, welches man hier bekommt.

Mittels Button "Get App" wird mal zur Auswahl einer Region weitergeleitet. In meinem Fall wird dies die Region Frankfurt.


Nach erfolgreichem "Sign In" lande ich in der Cloud Console und mache weitere Angaben zum Sizing, Netzwerk Konfiguration, Compartment und anderen Dingen.
Achtung: für das Image gilt: Bring Your Own License




Mit "Launch Instance" geht es in die Detail Konfiguration. Für den Connect zu der neuen Instanz brauchen wir einen Public SSH Key.





Mit einem Klick auf "Create" am Ende der Seite wird die Instanz nun erzeugt.


Nachdem die Instanz erstellt wurde, geht es mit der Konfiguration der Weblogic Domäne weiter. Dazu muss man sich mit der Instanz verbinden:

ssh -i ..\workshop_key_private.ssh opc@public_ip_der_instanz


Wichtig: bei den folgenden Passwörtern hat die Eingabe mit Sonderzeichen nicht funktioniert, sondern nur eine Kombination aus Zahlen und Buchstaben.


Danach wird die Forms Weblogic Domäne konfiguriert und erstellt, was bis zu 15 Minuten dauern kann. Reports ist nicht vorkonfiguriert. Dafür muss man dann die Weblogic Domäne erweitern und danach alles entsprechend konfigurieren.


Nach weniger als 10 Minuten in meinem Fall ist die Provisionierung fertig und als nächstes verbinde ich mich mit Putty zu der Instanz und starte dort den VNC-Server (MyOracleSupport Note 2456478.1).

Vom Client starte ich den VNC-Viewer und komme auf das Linux der Instanz.



Vom Client Browser kann ich nun die Forms Test-Seite aufrufen.

Vom VNC Desktop oder dem lokalen Client kann ich den FSAL aufrufen. Erstmal FSAL lokal herunterladen mit http://localhost:9001/forms/html/fsal.htm


Von der Konsole dann starten: java -jar frmsal.jar -url "http://localhost:9001/forms/frmservlet?config=standaloneapp" -t 10000 -showConfig true



Damit ist die Grundinstallation abgeschlossen und die Testseite von Forms läuft erfolgreich. Und das alles in knapp 15 Minuten.

Für Reports und die Konfiguration der eigenen Applikationen benötigt es natürlich noch weitere Zeit. Aber das bekommt man sicherlich auch noch hin. Besonders kompliziert war das Ganze nicht und bis auf die Eigenheiten bei den Passwörtern auch recht intuitiv.

Nachtrag:
Um sich mit WinSCP auf die Maschine zu verbinden, sei folgender Link sehr empfohlen:
http://sharabinth.blogspot.com/2017/10/configure-winscp-to-use-sftp-with.html

Das hat sofort funktioniert.

Viel Freude beim Ausprobieren wünscht
Holger

Freitag, 23. November 2018

DOAG 2018 Konferenz in Nürnberg - ein paar Erkenntnisse von mir

Schon ist die DOAG 2018 Konferenz in Nürnberg wieder vorbei - 3 Tage voller Trubel und geballten Informationen rund um den großen roten Oracle-Riesen in Germany. Im Vorfeld hatte ich schon die für mich interessanten Vorträge, Themen und mögliche Gesprächspartner herausgefiltert. Meine 3 Top-Themen waren: Oracle Forms, Weblogic Server und DevOps.

Man merkt immer mehr, wie das Thema DevOps endlich bei Oracle ankommt. Gibt es doch schon die Datenbank im Docker Container, den Weblogic Server ebenfalls. Oracle Forms kann darin laufen und auch der Weblogic Server ist für Kubernetes zertifiziert.

Wie die letzten Jahre schon üblich, fand am Dienstag Abend wieder das Forms Community Meeting statt. Da wurde der Product Manager Michael Ferrante wieder zu Themen rund um Forms und Reports befragt.

Quelle: von Auraplayer
Die Erkenntnisse davon, aus den Vorträgen und persönlichen Gesprächen mit dem Product Manager reihe ich nun mal in Kurzform auf. Der Rest ist auf den offiziellen Folien zu finden. Alles was im Folgenden kommt, ist noch nicht offiziell (vergleiche Safe Harbor Statement von Oracle) und muss so nicht unbedingt eintreten.

  • Es ist möglich, dass es ein Reports 19 Release geben wird
  • Forms 19 ist ein Patch Release (also eigentlich ein 12.2.1.4.0) und kommt im Kalenderjahr 2019
  • Der Forms Standalone Launcher (FSAL) bekommt einige Neuerungen und Verbesserungen, unter anderem den Single Sign-On Support
  • Forms 20 wird wohl auch ein Patch Release
  • Forms wird wohl noch weit über 2030 hinaus leben, vergleiche Lebenszyklus der Oracle E-Business Suite
  • ein signifikantes neues Feature ist der Support von Forms im Developer Cloud Service
  • Forms 19+ soll Java 11 LTS unterstützen
Quelle: Oracle 
Quelle: Oracle

Weitere interessante Themen auf der DOAG waren:

  • Revival von utPLSQL mit 2 tollen Vorträgen
  • DevOps Vorträge rund um verschiedene Oracle Komponenten
  • APEX Neuerungen in 18.1 und forward
  • verschiedene Cloud Themen
  • und und und
Am Ende gingen die 3 Tage in Nürnberg wieder viel zu schnell vorbei. Das ist ja irgendwie immer so. Neben viel Austausch gab es einen Haufen an Informationen zu aktuellen Themen und Trends. Was nicht wirklich gut für Oracle ankam, waren die Ergebnisse einer Support Umfrage der DOAG zur Zufriedenheit mit dem Oracle-Support (siehe Link ). Tendenz: weiter sinkende Zufriedenheit, das sollte der Hersteller wirklich ernst nehmen.
Nun bleibt mir nur noch zu sagen: bis zur #DOAG2019 und früher.

Viele Grüße
Holger