[NEWSboard IBMi Forum]
Seite 2 von 3 Erste 1 2 3 Letzte
  1. #13
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Zitat Zitat von Fuerchau Beitrag anzeigen
    SRVPGM-Quelle:

    STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('V1.00')
    EXPORT SYMBOL('D002DBT_getDatasetfromD002')
    EXPORT SYMBOL('D002DBT_getNewKeyNumber')
    EXPORT SYMBOL('D002DBT_updateDataD002')
    EXPORT SYMBOL('D002DBT_insertDataD002')
    ENDPGMEXP
    Hallo Baldur,
    vielen Dank für das Snippet. Um ehrlich zu sein: Mir ist nicht klar, wofür man das benötigt und wo man das hinschreibt und welchen Vorteil das hat.
    Im Serviceprogramm selber schreibt man doch schon "export" an die zu exportierenden Procedures. Damit ist doch schon klar, welche Proc exportiert wird.

    Und wo schreibt man die oben genannte Bindersprache hin? Ist das eine eigene Teildatei?
    Wir haben das noch nie benutzt. Wir haben ein Binderverzeichnis, in das wir alle Serviceprogramme reinhängen.

  2. #14
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Hallo Andreas,
    du hast Recht: Wir sind etwas off topic gelandet durch die Diskussion über Serviceprogramme. Deshalb hier meine Antwort zu deinem letzten Post.
    Du ziehst ja gerne den Ford Mustang heran. Bitte nimm es mir nicht übel, wenn ich sage: Ist das wirklich ein fahrbereiter Ford Mustang oder ist ein fast fertiges Auto, an dem man erst noch herumschrauben muss, bis man losfahren kann? :-)

    Stichwort "Markdown File": Das kenn ich nicht, die Syntax müsste ich mir erst angucken. Oder "kleines Script", um die Sourceliste mit Änderungsdatum zu aktualisieren. In welcher Scriptsprache geht das?

    Bitte versteh mich nicht falsch. Wahrscheinlich würden wir hier im Haus (zumindest mit Hilfe meiner Kollegen) diese Scripte bauen können. Aber es gibt doch sicherlich zahlreiche RPG-Programmierer, die eine fertige Lösung suchen, oder? (RDi ist immerhin sofort "fahrbereit").

  3. #15
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Auch nochmal eine Frage an alle anderen Forumsteilnehmer:

    Hat schon jemand einen Wechsel von Teildatei zu IFS-File durchgeführt?
    Falls ja, wie hoch war der Aufwand und hat es sich gelohnt?

  4. #16
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Die Service-Programmdiskussion halte ich in diesem Rahmen für nicht unwichtig, da man sich viele Abhängigkeitsregeln und Recompiles durch vernünftiges Planen komplett sparen kann.

    Wenn ich eine SQL-Tabelle ändere, ggf. nur Recompile für die Programme, die es brauchen, da die anderen, wenn sie denn mit SQL arbeiten, davon gar nichts merken. Voraussetzungen sind natürlich vernünfitge Defaults bei neuen Spalten.
    Ansonsten eben leider alle Programm/Module/Services, die diese Datei/Tabelle referieren. Allerdings nicht die in Folge abhängigen Services.

    Wenn ich Services ändere gilt dies ebenso.

    Wenn ich wie oben diskutiert, für jedes Modul einen Service erstelle, kann es im Zweifel dann passieren, dass der Recomile eines Service hunderte Recompiles der Abhängigen Services auslöst, was vollkommen unnötig ist.
    Verwende ich eine SRVPGM-Source, wandle ich das Modul und erstelle das Serviceprogrmm (mit Moduliste) nur neu.

    Damit ruduziert sich eben auch der Aufwand von Make-Files und Abhängigkeitsregeln.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #17
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Meiner Ansicht nach hat man 2 Probleme bei Änderungen:


    1. Wenn man eine Tabellenstruktur ändert, ist man zum Durchkompilieren gezwungen, sobald man den Datensatz als (extern) definierte Struktur anspricht. Dagegen kann man ja selbst bei ausschließlichen SQL-Zugriffen kaum etwas machen, denke ich. Es sein denn, man spricht nur einzelne Felder an und niemals eine Datenstruktur. Aber dann hat man es ja mit vielen Parametern zu tun, anstatt sonst nur einen Parameter (die Datenstruktur) zwischen den Programmen durchzureichen.
    2. Wenn man die Aufrufparameter eines Programmes ändert. Wir beschränken uns darauf, nur Parameter mit options(*nopass) am Ende der Parameterliste hinzuzufügen. Dann klappt das auch im laufenden Betrieb.
      Wenn es aber eigentlich ein Pflichtparameter ist, ändern wir danach in aller Ruhe alle Aufrufe und geben den neuen Parameter mit. Wenn am nächsten Morgen dann alle Jobs neue gestartet sind, nehmen wir das options(*nopass) raus.

  6. #18
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... ist ja eine Palette von Themen, ich versuche mal ein paar Dinge anzureißen:

    @Sourcen im IFS: attraktiv ist die einfache GIT (subversion) Anbindung, die einem eine saubere Versionierung liefert. Das geht aber auch mit verfügbaren Erweiterungen für RDI.

    Ein komplettes Paket, wie Andreas das hier skizziert, macht Sinn, wenn die verfügbare Truppe auf mehreren Hochzeiten tanzt. Dann ist Vereinheitlichung von Werkzeugen sicherlich sinnvoll. Was es dann wird, hängt von den skills der Truppe ab und ist auch Geshcmacksache (sagte der Affe und biss in die Seife).
    Ein Umstieg für eine reine RPG Truppe macht m.E. keinne Sinn, solange es keine richtige Entwicklungsumgebung gibt (RDI ist das auch nicht, da fehlen die wichtigsten Features : all das, was bei Eclipse für Java unter Source und Refactor kommt). Solange da nichts ist, nehme ich (Geschmacksache!) immer noch SEU, wenn ich mir das aussuchen darf.

    @SRVPGMs: Serviceprogramme auf eine exportierte Procedure zu beschränken, ist ein ernsthafter Kunstfehler, dann sollte man stattdessen PGMs nehmen, das spart einem (fast) alle diskutierten Probleme.
    Der wesentlliche Unterschied zwischen PGM und SRVPGM ist, dass SRVPGMs mehrere Entrypoints haben, die auf denselben Daten operieren. Das vereinfacht die Schnittstellen (jeder kriegt nur die, die er braucht) und es werden keine Steuerungsparameter übergeben.
    Die Größe von SRVPGMs (sprich: wieviel Module binde ich zu einem SRVPGM ist in erster Linie eine Frage des Deployments. Für eine Software mit einer einzigen produktiven Installation favorisiere ich: ein Modul ein SRVPGM, für eine Vielzahl von Installationen sind größere Einheiten oft einfacher.

    @Parameter Schnittstellen: Selbige ändert man nicht, sobald man eine Funktionalität in Production hat. Dann gibt es eine neue Funktion (die ja die alte durchaus benutzen kann), mit der geänderten Schnittstelle. Die kann man dann da einbauen, wo die Erweiterung benötigt wird.

    @Dateien: hier ist es besonders einfach bei SQL: Alle Programme greifen immen auf Views zu (niemals auf die Table). Standard ist hier select * from XyzView und XyzView as select (Feldliste von Datei). Kommt ein Feld in der Date hinzu, gibt es dann eine weitere View. Jetzt kann man auch die EDS (die immer auf Views verweisen) überall verwenden - ohne dass sich da irgendwas ändert. Mit dieser elementaren Vorgehensweise kann man sogar Felder in eine andere Datei verschieben, ohne dass vorhandene Programme das merken. (Komplizierter wird es bei Erweiterungen von Keys, aber das hat man nicht so oft).

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #19
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Hallo D*B,
    vielen Dank für deine Ausführungen. Auch wenn ich nicht immer bei allem deiner Meinung bin: Dein Schreibstil ist jedesmal unterhaltsam ("Geschmackssache ... Affe ... Seife") :-)

    Nochmal für mich zur Klarstellung bei Serviceprogrammen / Modulen, damit ich das auch richtig verstehe:

    Du / ihr seht das so:
    Ein Sourcemember beinhaltet immer den Code für ein Modul. In einem Modul können mehrere exportierte Procedures sein. Mehrere Module können zu einem Serviceprogramm zusammengebunden werden.
    Habe ich das richtig verstanden? (Da bei uns ein Sourcemember (fast) immer zu nur einem Serviceprogramm führt, haben wir mit Modulen zur Zeit nichts am Hut.)

    Bei Parameteränderungen gebe ich dir Recht. Wenn man breaking changes macht, sollte man eine neue Version erzeugen. Solange wir mit zusätzlichen optionalen Parametern hinkommen, ist das aber nicht unbedingt nötig, finde ich.

    Dein Konzept mit den Datenstrukturen, die immer auf Views basieren, habe ich schon vor Jahren bei dir gelesen und finde es immer noch interessant. Allerdings haben wir es nie umgesetzt. Es gab Bedenken bei uns, dass wir dann mit einer Vielzahl von unterschiedlichen Datensätzen (Datenstrukturen) hantieren müssen. Es würde in deinem Konzept doch so sein, dass die Datenstrukturen versioniert werden, oder? Also zunächst heißt die Struktur "KUNDE_Datensatz", nach einer Felderweiterung dann "KUNDE_DatensatzV2" usw. Richtig?
    Falls ja, hat man dann nicht immer noch die gleichen Probleme wie bisher? Ich kann an ein Programm ja nicht die erste Struktur übergeben, wenn Sie die V2-Version erwartet.

    Aber wahrscheinlich habe ich nur noch nicht lange genug darüber nachgedacht.

  8. #20
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Wenn du mal ein DSPSRVPGM machst, wirst du erstaunt sein, dass da mindestens ein Modul erstellt wurde, was eben intern passiert (CRTxxxMOD, CRTPGM).
    Ein Modul sollte themenspezifisch mehrere Prozeduren aufweisen.

    Das mit Dieters Views ist ein wenig überdimensioniert oder eben Ansichtssache.
    Solange ich mit select * arbeite und DS'n verwende ist alles gut, da beim nächsten Recompile der Precompiler entsprechend erweitert.
    Wenn man auf der sicheren Seite sein will, sollte man sowieso mit Feldlisten bewusst arbeiten, was man ja wegen Faulheit eben meist sein lässt.
    Dadurch fällt auch z.b. der optimierte ReadOnlyIndex-Zugriff weg.

    Spätestens beim Update/Insert bist du ja eh wieder auf die Table angewiesen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #21
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von dschroeder Beitrag anzeigen
    Ein Sourcemember beinhaltet immer den Code für ein Modul. In einem Modul können mehrere exportierte Procedures sein. Mehrere Module können zu einem Serviceprogramm zusammengebunden werden.
    Habe ich das richtig verstanden? (Da bei uns ein Sourcemember (fast) immer zu nur einem Serviceprogramm führt, haben wir mit Modulen zur Zeit nichts am Hut.)
    Procedure := aufrufbare Einheit, hat lokale Variablen und kann auf globale Variablen des Moduls zugreifen.

    exportierte Procedure := kann aus anderen Modulen benutzt werden.

    exportierte Variable := Pfui, Bäh!

    Module := Compileeinheit, wird aus Quelle erstellt. Kann in PGM oder SRVPGM per copy eingefügt werden.

    SRVPGM := macht Module verfügbar (bind by reference).

    Binder Source := legt fest, was von ausserhalb des SRVPGMs sichtbar ist (Parameter beim CRTSRVPGM: *all oder Binder Source) und gibt die Möglichkeit die Reihenfolge der Exporte selber festzulegen und selber eine Signatur festzulegen.

    Zitat Zitat von dschroeder Beitrag anzeigen
    Es würde ... doch so sein, dass die Datenstrukturen versioniert werden, oder? Also zunächst heißt die Struktur "KUNDE_Datensatz", nach einer Felderweiterung dann "KUNDE_DatensatzV2"
    Kann man so machen, wenn einem nix besseres einfällt (man könnte ja auch seine Dateien nach Erstellungsdatum durchnummerieren), in vielen Fällen des täglichen Lebens, könnten einem auch sprechendere Namen einfallen. Entscheidend ist, dass die vorherigen "Varianten" ihre Namen behalten. Dann ändert sich an allem bisherigen nix. Meist ist es so, dass bisherige Programme ein zusätzliches Feld auch nicht brauchen, dann packt man die auch nicht an (warum soll man diese Programme verkomplizieren). Da wo das gebraucht wird, wird eine View benötigt, die das "neue" Feld benötigt (aber vielleicht andere nicht), dafür gibt es dann eine zusätzliche View.
    => mehr Views und die Programme werden einfacher, die Zugriffe schneller! (Wird so ein Feld überall gebraucht,kann man nicht benötigte Views löschen - es ist aber keineswegs Ziel in Programme Felder reinzunehmen, nur weil sie "da" sind!).

    Am Rande sei erwähnt: Es gibt nur 2 Varianten bei SQL Zugriffen, die gegen Seiteneffekte stabil sind.
    select * und e DS oder select Feldliste in Feldliste, alles andere ist no risc, no fun!


    Zitat Zitat von dschroeder Beitrag anzeigen
    Bei Parameteränderungen gebe ich dir Recht. Wenn man breaking changes macht, sollte man eine neue Version erzeugen. Solange wir mit zusätzlichen optionalen Parametern hinkommen, ist das aber nicht unbedingt nötig, finde ich.
    Wenn sich alle dranhalten, kann man das so machen. Wenn nicht: no risc, no fun! (Ich bin für fun ohne risc!)

    mfG
    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #22
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Spätestens beim Update/Insert bist du ja eh wieder auf die Table angewiesen.
    ... warum?

    D * B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #23
    Registriert seit
    Nov 2020
    Beiträge
    331
    Losfahren kannst du damit schon seit langem.
    Wir reden hier ja um die "Getränkehalter" ;-)


    Ich verstehe die Bedenken, hatte ich lange auch, nur wenn ich mir die "fertigen" Lösungen (kostenpflichtig) anschaue, sind diese weit hinten, bezogen auf den heutigen Stand der Technik. Diese sind alles andere als "fertig". Das hat mich zum Umdenken gebracht.


    Das Beispiel der Source-Texte hat es deutlich gemacht, wie schnell und einfach es geht wünsche umzusetzen.
    Wenn du neben den Source-Texten auch noch weitere Informationen haben willst (Kategorien, Labels, ...), wie lange würden die "fertigen" Lösungen benötigen, um solch ein Feature zu implementieren? ... falls überhaupt.
    Ich habe hier eine Lösung zur Verfügung gestellt und das innerhalb von ein paar Minuten.
    Und mit dieser Lösung hast du mehr Möglichkeiten als es die anderen bieten.


    Markdown war nur ein Beispiel. Markdown ist halt passend, weil dies immer stärker in den Vordergrund kommt. (Z.B.: jede Doku in Github wird mit Markdown geschrieben)
    Könnte aber auch mit JSON gemacht werden und es mit ein wenig HTML & Javascript darstellen lassen. Das ganze wird im IDE wie im Browser dargestellt.
    Bei Bedarf kann ich da auch gerne unterstützen, kann aber auch jeder anderer der ein wenig sich mit HTML auskennt. Es gibt auch genug Beispielcode im Internet das man sofort via Copy/Paste verwenden könnte.


    Du kannst dir gerne mein Projekt auf GitHub anschauen. Die Scripts habe ich alle mit Bash geschrieben.
    Kann man aber auch mit Python, Node.js oder was auch immer machen wenn etwas zusätzlich benötigt wird.


    Wenn du ein "fertiges" Produkt nimmst, und du brauchst eine Erweiterung, dann machst du das ja auch nicht selbst sondern du beauftragst den Hersteller (falls er das machen kann/will).
    Genauso machst du es auch bei Open Source Projekten.
    Der Unterschied ist nur, du bist nicht an den Hersteller gebunden. Jeder der sich in diesem Gebiet etwas auskennt kann das machen, schneller, einfacher, unkomplizierter, transparenter, kostengünstiger.


    Die stärken der "fertigen" Produkten liegt wo anders.
    Wenn du z.B. signierte Deployments benötigst, oder eine Zertifizierte Software brauchst, dann würde ich dir die kostenpflichtigen Lösungen empfehlen.


    Was den RDi Betrifft:
    Ich habe die RDi Phase hinter mich gelassen.
    Jahrelang habe ich nur mit diesem gearbeitet (und würde es auch noch tun, wenn der SEU die einzige alternative wäre).
    Ich habe auch einige Jahre im mit GIT im RDi und Sourcen in Source-Files gearbeitet.
    Ist funktioniert alles grundsätzlich und ist besser als nichts.
    Nur im täglichen leben hat mich einiges gestört, war nicht praktisch und teilweise eingeschränkt.
    Der RDi selbst ist sowieso immer mehrere Generationen hinter dem "richtigen" Eclipse.
    Deshalb bevorzuge ich den VSCode. Mein Build-Tool kannst du aber genauso auch mit RDi benützen.


    Zu SRVPGM:
    Mein Weg ist: 1 Modul = 1 SRVPGM
    Ändere ich etwas im Modul werden automatisch alle abhängigen Sourcen mit kompiliert.
    D.h. ändere füge ich eine Spalte hinzu, werden alle Module & PGMs neu erstellt, die darauf referenzieren. Und dann noch alle Module & PGMs die auf die zuvor neu erstellten Module zugreifen usw. usw.
    Gerade bei DB Erweiterungen kann das einen Rattenschwanz an neu zu erstellenden Objekten mit sich führen.
    Der Vorteil hier ist jedoch, dass der Entwickler weniger Fehlerquellen verursachen kann und ich durch die erneuten Kompiles diverse Prüfungen habe auf die ich nicht verzichten will.
    So machen das übrigens auch die "fertige" Lösungen.

  12. #24
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Wie gesagt, jedem das Seine, weniger ist manchmal mehr.

    Bzgl. IFS-Quellen hätte ich noch gerne folgendes gewusst, ggf. kannst du das mal ausprobieren:

    Definiere ich eine SQL-Hostvariable mit like, funktioniert dies derzeit nur, wenn ich die Basis in einer /Copy oder direkt in der Quelle habe.
    Definiere ich das in /Include, wie es für IFS ja benötigt wird, funktioniert dies nicht, da Include vom Precompiler nicht aufgelöst wird.
    Nested Copy wiederum, was für ILERPG erlaubt ist (bis 32), ist für den Precompiler jedoch nicht erlaubt.
    Like-Definitionen sind aber, was die Erweiterbarkeit angeht, ein wesentlicher Bestandteil von ordentlichen Quellen.

    Nun gibts ja noch die Pre-Compileroption für die Auflösung der Quellen mit *LVL1/*LVL2.
    Dies scheint aber wiederum von einem anderen Reader aufgelöst zu werden als vom ILERPG-Compiler.
    Schreibt man nämlich Code über die max. Standard-ILE-SRC-Breite hinaus, wird dieser Code einfach abgeschnitten. Der ILERPG-Compiler bricht die Zeilen automatisch um.
    Aufgefallen ist das halt in einem größeren Projekt, in dem der Default einfach mal auf *LVL2 gestellt wurde. Viele Quellen waren dann nicht mehr kompilierbar.

    Wie sieht das nun im IFS-Fall aus?
    Wird Include vom SQL-Precompiler da aufgelöst?
    Wird geschachtelter Include unterstütz?
    Das würde die Quellverwaltung eben erheblich vereinfachen, da man Mehrfachincludes ja mit If-Direktiven verhindern kann.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Aus der Praxis: Modernisierungsprojekte im Vergleich
    By ML-Software in forum NEWSboard Server Software
    Antworten: 0
    Letzter Beitrag: 22-11-21, 12:43
  2. Artikel: IT & Business präsentiert ERP für die Praxis / Interview mit Prof. Norbert G
    By NEWSolutions Redaktion in forum NEWSolutions artikel
    Antworten: 0
    Letzter Beitrag: 05-10-16, 03:49
  3. Artikel: MERLIN: Browser-Revolution für IBM i
    By NEWSolutions Redaktion in forum NEWSolutions artikel
    Antworten: 0
    Letzter Beitrag: 10-02-16, 16:43
  4. Antworten: 0
    Letzter Beitrag: 10-02-11, 17:43
  5. Antworten: 0
    Letzter Beitrag: 10-02-11, 17:41

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •