[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Oct 2001
    Beiträge
    68

    Question Frage CPYFRMSTMF

    Hallo,

    ich schreibe meine Sourcen von der Iseries ins IFS, von dort werden sie dann in Subversion SVN geschrieben/gesichert. Soweit funktioniert mein Weg auch schon.
    Sieht im IFS dann so aus:
    \\iseries\ROOT\home\SVN\source\trunk\LNSSOND_SOURC EM\PM3073.RPG

    Nun will ich natürlich auch wieder zurück. Der Weg ist mir soweit klar. Allerdings hab ich beim zurückschreiben in die Source ein Problem. Mit dem folgenden Befehl

    CPYFRMSTMF FROMSTMF('/home/SVN/source/trunk/LNSSOND_SOURCEM/PM3073.RPG
    ') TOMBR('/qsys.lib/test.lib/source.file/PM3073.mbr') MBROPT(*REPLACE)
    STMFCODPAG(*PCASCII) ENDLINFMT(*CRLF)

    bekomme ich die Sourcen zwar wunderbar zurück, kann sie anschauen etc.
    Allerdings wird die Source ohne die "ART" (STRPDM) erstellt.
    Ich hab zwar schon einen anderen Weg versucht, der auch funktionieren würde:
    FTP auf IFS -> DIR *.* (DISK -> dann dort die Datei durchlesen und die Sourcen leer erstellen und anschließend mit dem CPYFRMSTMF die Sourcen reinkopieren.
    Finde ich aber etwas umständlich.

    Frage: kann ich das auch eleganter lösen?

  2. #2
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Wenn du die "Art" aus dem Namen der IFS-Datei extrahierst, kannst du sie danach per CL in deiner Sourcedatei eintragen:
    CHGPFM FILE(&LIB/&FILE) MBR(&MBR) +
    SRCTYPE(&SRCTYPE)
    Also z.B:
    CHGPFM FILE(TESTLIB/QRPGLESRC) MBR(PGM001) SRCTYPE(RPGLE)

    Dieter

  3. #3
    Registriert seit
    Oct 2001
    Beiträge
    68
    Danke hilft mir auch schon mal weiter!!

    Noch eine Frage: Wenn ich im IFS mehrere Sourcen stehen habe und die alle rüberziehen will, geht das mit den Cpyfrmstmf überhaupt.

    Ein generisch mit *.* geht nicht.*.* bringt da einen Fehler. Gibts da was ala' Copy mit *.*??
    Wie lese ich aus dem IFS die ganzen Einträge ohne "FTP"?

  4. #4
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Es gibt dafür APIs von IBM, die du in RPGLE einbinden kannst. Z.B. kann das API "readdir" ein ganzes Verzeichnis auslesen und die Namen liefern.
    Wir haben bei uns die meisten IFS-Zugriffe (z.B. Dateien lesen, schreiben, ...) über Streamfile-APIs gelöst.

    Dieter

  5. #5
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Noch ein Nachtrag: Es gibt da übrigens ein downloadbares Handbuch "IBM i Programming API overview and concepts" von IBM. Wenn ich spezielle APIs suche, nutzte ich allerdings meistens die IBM-Internetseite IBM i information center Dort gibt es einen API-Finder.

    Es ist manchmal etwas mühsam, die APIs (sind in Regel in C geschrieben) zu nutzen. Aber wenn man das einmal gemacht hat, kann man sie wegkapseln und einfacher nutzen.
    Dieter

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Alle Einträge kannst du mit QSH (Beispiele hier im Forum) auslesen.
    Mittels "FTP localhost" und mget kannst du dir alle Sourcen in die PF kopieren.
    Du musst allerdings dann per RTVMBRD *NEXT dann die Art per CHGPFM manuell eintragen.
    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

  7. #7
    Registriert seit
    Oct 2001
    Beiträge
    68
    Erstmal Danke an alle!! Bin durch Euch jetzt schon sehr viel weiter gekommen.

    Zufällig hab ich auch noch das hier gefunden, das mir Qsh und FTP erspart. Das Programm konnte ich auch wunderbar erweitern (Dateiausgabe) Ich stelle es mal hier rein, vielleicht kann man es ja mal brauchen
    Mann muss nur den Pfad (pathtolist)anpassen, dann tut das Teil.

    Code:
     H DftActGrp(*No) Option(*SrcStmt : *NoDebugIO)
         D PATHTOLIST      C                   CONST('/home/jamie/')
         D*PATHTOLIST      C                   CONST('/')
         D*
         D* Directory Entry Structure (dirent)
         D*
         D*
         D p_dirent        s               *
         D dirent          ds                  based(p_dirent)
         D   d_reserv1                   16A
         D   d_reserv2                   10U 0
         D   d_fileno                    10U 0
         D   d_reclen                    10U 0
         D   d_reserv3                   10I 0
         D   d_reserv4                    8A
         D   d_nlsinfo                   12A
         D     nls_ccsid                 10I 0 OVERLAY(d_nlsinfo:1)
         D     nls_cntry                  2A   OVERLAY(d_nlsinfo:5)
         D     nls_lang                   3A   OVERLAY(d_nlsinfo:7)
         D     nls_reserv                 3A   OVERLAY(d_nlsinfo:10)
         D   d_namelen                   10U 0
         D   d_name                     640A
    
         D*------------------------------------------------------------
         D* Open a Directory
         D*
         D* DIR *opendir(const char *dirname)
         D*
         D*------------------------------------------------------------
         D opendir         PR              *   EXTPROC('opendir')
         D  dirname                        *   VALUE
    
         D*------------------------------------------------------------
         D* Read Directory Entry
         D*
         D* struct dirent *readdir(DIR *dirp)
         D*
         D*------------------------------------------------------------
         D readdir         PR              *   EXTPROC('readdir')
         D  dirp                           *   VALUE
    
    
         D* a few local variables...
         D dh              S               *
         D PathName        S            256A
         D Name            S            256A
    
    
         C* Step1: Open up the directory.
         c                   eval      PathName= PATHTOLIST + x'00'
         C                   eval      dh = opendir(%addr(PathName))
         C                   if        dh = *NULL
         c                   eval      Msg = 'Cant open directory'
         c                   dsply                   Msg              50
         c                   eval      *INLR = *ON
         c                   Return
         c                   endif
    
         C* Step2: Read each entry from the directory (in a loop)
         c                   eval      p_dirent = readdir(dh)
         c                   dow       p_dirent <> *NULL
    
         C* FIXME: This code can only handle file/dir names 256 bytes long
         C*         because thats the size of "Name"
         c                   if        d_namelen < 256
         c                   eval      Name = %subst(d_name:1:d_namelen)
         c                   movel     Name          dsply_me         52
         c     dsply_me      dsply
         c                   endif
    
         c                   eval      p_dirent = readdir(dh)
         c                   enddo
    
         C* Step3: End Program
         c                   dsply                   Pause             1
         c                   eval      *inlr = *On
    der Link dazu display all tables in IFS directory

  8. #8
    Registriert seit
    Dec 2012
    Beiträge
    1
    Sorry for English - you might be interested in our SVN client for IBM i. See Subversion and other tools for IBM i developers

    Regards,
    Alexei

  9. #9
    Registriert seit
    Oct 2001
    Beiträge
    68
    Hallo,

    ich muss das Thema nochmal hochholen. Da ich erst jetzt wieder mal dazugekommen bin da weiterzumachen.

    Über was ich jetzt stolpere ist, mein "entry". Wenn ich das Programm laufen lasse mit der Konstanten CONST im Pfadnamen (wie im Original) funktioniert es.
    Wenn ich das ganze dahin ändere, das ich den Pfadnamen oder einen Teil davon übergeben will klappts nicht mehr.
    Ich hab dann in der Variablen "dh" imm "*Null" stehen, anstatt wie im Orginal den Pfadnamen.
    Kann mir da jemand einen Tip geben, woran's da bei mir krankt?

    Code:
     H DftActGrp(*No) Option(*SrcStmt : *NoDebugIO)
    
         FDIROUTPUT O    E             DISK
    
         D PATHTOLIST      C                   CONST('/home/SVN/src_diso1/trunk/+
         D                                            LSRCELNS_SOURCE/')
         D PFADNAME        S            100A   INZ VARYING
         D*
         D* Directory Entry Structure (dirent)
         D*
         D*
         D p_dirent        s               *
         D dirent          ds                  based(p_dirent)
         D   d_reserv1                   16A
         D   d_reserv2                   10U 0
         D   d_fileno                    10U 0
         D   d_reclen                    10U 0
         D   d_reserv3                   10I 0
         D   d_reserv4                    8A
         D   d_nlsinfo                   12A
         D     nls_ccsid                 10I 0 OVERLAY(d_nlsinfo:1)
         D     nls_cntry                  2A   OVERLAY(d_nlsinfo:5)
         D     nls_lang                   3A   OVERLAY(d_nlsinfo:7)
         D     nls_reserv                 3A   OVERLAY(d_nlsinfo:10)
         D   d_namelen                   10U 0
         D   d_name                     640A
         D*------------------------------------------------------------
         D* Öffnen Directory
         D*
         D* DIR *opendir(const char *dirname)
         D*
         D*------------------------------------------------------------
         D opendir         PR              *   EXTPROC('opendir')
         D  dirname                        *   VALUE
    
         D*------------------------------------------------------------
         D* Read Directory Entry
         D*
         D* struct dirent *readdir(DIR *dirp)
         D*
         D*------------------------------------------------------------
         D readdir         PR              *   EXTPROC('readdir')
         D  dirp                           *   VALUE
    
    
         D* a few local variables...
         D dh              S               *
         D PathName        S            256A
         D Name            S            256A
         D PATH            S            256A
    
         C     *ENTRY        PLIST
         C                   PARM                    P_PFADNAME       25
    
         C* Step1: Öffnen Directory.
         c**                 eval      Pathname = PATHTOLIST + x'00'
         c                   eval      PFADNAME = pathtolist + P_PFADNAME
         c                   eval      Pathname = PFADNAME + x'60'
         C                   eval      dh = opendir(%addr(PathName))
         C                   if        dh = *NULL
         c                   eval      Msg = 'Cant open directory'
         c                   dsply                   Msg              50
         c                   eval      *INLR = *ON
         c                   Return
         c                   endif

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Ist das ein Tippfehler oder warum hängst du X'60' dran?

    Der Prototyp sollte mit "const options(*string)" definiert werden, dann kannst du das mit dem X'00' sein lassen:

    dh=opendir(pathtolist + %trim(Pfadname));

    Wichtig ist, dass keine Leerzeichen am Ende sind.

    Allerdings:

    MKDIR '\Home\MyDir ' enthält am Ende ein Blank was mit zum Namen zählt!
    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

  11. #11
    Registriert seit
    Oct 2001
    Beiträge
    68
    Sorry, aber auch wenn ich mich hier jetzt beschämend als unwissend oute. Ich versteh's nicht.


    dh=opendir(pathtolist + %trim(Pfadname));
    ist mir klar.

    "const options(*string)"
    ??? - Zeile ist vom Inhalt klar, aber wo und wie nicht?

    ich hab jetzt versucht möglichst viel über "Prototypen" zu lesen, kriegs aber nicht hin.


    - das mit dem "X60" ist wohl aus meinen Versuchen übrig geblieben.

  12. #12
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    Das OPTIONS(*STRING) gehört zu den String-Parameter der Prozeduren, siehe hier oder hier.

Similar Threads

  1. Frage zum Befehl STRPCCMD
    By stoerfang in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 24-01-13, 10:27
  2. SQL Frage
    By Bratmaxxe in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 24-01-07, 19:17
  3. CPYFRMSTMF mit xml-Datei
    By wrkas400 in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 11-01-07, 11:12
  4. Frage zu QZDFMDB2
    By Freezer in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 23-10-06, 21:02
  5. Frage zu SQL UserDefinedFunction
    By cbe in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 24-08-06, 17:30

Berechtigungen

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