|
|||||||||
|
プログラミングのヒント |
|
|
| 特別記事のため、このページを印刷されてからお読みになることをおすすめします。 ここに紹介する便利なトリックをアプリケーション開発戦略に加えましょう ビジネス・システムの競争戦略を立てる際に、プログラマーは現場の主任技術者になります。毎日のビジネス・トランザクションの失敗例や成功例に鋭く目を光らせている有能なプログラマーは、環境をめざましく効率化することができます。それどころか、プログラマーの良し悪しによって、企業が市場でトップになるか最下位になるかが決まることさえあります。 ここに集めた AS/400 プログラミングのヒントでは、現場で活用できる『技』をいくつか紹介します。SRCDBG をユーザー定義の PDM オプションとして指定する方法、骨組み行を使用して SEU でのコーディングの能率を上げる方法などを身につけてください。あなたのプログラミング戦略にこれらのトリックを加えれば、チームの能率がみるみる上がります。 パラメーターのコピー / 貼り付け AS/400 コマンドの大きな問題の 1 つは、詳細を入力する必要があるパラメーターの数が多いことです。CPYSPLF コマンドの場合、これらの詳細はすでに他の画面に表示されているので、それをコピーして貼り付ければ、コマンドを定義するために覚えたりメモしたりしなければならない値の数を減らすことができます (パラメーターをコピーして貼り付けるために、私は eNetwork Personal Computer Client Access/400 for Windows 95/NT ワークステーション・プログラムを使用しています)。 CPYSPLF コマンドを使用する場合、通常はスプール・ファイルの属性を表示して、ジョブ / ユーザー / 番号の情報をスプール・ファイルの名前、番号と一緒に書き留める必要があります。そうでなければ、CPYSPLF コマンド・プロンプトに入力する前にこれらの値を覚えておかなければなりません。 時間を節約するために、スプール・ファイルの属性を表示してから、カーソルを使用してジョブ / ユーザー / 番号のデータの周りにコピー・エリアを定義します。 Job .........: ACEX84R User ......: LASHAMS Number.....: 953114 コピー・エリアはジョブ名の最初の文字に合わせる必要があり、ジョブ、ユーザー、および番号のデータを中に含めます。次に、コピー・ボタンをクリックします。それでもスプール・ファイルの名前と番号はメモする必要がありますが、ジョブ / ユーザー / 番号の詳細はコピー・バッファーに入っているので書き留める必要はなくなります。 次に、CPYSPLF コマンドを表示して、デフォルトのアスタリスクが表示されている Job パラメーターにカーソルを移動します。貼り付けボタンをクリックして、3 つのデータ要素 (ジョブ / ユーザー / 番号) を該当する場所に貼り付けます。2 つのセッション・ウィンドウを使用すれば、コピー / 貼り付け機能を使用してスプール・ファイルの名前と番号を表示することもできます。 このトリックは多くの AS/400 コマンドに対して使用できます。また、2 つのセッションを開けば、紙に詳細を書き留めたり、再入力する番号のストリングを覚えるためにセッション・ウィンドウを繰り返し切り替えたりする必要がなくなり、コマンド・パラメーターの入力がとても簡単になります。 Stephen Lasham、アナリスト / プログラマー Auckland City Council Auckland, New Zealand Query/400 での絶対値に基づくソート Query/400 で絶対値に基づくソートを行うには、ソートしたいフィールドを 2 乗し、2 乗した結果をソート基準として選択します。ただし、その結果は印刷せず、列記述ではヘッダーを *none に設定し、スペーシングとフィールド長をゼロに設定します。2 乗した結果の代わりに、元のフィールドを印刷します (符号は付けても付けなくても構いません)。 Lynne Noll 情報技術、Imperial Distributors, Inc. Auburn, Massachusetts RPG のモジュラー・プログラミング方式 読みやすくて保守しやすい、プログラムのモジュラー・コーディング方式を紹介します。簡単な方式ですが、これを使っている RPG プログラムはほとんど見かけません。 図 1 のコードは「サーバー・タイプ」プログラムの一例で、データ・キューから要求を受け取って書式設定し、TCP/IP によって外部コンピューターに送信し、この外部コンピューターから応答を受け取り、応答を書式設定して別のデータ・キューに送り返すというものです。 それぞれのサブルーチンは、次に入るモードを設定します (スペースの都合上、各サブルーチンが制御を渡す先のモードはコードに示されていません)。サブルーチンがエラーをトラップすると、次のモードを 'fmtError' に設定するので、エラー処理は簡単です。このモードになると、サブルーチン fmtError が実行され、必要なエラー処置が実行されます。その後サブルーチン fmtError はモードを 'reset' に設定し、初めからやり直しとなります。 さらに機能性を高めるために、別の Case ステートメント行を追加することもできます。そのステートメントが制御を渡す次のモードを設定し、該当するサブルーチンの終了時にこの新しいモードが起動されるようにします。サブルーチンはいくつかのサブルーチンに条件付きで制御を渡すことがよくある点に注意してください。 Chris Woodhead、アナリスト / プログラマー Baycorp Holdings Auckland, New Zealand OPNQRYF の数値パラメーター OPNQRYF ステートメントで数値フィールドを使用する必要があるときは、図 2 に示すように、まず数値を文字に変換する必要があります。この変換は CHGVAR コマンドによって行います。文字フィールドは、負符号 (負の結果の場合) と、小数部があるフィールドを使用する場合は小数点が入るだけの大きさにする必要があります。 Ken Schaefer、プログラマー / アナリスト Alfred Publishing Van Nuys, Califorina SQL の編集コードの再定義 このヒントは、対話式 SQL (ISQL) の編集コードを手っ取り早く再定義するのに役立ちます。在庫価格の表があるとしましょう。この表の設計には、負の値を許可しない編集コードを指定した PRICE フィールドが含まれています。しかし、ユーザーが間違って負の値を指定してこのフィールドを更新しました。次の SQL ステートメント SELECT PRICE FROM PRICELIST は、実際の表にたとえば -15 が入っていても、正の値 15 だけを表示します。これは、デフォルトでは ISQL が表に対して指定された編集コードを使用するからです。これを手っ取り早く回避するには、単に次の照会を実行します。 SELECT PRICE +0 FROM PRICELIST 当然ですが、ゼロを加算しても値は変わりません。しかし、PRICE フィールドが変更されたので、ISQL はこれを結果フィールドとして扱います。この扱いによって、ISQL はデフォルト編集フィールドを使用するようになり、値が負の場合には低位桁に負符号 (-) を付けて負の数値を表示します。 Jeremy Likness、開発マネージャー AS/400 Technical Services Manhattan Associates, Inc. Atlanta, Georgia 骨組み行を使用して SEU のコーディングを迅速化する SEU を使用して (プロンプトなしで) RPG プログラムの計算仕様を入力する際に、何か特別なことをしなければ、新しい計算行を入力するときにカーソルは改行され、新しい行の上の行の先頭文字に合わせられます。その後ユーザーは C と入力し (位置 6 に)、演算項目 1 または命令コードを入力する場所までカーソルを移動します。このため、作業を済ませるにはカーソルをたくさん動かさなければなりません。 幸い、ユーザーは骨組み行を独自に作成してコーディング処理を迅速にすることができます。まず、位置 6 に文字 C だけがある計算行を作成し、Enter を押します。次に、その行はエラーとして強調表示されますが、行のシーケンス番号域に S と入力します。続いて、命令コードを通常入力する場所にカーソルを移動し (たとえば、RPG/400 では位置 28、ILE RPG では位置 23)、Enter を押します (図 3A)。これで骨組み行が作成されます。この行は削除することもでき (エラーとして強調表示されているので)、コードを完全に入力してから Enter を押すこともできます。 骨組み行を使用するには、コードを挿入する場所にカーソルを移動して、シーケンス番号域に IS とコーディングし、Enter を押して骨組み行を挿入します (図 3B)。ユーザーがコーディングするための新しい行がシステムによって追加されますが、骨組み行がモデルとして使用されます (図 3C)。C がすでに入力されており、カーソルは命令コード列の 1 文字目の位置にあります。その行のコードを入力した後 Enter を押すと、コーディング域にユーザーが使用できる別の骨組み行が表示されます。 プログラム論理の新しい行をコーディングするたびに反復したいコードがある場合、そのコードを骨組み行に含めることができます。たとえば、多数の Eval ステートメントをコーディングしたい場合、骨組み行に Eval という語を含めて、カーソルを演算項目 2 ブロックの最初の位置に置くことができます。 また、カスタム骨組み行の挿入のたびに追加される行の数を指定することもできます。たとえば、IS10 を指定すると、コーディング・ページに骨組み行が 10 行追加されます。特にこの機能は、低速接続を経由してオフサイトで作業している場合に便利です。これは、Enter を押して新しいコード行を構文検査のために AS/400 に送信する前に、10 行分 (あるいはそれ以上) のコーディングが可能になるからです。 Gene Snipes、コンサルタント GJK Consulting Indianapolis, Indiana OPNQRYF の %WLDCRD OPNQRYF (照会ファイルを開く) コマンドの %WLDCRD(...) 組み込み関数は、パターンに基づいてストリングのワイルドカード・スキャンを実行します。 %WLDCRD("pattern-string" ["wild-characters"]) wild-characters パラメーターはオプションです。デフォルト値は _* で、下線は任意の単一文字、アスタリスクは任意のストリングを表します。パラメーターの長さはゼロにすることができます。次のようにいくつかの制約があります。 * %WLDCRD は、OPNQRYF の QRYSLT パラメーターまたは GRPSLT パラメーターに対してだけ使用できます。 * %WLDCRD は、EQUAL 演算子の右側にだけ指定できます。 図 4 は、例を示しています。経験では、パターン・ストリングにワイルドカード文字が,m含まれていない場合、%WLDCRD は機能しません。 Istvan Buknicz Camsco, Budapest 抑音 (`) 文字のマッピング 17 年間のプログラミング経験の中で、5250 画面上で ` 文字が必要になったことは一度もありません (英語以外の言語でプログラミングしているプログラマーの場合は別ですが)。このキー (1 キーの左側にある) を F16 にマップしましょう。F16 は IBM 画面の多くの機能に使用できます (特にスキャン)。 Tory Bennetsen Texas Workers Compensation Insurance Fund Austin, Texas データベース関係の維持 物理ファイルとその論理ファイルをライブラリー間でコピーまたは移動するときに、物理ファイルとその論理ファイルの間のデータベース関係を維持する必要が生じることがあります。たとえば、ECL という名前の物理ファイルに 3 つの論理ファイルが関連しているとしましょう (ECLL01、ECLL02、ECLL03)。ECL のオブジェクトは FROMLIB ライブラリーに存在し、TOLIB が宛先ライブラリーです。次のコマンドを実行することにより、4 つのファイルがすべてコピーされ、新しい物理ファイルに対する新しい論理ファイルの関係が維持されます。 CRTDUPOBJ OBJ(ECL*) FROMLIB(fromlib) OBJTYPE(*FILE) TOLIB(tolib) この 1 ステップの方法が使えるのは、OBJ パラメーターに対して総称名 (例 ECL*) が指定できるように、関連したファイル名の先頭が共通している (例: ECL) 場合だけです。 Gaya Dahanayake、プログラマー・アナリスト III Malden Mills Saugas, Massachusetts Qshell パイプ タスクを実行するためにシェル・ユーティリティーを組み合わせることは、Unix 界のほとんどのプログラマーがよく知っている機能です。AS/400 上ではさらに、ユーザー独自の Java ユーティリティーを IBM の Qshell ユーティリティーと組み合わせて使用すれば、素晴らしい効果が得られます。Java 仮想マシン (JVM) のランタイム・プロパティーをリストする、次の簡単な Java ユーティリティーを考えてみましょう。 public class ShowMeProperties { public static void main(String[] args) { java.util.Properties p = System.getProperties(); p.list(System.out); } } ほとんどの AS/400 上でこのプログラムを実行すると、30 以上のプロパティーのリストが作成されます。このリストを絞り込んで、OS/400 固有のプロパティー (リスト内で os400 というテキストで区別されている) だけを含むようにしたい場合を考えましょう。このためには、QShell 固有の機能を利用して、あるユーティリティーの出力を別のユーティリティーの入力に送ります。この機能はパイプと呼ばれ、縦線 (|) によって指定されます。実際には、パイプは次のようなものです。 java ShowMeProperties | grep 'os400.' この例では、パイプによって Java プログラムの出力はシェルの grep ユーティリティーの入力になります。この方法で grep を行うと、grep はプロパティー・リスト内のそれぞれの出力行からテキスト os400. を検索し、このテキストを含む行だけを検出して出力します。 os400.create.type=direct os400.class.path.security.check=20 os400.class.path.rawt=0 os400.class.path.system=PRE . . . パイプを使用すると、Java プログラムの標準出力ストリームをあらゆる Qshell ユーティリティーに送ることができます。自作の Java ユーティリティーにあれこれ付け加える前に、出力を既存のシェル・ユーティリティーにパイピングして同じ結果が得られないかどうか調べてください。 上記の Java プログラムを実行する際に "Process must be multithread capable to run Java programs" というエラー・メッセージが出された場合は、次の OS/400 コマンドを使用して Qshell のマルチスレッド・プロセスを使用可能にします。 ADDENVVAR ENVVAR(QIBM_MULTI_THREADED) VALUE(Y) Dan Darnell NEWS/400 テクニカル・エディター デフォルト・オプションとして SRCDBG を指定する 私のような仕事をしている方なら、OPM CL プログラムのソール・レベル・デバッグを使う必要があるでしょう。しかしこのためには、CRTCLPGM コマンドに OPTION(*SRCDBG) を指定する必要があります。OPTION パラメーターのデフォルトとして *SRCDBG を指定 (CHGCMDDFT コマンドを使用して) できれば便利ですが、このパラメーターにデフォルト値を指定することはできません。ただし、この解決策としてユーザー定義の PDM オプションを使用できます。 「Work with Members Using PDM」パネルで、F16 を押して「Display User-Defined Options」パネルを表示します。このパネルから、F6 を押してユーザー定義オプションを作成し、図 5 に示した情報を入力します。ただし、 * &L は、作業している対象のメンバーを含むライブラリーの名前 * &N は、ユーザー定義オプションを指定した場所の隣にあるリスト内の項目の名前 * &F は、作業している対象のメンバーを含むソース・ファイルの名前 必要に応じて、これらの置換変数の値を環境に応じた定数値に変更できます。 Denise Smith、プログラマー / アナリスト Bob Evans Farms, Inc. Columbus, Ohio SDA での画面レイアウトの印刷出力 このことを知らずに AS/400 上で長い間 SDA を使っていたことが信じられません。SDA 内で書式を使用しているときに F17 を押せば、画面レイアウトと、その書式に定義されているすべてのフィールド名を両方とも印刷できます。このような印刷出力があれば、ディスプレイ・ファイルと対話する RPG (あるいは他の HLL) プログラムを書くときに便利です。 Eileen Nicol、Iss, Inc. 副社長 Bainbridge Island, Washington C プログラムのオブジェクト名の制御 SQL ストアード・プロシージャーを作成する際に、データベースは SQL プロシージャー論理をインプリメントするための C プログラム・オブジェクトを作成します。プロシージャー名が 10 文字より長い場合、システム・プログラム・オブジェクト名が 10 文字を超えてはならないため、データベースは 10 文字の名前を生成する必要があります。この生成された名前は、単にプロシージャー名の先頭 5 文字に固有な 5 桁の番号を付加したものなので、ユーザーにはあまり分かりやすくありません。 CREATE PROCEDURE ステートメントに SPECIFIC name 文節を追加するだけで、プログラム・オブジェクト名を制御できます。たとえば、次のプロシージャー定義に SPECIFIC が含まれていないと、システムによって生成される名前は PROMO00001 となり、SPECIFIC 文節に指定されている PROMOTE という名前より分かりづらくなります。 CREATE PROCEDURE PROMOTE_EMPLOYEE (IN EmpNum CHAR(4),IN NwLvl INT) LANGUAGE SQL SPECIFIC PROMOTE Proc1_Src: BEGIN DECLARE CurLvl INT; SELECT edlevel INTO CurLvl FROM emptbl WHERE empno=EmpNum; IF NwLvl > CurLvl THEN UPDATE emptbl SET edlevel=NwLvl, salary=salary + (salary*0.05) WHERE empno=EmpNum; END IF; END Kent Milligan DB2 UDB for AS/400 テクノロジー・チーム Partner World for Developers, iSeries 実行依頼したジョブの表示 図 6A のコードを使用して、CL メニューからジョブが実行依頼されたことをユーザーに示すことができます。図 6B は、RCVMSG が MSG 変数に戻す内容の例です。 この段階では、メッセージは変数 &ScMsgField 内にあります。この変数は、メニュー・ディスプレイ・ファイルに 80 バイトのフィールドとして定義されています。メッセージは、SNDRCVF (ファイルの送受信) コマンドによってユーザーに表示されます。 Robert Goodwin Boiling Springs, South Carolina QSH ユーティリティーの使用 AS/400 には、多数の便利な "Unix" 機能を実行できる QSH という組み込みコマンド・インタープリターがあります。QShell セッションを開始するには、コマンド行で qsh と入力します。 QSH ユーティリティーを使用して、次のことを実行できます。 1. ツリー構造をコピーする。たとえば 'cp -r /qopt//somedir' は、AS/400 組み込み CD-ROM からディレクトリー somedir にファイルを再帰的にコピーし、そのツリー構造を保存します。 2. IFS テキスト・ファイル内のストリングを検索する。たとえば 'grep foo/mydir/*' は、ディレクトリー mydir にある全ファイルからストリング foo を検索します。 3. ストリーム・ファイルの zip と unzip を行う。たとえば 'jar cvf x.zip/mydir/*.*' は、ディレクトリー mydir の全ファイルを x.zip という名前の新しい zip ファイルに圧縮します。 4. さまざまな検索基準のオプションを使用して IFS 内のファイルを検索し、オプションでこれらのファイルに対して機能を実行する。たとえば 'find /mydir -name test* -exec rm {} \;' は、ディレクトリー mydir 内の "test" で始まるファイルを検索して (再帰的に)、検出した各ファイルを削除します。 Shahar Mor、テクニカル・マネージャー BARMOR Information Systems Ramat Gan, Israel エラーでない例外の除去 ジョブ・ログにある実際にはエラーでない例外を除去したい場合、CL プログラム内でこのコードを使用できます。これを行うときには、どのメッセージをモニターして除去したいかが分かっている必要があります。 DLTF FILE(QTEMP/DSPOBJD) MONMSG MSGID(CPF2105) EXEC(DO) RCVMSG MSGTYPE(*EXCP) RMV(*YES) ENDO Scott Cole, Sr., テクニカル・アナリスト Excel Corporation Wichita, Kansas SDA 内でのシステム・コマンド行の起動 システム・コマンド行を起動するには F21 を押します。これはご存じですね? しかし SDA の中では、F21 を押してもシステム・コマンドは起動しません。SDA を終了してシステム・コマンドを起動することもできますが、SDA 内にいながらにしてシステム・コマンドを起動するキーがあります。そのキーは F22 です。 この機能が使用できるのは、画面イメージを設計している場合だけで (「Work with Display Records」のオプション 12)、すべての SDA プログラム内から使えるわけではないので注意してください。 Shyam Gummidela、コンサルタント Idea Integration Rochester Hills, Michigan |
| ↑このページのトップへ |
BELLDATA, Inc. Copyright reserved. |