3

それを使用するJavaユーティリティを呼び出す前に、IFSで構成ファイルを作成して設定するプログラムを制御言語で作成しようとしています。

open()およびclose()APIを呼び出してファイルを(再)作成することに成功しましたが、私の人生の間、ファイルに何かを入れるためのwrite()を取得できません。これまでのところ、すべて学習経験でしたが、write()呼び出しにエラーメッセージが表示されず、問題がどこにあるのかがわかりません。

それはほぼ間違いなく私が変数を処理する方法ですが、デバッグセッションはそれらが本来あるべきものであることを示唆しています。

/* ========================================================================= */
/* Processing for the PRCMQMSG command                                       */
/* ========================================================================= */
         PGM        PARM(&ACTION &SRCMQ &TGTMQ)                            

/* Input parameters */                                                         
         DCL        VAR(&ACTION) TYPE(*CHAR) LEN(5)                        
         DCL        VAR(&SRCMQ) TYPE(*CHAR) LEN(125)                       
         DCL        VAR(&TGTMQ) TYPE(*CHAR) LEN(125)                       
/* Parameter elements */                                                       
         DCL        VAR(&SRCHOST) TYPE(*CHAR) STG(*DEFINED) +              
                      LEN(30) DEFVAR(&SRCMQ 3)                             
         DCL        VAR(&SRCPORT) TYPE(*DEC) STG(*DEFINED) +               
                      LEN(5) DEFVAR(&SRCMQ 33)                             
         DCL        VAR(&SRCQMGR) TYPE(*CHAR) STG(*DEFINED) +              
                      LEN(30) DEFVAR(&SRCMQ 36)                            
         DCL        VAR(&SRCCHNL) TYPE(*CHAR) STG(*DEFINED) +              
                      LEN(30) DEFVAR(&SRCMQ 66)                            
         DCL        VAR(&SRCQUE) TYPE(*CHAR) STG(*DEFINED) +               
                      LEN(30) DEFVAR(&SRCMQ 96)              
         DCL        VAR(&TGTHOST) TYPE(*CHAR) STG(*DEFINED) +
                      LEN(30) DEFVAR(&TGTMQ 3)               
         DCL        VAR(&TGTPORT) TYPE(*DEC) STG(*DEFINED) + 
                      LEN(5) DEFVAR(&TGTMQ 33)               
         DCL        VAR(&TGTQMGR) TYPE(*CHAR) STG(*DEFINED) +
                      LEN(30) DEFVAR(&TGTMQ 36)              
         DCL        VAR(&TGTCHNL) TYPE(*CHAR) STG(*DEFINED) +
                      LEN(30) DEFVAR(&TGTMQ 66)              
         DCL        VAR(&TGTQUE) TYPE(*CHAR) STG(*DEFINED) + 
                      LEN(30) DEFVAR(&TGTMQ 96)              
/* IFS details */                                                
         DCL        VAR(&PATH) TYPE(*CHAR) LEN(128) +        
                      VALUE('/mqutil')                       
         DCL        VAR(&CFGFILE) TYPE(*CHAR) LEN(20)        
         DCL        VAR(&JOB) TYPE(*CHAR) LEN(6)             
/* IFS API flags */                                              
         DCL        VAR(&O_RDONLY) TYPE(*INT) VALUE(1)       
         DCL        VAR(&O_WRONLY) TYPE(*INT) VALUE(2)       
         DCL        VAR(&O_RDWR) TYPE(*INT) VALUE(4)         
         DCL        VAR(&O_CREAT) TYPE(*INT) VALUE(8)          
         DCL        VAR(&O_EXCL) TYPE(*INT) VALUE(16)          
         DCL        VAR(&O_TRUNC) TYPE(*INT) VALUE(64)         
         DCL        VAR(&O_APPEND) TYPE(*INT) VALUE(256)       
         DCL        VAR(&O_CODEPAGE) TYPE(*INT) VALUE(8388608) 
         DCL        VAR(&O_TEXTDATA) TYPE(*INT) VALUE(16777216)
         DCL        VAR(&S_IRUSR) TYPE(*INT) VALUE(256)        
         DCL        VAR(&S_IWUSR) TYPE(*INT) VALUE(128)        
         DCL        VAR(&S_IXUSR) TYPE(*INT) VALUE(64)         
         DCL        VAR(&S_IRWXU) TYPE(*INT) VALUE(448)        
         DCL        VAR(&S_IRGRP) TYPE(*INT) VALUE(32)         
         DCL        VAR(&S_IWGRP) TYPE(*INT) VALUE(16)         
         DCL        VAR(&S_IXGRP) TYPE(*INT) VALUE(8)          
         DCL        VAR(&S_IRWXG) TYPE(*INT) VALUE(56)         
         DCL        VAR(&S_IROTH) TYPE(*INT) VALUE(4)          
         DCL        VAR(&S_IWOTH) TYPE(*INT) VALUE(2)          
         DCL        VAR(&S_IXOTH) TYPE(*INT) VALUE(1)          
         DCL        VAR(&S_IRWXO) TYPE(*INT) VALUE(7)          
