Posts mit dem Label Allgemein werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Allgemein werden angezeigt. Alle Posts anzeigen

Samstag, 25. November 2017

Mein persönlicher Rückblick auf die #DOAG2017

Nach 5 jähriger Abstinenz von der DOAG Hauptkonferenz hatte ich endlich wieder das Vergnügen, dieses Jahr vom 20-23.11.2017 dorthin zu können. Die Anreise am Montag verlief leider dank der deutschen Bahn alles andere als glücklich (es gab 90 Minuten Verspätung) und so verpasste ich leider das #ACE Dinner, das Martin Klier angesetzt hatte.


Im Vorfeld schon grob das Veranstaltungsprogramm mit den möglichen Sessions zusammengesucht, war ich ganz gut vorbereitet für den ganzen Marathon an Vorträgen. Dafür aber auch noch ein paar persönliche Gespräche angesetzt, mit ehemaligen Kollegen, mit Forms Gleichgesinnten und besonders mit Michael Ferrante, dem Oracle Forms Product Manager. Mein persönlicher Fokus bestand natürlich hauptsächlich auf Forms, SQL, PL/SQL, APEX, Weblogic und Docker Sessions und meine Erwartungen daran wurden auch erfüllt. Dazu später aber noch mehr.

Der Dienstag stand ganz unter dem Zeichen von Forms Vorträgen, die Kollegen haben mich später gefragt, wo ich denn den ganzen Tag lang war. Meine Antwort: von einer Session zur nächsten. :-) Die Referenten für Forms waren u.a. Mia Urman, Michael Ferrante, Jürgen Menge, Gerd Volberg. Am Abend gab es dann das Forms Community Meeting, das sehr gut besucht war. Dort konnten wir M. Ferrante alle Fragen stellen, die uns run um Oracle Forms beschäftigen. Teilweise sehr interessante Dinge, die hoffentlich noch kommen werden. Eins scheint unumstößlich: selbst Oracle Forms soll es angeblich in die Cloud schaffen.







Das war also der erste Tag, im Rückblick der spannendste für mich von den 3 Veranstaltungstagen. Abends ging es dann mit der DOAG DB Community in der Nürnberger Altstadt zum gemütlichen Ausklang.

Am 2. Tag war ein Tag ohne Forms Vorträge, dafür gibt es ja genug andere Themen. Ganz oft gab es zumindest für mich viele interessante parallele Sessions, da war entscheiden angesagt. Wie immer ein ganz großes Angebot auf der DOAG. Ich meine gehört zu haben, dass die Hälfte aller Einreichungen an Vorträgen abgesagt werden musste.
  • Ausfallsicherheit für den Weblogic Admin Server
  • Goldene Regeln für schlechte Programmierung
  • intelligente Chatbots
  • SQL Magic
  • APEX REST Services in 5.2
  • PL/SQL API 
  • Docker for Dummies
Und schon war der letzte Tag da, der Donnerstag. Das war ein gemischter Tag, den ich mit ein paar Vorträgen und vielen Gesprächen verbracht habe. Highlight des Tages waren u.a. der persönliche Talk mit einem umkomplizierten Michael Ferrante und einem Vortrag von Adam Lukaszewski zum Thema Boost your Forms Development with GIT and Forms API Master. Dabei wurde schon gezeigt, wie man mit Hilfe von Git, dem Forms API Master und dem Mergetool parallel an Forms Objekten entwickeln kann, auch mit mehreren Branches. Das kannte ich so bisher auch noch nicht, denn sonst hieß es ja immer, Mergen von binären Objekten geht nicht.



Was soll ich sagen? Es waren tolle informative Tage in Nürnberg, mit gutem Austausch und neuen Erfahrungen. Neue Türen geöffnet und viele bekannte Gesichter gesehen und gesprochen. Wenn mich jemand fragt, würde ich sagen: es hat sich total gelohnt. Vielen Dank natürlich an die DOAG für die tolle Vorbereitung und Planung und an meinen Arbeitgeber, der mir das ermöglichte. Nächstes Jahr bin ich hoffentlich auch selber wieder mit einem Vortrag dabei. Ganz persönlich fand ich auch die Leute von Oracle sehr angenehm und menschlich. Ein paar Bilder für diesen Beitrag habe ich von anderen Twitteren genommen, ich hoffe das ist ok.

Viele Grüße
Holger

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

Donnerstag, 19. Januar 2017

Einige Einblicke vom DOAG Forms Day am 18.01.2017 in Berlin - Das Treffen der Gefährten


Ja ja jetzt kommt der erste Beitrag in 2017 in meinem Blog, ein sehr ausführlicher Beitrag zum 1. DOAG Forms Day am 18.01.2017 in Berlin in den Geschäftsräumen von Oracle Berlin. Diese Veranstaltung zum gegenseitigen Austausch der Oracle Forms Anwender wurde auf dem Dev Camp 2016 erfunden und hat jetzt gestern stattgefunden. Vorweg es waren über 60 Teilehmer da, Bombe. Und jemand aus den USA würde sagen: All the german Forms Gurus are on stage.

Bevor es morgens losging, habe ich noch ein bisschen Tourist gespielt und mir 2 Sehenswürdigkeiten angeschaut: das Brandenburger Tor und den Reichstag, die lagen quasi am Weg.


