初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2017-06-13 15:20:10

まみこ
Member

再帰式について

いつもお世話になっております。
環境はwin7,pro14です。

keimaさんの計算式をアレンジしたいと思います。
https://fm-aid.com/bbs2/viewtopic.php?id=1519

これは、ハガキで7文字なのですが、9文字分の枠に合わせた文字間隔を設定したいのです。
$no=7;を$no=9;に変えたり、
$PSz1=19;   /*  数字の間隔 ( スペースのサイズ  )    */
$PSz2=24;   /* ハイフン部分の間隔  */
を同じ値にしたり、試行錯誤をしてみたのですが、どうしても9文字を表示しようとすると、間隔が開かずに表示されてしまいます。
どうしたらできますか。
よろしくお願いいたします。

keima wrote:

7つの数字の文字の間にサイズ指定のスペースを入れた計算式ひとつで済ませる案
フォントはOCRB、文字サイズは12p 。
FMでは文字サイズは整数しか使えないので
各文字の間は半角スペース19p、ハイフン部分は24p にした。
もっと細かく調整したければ、2文字目と3文字目の間のサイズをCase文のところで調整するとか。

Let([
$PN=Filter ( RomanHankaku ( 郵便番号 ) ; "0123456789" );
$no=7;
$PSp=" " ;
$PSz1=19;   /*  数字の間隔 ( スペースのサイズ  )    */
$PSz2=24;   /* ハイフン部分の間隔  */
$result="";
$f="Case(
   $no < 1;TextFont ( $result ; \"OCRB\" ) ;
    Let([$result=Middle ($PN;$no;1) & Case($no=3;TextSize ($PSp ; $PSz2 );TextSize ($PSp ;$PSz1)) & $result;
   $no=$no-1
];Evaluate($f))
)"
];
Evaluate($f)
)

Offline

#2 2017-06-13 16:50:13

Hiro
Member

Re: 再帰式について

繰り返しフィールドに1文字ずつ切り出して、フィールドのレイアウト表示調整でやる方が良いのでは無いかなぁ?

Offline

#3 2017-06-14 09:14:48

まみこ
Member

Re: 再帰式について

Hiro様回答ありがとうございました。
再帰式の理解ができないうちは、このやり方が良いかもしれませんね。
早期実用に向けて頑張りたいと思います。

Offline

#4 2017-06-14 12:23:50

Shin
Member

Re: 再帰式について

再帰式の云々 というより、かなりニッチな方法だと思いますよ。
基本的な解法は、レイアウトの上でオブジェクトの配置で行うのが一番いいのでは。等間隔なら、繰り返しフィールドが簡単、不等間隔ならばそれぞれのオブジェクトで。

それが不可能で、テキスト処理しないといけないのならば、文字間にタブを設定して、タブストップを使って整形する、
それが不可能ならば、スペースを入れて文字間調整でしょう。

Offline

#5 2017-06-14 14:40:24

まみこ
Member

Re: 再帰式について

Shin様回答ありがとうございます。
繰り返しフィールドはすぐできそうなので、
今はLet関数を勉強してます。
middleの関数をどう組み込んでやっていけばいいのか悩んでいます。
タブストップ 調べてやってみます。
時間がかかりそうですが、希望のものができるように仕上げていきたいと思います。

Offline

#6 2017-06-15 06:58:00

wader
Member

Re: 再帰式について

Let関数の勉強はいいけど、Evaluateを使った再帰というのはちょっと別物だと思います。
9文字(以下)と決まってるなら、再帰のメリットはなく、繰り返しフィールドや9回並べた計算式の方がいいでしょう。

Offline

#7 2017-06-15 09:29:19

まみこ
Member

Re: 再帰式について

wader様回答ありがとうございます。

昨日一日Let関数を考えた結果、
Let ([
  a = 合計額;
  n=1;
  c=24;
  k=9;
  b=TextSize ( GetAsText ( " " ); c)];
  Middle ( a ; n ; 1 )&b&
  Middle ( a ; n+1; 1 )&b&
  Middle ( a ; n+2 ; 1 )&b&
  Middle ( a ; n+3 ; 1 )&b&
  Middle ( a ; n+4 ; 1 )&b&
  Middle ( a ; n+5 ; 1 )&b&
  Middle ( a ; n+6 ; 1 )&b&
  Middle ( a ; n+7 ; 1 )&b&
  Middle ( a ; n+8 ; 1 )&b
)
これが私的に限界かなと感じました。
middleの繰り返しの部分をloop処理にして一行にまとめたかったです。

Offline

#8 2017-06-15 12:16:40

Hiro
Member

Re: 再帰式について

本事例は、Evaluate再帰式の趣旨に則しませんが、
あくまで、ループ式の勉強としてなら、
その式例は、(合計額の文字数$kは変動可能、自動取得)

Let ([
   $a=合計額;
   $n=0;
   $c=24;
   $k=Length($a);
   $b=TextSize(Char(32); $c);
   $r="";
   $f=
      "Case($n=$k; $r;
         Let([
            $n=$n+1;
            $r=$r & Middle($a; $n; 1)&$b
         ]; Evaluate($f))
      )"
];
   Evaluate($f)
)

