2 返信 最新の回答 日時: Jul 30, 2013 5:20 PM ユーザー:h.amano

    バイト表示について(固定長)

    h.amano

      タイトル

      バイト表示について(固定長)

      フォーラムに投稿

           FMではあまりバイト数管理をしないのですが

           会社のシステム上 どうしても固定長でデータを送らないといけないことがあります。

           例えば 60バイトで転送するとすれば

           実際の文字バイトが30だった場合残りの30バイトは空白を入れ60バイトにして送るということをしています。

           ここで質問ですが

           実際の文字バイトが70だった場合、60バイトでデータを転送しないといけないので

           10バイト自動的に切らないといけません。

           その場合はどのように関数を組めばよいのか教えてください。

           よろしくお願いします。

        • 1. Re: バイト表示について(固定長)
          hiro_

               お尋ねします。
                環境は? データに2バイト文字も混入?

               一応、FM8.5以降?環境で、2バイトも混入と想定して、計算式は、

               Let([
                $data=データフィールド;
                $data=Left($data & Substitute(10^Max(60-Length($data);1)-1;9;" "); 60);
                $dmy=Choose(Sign(PatternCount($data;"~"));"~";"^");
                $i=0;
                $res="";
                //自作関数を定義
                $byt=
                 "Length($chr&Filter($chr;RomanZenkaku(KanaZenkaku($chr))))";
                $fnc=
                 "Case(
                   $i=Length($data) or Length($res)>=60; $res;
                   Let([
                     $i=$i+1;
                     $chr=Middle($data;$i;1);
                     $chr=Case(Evaluate($byt)=2;$dmy) & $chr;
                     $res=$res & $chr
                     ]; Evaluate($fnc))
                  )";
                //-------
                $res=Evaluate($fnc);
                 $res=Left($res;60);
                  $res=Left($res;60-1) & Case(Right($res;1)=$dmy;" ";Right($res;1));
                   $res=Substitute($res;[$dmy;""])
               ];
                $res
               )
                

               ※ 60バイトに満たないデータは不足分を半角スペースで満たす。
               ※ 60バイト目が2バイト文字の場合、切り捨て・半角スペースへ置換。

          • 2. Re: バイト表示について(固定長)
            h.amano

                 Hiro様

                 ありがとうございます。

                 環境を書き忘れていました。

                 WIN  FMProA 12.4です。

                 データには 英数字 漢字 かな すべて含まれます。

                 現在は 例えばユーザ名でしたら

                  第一段階として

                 Length(エンドユーザー名称 & Filter(エンドユーザー名称;RomanZenkaku(KanaZenkaku(エンドユーザー名称))))

                 でバイト数を出して

                 第二段階で

                 Left ( エンドユーザー名称 & "                                                            " ;60 - ユーザバイト数 +ユーザ文字数)

                 で60バイトにして固定長で送っています。

                  

                 勉強不足で 返答していただいている 式に

                 うまくあてはめることができるのか わかりませんが

                 ゆっくりやってみます。

                 ありがとうございました。