/* IFS API parameters */                                           
         DCL        VAR(&STROPN) TYPE(*INT) /* Open flags */   
         DCL        VAR(&STRMODE) TYPE(*INT) /* Mode flags */   
         DCL        VAR(&STRPATH) TYPE(*CHAR) LEN(149)          
         DCL        VAR(&STRCODEP) TYPE(*INT) VALUE(819)        
         DCL        VAR(&STRHAND) TYPE(*INT)                    
         DCL        VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')  
         DCL        VAR(&CRLF) TYPE(*CHAR) LEN(2) VALUE(X'0D25')
         DCL        VAR(&ERRNO_PTR) TYPE(*PTR)                  
         DCL        VAR(&ERRNO) TYPE(*INT) STG(*BASED) +        
                      BASPTR(&ERRNO_PTR)                        
         DCL        VAR(&ERRNO_CHR) TYPE(*CHAR) LEN(4)          
         DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)              
         DCL        VAR(&LINE) TYPE(*CHAR) LEN(250)             
         DCL        VAR(&LINE_PTR) TYPE(*PTR) ADDRESS(&LINE)    
         DCL        VAR(&LINELEN) TYPE(*UINT)                   
         DCL        VAR(&LINELEN_D) TYPE(*DEC) LEN(5 0)         

/* Create and open a configuration file in the IFS */               
         RTVJOBA    NBR(&JOB)                                   
         CHGVAR     VAR(&CFGFILE) VALUE('mqconf_' |< &JOB)      
         CHGVAR     VAR(&STRPATH) VALUE(&PATH |< '/' |< &CFGFILE +
                      |< '.connection' |< &NULL)                  
         CHGVAR     VAR(&STROPN) VALUE(&O_WRONLY + &O_CREAT + +   
                      &O_TRUNC + &O_CODEPAGE + &O_TEXTDATA)       
         CHGVAR     VAR(&STRMODE) VALUE(&S_IRWXU + &S_IRWXG + +   
                      &S_IROTH)                                   
         CALLPRC    PRC('open') PARM((&STRPATH) (&STROPN *BYVAL) +
                      (&STRMODE *BYVAL) (&STRCODEP *BYVAL)) +     
                      RTNVAL(&STRHAND)                            
         IF         COND(&STRHAND = -1) THEN(DO)                  
         CALLPRC    PRC('__errno') RTNVAL(&ERRNO_PTR)             
         CHGVAR     VAR(&ERRNO_CHR) VALUE(&ERRNO)                 
         CHGVAR     VAR(&MSGID) VALUE('CPE' || &ERRNO_CHR)        
         SNDPGMMSG  MSGID(&MSGID) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)  
         ENDDO                                                    

/* Write a line to the file */                                        
         CHGVAR     VAR(&LINE) VALUE('This is a line of text in + 
                      a file.' |< &CRLF)                          
         RTVMSG     MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&LINE) +  
                      MSGLEN(&LINELEN_D)                   
         CHGVAR     VAR(&LINELEN) VALUE(&LINELEN_D)        
         CALLPRC    PRC('write') PARM((&STRHAND *BYREF) +  
                      (&LINE_PTR *BYREF) (&LINELEN *BYVAL))

/* Close the configuration file */                             
         CALLPRC    PRC('close') PARM((&STRHAND *BYVAL))   

         ENDPGM                                            

&ERRNOおよび&ERRNO_PTRと同じ方法で&LINEおよび&LINE_PTR変数を宣言しようとしましたが、&LINEに値を割り当てようとすると、ポインターが設定されないというエラーが発生しました。これは、&ERRNO_PTRが最初にアクセスされるためだと思いますが、&LINE_PTRの場合はそうではありませんでした。とにかく、それは赤いニシンかもしれません。

RTVMSGコマンドは、末尾のブランクを除く文字列の長さを見つけるためのトリックです。

デバッグでコードを実行し、write()を呼び出す前に、&LINEには35である&LINELENと同様に、期待どおりの内容が含まれています。次に、write()が呼び出され、エラーは発生しませんが、ファイル。ファイルは空のままです。

最後のメモ。プログラムのすべてのパラメーターは現在使用されていませんが、何か馬鹿げたことをした場合に備えて、完全を期すために残しておきます。したがって、基本的に、宣言の最初の2つのブロックは無視できます。

助けていただければ幸いです。

4

3 に答える 3

4

QSH とリダイレクトを使用すると、C API を使用するよりもはるかに簡単に IFS に書き込むことができます。

/* DISABLE STDOUT */
ADDENVVAR ENVVAR(QIBM_QSH_CMD_OUTPUT) VALUE('NONE') REPLACE(*YES)

/* CREATE THE FILE WITH CCSID 819 */
ADDENVVAR ENVVAR(STRPATH) VALUE(&STRPATH) REPLACE(*YES)
QSH CMD('rm $STRPATH; touch -C 819 $STRPATH')

/* APPEND A LINE TO THE FILE */
ADDENVVAR ENVVAR(LINE) VALUE(&LINE) REPLACE(*YES)
QSH CMD('echo "$LINE">>$STRPATH')

詳細については:


より高いパフォーマンスが必要な場合は、より柔軟な HLL を使用して API にアクセスできます。Scott Klement は、Working with the IFS in RPG IVというタイトルの素晴らしい電子ブックを持っています。

于 2012-06-28T06:56:13.060 に答える
0

書き込み関数を呼び出す際の小さなエラーです。ハンドルは byref の代わりに値で渡す必要があります

CALLPRC    PRC('write') PARM((&STRHAND *BYVAL) +    
         (&LINE_PTR *BYREF) (&LINELEN *BYVAL))  
于 2015-09-08T07:52:13.240 に答える
0

CL から IFS API を使用する方法を探していたところ、あなたのコードに出会いました。書き込みに関する問題は、ファイルハンドル(最初のパラメーター)を値で渡す必要があることだと思います。また、コード ページ パラメータと競合するため、&STROPN 変数に O_CODEPAGE を指定しないでください。私はこの方法を使用しており、現在取り組んでいるサービス プログラムの適切なトレース ファイルを取得できます。

于 2014-08-20T13:35:21.047 に答える