Jetzt kommen wir aber zur Agenda des Tages, die mit zahlreichen Vorträgen ausgefüllt war. Ziel der Veranstaltung war ein Austausch zwischen Oracle und den Anwendern, Wissensvermittlung und Networking zum Thema Forms.

Die besten Sätze vorweg: für die nächsten 8 Jahre ist der Support und die Weiterentwicklung von Forms sicher gestellt, danach steht vielleicht ein großer Umbruch bevor :-)

Der erste Vortrag von Frank Hoffmann beschäftigt sich mit der Frage, wie man Forms fit für die nächsten 20 Jahre machen kann. Er vergleicht dabei irgendwie sehr passend, Forms und seine Entwickler (Jünger) mit vielen Gestalten aus dem Film "Herr der Ringe". Die Message ist klar: die Technik ist ausgereift, robust und die Entwickler sind oft ab 50 Jahren aufwärts. Es fehlt also die neue Generation junger Entwickler, die den Job fortsetzen. Und Forms soll ja nicht das "neue" COBOL werden.




Nummer 2 kam von Jan Peter Timmermann mit dem Thema "Forms und Reports 12c Installation und Administration" mit vielen spannenden Skripten und Tipps zur Installation der Infrastruktur.

Nächster Slot war Mark Eichhorst mit Tipps zur Oberflächen-Modernisierung bei Forms vor allem mit PJCs und Java Beans. Damit lassen sich natürlich sehr schöne Sachen machen, siehe auch meinen Beitrag zum hübschen System der Firma Sensis.


Nach der Mittagspause zeigte uns Jürgen Menge, wie man Teile einer Forms-Anwendung Mobil machen kann, mit Tools wie Auraplayer und den Cloud-Services von Oracle. Wichtig: Nicht die gesamte Anwendung kommt in die Cloud, sondern sinnvolle Teile, die durch bestimmte Use-Cases identifiziert werden müssen. Aber es geht!

Danch kam auch ein spannendes Thema von Stephan La Rocca: Die Zukunft des Reporting, da ja Oracle Reports offiziell abgekündigt ist. Es gibt offiziell von Oracle als Empfehlung den BI Publisher, ein anderes Open Source Tool ist JasperReports. Das Tool gibt es nicht und schon gar nicht eine automatische Migration der vorhandenen Reports, meist ist eine aufwändige Neu-Implementierung nötig. Aber auch sein Fazit: muss es ein neues Tool sein oder sollte man nicht seine komplette Reporting-Strategie in Zeiten der Digitalisierung neu überdenken.


Vorletzte Session kam von Friedhold Matz: Entwicklung eines Frameworks in Forms 12c - Light Version. Das soll bald auch noch online gestellt werden.


Der letzte Teil war mit einer der wichtigsten, initiiert von Gerd Volberg: Wie geht es mit der Forms Community weiter? Dafür setzten wir uns nach einer kurzen Einführung in einen Kreis und diskutierten zusammen.


Was bereits von Gerd, Frank und Jürgen eingerichtet wurde:
  1. der Forms 12 Demo Server https://forms12c.de mit einigen Demos
  2. das DOAG Github für Forms: https://github.com/Doag/Forms
  3. die Community-Seite https://community.oracle.com/community/other-languages/deutsche-oracle-entwickler-community/forms-developer-community
In den Demos sollen demnächst alle Interessierten Demos bereitstellen, was mit Forms 12 alles gemacht werden kann, ähnlich wie bei der APEX-Community. Denn jeder sucht mal etwas, hat eine Frage und kann auch Input bei Fragestellungen geben. Damit der Wissensaustausch auch weiter voran schreiten kann.

Aus meiner Sicht war dieser Tag ein voller Erfolg, der hoffentlich 2018 wiederholt wird. Vielleicht auch noch ein 2. mal in diesem Jahr in Verbindung mit ein paar Report-Themen. Man konnte sehr viel mitnehmen und es wurde offen über viele Themen geredet.

Danke an Berlin, die DOAG und die 3 Vorreiter Gerd, Frank und Jürgen.

Viele Grüße
Holger

Montag, 6. Juni 2016

Forms mal generisch: alle Items eines Blockes verstecken und wieder einblenden

Dieser Beitrag kommt aus der praktischen Arbeit heraus gerade. Der Kunde hat die Anforderung: fast alle Items eines Datenblockes nach Klick auf einer Checkbox ausblenden und wieder einblenden danach. Da ich mir durchaus vorstellen kann, dass das auch woanders vorkommen könnte, möchte ich meine favorisierte Lösung vorstellen.

Die Lösung dazu ist entweder sehr trivial oder mit ein bisschen mehr Invest auch schöner, dafür aber anspruchsvoller umsetzbar.

Meine 1. Idee (trivialer Ansatz) war: alle Items nacheinander mit ihrem Namen ansprechen und dann ausblenden. Einfacher Ansatz, aber viel Tipperei, evtl. ein Item vergessen und Wiederholungen. Und ich stehe ja mehr auf Wiederverwendbarkeit und generische Ansätze.

Code dafür:
pkg_item.verstecken('BLOCK.ITEM1'); bis pkg_item.verstecken('BLOCK.ITEM32');
Dazu sollten auch alle Eingaben gelöscht werden.
:BLOCK.ITEM1 := NULL;

pkg_item.verstecken('BLOCK.ITEM1'); macht einfach
set_item_property ('BLOCK.ITEM1', visible, property_false);

