最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

14.30.オープンフィールドのアップロード最大データ長

[ Previous ] [ HOME ] [ Upper ] [ Next ]


掲示板で、PCのフィールドから、AS/400への混在フィールド(オープンフィールド)へ、アップロードしたときの、桁数の増加について書いたときの、計算式を書いておきます。「多分」合っていると思います。間違っていたらごめんなさい。
2001-6-30

注意

データ長に関連して、次の点にご注意を。

PCからデータをAS/400に渡す場合、フィールド区切り文字なしのデータストリーム全体で転送してしまうと、フィールド単位の転送ではないので、漢字のフィールドの増加で、受け取りのファイルのフィールドの中に、ぴったり入りません。たとえばレコードの先頭に漢字フィールドがあり、全角文字と半角文字の組みあわせで、場合によっては、短く、または、長くなるため、そのレコードの、次のフィールドの開始位置が、毎回変わってしまいます。これでは、受け取り側のフィールドを固定長とすることはできません。したがって、全角半角混在の漢字が含まれる場合、CSVなど、フィールドを切り分けるデリミッタが付いていないとだめです。

(尚、FTPではなく、PC5250のデータ転送などは、フィールド別の変換なので、漢字フィールドのみ気をつけていれば、いいことになります。)

お気をつけください。

 


これは、全角と半角が混在したデータをPCから、AS/400へアップロードしたときに、つけられるシフトコード(x'0e', x'0f'')の個数の最大数を計算で求めて、データの長さがどのくらい増えるかを予測するものです。

(例1)

この例では、0e,0fは一組つくので、2バイト増えます。

PC

1 2 3 4 5
A

AS/400

1 2 3 4 5 6 7
0e 0f A

(例2)

この例では、0e,0fは、2組つくので、4バイト増えます。つまりPCで5桁だと、AS/400では、最大、9桁のデータになる事がわかります。

PC

1 2 3 4 5
A

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バイトのペアがいくつ、データ長の中に入ることができるのか、さらに、あまった桁数内に、全角を入れることができるのか、が解法につながると思います。

  1. PCのデータ長(a)を3で割った、整数の商を求めることで、いくつ全角+半角が入るかが分かります。この数を、x とします。
  2. さらに、PCのデータ長を3で割った、整数の余り(0, 1, 2 しかあり得ない)が、2の場合、全角を1文字入れることができます。(上記(例2)を見てください。)余りが、2の場合、y=1 とし、そうでない場合は、y=0とします。
  3. この x と y が入りうる最大の全角数なので、各々にx'0e'とx'0f'の2バイトが入るので、AS/400で付加されるバイト数は、

    ( x + y ) × 2 

    となります。
  4. 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


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送