みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
FMS19とFMP19でWindows環境、ServerはMACMini(Ventura13.1)の構成です。
工程1,工程2というふうに番号のついたフィールドが20ほどあります。
このフィールドの中にAの文字があれば、関連する部品番号1,2のマスターリストに飛び、印刷をします。これをフィールドすべてで繰り返したいのです。
Loop関数では、次のレコードで繰り返せますが、1つのレコードのなかのフィールドで繰り返したいときはどうすればできますでしょうか。フィールドは数字の番号が後ろについています。この後ろの数字を01,02としている場合はどうなるでしょう?
Offline
ファイル構造を、根本から作り直しましょう。今のままでもloopを繰り返せば作れないことはないのですが、膨大な作業になりますし、工程数が増えたりした場合に、同じだけの作業が発生します。
まず、工程を、1工程ごとに別テーブルのレコードとし、ポータルで表示するようにします。そのレコードから、部品のマスターテーブルへリレーションしておきます。
その構造でしたら、作業レコードから、関連レコードへ移動、で工程テーブルへ移動します。工程名にAの文字があるものへレコードを絞り込みます。
もし、工程ごとに重複する部品がないのでしたら、そのまま、対象レコードから関連レコードへ移動すればいいです。
重複する部品がなあるのでしたら、一レコードごとに関連レコードへ移動し、印刷すればいいでしょう。
Offline
> Loop関数では、次のレコードで繰り返せますが、
> 1つのレコードのなかのフィールドで繰り返したい
これへの回答です。
それらのフィールドを順にタブ順を付けておき、
スクリプトステップ
次のフィールドへ移動
で移動できます。
最後の判定が必要であるのと、
必ずそのレイアウトで実行する必要があります。
構造はShinさんの通りだと思いますが。。
Offline
一応フィールドでの繰り返し処理の方法を書くと、
フィールドのリストを作っておいて、
そこからGetField(GetValue($fieldList;$n))
という風に取得できます。
フィールドのリストを作らずループ内で自動生成するんでもいいですが
>この後ろの数字を01,02としている場合
SerialIncrement(”工程00";$n)
しかし、
>工程1,工程2というふうに番号のついたフィールドが20ほどあります。
これ自体が、データベースとして正しい構成ではないことを示しています。
いろいろありがとうございます。どれもむずかしいですね。
1つのレコード内にある30ぐらいのフィールドなんです。
1つのフィールドに対して文字を検索して、関連レコードを印刷するという2行だけのスクリプトになりますので。
これを30個繰り返せば済む話なんです。
スマートではないですが、ミスしなさそうなのでしこしこ30こつくります
Offline
重複する部品がなければ、4行のスクリプトですべてできますよ。
https://www.dropbox.com/s/ryj1xfv5vgfyq … 2.zip?dl=0
Offline
みなさんありがとうございます。単純に考えてみました
Loop用番号フィールドをつくりました。
Loop関数でこのフィールドをLoopのなかで+1します。
工程1,工程2というフィールドを「工程+Loop番号」にして、この中にAという文字が含まれるかどうかをIF文でPatternCountで検索したいのです。
Loop用番号が30になったらLoopをやめるでいいとおもうのですが、
フィールドの指定がうまくいきません。
どうすればいいのでしょう。
Offline
Evaluate ( "工程" & Loop番号 )
とするか、
GetField ( "工程" & Loop番号 )
を使います。
工程1〜工程30の中のどこかに"A"があるかどうかだけ見ればいいのでしたら、
List ( 工程1 ; 工程2 ; ..... ; 工程30 )
でみればいいのかも、
Last edited by Shin (2023-04-09 13:57:18)
Offline
ありがとうございます。Evaluate(”工程“&Loop番号)関数でできました。
この工程01のフィールドにAが含まれていたら、部品番号01に記載されているファイルにジャンプして印刷実行して戻ってきたいのです。
しかし、関連レコードの取得元の欄にはEvaluate関数などがつかえません。
同じように部品番号&Loop番号のファイルにジャンプしたいのです。
うまくいきません。
Offline
もうちょっとちゃんとした用語で説明してください。
「部品番号01に記載されているファイルにジャンプ」フィールドにファイル名を記載しているわけじゃないですよね?
「関連する」といっても何がどう関連するのかわかりません。
「部品番号」と言うフィールドなら、部品名が入っているのでは?
その部品をマスタから検索して印刷したいような気がしますが、
「関連レコードへ移動」を使うには、フィールド20個とか30個分のリレーションを定義しないといけなくなります。
検索して印刷するスクリプトにして、引数で部品番号を渡せばいいと思うけど...
部品ごとに全部バラバラに印刷していいんでしょうかね...
複数のフィールドに同じ部品がある場合とか...
ごめんなさい。「部品番号01」はファイル名なんです。関連レコードへ移動は30のリレーションを定義しています。
印刷したいのは、この部品番号01のファイルの一つのレイアウトの印刷なんです。
Offline
ファイルの構造設計が無茶苦茶です。
今の構造からスクリプトを作るなら、
If ( PatternCount ( 工程01 ; "A" )
スクリプトを実行[部品番号01 ; 印刷実行]
endIf
を延々30繰り返すしかないでしょう。30個の部品ファイル側にも、印刷実行 のスクリプトと印刷するためのレイアウトがそれぞれ必要です。あとあとメンテナンスも大変ですよ。
Last edited by Shin (2023-04-10 17:30:57)
Offline
確かに、Filemakerのよいところだと思っているのですが、あとからあとからクライアントの要求を簡単に実現できるというのが。そのせいでだんだんスパゲッティコードになっていくような気がします。
ということは、関連レコードへジャンプするときに計算式をつかえないということでしょうか。
Offline
「関連レコードへ移動」は、移動先のテーブルのフィールド値とリレーションが成立しているのが前提なので、移動元のフィールド値が移動先のファイル名ではリレーションが成立しません。
「部品番号01」はファイル名なんです。
と聞いて、一瞬部品の画像ファイルのファイル名をデータとして持ってるのかと思いましたが、
この部品番号01のファイルの一つのレイアウトの印刷
というので、ファイル名と言うのは.fmp12ファイルということですよね。部品番号ごとにファイルがあるというのがちょっと理解困難ですが...
印刷するレイアウト名とレコードはどこから取得できるのですか?
ごめんなさい。ちょっと混乱しています。
部品番号01はファイル名ではありません。マスターファイルのフィールド名です。
記入はあわてず、注意して書くようにします。
Offline
> あとからあとからクライアントの要求を簡単に実現できるというのが。そのせいでだんだんスパゲッティコードになっていく
最初のファイル設計が間違っているからです。
理論的に標準的な構造を持っているファイルでしたら、最小の手間で最善の仕組みが作れます。それが将来を見越して発展できるようにつくっていくのも、設計の一部です。
ただ、データベースのファイル設計は結構難しく、かなり経験を積んで何度も痛い目に合わないといい設計はできません。それを取得するには、一旦作り上げた物でもゼロから作り直す勇気が必要です。
今のファイル構造での動きと、上のサンプルの構造での動きは、全く同じ動きをします。ですが、フィールド数は数倍、リレーションは数十倍、リレーションなどの作業工程は30倍違っています。将来のメンテナンスについても、それに匹敵するだけかかります。今のうちに原点に戻って再設計再構築をすればいかがですか。
Last edited by Shin (2023-04-11 11:34:27)
Offline
部品番号01はファイル名ではありません。マスターファイルのフィールド名です。
それはわかってます。#10では、その内容を聞いたんですが(私も「「部品番号」と言うフィールドなら、部品名が入っているのでは?」と、ちょっと変なことを書いてましたね。部品名ではなく部品の番号、ですね)、そうすると#11では何も答えてなかったことになりますねえ。。。
説明が下手すぎるのと、「~~x」というフィールド定義が悪いだけで、それほどひどい構造にはなってないのかな。。。
リレーションが機能してるなら、#12のようなことでできそうですよね。
30回繰り返すとしても、今は「スクリプトを名前で実行」もあるし、印刷するレイアウトが同じならスクリプトは1つで済んでますよね。
#9で「同じように部品番号&Loop番号のファイルにジャンプしたいのです。」といってるのは、リレーションが30個だから関連レコードへ移動が30種類必要、ということですね。
関連レコードへ移動は使わずに、部品マスターファイルのスクリプトを引数付きで呼び出して、検索すればいいのでは。
いや、関連レコードにジャンプすることは必要と考えています。印刷は、そのジャンプ先にスクリプトで作っています。
Offline
「ジャンプ」でなく「移動」です。
「関連レコードへ移動」というのは、リレーションのキーフィールドを使って関連テーブルのレコードを検索して、結果を指定したレイアウトで表示する、という機能なので、別の複数のスクリプトステップで代替可能です。
移動先のファイル(テーブル)の実体(オカレンスでなく)は、部品マスターで常に同じですよね?
「関連レコードへ移動」を使うと30フィールドで30のリレーション(テーブルオカレンス)を使う必要がでてきますが、レイアウト切り替えと検索なら1つのスクリプトで済みます。
関連レコードへ移動」ではなく「レイアウト切り替えと検索」のスクリプトで対応するということですか。なるほど、関連レコードのフィールド内容をコピーしてテーブルに移動するわけですね。ちょっと考えてみます
Offline
Evaluate ( "工程" & Loop番号 ) という計算フィールドを作って、そこからのリレーションで、関連レコードへ移動 して、そのレイアウトにトリガーをしかけておいて、印刷などする動作をさせてもいいのかも。
でも、上に書いている通り、構造を変えるとものすごくシンプルになりますよ。
Last edited by Shin (2023-04-14 08:47:28)
Offline
ありがとうございます。やってみます
Offline
Pages: 1
[ Generated in 0.007 seconds, 11 queries executed - Memory usage: 613.88 KiB (Peak: 630.78 KiB) ]