Nun der generische und schönere Ansatz:
1. merken einiger Felder, die immer sichtbar sein sollen:
          v_currentblockp := 'BLOCK.';
          v_ausnahme_felder := v_currentblockp || 'ITEM12 ';
          v_ausnahme_felder := v_ausnahme_felder || v_currentblockp || 'ITEM13 ';

2. den Block durchgehen und alle Felder ausblenden und ggf mit COPY auf NULL setzen:
      LOOP
         v_currentitem2 := get_item_property(v_currentitem,nextitem);
         v_currentitem:= v_currentblockp || v_currentitem2;
         -- Ausstiegskriterium, wenn Current Item leer ist (also nur der Blockname)
         IF v_currentitem = v_currentblockp THEN
              EXIT;
         END IF;   
        
         -- Item darf nicht in der Ausnahmeliste sein(sonst wird es unsichtbar)
         IF INSTR(v_ausnahme_felder, v_currentitem ) = 0 THEN
           IF GET_ITEM_PROPERTY(v_currentitem,visible)= 'TRUE'  THEN
                  -- Felder leeren
                  IF GET_ITEM_PROPERTY(v_currentitem,ITEM_TYPE) IN
                       ('TEXT ITEM', 'LIST',  'DISPLAY_ITEM') THEN
                       COPY(NULL, v_currentitem);
                  END IF;  
                 
                 -- Felder verstecken (unsichtbar machen)                 
              pkg_item.verstecken(v_currentitem);
           END IF;         
         END IF;
      END LOOP;

3. das Sichtbar machen funktioniert ähnlich mit einer Besonderheit: der Block hat auch Felder, die sollen gar nicht sichtbar werden (Control-Items usw.). Um das Ganze mit einer Logik zu versehen, habe ich mir beim Start der Maske alle Felder gemerkt, die dann auch sichtbar sind und nicht zu meinen o.g. Ausnahmen gehören. Danach stehen in der Variable v_filter_items alle Felder, die ich nach einem Ausblenden auch wieder sichtbar machen will.

         IF INSTR(v_ausnahme_felder, v_currentitem ) = 0 THEN
           IF GET_ITEM_PROPERTY(v_currentitem,visible)= 'TRUE'  THEN
                 v_filter_items := v_filter_items || v_currentitem || ' ';
           END IF;         
         END IF;

Jetzt noch der Loop zum Sichtbar machen mit dem Zusatz auch die Felder wieder zu enablen:
     v_currentblockp := 'BLOCK.';
     LOOP
          v_currentitem2 := get_item_property(v_currentitem,nextitem);
         v_currentitem:= v_currentblockp || v_currentitem2;
         -- Ausstiegskriterium, wenn Current Item leer ist (also nur der Blockname)
         IF v_currentitem = v_currentblockp THEN
              EXIT;
         END IF;   
        
         -- Item muss aber in der Liste der sichtbaren Felder sein und nicht in der Ausnahmeliste
         IF  (INSTR(v_filter_items, v_currentitem ) != 0 AND INSTR(v_ausnahme_felder, v_currentitem ) = 0) THEN
           IF GET_ITEM_PROPERTY(v_currentitem,visible)= 'FALSE'  THEN
                  -- Felder wieder anzeigen und enablen
                  pkg_item.zeigen(v_currentitem);
                 
                  IF GET_ITEM_PROPERTY(v_currentitem,ITEM_TYPE) != 'DISPLAY ITEM' THEN
                       pkg_item.enable(v_currentitem);
                  END IF;  
           END IF;         
         END IF;
      END LOOP;

Ein Screenshot von der Maske mit den ausgeblendeten Feldern (diese ist nicht mehr schön, weil sie auch Frames enthält, die aber sichtbar bleiben sollen). Die Schaltflächen und die 4 Eingabefelder (weiß) sind in meinem Beispiel die Ausnahmefelder und von der Logik ausgenommen. Diese layouttechnisch unschöne Lösung war aber kostengünstiger als eine neue Version der Filtermaske.


Wie man erahnen kann, ist diese Lösung universell einsetzbar und auch noch weiter auszubauen. Ich denke daran, z.B. diese Felder konfigurierbar in einem DB-Schema zu speichern vielleicht. Damit wären dann user-spezifische Varianten zu erreichen.

Viele Grüße
Holger

Samstag, 19. März 2016

Der Blick über den Tellerrand zur agilen Szene - 5. "Agile Cologne" und 50. Scrumtisch Köln

"Stillstand ist der Tod" - so möchte ich meinen heutigen nicht technischen Beitrag beginnen. Denn wer irgendwann stehen bleibt, kann sich meiner Meinung nicht weiter entwickeln.

Begonnen hat der ganze Transformationsprozess in unserem Team vor mehr als 1 Jahr. Der Hauptgrund dafür waren neue Strukturen nach Wechsel des Teamleiters, der sich neuen Aufgaben gewidmet hat. Sein Nachfolger war schon etwas infiziert mit dem Wind von neueren Methoden, wie sich das Team fortan organisieren könnte. Als Experiment wurde Kanban verprobt mit dem Ziel von weniger Bürokratie, mehr Transparenz, besserem Wissenstransfer und entsprechend höhere Selbstorganisation.


