CONTROLLARE L’ACCESSO AI MEMBRI ORIGINE DA RDi

In generale i programmatori RPG e COBOL non sono abituati a lavorare sotto il controllo di un software ALM (Application Lifecycle Management) o di gestione delle versioni. In passato ho avuto la fortuna di usare uno di questi prodotti (era Turnover della Softlanding) e devo dire che adesso che non lo uso più ne sento la mancanza. Qualunque sia il motivo di questa non scelta – soldi, pigrizia o semplice ignoranza – tutti i programmatori RPG e COBOL che lavorano in un team hanno il problema della allocazione di un membro origine per evitare che più persone lavorino sullo stesso membro origine pestandosi i piedi. Molti si sono arrangiati creando in casa un semplice comando di check-out e modificando il comando STRSEU per impedire l’accesso al membro origine al secondo programmatore. Ma come ottenere lo stesso risultato da RDi? Anni fa, con una RFE, chiesi a IBM l’aggiunta di qualche ‘exit point’ da usare per crearsi in casa un semplice ALM, ma naturalmente IBM declinò. Continuai ad indagare e finalmente arrivai a scoprire che la comunicazione tra RDi e IBM i è il classico DDM (distributed data management), quindi passa attraverso il programma specificato nel parametro DDMACC (Accesso richiesta DDM/DRDA) degli attributi di rete, che può essere impostato con il seguente comando:

CHGNETA DDMACC(libreria/programma)

Le modifiche a questo parametro hanno effetto immediato e si riferiscono alle applicazioni DDM e DRDA. I lavori attualmente in esecuzione sul sistema non usano il nuovo valore, perché si accede al valore DDMACC solo quando un lavoro viene avviato per la prima volta, quindi occorre disconnettere e riconnettere RDi dal server IBM i. È chiaro che una soluzione di questo tipo può essere presa in considerazione solo se lo sviluppo avviene su un server dedicato e non su quello di produzione.

Il programma riceve un parametro con un po’ di informazioni – tra cui profilo utente, libreria, file sorgente, membro origine e tipo di richiesta – e restituisce un flag che può assumere due valori: *ON = richiesta accettata; *OFF = richiesta respinta.

Di seguito trovate un esempio di programma DDMACC:

     ***************************************************************************
     **
     ** Accesso richiesta DDM/DRDA (DDMACC) comando CHGNETA.
     **
     ***************************************************************************

     H DFTACTGRP(*NO) ACTGRP(*CALLER) BNDDIR('QC2LE')

     ***************************************************************************
     **
     ** Campi
     **
     ***************************************************************************

     DreturnCode       S              1A
     Desito            S              1A
     DmembroEditabile  S               N

     ***************************************************************************
     **
     ** Strutture dati
     **
     ***************************************************************************

     DddmRequest       DS                  QUALIFIED
     D input                          1A
     D output                         1A
     D update                         1A
     D delete                         1A
     Dvalues           DS                  QUALIFIED
     D user                          10A
     D application                   10A
     D subApplication                10A
     D objectName                    10A
     D objectLibrary                 10A
     D member                        10A
     D format                        10A
     D length                         5S 0
     D sourceRemoteLocation...
     D                               10A
     D sourceSystemName...
     D                               10A
     D other                       2000A

     ***************************************************************************
     **
     ** Costanti
     **
     ***************************************************************************

     DREQUEST_ACCEPTED...
     D                 C                   *ON
     DREQUEST_REJECTED...
     D                 C                   *OFF

     ***************************************************************************
     **
     ** Parametri
     **
     ***************************************************************************
     C     *ENTRY        PLIST
     C                   PARM                    returnCode
     C                   PARM                    values

     ***************************************************************************
     **
     ** Main
     **
     ***************************************************************************

       *INLR = *ON;
       returnCode = REQUEST_ACCEPTED;

       IF values.application <> '*DDM' OR values.subApplication <> 'OPEN';
         RETURN; // La richiesta non mi interessa: richiesta accettata.
       ENDIF;

       IF values.member >= 'RSE0000000' AND values.member <= 'RSE9999999';
         RETURN; // Membri di lavoro creati da RDi.
       ENDIF;

       ddmRequest = values.other;

       IF ddmRequest.input = *ON;
         RETURN; // E' una richiesta di sola lettura: richiesta accettata.
       ENDIF;

       // Inserire qui il controllo del check-out del membro origine.
       // Per esempio, controllare che il membro origine sia nella libreria di sviluppo.

       IF values.objectLibrary = 'SVILUPPO'; 
         RETURN; // Richiesta accettata.
       ENDIF;

       // Se arrivo qui la richiesta è da respingere.

       returnCode = REQUEST_REJECTED;

In caso di richiesta respinta in RDi appare questo messaggio un po’ criptico, quindi consiglio di avvisare l’utente anche con una email:

Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

Recent Posts

VsCode Extension: Bob Cozzi’s RPG IV to RPG Free Conversion

L’estensione “RPG IV to Free Format Conversion” sviluppata da Bob Cozzi (Cozzi Research) è pensata per semplificare la conversione di…

10 mesi ago

IBM i & SQL Tips #010 – Localizzare programmi nella Call Stack con STACK_INFO

Ciao a tutti, oggi voglio segnalarvi un altro interessante contributo di Massimo Duca, parte della sua ormai nota serie IBM…

10 mesi ago

Display file DDS Edit per VsCode, nuova preview.

Incuriosito da alcuni messaggi di Cristian Larsen su Linkedin (New Release - Display File DDS Edit v.0.10.1) ho voluto scaricare…

11 mesi ago

Project Bob: il nuovo strumento AI di IBM per sviluppo COBOL su IBM Z e RPG su IBM i

Ciao a tutti,oggi voglio segnalarvi un annuncio che potrebbe segnare una svolta per lo sviluppo applicativo su ambienti IBM: Project…

11 mesi ago

IBM i & SQL Tips #6: chiamare API REST e analizzare le risposte JSON con SQL

Voglio segnalarvi un nuovo articolo molto interessante di Massimo Duca nella serie IBM i & SQL Tips. In questo sesto…

12 mesi ago

Come funziona il passaggio di parametri a un programma IBM i (RPG / Cobol)

Ciao a tutti, voglio segnalarvi un post molto utile di Marco Riva sul suo sito Markonetools, in cui spiega in…

12 mesi ago