Offline

#9 2017-06-15 16:17:28

Shin
Member

Re: 再帰式について

ちょっと違う関数を使って、
Let ([
   $a=合計額;
   $c=24;
   $n=Length($a);
   $b=TextSize(Char(32); $c);
   $f=
      "Case($n=1; $a;
         Let([
            $a=Replace ( $a ; $n ; 0 ; $b );
            $n=$n-1
         ]; Evaluate($f))
      )"
];
   Evaluate($f)
)

Offline

#10 2017-06-16 10:44:33

まみこ
Member

Re: 再帰式について

Hiro様回答ありがとうございました。
繰り返しをする時は、case関数や、Evaluate関数を使うことは分かっていたのですが、使い方がわかっていなかった為、活かすことができませんでした。
しかし、上記の自分の考えた計算式と照らし合わせることによって、やっと解読することができました。

Hiro wrote:

本事例は、Evaluate再帰式の趣旨に則しませんが、
あくまで、ループ式の勉強としてなら、
その式例は、(合計額の文字数$kは変動可能、自動取得)

Let ([
   $a=合計額;
   $n=0;
   $c=24;
   $k=Length($a);
   $b=TextSize(Char(32); $c);
   $r="";
   $f=
      "Case($n=$k; $r;
         Let([
            $n=$n+1;
            $r=$r & Middle($a; $n; 1)&$b
         ]; Evaluate($f))
      )"
];
   Evaluate($f)
)

文字数が変動することも十分ありえます。
Char(32); がスペースのことだと初めて知りました。

Last edited by まみこ (2017-06-16 10:44:49)

Offline

#11 2017-06-16 10:52:44

まみこ
Member

Re: 再帰式について

Shin様回答ありがとうございました。
Hiro様の計算式よりも簡潔に作られていて驚きました。

Shin wrote:

ちょっと違う関数を使って、
Let ([
   $a=合計額;
   $c=24;
   $n=Length($a);
   $b=TextSize(Char(32); $c);
   $f=
      "Case($n=1; $a;
         Let([
            $a=Replace ( $a ; $n ; 0 ; $b );
            $n=$n-1
         ]; Evaluate($f))
      )"
];
   Evaluate($f)
)

Replace関数で文字サイズを変更(置換)&文字間を空ける作業をするのですね。
私の持っている参考書では、Replace関数が載っていませんでした。
初心者、中級者では、そんなに活用されない関数なのかなと思いました。
未知の関数が知れてとっても勉強になりました。

Offline

#12 2017-06-16 11:39:33

チポ
Member

Re: 再帰式について

Replace関数
が無い参考書!!

そんな粗悪がはびこっているのですかね。。


http://www.filemaker.com/help/14/fmp/ja … tml#423136
関数のヘルプです。

全ての関数の解説が有ります。
変な日本語も有りますが、
ただ見ているだけでもどんなことができるのか分かってきますよ。

Offline

#13 2017-06-16 11:50:09

まみこ
Member

Re: 再帰式について

ポチ様回答ありがとうございまいた。

チポ wrote:

Replace関数
が無い参考書!!

そんな粗悪がはびこっているのですかね。。


http://www.filemaker.com/help/14/fmp/ja … tml#423136
関数のヘルプです。

全ての関数の解説が有ります。
変な日本語も有りますが、
ただ見ているだけでもどんなことができるのか分かってきますよ。

すみません、INDEX(索引)に記載がなかったので、特殊な関数だと思い込んでしまいつい投稿してしまいました。
「そんな粗悪がはびこっているのですかね。。」っと言われ、気になって、関数・スクリプトステップ一覧のページを調べたら、ありました。
以後は索引以外のところでも確認をして投稿したいと思います。

Offline

#14 2017-06-16 12:04:25

Shin
Member

Re: 再帰式について

Replace関数 特殊な関数ではないのですが、滅多に使いませんね。頭文字付きのシリアル番号の変更の時に使ったかな

Offline

#15 2017-06-16 12:36:51

Moz
Member

Re: 再帰式について

リファレンス系(関数スクリプト活用事典・ビギナーズガイドなど)では全関数の説明がありますが
テクニック系(開発運用講座・FileMaker Drill Bookなど)には全関数の説明はありません。

書籍の性質によって記載されている内容は異なりますから、記載が無い = 粗悪 というのは適切ではありません。

公認のテクニック系の独習向けテキスト FileMaker Training Series にも全関数の解説はありませんし、
バージョンによっては Replace を記載していないものもあります。

全関数・スクリプトステップの知識を深めるためにはヘルプのリファレンスやリファレンス系の書籍を参考にされると良いでしょう。

Offline

#16 2017-06-16 13:08:19

チポ
Member

Re: 再帰式について

ああ、書き方が乱暴でしたか。。

他の関数の説明が有るのに抜けが有る。
と読んでのことでした。

結果有ったのですから、
「粗悪」
は取消をお願いいたします。

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.029 seconds, 9 queries executed - Memory usage: 557.45 KiB (Peak: 578.36 KiB) ]