Wir haben viel experimentiert, über die Ergebnisse retrospektiviert und immer wieder neue Einflüsse auf uns wirken lassen. Auch haben wir über Software-Lösungen nachgedacht, sind uns aber einig, dass uns das physische Board am besten gefällt. Mit der Hilfe von Kollegen, die auf diesem Gebiet schon besonders firm sind, konnten wir auch eine kontinuierliche Verbesserung des Boards erreichen.

Nach diesen Erfahrungen kam bei mir und einem Kollegen der Wunsch auf, unsere Erfahrung in diesem Themengebiet zu vertiefen und wieder neue Luft zu schnuppern. Am Freitag 11.03.2016 findet in Köln im Mediapark die 5. "Agile Cologne" statt, eine ganztägige Veranstaltung mit ca. 150 Teilnehmern zum Thema "Agile". Die ganze Zeit wird in parallelen Streams im Open Space Format abgehalten, d.h. in Summe ca. 40 Session á eine Stunde Dauer.


Meine Sessionplanung:
  1. Lässt sich Selbstorganisation / agil verordnen?  11.30-12.30
  2. Die gelben Stämme - Yello Strom wird agil       12.30-13.30
  3. Einfach mehr schaffen                                        13.30-14.30
  4. You build it - You run it                                      14.30-15.30
  5. Warum scheitern immer mehr Scrum Projekte   15.30-16.30
  6. Agile Church                                                       16.30-17.30
Zu meinen Eindrücken schreibe ich später nochwas. Angeregt durch die neuen Themen, wollte ich auch den 50. Scrumtisch fast an gleicher Stelle besuchen, nur 5 Tage nach der Agile Cologne. Mehrere neue Gesichter waren mir bereits bekannt, so dass man sich fühlt, als wäre man schon ewig dabei. Der Scrumtisch ging von 19 - 22 Uhr am Mittwoch. Ebenso gab es wieder Sessions im Open Space. Dadurch ist der Austausch viel intensiver als bei reinen Vorträgen, gepaart mit direkten Diskussionen.



Nach einer kurzen Vorstellungsrunde zu den 2 Fragen: "Warum bin ich hier" und "Was für ein Jubiläum hatte ich kürzlich" wurden schon die Sessions geplant und dann ist der Scrumtisch gestartet.

Was bleibt?
Ich für mich fand es als Bereicherung in die neuen Welten der Agilität zu schnuppern. Auch wenn ich momentan keine Veränderung dahin in diese Richtung plane, ist der Austausch damit für mich aber besonders wertvoll. Einerseits um Wissen aufzusaugen und andererseits das Wissen mit zu nehmen und weiter zu verteilen oder auch vielleicht etwas davon ins Team zu transportieren. Agilität und alles was damit zusammen fällt, ist auch sicher kein Allheilmittel. Aber es bringt neue Ideen und Methoden in die sich verändernde Arbeitswelt, warum also nicht davon profitieren. Ich denke, ich werde auch weiter die Scrumtische besuchen, in diversen Büchern schnuppern und versuchen auch davon zu lernen. Aber auch bei uns in  der Firma gibt es schon den Open Space, die Retrospektiven, Lean Cafe und andere Aspekte der agilen Welt, die sicher immer weiter ein Teil unserer Methodik wird. Ich finde das Thema jedenfalls sehr spannend.

Viele agile Grüße
Holger

Mittwoch, 16. März 2016

Die Ablösung von "SuperMario" - oder das Thema "ReadOnly"


Diesen Artikel hat mein Opitz-Kollege Jürgen von Wachtendonck für unser Intranet verfasst. Das Konzept der folgenden Idee haben wir zusammen erarbeitet und verprobt. Alle Original Projekt- und Kundennamen wurden durch Ersatzkonstrukte aus meiner Fantasie ersetzt. Technologisch bewegen wir uns im PL/SQL, Datenbank und Forms Umfeld der Firma Oracle.

Dieser Artikel betrachtet die unterschiedlichen Aspekte, die bislang bei den Arbeiten an der Ablösung von <SuperMario> für das ehemalige <Firma1>-Team zum Tragen gekommen sind. - Nur kurz für diejenigen unter euch, die es vielleicht noch nicht wissen: 
"<SuperMario>" heißt die von unserem Team über viele Jahre hinweg entwickelte und betriebene Lösung bei <Firma1>. - Auch wenn die Umsetzung über normale <SuperMario>-Tickets erfolgt, so handelt es sich dennoch um ein großes Projekt: Es handelt sich um das größte Arbeitspaket, welches wir bei <Firma1> seit Jahren umgesetzt haben. 

Im Oktober 2015 haben wir begonnen, ein stabiles und tragfähiges Konzept zu entwickeln. Das Konzept ermöglicht eine abschnittweise Ablösung von <SuperMario> mit einer zeitversetzten Datenmigration, die nicht an die Releasezyklen der Anwendung gebunden ist. Wesentliches Ziel ist es, eine Datenmigration durchzuführen, ohne dass es bei der abzulösenden Anwendung <SuperMario> zu technischen Problemen kommt.

Worum geht es bei dem Projekt?
Seit Jahren gibt es Bestrebungen, die Anwendung <SuperMario> oder Teile der Anwendung abzulösen. Im Gespräch waren die Auslagerung von Modulen wie des Java-Clients oder die Ablösung von <SuperMario> durch eine Standardsoftware im Rahmen des <Himmel>-Projekts. Zu einer erfolgreichen und vollständigen Ablösung ist es bisher allerdings noch nicht gekommen. 

