9.231.2 その他のパラメータ
Alpha、Char、String、BLOB、CLOBフィールドでの無効文字の処理
使用しているオペレーティング・システムの正しい形式を使用する必要があります。Windowsの場合、<ドライブ>:\<パス>\<ファイル>.<接尾辞>形式の完全修飾名または<ファイル>.<接尾辞>などの省略形を使用できます。省略形を使用した場合、現在のディレクトリでファイルが置換または作成されます。
通常、<サフィックス>値DATが永久データ・ファイルに使用され、TMPが一時ファイルに使用されます。ファイルが存在する場合、ファイルは開かれ、既存のデータはすべて消去されます。ファイルが存在しない場合、ファイルが作成され、開かれます。
Alpha、Char、String、BLOB、CLOBフィールドでの無効文字の処理
出力ファイルは、出力データに挿入される文字値により破壊される場合があります。このオプションは、無効な文字が発見された場合の処理を指定します。スキャンされる無効文字の一式は、以下のように、要求された出力形式により異なります。
形式 |
無効な文字 |
---|---|
AおよびB |
水平タブ、垂直タブ、キャリッジ・リターン、改ページ、バック・スペース、改行(ライン・フィード)、二重引用符、最終文字列の区切り(すなわちX'00') |
O |
水平タブ、垂直タブ、キャリッジ・リターン、改ページ、バック・スペース、改行(ライン・フィード)、コンマ、最終文字列の区切り(すなわちX'00') |
T、C、およびD |
水平タブ、垂直タブ、キャリッジ・リターン、改ページ、バック・スペース、改行(ライン・フィード)、最終文字列の区切り(すなわちX'00') |
注:Alpha、Char、String、BLOB、CLOBフィールドのみ、無効文字のスキャンが実行されます。
以下の無効文字の処理オプションがサポートされます。
· B - ブランクに置き換え
無効文字は出力ストリームでブランク文字に置き換えられます。
· I - 無視
無効文字の表示は無視されます。無効文字は出力ストリームに含まれます。したがって、以後、他のアプリケーションの処理でファイルが破壊される可能性があります。
· R - 出力から削除する
無効文字は出力ストリームから削除されます。このオプションにより出力フィールドの長さは1桁短くなります。「固定形式」の出力ファイルを作成するときにこのオプションを使用するべきではありません。
このオプションが必要なのは、小数点区切りにコンマ(,)を使用するようにシステムが設定されている場合だけです。デフォルトでは、出力の数値フィールドはコンマを使用しますが、これは、他製品がコンマを受け入れない場合、適切ではない場合があります。このオプションを使用してこの組み込み関数に終止符/ピリオド文字(.)の使用を強制することができます。
このパラメータに使用できる他の特殊オプションとして'R'(削除)があります。このオプションは、固定レコード形式で「暗黙(位置による)」の小数点を使用する、アプリケーションへの入力ファイルを作成する場合に使用することができます。
'R'オプションは'C'および'D'のファイル形式にだけ使用することができます。
クローズ出力ファイル・オプションは、組み込み関数が、実行完了時に出力ファイルをクローズすることを防ぎます。
通常の使用では次のようになります。作業リストにデータがロードされ組み込み関数に渡されます。作業リストが読み込まれ、ディスク・ファイルに書き込まれると、ディスク・ファイルはクローズされます。以後、同じファイル名を使ってこの組み込み関数が使用された場合、既存のファイル(およびそのデータ)は新しいデータ一式で置き換えられます。
"do not close"オプションを使用した場合、次の例のように、さらに複雑な処理を実行することができます。
レコード件数が9999を超える出力ファイルや膨大な作業リスト(大量のメモリーの割り当てが必要)を作成しないようにするには、以下のコードのようにします。このコードでは、作業リストのサイズは100エントリーしかありませんが、効率良く使用して、出力ファイルにレコードを何件でも作成することができます。作業リストはアプリケーションの出力バッファーのような働きをします。
def_list #list fields(....) listcount(#count)
type(*working) entrys(100)
select fields(...) from_file(...)
add_entry #list
if (#count = 100)
use TRANSFORM_LIST #list (with "do not
close" option)
clr_list #list
endif
endselect
use TRANSFORM_LIST #list (with "close" option)
· 混在するレコード・タイプを持つ出力ファイルを作成します。2つの異なる「レコード・タイプ」を持つオーダー詳細が含まれる出力ファイルを考えてみましょう。1つはオーダーの「ヘッダー」で、もう1つは各オーダーの「明細」項目です。これを処理するファンクションは以下のように構築することができます。
def_list #head fields(....) type(*working) entrys(1)
def_list #line fields(....) listcount(#count) type(*working) entrys(100)
select fields(...) from_file(orders)
inz_list #head num_entrys(1)
use TRANSFORM_LIST #head (with "do not close" option)
select fields(...) from_file(lines) with_key(...)
add_entry #line
if (#count = 100)
use TRANSFORM_LIST #line (with "do not
close" option)
clr_list #line
endif
endselect
use TRANSFORM_LIST #line (with "do not close"
option)
clr_list #line
endselect
use TRANSFORM_LIST #line (an empty list with "close"
option).
このオプションおよび組み込み関数の使用に関するいくつかのヒントを以下に示します。
· この組み込み関数は、Visual LANSAアプリケーションと外部アプリケーションとの間のインターフェースとなることを目的に作成されました。このファンクションは、ファイルをオープンしてデータをファイルに書き込んだ後に、ファイルを再度クローズするように作られています。このファンクションは、「常時オープン」ログ・ファイル保守のような、さらに複雑な「システム」レベルのタスクをサービスすることを目的とするものではありません。
· 50個までの出力ファイルを同時にオープンできます。お使いのオペレーティング・システムによっては、これより少ない制限または構成オプションが使用される場合があります。
· 最大レコード長に対する制限はありません。各レコードの最後に、改行(NL)文字がレコードの終わりを示す区切り文字として追加されます。
· 作成したファイルがLANSA 10.0 以前のバージョンのTRANSFORM_FILEで読み込まれる場合、レコードの最大長は20000バイトにしなければなりません。
· この組み込み関数の最後の呼び出しで、必ず出力ファイルがクローズされるようにします。単にファイルをクローズして、これ以上データを追加しない場合は、空またはクリアした作業リストを渡します。
· この組み込み関数は、呼び出される度にすべての引数をチェックして、現在オープンされている出力ファイルのリストから一致するものを検索する必要があります。したがって、大量のエントリーが含まれるリストを使って呼び出しを少なくする場合が最も効率が良く、少しのエントリーしか含まれないリストを使って何度も呼び出す場合は最も非効率になります。
RDMLX作業リストを導入する場合、フィールド数が1000以下、エントリー数が2G(2147483647)以下、エントリー長が2Gb(2147483647バイト)以下であれば、ほとんどの場合、付加リストの必要はありません。しかし、RDMLX付加リストを使用する場合は、RDMLリストと同じ規則が適用されます(上記は別とします)。基本作業リストがRDMLXリストの場合、付加リストは使用できないので注意してください。
この組み込み関数を呼び出すとき、最大10個の付属作業リストを指定することができます。この組み込み関数はループを実行しますが、そのループは以下のように表されます。
-> do for each entry in the "primary" working list (ie: argument 1)
|
| map details of primary list entry "n" to output buffer
|
| -> do for each appendage working list that has been specified.
| | get a matching entry "n" from the appendage list.
| | -- if entry "n" can be found
| | | -- test the case of the entry's "appendage option"
| | | |----> when = A, Append this entry to the current record.
| | | |----> when = N, Write the existing buffer, ends the current record with a New Line
| | | | character .Clear the output buffer and map this entry into it to start a new | | | | record.
| | | |----> when = O, Omit (ie: skip) this list entry.
| | | |----> otherwise: Issue a fatal error and kill the function.
| | | -- endcase
| | -- endif
| -- enddo
|
| if the buffer is not empty, write output record from buffer.
|
-- enddo
「付加オプション」に注意して下さい。作業リストを付加リストとして使用する場合、最初に定義するフィールドは、1桁の英数字フィールドにする必要があります。この1桁の英数字フィールドは「付加オプション」で、エントリーの処理方法を示します。現在サポートされている値は以下のとおりです。
A |
生成される出力バッファーにこのエントリーを付加します。 |
N |
既存のバッファーを書き込み、このエントリーで新たなバッファーを作成します。 |
O |
出力ストリームからこのエントリーを除外します。 |
付加オプション・フィールドは、実際はリストの一部ではありません。その値は検査されますが、出力バッファーには出力されません。したがって、付加オプション・フィールドは実際には作業リストの一部として定義されますが、レコード・レイアウトおよび長さ計算には関係しません。
ここまで、「付加リスト」の使用方法は明確ではないかもしれません。しかし、付加リストを使用すれば以下の問題を解決することができます。
· RDML作業リストに含めることのできるフィールド数は最大で100個です。しかし、120個のフィールド(例えば)を含むファイルを出力しなければならない場合もあります。100個のフィールドを持つ基本RDMLリストと、21個のフィールド(付加オプション・フィールド含む)を持つ付加リストを1つ使用することで、これに対応することができます。以下の例では199個までのフィールドが含まれるレコードを持つ出力ファイルを作成することができます。付加リストは10個まで指定できるため、論理的に合計で、100+(10×99)=1090フィールドを出力ファイル・レコードに持たせることができます。同様に、RDML作業リストの最大エントリー長を256バイトに制限しているファンクションがあります(これはI5/OSの制限ですが、アプリケーションの移植性を維持するため、Visual LANSAにもこの制限が課せられています)。この制限もまた、1つまたは複数の付加リストを使用することで容易に解決することができます。
· 120個のフィールドを持つRDMLX作業リストを使用する場合、「付加リスト」の必要はありません。
以下は、"A"(付加)オプション"の例です。しかし、"N"(新規)や"O"(除外)などの付加オプションを効果的に使用して「可変レコード・ファイル」を効率的に作成することができます。
def_list #plist fields(....) type(*working)
def_list #alist1 fields(#aoption .....) type(*working)
change #aoption 'A'
select fields(...) from_file(....)
fetch fields(...) from_file(...)
fetch fields(...) from_file(...)
fetch fields(...) from_file(...)
add_entry #plist
add_entry #alist1
endselect
use TRANSFORM_LIST #plist (with appendage list #alist1)
既存のメインフレーム・アプリケーション・システムへの入力のために、何かの「トランザクション」出力ファイルを作成しなければならない場合を考えて見ましょう。
すべての顧客に"HDR"タイプのヘッダー・レコードを持たせる必要があります。"ADR"タイプの住所更新レコードや"BIL"タイプの請求書レコードもあります。この様式は極めて旧式ですが依然として一般的なものです。
HDRデータで基本リスト、ADRとBILデータ(付加オプション・フィールド付き)で2つの付加リストを定義することにより、この組み込み関数を単に1回呼び出すだけで、以下のようなフォーマットが混在した任意のレコード「ストリーム」を作成することができます。このケースでは、付加オプションのO(除外)とN(新規)が使われます。
HDR-HDR-ADR-HDR-BIL-HDR-ADR-BIL-HDR-HDR-ADR-BIL-HDR
しかし、1つのHDRレコードに複数のBILレコードを作成する場合は、"do not close"オプションの使用が必要です。この方法については、「クローズ出力ファイル・オプション」を参照して下さい。
次の表に、ER戻りコードが戻され、RDMLレベルでトラップすることができるエラー(ユーザー・トラップ)とアプリケーションの致命的な障害を引き起こすエラー(システム・エラー)を示します。システム・エラーが発生すると、Visual LANSAの完全なエラー処理が呼び出され、X_RUN「セッション」全体が終了します。通常、システム・エラーをRDMLレベルでトラップすることはできません。
エラーのタイプ |
エラー状況 |
---|---|
オープンしようとする出力ファイル数が多すぎます。 |
システム・エラー |
出力ファイルオプションが、A、T、C、D、B、またはOではありません。 |
システム・エラー |
無効な文字のオプションに、I、B、R以外を指定しました。 |
システム・エラー |
復帰(CR)制御のオプションに、Y、N、T以外を指定しました。 |
システム・エラー |
ファイル・クローズ・オプションに、Y、N以外を指定しました。 |
システム・エラー |
付加リストの付加オプションが無効です。 |
システム・エラー |
出力ファイルのオープンでエラーが発生しました。 |
ユーザー・トラップ |
オープンされた出力ファイルへの書き込み中にエラーが発生しました。 |
システム・エラー |
注:
複雑なエラー処理スキームをご使用のアプリケーションに組み込むことは避けるよう、強くお勧めします。アプリケーションのすべてのレベルで、以下のようなごく単純なトラップを使用するようにしてください。
if (#retcode *ne OK)
abort msgtxt('Failed to .............................')
endif
標準的なエラー処理を行う組み込み関数を生成されるアプリケーションに組み入れて、問題に対処するようにしてください。ユーザー定義のエラー処理ロジックが非常に複雑になったために全RDMLコードの40から50%を占有するようなケースもあります(アプリケーションには何のメリットもありません)。このような事態に陥らないようにしてください。
ユリウス通日とは、過去(-4712年1月1日、12時UTC(協定世界時 - 現在のグリニッジ標準時と同等) (Julian proleptic Calendar) = 4713 BCE 1月1日、12時GMT(Julian proleptic Calendar) = 4714 BCE 11月24日、12時GMT(Gregorian proleptic Calendar))からの日数です。この時点のユリウス通日の値が、0となります。
ユリウス通日は、Julius Caesarによって導入されたユリウス暦とは関係ありません。ユリウス通日は、この概念を考案したJosephus Justus Scaligerの父、Julius Scaligerから名付けられました。
ユリウス通日を計算するためのアルゴリズムは複数存在します。この複数のアルゴリズムは非常に類似していますが、結果は異なる場合があります。この組み込み関数で使用するアルゴリズムでは、グレゴリオ暦で指定された日付のユリウス通日を計算します。計算されるユリウス通日は、その日付の0時(GMT)の値です。
1. 日付をY M Dで表します。ここで、Yは年、Mは、月(1月 = 1、2月 = 2など)、Dは、その月内の日です。
2. 月が1月または2月の場合、新しいYを得るために年から1を引き、新しいMを得るために月に12を足します(つまり、1月と2月は、前年の13番目と14番目の月と考えます)。
3. すべての乗法と除法の結果から端数部分を取り、次のように計算します。
A = Y/100
B = A/4
C = 2-A+B
E = 365.25x(Y+4716)
F = 30.6001x(M+1)
JD= C+D+E+F-1524
このようにして計算された値が、該当の日付の始まり(UTC0時)のユリウス通日となります。
例えば、日付が1582年10月15日の場合、次のようになります。
Y = 1582
M = 10
D = 15
A = 15
B = 3
C = -10
E = 2300344
F = 336
JD = 2299161
結果は、2299161日になります。
ユリウス通日をグレゴリオ暦の日付に変換する場合、ユリウス通日は0時(UTC)に対する日数であると考えてください。次の計算を行い、すべての乗法と除法の結果から端数部分を取り除きます。
注:この方法によって、 Gregorian Proleptic Calendar(つまり、グレゴリオ暦のうるう年規則を使用して、1582年より前の年にグレゴリオ暦を遡らせることによって得られる暦)上の正確な日付は得られません。特に、Y<400の場合、この方法は失敗します。
Z = JD
W = (Z - 1867216.25)/36524.25
X = W/4
A = Z+1+W-X
B = A+1524
C = (B-122.1)/365.25
D = 365.25xC
E = (B-D)/30.6001
F = 30.6001xE
月の日 = B-D-F
月 = E-1またはE-13 (12以下の数値を取得する必要がある)
年 = C-4715 (1月または2月の場合)またはC-4716 (それ以外の場合)
例
JD = 2299161から計算を開始し、最初の例を確認します。
Z = 2299161
W = 11
X = 2
A = 2299171
B = 2300695
C = 6298
D = 2300344
E = 11
F = 336
月の日 = 15
月 = 10
年 = 1582