掲示板で、PCのフィールドから、AS/400への混在フィールド(オープンフィールド)へ、アップロードしたときの、桁数の増加について書いたときの、計算式を書いておきます。「多分」合っていると思います。間違っていたらごめんなさい。
2001-6-30
注意
データ長に関連して、次の点にご注意を。
PCからデータをAS/400に渡す場合、フィールド区切り文字なしのデータストリーム全体で転送してしまうと、フィールド単位の転送ではないので、漢字のフィールドの増加で、受け取りのファイルのフィールドの中に、ぴったり入りません。たとえばレコードの先頭に漢字フィールドがあり、全角文字と半角文字の組みあわせで、場合によっては、短く、または、長くなるため、そのレコードの、次のフィールドの開始位置が、毎回変わってしまいます。これでは、受け取り側のフィールドを固定長とすることはできません。したがって、全角半角混在の漢字が含まれる場合、CSVなど、フィールドを切り分けるデリミッタが付いていないとだめです。
(尚、FTPではなく、PC5250のデータ転送などは、フィールド別の変換なので、漢字フィールドのみ気をつけていれば、いいことになります。)
お気をつけください。 |
これは、全角と半角が混在したデータをPCから、AS/400へアップロードしたときに、つけられるシフトコード(x'0e',
x'0f'')の個数の最大数を計算で求めて、データの長さがどのくらい増えるかを予測するものです。
(例1)
この例では、0e,0fは一組つくので、2バイト増えます。
PC
AS/400
1 |
2 |
3 |
4 |
5 |
6 |
7 |
0e |
漢 |
字 |
0f |
A |
(例2)
この例では、0e,0fは、2組つくので、4バイト増えます。つまりPCで5桁だと、AS/400では、最大、9桁のデータになる事がわかります。
PC
AS/400
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0e |
漢 |
0f |
A |
0e |
字 |
0f |
このように、AS/400側で、データ長が最も大きく膨らむのは、最も多く、0e0fが入る場合であることが容易に分かります。全角が続くと、まとめて、前後に1組の0e0fがつくので、0e0fが少ないので、最大長にはなりません。全角+半角、または、半角+全角のように、交互に全角と半角が出てくるデータが、そのひとつひとつの全角の前後に0e0fがつくので、最大長になるわけです。ここでは、全角+半角のパターンで考えてみます。
上記のようなデータをさらに考えてみましょう。
(例3)
PC(データ長11桁まで)
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
あ |
A |
い |
B |
う |
C |
え |
AS/400
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
0e |
あ |
0f |
A |
0e |
い |
0f |
B |
0e |
う |
0f |
C |
0e |
え |
0f |
上の表をよく見ると、
PCデータ長 |
AS/400最大データ長 |
2 |
4 |
3 |
5 |
4 |
6 |
5 |
9 |
6 |
10 |
8 |
14 |
9 |
15 |
10 |
16 |
11 |
19 |
となっています。PCデータ長が4バイトの場合は、全角+全角か、全角+半角+半角のパターンなので、最大は、どちらの場合でも、6バイトですね。PCデータ長が10バイトの場合でも、同様な考えができます。最大は、16バイトになると思います。
このPCのデータ長とAS/400最大データ長は、一対一なので、計算式で求められそうですね。全角2バイトと半角1バイトのペアがいくつ、データ長の中に入ることができるのか、さらに、あまった桁数内に、全角を入れることができるのか、が解法につながると思います。
- PCのデータ長(a)を3で割った、整数の商を求めることで、いくつ全角+半角が入るかが分かります。この数を、x
とします。
- さらに、PCのデータ長を3で割った、整数の余り(0, 1, 2
しかあり得ない)が、2の場合、全角を1文字入れることができます。(上記(例2)を見てください。)余りが、2の場合、y=1
とし、そうでない場合は、y=0とします。
- この x と y が入りうる最大の全角数なので、各々にx'0e'とx'0f'の2バイトが入るので、AS/400で付加されるバイト数は、
(
x + y ) × 2
となります。
- PCのデータ長を a として、上記をまとめると
AS/400で付加されるシフトコードの総バイト長 = ( int( a / 3 ) +
int(
mod ( a / 3) / 2 ) ) * 2
となります。
たとえば、EXCELでの計算式は、
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
1 |
PCのデータ長 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
2
|
AS/400の最大データ長 |
4 |
5 |
6 |
9 |
10 |
11 |
14 |
15 |
16 |
19 |
20 |
このセルの「B2」の定義は、=B1+((INT(B1/3)+INT(MOD(B1,3)/2))*2) になっています。
2001-6-17 |