Nachdem <Firma2> <Firma1> gekauft hat, wurde beschlossen, dass die Planungstools bei <Firma2> erhalten bleiben und die Tools von <Firma1> abgelöst werden sollen. Diese Festlegung veränderte die Rahmenbedingungen. Seit dieser Entscheidung wird gezielt daran gearbeitet, die "überflüssigen" Tools abzulösen. 

In Zusammenarbeit mit <James Bond>, unserem direkten Ansprechpartner bei <Firma1>, haben Jürgen  und ich ein tragfähiges Konzept für <SuperMario> entwickelt, welches den Übergang der Verantwortung von verschiedenen fachlichen Bereichen von <Firma1> zu <Firma2> abbildet. Ziel ist es, die Bereiche in der Anwendung <SuperMario>, die nicht mehr in der Verantwortung von <Firma1> sind, auf "ReadOnly" zu setzen. 

Fachlicher Ansatz
Es ist geplant, dass der Wechsel der Verantwortung von <Firma1> zu <Firma2> sukzessive erfolgen wird. Aus diesem Grund ist es erforderlich, eine Konstruktion zu erstellen, die sicherstellt, dass Daten in den einzelnen Bereichen nur noch in dem verantwortlich führenden Tool angelegt, bearbeitet und gelöscht werden können. 

Durch diese Vorgabe muss für jede betroffene Tabelle und für jeden einzelnen Datensatz in den betroffenen Tabellen zu jeder Zeit die Datenhoheit eindeutig zu ermitteln sein. Weil das konkrete Vorgehen bei der Datenmigration noch nicht festgelegt wurde, haben wir eine Konstruktion aufgebaut, in der es möglich ist, die Datenhoheit für einen Teil der Datensätze bereits von <Firma1> zu <Firma2> zu übertragen. Gleichzeitig können aus <SuperMario> immer noch neue Datensätze in die entsprechenden Tabellen geschrieben werden, weil die Datenhoheit für diesen Bereich noch bei <Firma1> liegt. 

Technisches Konzept "ReadOnly"
Wichtig ist an dieser Stelle die Statements 'Insert' und 'Update und Delete' getrennt zu betrachten, weil die Datenhoheit für einzelne Datensätze schon vor der Übergabe der jeweiligen Tabelle an <Firma2> übergehen kann. 

Alle betroffenen Tabellen werden um eine Spalte "Besitzer" erweitert, damit es möglich ist, die Datenhoheit für den einzelnen Datensatz zu ermitteln. Dieser Wert steuert, ob ein Update oder Delete für den Datensatz abgesetzt werden darf. 

Für jede betroffene Tabelle wird ein Eintrag in einer Steuertabelle erstellt, in der der Besitzer für die Tabelle gespeichert ist. Solange die Datenhoheit der Tabelle bei <Firma1> liegt, ist es möglich in der Tabelle neue Datensätze anzulegen. Diese neuen Datensätze unterliegen immer der Datenhoheit von <Firma1>. 

Die Prüfung der Statements wird durch neue Trigger auf allen betroffenen Tabellen gewährleistet, die jeweils prüfen, ob das abgesetzte Statement erlaubt ist oder nicht. Im Fehlerfall wird eine Exception mit eindeutiger Fehlernummer ausgelöst, welche die Verarbeitung abbricht. Um sicher zu stellen, dass es für uns möglich bleibt alle Daten in einer Datenbereinigung verarbeiten zu können, haben wir eine Package-Variable definiert, die bestehende Verbote aufhebt. Mit dieser robusten und einfachen Konstruktion stellen wir sicher, dass auf der Datenbank keine unerwünschten Datenänderungen mehr erfolgen können. 

An dieser Stelle hatten wir datentechnisch, d. h. auf der Datenbank, bereits eine sichere Lösung erreicht. Offen war an dieser Stelle noch, wie die Anpassungen in der Anwendung <SuperMario> aussehen sollen. Hier haben wir verschiedene Aspekte diskutiert und letztlich gemeinsam mit dem Kunden entschieden, dass es nicht darum gehen kann, dass sich der Anwender "wohlfühlt". Wichtig ist, dass er die nötigen Informationen erhält. 

Um dies zu gewährleisten, müssen die erforderlichen Informationen an allen Stellen in <SuperMario> dargestellt werden, an denen Daten aus den betroffenen Tabellen dargestellt und/oder bearbeitet werden. Die im Folgenden beschriebenen Änderungen wurden alle in Oracle Forms umgesetzt: 

Für jeden Datensatz einer betroffenen Tabelle wird die Darstellung in der Anwendung um das jeweilige Besitzer-Flag ergänzt. So kann der Anwender erkennen, wer für den einzelnen Datensatz verantwortlich ist. Zusätzlich wird für die jeweilige Tabelle ein Info-Feld angelegt, das sichtbar wird, sobald die Datenhoheit für die Tabelle an <Firma2> übertragen worden ist. Im Einzelfall werden Buttons deaktiviert, wenn sie im Hintergrund Daten in die betroffenen Tabellen schreiben. 

