Alpha、Char、String、BLOB、CLOBフィールドでの無効文字の処理
使用しているオペレーティング・システムの正しい形式を使用する必要があります。Windowsの場合、<ドライブ>:\<パス>\<ファイル>.<接尾辞> 形式の完全修飾名または <ファイル>.<接尾辞> などの省略形を使用できます。省略形を使用した場合、現在のディレクトリでファイルが置換または作成されます。
通常、<接尾辞> 値DATが永久データ・ファイルに使用され、TMPが一時ファイルに使用されます。ファイルが存在する場合、ファイルは開かれ、既存のデータはすべて消去されます。ファイルが存在しない場合、ファイルが作成され、開かれます。
Alpha、Char、String、BLOB、CLOBフィールドでの無効文字の処理
出力ファイルは、出力データに挿入される文字値により破壊される場合があります。このオプションは、無効な文字が発見された場合の処理を指定します。スキャンされる無効文字の一式は、以下のように、要求された出力形式により異なります。
|
注:Alpha、Char、String、BLOB、CLOBフィールドのみ、無効文字のスキャンが実行されます。
以下の無効文字の処理オプションがサポートされます。
このオプションが必要なのは、小数点区切りにコンマ(,)を使用するようにシステムが設定されている場合だけです。デフォルトでは、出力の数値フィールドはコンマを使用しますが、これは、他製品がコンマを受け入れない場合、適切ではない場合があります。このオプションを使用してこの組み込み関数に終止符/ピリオド文字(.)の使用を強制することができます。
このパラメータに使用できる他の特殊オプションとして'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)
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).
このオプションおよび組み込み関数の使用に関するいくつかのヒントを以下に示します。
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 |
出力ストリームからこのエントリーを除外します。 |
付加オプション・フィールドは、実際はリストの一部ではありません。その値は検査されますが、出力バッファーには出力されません。したがって、付加オプション・フィールドは実際には作業リストの一部として定義されますが、レコード・レイアウトおよび長さ計算には関係しません。
ここまで、「付加リスト」の使用方法は明確ではないかもしれません。しかし、付加リストを使用すれば以下の問題を解決することができます。
以下は、"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レベルでトラップすることはできません。
|
注:
複雑なエラー処理スキームをご使用のアプリケーションに組み込むことは避けるよう、強くお勧めします。アプリケーションのすべてのレベルで、以下のようなごく単純なトラップを使用するようにしてください。
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時) のユリウス通日となります。
次の計算を使って、ユリウス通日をグレゴリオ暦の日付に変換します。この場合、ユリウス通日は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 (それ以外の場合)
以下も参照してください。