Domanda

Ho un limitied (0) conoscenze su AS400 e RPG. Ma abbiamo una necessità urgente in cui abbiamo bisogno di invocare un programma RPG da una classe Java. Così ho scoperto che possiamo raggiungere attraverso JTOpen. Ma io sono bloccato a dichiarare la lista ProgramParameter. Ho le seguenti informazioni sul programma RPG

Il nome del programma: ZM30000R parametri: Branch 7,0 (numerico)
Tipo di account 2 (01-controllo, 02 di risparmio)
Numero di conto 20 (carattere)
Codice di errore 7 (carattere) DR / CR indicater 1 (carattere D, C)

Ma nessun indizio su ciò che è l'gli input e l'output .Come dichiarare la ProgramParameter. Ho fatto come di seguito. Non riesco a provare pure perché io non dispone di connettività a questi sistemi.

// Create AS400 Text objects for the different lengths
          // of parameters you are sending in.
          AS400Text branchTxt = new AS400Text(7);
          AS400Text accntTypeTxt = new AS400Text(2);
          AS400Text accntNumberTxt = new AS400Text(20);
          AS400Text errorCodeTxt = new AS400Text(7);
          AS400Text DCIndicatorTxt = new AS400Text(1);            

          // declare and instantiate  your parameter list.
          ProgramParameter[] parmList = new ProgramParameter[5];

          // assign values to your parameters using the AS400Text class to convert to bytes
          // the second parameter is an integer which sets the length of your parameter output
          parmList[0] = new ProgramParameter( branchTxt.toBytes(branch),7);
          parmList[1] = new ProgramParameter( accntTypeTxt.toBytes(accntTypeTxt),2);      
          parmList[2] = new ProgramParameter( accntNumberTxt.toBytes(accntNumberTxt),20);      
          parmList[3] = new ProgramParameter( errorCodeTxt.toBytes(""),7);      
          parmList[4] = new ProgramParameter( DCIndicatorTxt.toBytes(indicator),5);

Qualsiasi aiuto sarà davvero molto utile.

Grazie e saluti,

Srinivas

È stato utile?

Soluzione

Beh, io ho un indizio solo dalla descrizione dei parametri. Branch, tipo di conto e numero di conto sono in. È necessario che le informazioni per una prenotazione finanziario o transazione. Il codice di errore è appearently OUT. Nella mia esperienza con i sistemi finanziari è ragionevole normale che l'API restituisce il modo in cui l'importo viene ammonito dall'arbitro. Normalmente si usa il segno, ma nei sistemi finanziari (D) EBIT o (C) redit è il modo migliore.

L'API è molto probabile che l'API di un sistema finanziario. Se questo è vero, allora mi manca la quantità. Sei sicuro che hai la descrizione completa?

Si noti che il primo parametro è numerico. Non sei nella fortuna. L'iSeries e RPG non sono molto indulgente sul tipo di un numerico. Si può scegliere tra Bit, Sottoposto a zonizzazione, Pranzo, decimale, integer, float e così via. Se il gioco di ruolo è davvero RPG invece di ILE RPG, allora si può portare che fino a Sottoposto a zonizzazione, possibilità di pranzo e Byte.

Mi assumo l'accesso hai a iSeries. Poi si può guardare il programma di chiamata, le informazioni di debug e scaricare le informazioni. Che vi aiuterà se si ha a che fare "trial and error". Se non si ha accesso, la strada sarà molto difficile. Riceverai un errore nella classe java se la chiamata programma non è di successo. Ma sarà difficile identificare l'errore reale senza le informazioni dai iSeries da soli. Pertanto, l'accesso è veramente necessario.

Altri suggerimenti

Il campione è in gran parte sulla strada giusta. Ma il vostro parametro ramo è numerico. Quindi si dovrebbe usare AS400ZonedDecimal invece di AS400Text:

AS400ZonedDecimal branchNbr = new AS400ZonedDecimal(7,0)

Il programma RPG può essere in attesa imballato invece suddivisa in zone. Nessun grosso problema, basta usare invece AS400PackedDecimal.

Come si costruisce l'oggetto ProgramParameter, le vostre esigenze del costruttore sono diversi a seconda se sono i parametri di ingresso o di uscita al vostro programma. Per i parametri di input, solo passare i toBytes) Risultati (. Non v'è alcuna necessità di includere la lunghezza. Per i parametri di output sola, basta passare la lunghezza.

Sono d'accordo con la risposta di Robert che ci sono alcune informazioni mancanti, ma le sue ipotesi sulla outputness del codice di errore sembra valido. Direi, però, che il parametro è DCIndicator di ingresso in quanto il campione passa un valore. Per il parametro codice di errore, dopo la chiamata del programma, è necessario estrarre il valore e fare qualcosa con esso. Dato quello che hai già, ecco come la chiamata del programma avrebbe funzionato. Prendete nota che ho specificato un nome di libreria di "MyLibrary". Questo è a scopo esemplificativo. Si dovrà stabilire quale libreria l'oggetto programma è in.

ProgramCall pgm = new ProgramCall(as400, QSYSObjectPathName.toPath("MyLibrary","ZM30000R","PGM"), parmList);
if (pgm.run() == true) {
    String sErrorCode = (String) errorCodeTxt.toObject(parmList[3].getOutputData());

    //Do something with your output data.
}
else {
    AS400Message[] messageList = pgm.getMessageList();
    for (int i=0; i<messageList.length; i++) {
        String sMessageID = messageList[i].getID();
        String sMessageText = messageList[i].getText();

        //Do something with the error messages
    }
}

Un altro aspetto da considerare è liste di libreria. Il programma di RPG aspettano alcune librerie di essere nella lista di biblioteca? Se è così, si dovrebbe rilasciare CommandCalls aggiungere le librerie alla lista della libreria prima di chiamare il programma.

FWIW:. E 'molto più facile chiamare IBM i ospitare programmi e programmi di servizio utilizzando PCML piuttosto che ProgramCall

I compilatori sarà anche generare il documento PCML per voi.

http://javadoc.midrange.com/ JTOpen / com / ibm / AS400 / dati / ProgramCallDocument.html per i dettagli.

Se non si dispone di connettività, allora davvero non si può fare ciò che è chiesto. Come si prova? C'è parametri numerici o sono tutte di carattere?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top