Dem Endanwender wird grundsätzlich die Freiheit gelassen, alle Daten zu bearbeiten. Wenn Daten nicht mehr in <SuperMario> gespeichert werden dürfen, so wird dies durch die Trigger auf der jeweiligen Tabelle verhindert. Die oben beschriebene Exception wird in <SuperMario> gezielt abgefangen und mit einer sprechenden Meldung dargestellt. Eventuelle Veränderungen der Daten in einer Maske werden automatisch zurückgerollt und der Ursprungszustand der Daten wieder hergestellt. 

Stufenweise Umsetzung
Wichtig ist beim Thema ReadOnly eine robuste Umsetzung, die sicherstellt, dass keine fehlerhaften Daten auf der Datenbank ankommen können. Nach den konzeptionellen Überlegungen haben wir eine beispielhafte Teilumsetzung als "Proof of Concept" erstellt. Diese Umsetzung hat <Firma1> intensiv geprüft. Erst nach erfolgreichem Abschluss dieser Prüfungen wurden die betroffenen Bereiche fachlich in einzelne Phasen unterteilt, damit die Projekte überschaubar abgewickelt werden können.
So haben sich bis heute drei Phasen ergeben:
  • Proof of Concept
  • Phase 1 (<Fachliches Objekt 1>, <Fachliches Objekt 2>, <Fachliches Objekt 3>, und anderes)
  • Phase 2 (<Fachliches Objekt 4> und Fachliches <Objekt 5>)

Ob wir weitere Phasen umsetzen werden, ist zurzeit nicht klar, weil die Möglichkeit besteht, dass <Firma2> <SuperMario> vorher stilllegt und die verbleibenden Daten im Anschluss in die eigenen Systeme migriert. Wenn sich allerdings abzeichnet, dass die Übergangsphase noch länger dauert, wird das Projekt ReadOnly voraussichtlich noch weitere Bereiche in <SuperMario> entsprechend bearbeiten. 

Wie sind unsere Erfahrungen in diesem Projekt?
Unsere Erfahrung mit dem gewählten Vorgehen ist sehr gut und alle Beteiligten zeigen sich mit dem technischen Ansatz sehr zufrieden. Allerdings ist der Entwicklungs- und Testaufwand ist im Vergleich zu den anderen Tickets, die wir derzeit bei <Firma1> umsetzen, sehr hoch. Aus diesem Grund gab es in Zusammenarbeit mit <Firma1> leider auch einige Unstimmigkeiten:

Die Erwartungshaltung der Gegenseite zum zeitlichen Aufwand war immer deutlich niedriger, als der von uns geschätzte und der tatsächliche Aufwand. Dies passierte sowohl in Phase 1 als auch in Phase 2. Bei Phase 2 gab es sogar eine zeitliche Planung der Fertigstellung, die nicht mit uns abgestimmt war. Möglicherweise wäre hier ein anderer Ansatz zielführender gewesen, nämlich eine möglichst frühe Umsetzung ohne eine konkrete lückenlose Spezifikation nach dem Wasserfallmodell. Das hätte wesentlich schneller Ergebnisse geliefert, dabei wären aber mögliche anzupassende Module eventuell vergessen worden. Der Auftraggeber hatte jedoch explizit eine Schätzung verlangt, wie lange die Umsetzung dauern wird. 

Wir haben aus diesen, für alle Beteiligten, unangenehmen Situationen gelernt. Die anschließend aufgeführten Punkte beziehen sich natürlich auf dieses Projekt und lassen sich bestimmt nicht 1:1 auf andere Projekte übertragen, trotzdem können sie vielleicht dem ein oder anderen von euch in ähnlichen Situationen helfen.
  • Früh über erste/ungefähre Schätzungen oder sogar über das Bauchgefühl sprechen
  • Früh über Kosten, Zeit, zeitliche Planung und Verfügbarkeiten sprechen
  • Möglichst früh konkrete Erwartungshaltungen der anderen Beteiligten abholen
  • Zeitplanung/Meilensteine und Prioritäten des Auftraggebers abfragen, insbesondere wenn nichts kommuniziert ist
  • Nicht von gleichen Annahmen ausgehen, was Zeit, Aufwand, Planung etc. betrifft, selbst wenn die unbestimmte Beschreibung gleich ist. (Begriffe können im Kontext unterschiedlich belegt sein, wie z.B. schnell, einfach, zügig, komplex, schwierig, wichtig, …)
  • Sich fragen, ob man durch die Brille des Auftraggebers schauen kann.
    Was passiert, wenn der Auftraggeber nicht die Brille des Dienstleisters aufhat?
  • Prüfen, ob alle Beteiligten über alle Punkte (Aufgabe, Zeit, usw.) vollständig kommuniziert haben
Zum Schluss möchten wir noch erwähnen, dass wir von <Firma1> eine Person an die Seite gestellt bekommen haben, welche die durchgeführten Änderungen in der Anwendung testet. Wir müssen teilweise fachlich und technisch unterstützen. Was uns dabei sehr gut gefällt, ist die Tatsache, dass diese Person auch in anderen Bereichen für den Test von Anwendungen verantwortlich ist. Unsere Änderungen werden daher über den Entwicklertest hinaus sehr ausführlich getestet. Aus unserer Sicht ist das dem Thema ReadOnly angemessen und wir begrüßen dies auf jeden Fall. So können wir uns auf die fachlichen Anforderungen und die technische Umsetzung konzentrieren.
Und nun noch ein schönes Schlusswort …    

… ein Zitat vielleicht?
"Der Langsamste, der sein Ziel nicht aus den Augen verliert, geht noch immer geschwinder, als jener, der ohne Ziel umherirrt." (Gotthold Ephraim Lessing)

Schönen Gruß
Jürgen und Holger

P.S.: Gerne stellen wir dieses Thema auch näher bei einem DOAG-Vortrag vor.

Donnerstag, 25. Februar 2016

Erkenntnisse vom DOAG DevCamp 2016 durch die Forms Brille oder das tote Forms ist doch nicht tot

Gestern habe ich ja bereits im Unternehmensblog "The Cattle Crew Blog" meine Erfahrungen vom DOAG DevCamp 2016 gepostet. Heute gehts bei mir hier mit weiteren Informationen zu den Forms Themen weiter. Zuallererst noch 2 schöne Bilder von der tollen Location des Hotels in Bonn.


 


Bei der ersten Session von Andreas Koop kam schnell die Erkenntnis auf: der Kunde oder der Entwickler hat die Qual der Wahl bei der Technologieauswahl zur Lösung einer speziellen Aufgabe, es gibt nur selten eine einzige sinnvolle Art der Umsetzung.


Danach wurden die Sessions für Tag 1 eingereicht und die Twitter-Hashtags ausgerufen.


Jetzt kommt im Screenshot die Erkenntnis des Tages, mehrfach bereits propagiert und immer wieder das Gegenteil bewiesen.






Mein Kollege Gerd Volberg durfte auch eine Impulssession zum Thema Forms 12c halten. Nach der Präsentation der Neuerungen setzten wir uns in einen Stuhlkreis, um über die folgenden Fragen zu diskutieren:


Dabei kamen spannende Thesen und Informationen heraus.

  • Forms ist etabliert, erwachsen, sehr robust und hat schon viele spannende Java Hypes überlebt
  • In der Standardauslieferung sind die Masken starr, grau und altbacken, daher wird vermutlich keine Neuanwendung mehr mit Forms entwickelt und der Vertrieb wird das Produkt nicht mehr aktiv bewerben
  • Selbst Oracle fehlt eine jüngere Forms Generation an Consultants, genau wie bei anderen Unternehmen auch. Studierende wollen kein Forms mehr lernen, eine Ausnahme haben wir bei der Firma sensis kennengelernt, die aktiv junge Leute in dem Produkt ausbildet. Vermutung: es wurde sich zu stark auf andere Frameworks konzentriert und dabei Forms aus den Augen verloren
  • viele Anwendungen in Forms sind aber schon unternehmenskritisch und werden nicht einfach abgeschaltet oder migriert
  • zu einer steigenden Akzeptanz würden auf jeden Fall in neueren Releasen modernere Features beitragen ebenso wie das momentane Hypethema "Going mobile" oder Nutzung der Cloud. Hier gibt es ja auch schon Ansätze, um Forms durch besondere Techniken auf mobilen Geräten laufen zu lassen.
  • weitere Ideen neben einer Modernisierung von alten Applikationen hin zu Version 12 sind die Aufhübschung der GUI durch Java-Elemente oder die Integration der Forms-Applikation in einer APEX-Applikation als aüßerem Frame

Als nächstes war Jan-Peter Timmermann dran mit "Erfahrung in der Forms 12c Administration", danach haben wir Vor- und Nachteile von Forms gesammelt und niedergeshrieben.






Als Gegenpol zu den vielen Aspekten, die Anwender und Kunden an Forms stören, gibt es eine Initiative in der DOAG, einen DOAG Forms Day als Event inklusive einer DOAG Forms Community zu etablieren. Bei dem geplanten Ein-Tages-Event soll ein Oracle Forms Verantwortlicher Rede und Antwort stehen und weitere Vorträge zu Forms erfolgen. Hoffentlich gibts es hier bald seitens der DOAG eine positive Rückmeldung.





Später gab es noch eine Session von Frank Hoffman mit der Idee der Initiierung eins Forms 12 Frameworks mit der Sammlung von hilfreichen Code-Snippets, Installationsdokumenten, hilfreiche Einzel-Frameworks, praktische Java Beans und vielen anderen nützlichen Helferleins.

Ich war doch sehr überrascht, dass der erste Tag des DevCamp so von Forms dominiert wurde. Aber bei den immer noch vielen Kunden ist das eigentlich kein Wunder, da die getätigten Investitionen ja doch gesichert bleiben wollen. Für mich war es eine tolle Veranstaltung, bei der man sich mit vielen Leuten intensiv austauschen und wertvolle Erkenntnisse mitnehmen konnte. Hoffentlich gibt es das DevCamp in 2017 wieder, ich wäre wieder gerne dabei. Zum Abschluss noch die Erwähnung der Titelfolie von Sascha Wolter, Text: Widerstand ist zwecklos (hier bei IoT).



Samstag, 30. Januar 2016

OCCD - OC Community Day - ein Experiment mit Wiederholungsbedarf

Heute gibt es von mir einen wenig technologischen Beitrag, im kleinen Rahmen ist aber Forms mit enthalten. :-) An unserem Standort und an noch einem anderen wurde ein Experiment gestartet, der OCCD - Opitz Consulting Community Day.

Das hört sich vielleicht beim ersten Lesen hochtrabend an, ist aber ein Begriff, der zumindest bei mir im Nachhinein mächtig Eindruck hinterlassen hat. Was es damit auf sich hat und vieles mehr, darüber möchte ich heute berichten.

Der verwendete Slogan intern wirbt mit:
Der OC Community Day ist ein Tag für Dich. Für mich. Für uns. Für das Wir.

Grundaussage darin ist: am letzten Freitag des Monats kann ich mich mit fast allem beschäftigen, mit dem ich möchte. Es soll weder ein normaler Office-Day sein, noch soll ich die Spesenabrechnung machen oder mich mit dem eigentlichen Projektgeschäft befassen. Vielmehr wird mir und meinen Kollegen Freiraum geschaffen, mich mit Sachen zu beschäftigen, die vielleicht sonst in der Freizeit  passieren, die nach dem Projektgeschäft erst gemacht werden oder vielleicht sogar nie. Das muss natürlich an die Kunden kommuniziert werden, dass man an diesem Tage nicht zur Verfügung steht, sehr wichtig und notwendig.

Ziele des Tages sind unter anderem: Wissensaufbau, Networking, Ausarbeiten von Vorträgen oder anderen Papers, Selbststudium, Einarbeitung in neue Technologien, persönlicher Freiraum, Austausch mit Vorgesetzten und vieles andere noch.

Ja ich betone nochmals, es ist ein Experiment, was vollkommen neu ist. Wo wir nicht wissen, ob es ein Erfolg wird oder es vorzeitig abgebrochen wird, weil es scheitert. Damit das nicht passiert, ist der Input und Einsatz der Kollegen von zentraler Bedeutung, denn ohne Beteiligung und Ausprobieren wird das nichts werden. 

Jetzt muss natürlich noch die Frage gestellt werden, lohnt sich denn so ein Tag? Betriebswirtschaftlich wird es weniger Umsatz geben, aber es wird in das Wissen und die Weiterbildung der Mitarbeiter investiert. Diesen Effekt sollte man sehr hervorheben, mit Zahlen wird man die Auswirkungen des Tages frühestens in einem halben Jahr messen können, wenn überhaupt.

Für mich persönlich sind solche Experimente eine wertvolle Bereicherung des Alltags, vieles womit im Vorfeld des OCCD geworben wurde, erinnert mich an die Kanban-Methode. Stichworte z.B.: stetiger Wandel, kontinuierliche Verbesserung, fördere Leadership. 

Noch ein Teil des Mottos:
Ein Tag, der uns die Freiheit gibt Themen und Ideen zu verfolgen und zu verwirklichen. Ganz ohne Zwang. Ohne Kontrolle. Frei. Er lebt und stirbt also von und mit unserem Engagement.

Vorgeschlagene Arbeitsaspekte waren dabei u.a.:
  1. Bearbeitung eines Themas alleine oder in Kleingruppen
  2. Andere von seinem Wissen teilhaben lassen und auf eine breitere Basis verteilen
  3. andere Termine können noch mehr zentral auf den OCCD gelegt werden, weil sowieso schon viele Kollegen vor Ort sind
Vor dem eigentlichen Beginn des Tages worden bereits Themenspeicher angelegt, Räume geplant und schon erste Gruppen gebildet.

Für mich persönlich sah der Tag dann so aus:
  1. mehrere Themen in den Speicher gelegt
  2. eines priorisiert, an dem ich arbeiten wollte
  3. mit anderen Kollegen aus dem Forms- und Java-Bereich zusammengetan
  4. das Thema angegangen und auf der grünen Wiese angefangen, Ideen auszuprobieren
  5. unsere Arbeit soll nun ins Git wandern und noch bei folgenden Terminen weiter wachsen und entwickelt werden
Mein Fazit des Tages laut also: Daumen hoch, Experiment weiterverfolgen und wiederholen. Dieses Feedback habe ich dann auch an anderer Stelle eingetragen. Bleibt zu hoffen, dass dieser Tag auch bei vielen anderen so positiv aufgenommen wurde und weiterleben kann. Klar, es war alles neu  am Anfang, muss sich erstmal setzen. Man muss den Tag verinnerlichen, verarbeiten und auf sich wirken lassen.

Es kommen aber so viele neue Ideen zusammen, die Kreativität wird gefördert und das Arbeiten in einer gemischten Gruppe mit Leuten aus diversen Technologien war super. Der nächste Community Day ist schon in Sicht, eigentlich schon wieder verplant und ich freue mich sehr darauf. Also vielen Dank an die Vorgesetzten und die Geschäftsleitung, die dieses Experiment wagen und erst möglich gemacht haben.

Es grüßt ein zufriedener
Holger

Mittwoch, 16. Dezember 2015

der Vorweihnachtspost mit Impressionen aus Köln

Heute mal kein technicher Post von mir. Letzte Woche ergab es sich, dass ich in Köln verweilen durfte. Davon habe ich nun einige Impressionen mitgebracht, teilweise vom Mediapark und dem Dom bzw. Hauptbahnhof. Es war bereits dunkel und die Fotos sind dementsprechend gelungen.

das Cinedom im Mediapark

der Mediapark aus einer etwas anderen Richtung

der Kölner Dom mit Weihnachtsbaum im Vordergrund

das Dean & David Restaurant am Hauptbahnhof

Viele Vorweihnachtsgrüße
Holger