みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
新年おめでとうございます。今年もよろしくお願い致します。
フィールド値の移動方法について相談させてください。
わかりやすくするためレイアウトイメージをお伝えします。
フィールドA1(繰り返し数30) フィールドA2(繰り返し数30) フィールドA3(繰り返し数30)
フィールドB1(繰り返し数30) フィールドB2(繰り返し数30) フィールドB3(繰り返し数30)
フィールドC1(繰り返し数30) フィールドC2(繰り返し数30) フィールドC3(繰り返し数30)
フィールドD1(繰り返し数30) フィールドD2(繰り返し数30) フィールドD3(繰り返し数30)
フィールドE1(繰り返し数30) フィールドE2(繰り返し数30) フィールドE3(繰り返し数30)
フィールドF1(繰り返し数30) フィールドF2(繰り返し数30) フィールドF3(繰り返し数30)
フィールドG1(繰り返し数30) フィールドG2(繰り返し数30) フィールドG3(繰り返し数30)
となっており、それぞれ独立した値が入力されます(上記のいずれもリレーションは組んでいません)。
各1〜3の情報はセットなので、A1〜A3は一緒に入力されて、削除するときも一緒に消します。
ここで、例えばフィールドB1、B2、B3の内容を削除したときに、C以降の内容を1つずつ上に繰り上げたい、すなわち、
C1の内容をB1へ、C2の内容をB2へ、C3の内容をB3へ移動、
D1の内容をC1へ、D2の内容をC2へ、D3の内容をC3へ移動、
E1の内容をD1へ、E2の内容をD2へ、E3の内容をD3へ移動、
・・・
させたいのです。
同じ作業をA〜Eのすべてのグループに対応させる必要があります(例えばEグループが削除されたらFグループの内容をEグループに、Gグループの内容をFグループに移動させる)。
A〜E各グループごとに、以下のスクリプトステップを作りました。
【例】Bグループを削除するスクリプト
「フィールド設定」によりC1の内容をB1に表示させる、
「フィールド設定」によりD1の内容をC1に表示させる、
「フィールド設定」によりE1の内容をD1に表示させる、
「フィールド設定」によりF1の内容をE1に表示させる、
「フィールド設定」によりG1の内容をF1に表示させる、
「フィールド内容の全置換」によりG1フィールド内容を削除する、
上記をB2、B3についても再度記述する。
ですが、繰り返しフィールドなのもありステップ数が多く、更には同じフィールドのセットがタブコントロールにより5個もあり、すべてを手動で作っているとものすごい手間になってしまいます。ミスが連発して莫大な時間がかかってしまっているので、もっと単純な記述にしたいのですが、実力が追いつかず進みません。新年早々恐縮ですが、お知恵を拝借できないでしょうか。よろしくお願い致します。
※FMP11 Mac です。
Offline
繰り返しを使うのは止めましょう。
3フィールドを設定した別テーブルの値を参照し、ポータルで表示する様に、構造を変更しましょう。
そうすれば、そちらのテーブルで1レコードを削除(ポータルの中で1行削除でも同じ)することで、その動作は可能です。
Offline
ありがとうございます。
ポータルを使うと良いのですね。早速その方法で作り直してみます。
Offline
度々すみません、ポータルで構成し直しているのですが、うまくいきません。
上の例ですと、A1〜G3はすべて30個の繰り返しフィールドです。
例えばBグループ(B1、B2、B3の全繰り返しフィールドの内容)が削除されると、Cグループの繰り返しフィールドの全内容がBグループへ移動し、Dグループの繰り返しフィールドの全内容がCグループへ移動し・・・これをGがFに移動するまで繰り返す必要があります。
これをポータルで実現するにはどうすればよいでしょうか?1つのテーブル内にA1〜G3のフィールドを作り別テーブルでポータル表示させたのですが、グループ(上でいう繰り返しフィールドの全内容)単位で移動させる方法がわかりません。A、B、C・・・Gそれぞれを別テーブルにしてスクリプトでデータ移動させることになるのでしょうか?
何度もすみません、よろしくお願い致します。
Offline
別テーブルを作り、1,2,3に相当するフィールドを作り、A,B,Cに相当するものをレコードで保存します。それをポータルで表示させれば良いです。
相対位置でよければ、ポータル側で、Bのレコードを削除すればいいですよ。
絶対的な位置が重要なのですか。
Offline
早速ありがとうございます。少しクリアになりました(当初の私の理解が間違っていたようです)。
>別テーブルを作り、1,2,3に相当するフィールドを作り、
例えばテーブルXにフィールド1〜3を作りました。
>A,B,Cに相当するものをレコードで保存します。
ここなんですが、元々はA、B、Cは30個の繰り返しフィールドで、A、B、Cごとに一つの種類(グループ)です。
30個の繰り返しフィールド中に何個入力されるかはバラバラで、1個のこともあれば30個のこともあります。
1個の場合はそのフィールドが削除されれば、30個の場合はすべてがまとめて削除されれば、下のグループに入力されているもの(何個入力されているかはわからない)をまとめて上のグループへ移動させる必要があります。
逆に、例えばBグループに10個入力されている場合に、B1のみが削除されても、C1のデータは移動してはいけません。B1〜B10すべてが同時に削除された場合のみ、C1〜C10のデータをまとめて移動させないといけないのです。
これをポータルでやるには、少なくとも各レコードのデータがA〜Gのいずれのグループに属するか(どこからどこまでがセットか)の情報も必要だと思うのですが、それをどのように処理すべきかわかりません。テーブル1の一つのレコード中に、フィールド1〜3それぞれについて、各グループの30個がまとめて表示できればよさそうですが・・・自己リレーションでポータル表示などでしょうか?
しつこくてすみませんが、アドバイスいただけますでしょうか。よろしくお願い致します。
Offline
繰り返しフィールドと言うより、値の羅列なんですね。関連テーブル側のフィールドを繰り返しにしておきましょう。(後で苦労するかもしれませんが、その時に考えましょう)
元テーブルに、シリアル番号などのユニークなデータを持たせます。それをリレーションのキーにすればいいでしょう。
関連テーブル側にも同じフィールドと、繰り返しフィールドを3個(新しい説明では10個?)を作っておきます。
これで元テーブルに7行のポータルを表示させれば、AからGまでが表示されます。
B1〜B10すべてが同時に削除された場合 は、ポータル上の1行(関連テーブル側の全フィールド)の値が削除された時にあたり、各フィールドにトリガーをかけておいて、全フィールドが削除された時点でそのレコードを削除するように動かせばいいでしょう。
ところで、G1~G10が削除されたら、どう動くのですか。
Offline
ありがとうございます。
>元テーブルに、シリアル番号などのユニークなデータを持たせます。それをリレーションのキーにすればいいでしょう。
関連テーブル側にも同じフィールドと、繰り返しフィールドを3個(新しい説明では10個?)を作っておきます。
これで元テーブルに7行のポータルを表示させれば、AからGまでが表示されます。
ここまで完了したので、もう少しいじってみます。もともと想定していたのは、「Bグループを全削除する」というボタンを押すとCグループ以降のデータが繰り上がるものなので、Bグループの情報があるレコードを削除するスクリプトを組んでみます。
Offline
度々すみません。
>元テーブルに、シリアル番号などのユニークなデータを持たせます。それをリレーションのキーにすればいいでしょう。
関連テーブル側にも同じフィールドと、繰り返しフィールドを3個(新しい説明では10個?)を作っておきます。
これで元テーブルに7行のポータルを表示させれば、AからGまでが表示されます。
これを完了しました。で、実際にデータを入力して、レイアウト上にポータルで表示できるようになったんですが・・・関連テーブル側で1つのレコードを削除すると、同一ポータルに表示させるレコードがすべて消えてしまいます。。どうやら照合フィールドに同じ値を入れているせいのようですが、同じ値を入れないと同一ポータルに表示できないわけで、どうしたらよいでしょう。ちなみに、レコードを削除せずに該当レコードの全内容を消去しただけではポータル上でデータが繰り上げ表示されませんでした。
何度も申し訳ないです。よろしくお願い致します。
※素人頭での考えですが、照合フィールドの値が同じだからといって、1つのレコードを削除したら同じ値が入力されている全レコードが同時に削除されるのはおかしいように思います。ですが、確かに照合フィールドの入力値が異なるフィールドは削除されずに残っています。何か設定がおかしいものと思いますが、詳細がわかりません。ちなみにですが、元テーブル側で入力することを前提としていまして、元テーブルの照合フィールドに値を入力して、ポータルのフィールドにもデータを入力すると、関連テーブルの照合フィールドに元テーブル側の値が自動で入力されます。なぜそうなるのかわかりませんが、これが原因でしょうか?
Offline
関連レコード側へ移動して、1レコードを削除するか、ポータル行を削除、を行っていますか。
また、リレーションの設定で、親テーブル側で、関連するレコードが削除されればレコードを削除、をチェックしていませんか。(これは無用です)
Offline
斜め読みだけど
>各1〜3の情報はセットなので、A1〜A3は一緒に入力されて、削除するときも一緒に消します。
となってるのに
>B1のみが削除されても、C1のデータは移動してはいけません。
というのもあるし。。
なんのデータなのかわからないけど、他の方法を考えた方がいいんじゃないかな。
Shinさま
>リレーションの設定で、親テーブル側で、関連するレコードが削除されればレコードを削除、をチェックしていませんか。
このチェックを外したら大丈夫でした。
おかげさまで目的達成することができました。本当にありがとうございました。重要なデータベースだったのでとても助かりました。本来ならば有料でお願いするレベルの話だったと思います。年始のお休み中にご親切に教えていただいたこと、心より感謝申し上げます。
Offline
momoさま
自分で読み直して、用語の不統一があり理解しづらい質問となってしまっていました。試行錯誤を繰り返しましたが、なんとか目的達成できました。ありがとうございました。
Offline
ポータル行の削除も出来たのかな。
参考までに、ポータル内の全フィールドに、OnObjectSave トリガーで、次のスクリプトを起動させると良いですよ。
If [ IsEmpty ( List ( Last ( テーブル 2::A1 ) ; Last ( テーブル 2::A2 ) ; Last ( テーブル 2::A3 ) ) ) ]
ポータル内の⾏を削除[ ダイアログなし ]
End If
また、次回からは、
フィールドA1(繰り返し数30) フィールドB1(繰り返し数30) フィールドC1(繰り返し数30)
フィールドA2(繰り返し数30) フィールドB2(繰り返し数30) フィールドC2(繰り返し数30)
フィールドA3(繰り返し数30) フィールドB3(繰り返し数30) フィールドC3(繰り返し数30)
という形で書かれる事と、
抽象化して書かれているので、運用のイメージがまったく立てられません。具体的に書かれることをお勧めします。
Offline
Shinさま
ありがとうございます。その方法でポータル行削除ができました。私の頭では関連テーブルのレイアウトに移動して検索でレコードを絞ってレコード削除・・・などと考えていたので、そのようなスマートな方法を教えていただきとてもありがたいです。
質問の記載方法についても承知致しました。わかりづらい形で失礼致しました。
えっとですね、上述の部分までは上手くいったんですが、その後、ポータル表示したデータを他のレイアウトなどで利用する際にまったく歯が立たなくて困っています。ポータルを使い慣れておらず、普段は力技で必要な個数のフィールドを作成しているので、どうしても理解できない部分があります。具体的には、ポータル表示される情報の一部を指定して他のフィールドなどで利用したいのですが、どのような方法で指定すればいいのでしょうか?Get(アクティブポータル行番号)で番号を振りその値を利用するか、Get(レコード ID)で関連テーブルのIDを取得する方法を検討したのですが、どちらも上手くいきませんでした。
ご理解の助けに、具体的内容を記載しておきます。今回何がしたいかというと、商標出願の経過情報を管理したいのです。商標出願には「区分」「指定商品」「類似群コード」の情報がセットになっています。より正確には、区分というのは指定商品の集合の番号で、1〜45のいずれかです。ひとつの区分の中に通常は複数の指定商品を指定します。指定商品と類似群コードは1対1対応です。FMでは、「区分」「指定商品」「類似群コード」と並べて表示します。指定商品と類似群コードは各行で異なりますが、区分は同じグループ内ではすべて同じ数字が入ります。
例)
区分 指定商品 類似群コード
1 商品A 01A01
1 商品B 01A02
1 商品C 01A03 (最初の説明のAグループ)
2 商品D 02A01
2 商品E 02B01 (最初の説明のBグループ)
5 商品F 03A01
5 商品G 03A02
5 商品H 03B01 (最初の説明のCグループ)
最初にA〜Gグループと説明していたのは、区分単位で分けたグループです。いまは区分単位で繰り返しフィールドにして、ポータル表示しています。
ところが、この情報は、上記レイアウトで表示するだけでなく、他のレイアウトやテーブルに引っ張って加工して利用することもあります。例えば、上記の情報は出願時のものですが、登録になるまでに指定商品を補正(=削除)することがあり、この経過情報を管理する必要があります。そこで、同じ内容の関連テーブル(補正1〜5)&フィールド(区分・指定商品・類似群コード)を作成し、タブコントロールで「出願時」「補正1」・・・「補正5」までを表示しています(補正は最大5回までを想定)。
補正する際には、「出願時」の内容を「補正1」にコピーしてそれを修正します。このコピーするスクリプトは自力でできました。ですが、コピーした情報から例えば『区分2の内容(=Bグループの位置にある内容)を全削除する』というスクリプトを書こうとしたときに、ポータル内で二番目に表示されるグループをどのように指定するのかがわからず困っています。
同じ理由で、
■ 区分2の「2」という数字を引っ張るときの指定方法や、
■ 区分2の全商品をListで指定する方法、
がわかりません。
度々すみませんが、ポータル内の任意の位置にある情報を引っ張る方法をご教示いただけないでしょうか。よろしくお願い致します。
Last edited by eddie (2014-01-06 12:18:52)
Offline
区分 指定商品 類似群コードが、上のフィールドA1(繰り返し数30) フィールドA2(繰り返し数30) フィールドA3(繰り返し数30)に相当するのでしたら、3個のフィールドの各繰り返し毎が1商品、という管理なんですね。
> 指定商品を補正(=削除)する
この削除後には、
区分 指定商品 類似群コード
1 商品A 01A01
1 商品B 01A02
1 商品C 01A03
は、
区分 指定商品 類似群コード
1 商品B 01A02
1 商品C 01A03
になるのですか。(空行を作る、という動作)
区分 指定商品 類似群コード
1 商品B 01A02
1 商品C 01A03
になるほうがいいのですか。
ポータル内のレコードは、関連レコードへ移動でそのレコードが選択されているはずです。または、詳細側にシリアル番号をつけておくと、その数字を読み込むことでレコードが確定できます。
商品のListは、繰り返しフィールドを使っているため、簡単には作れません。カスタム関数か、再帰関数を書く必要があります。
やはり、予想していた最悪の方向へ向かっているようで、最初に書いたように、繰り返しフィールドを使わない構造に作り替えないと、回りくどい非常に面倒な処理が増えるだけのようです。その構造ですと、最小のレコードに削除フラグを立てるだけで、版数の管理が可能になるはずです。
Offline
根本的に作り直さないとだめなんでしょうけど、
>区分というのは指定商品の集合の番号で、1〜45のいずれかです
ここで45種類あるものが、最初のでA~Gの7グループだったのは、なぜですか?
同時に使うのは高々7種類というのが確実、ということなのかな。
指定商品を補正=削除 という事ですので、指定商品を区分、などと共に関連テーブルへ収納し、7個のポータルへXリレーションで表示し、各ポータルでフィルターで表示をコントロール、という方法で出来そうに思います。
補正履歴も、その関連レコードの中に、「出願時」「補正1」・・・「補正5」を持たせておき、削除した後は項目を消しておくと良いでしょう、
というアイデアのみ
Offline
Shinさま
ありがとうございます。最初の質問の仕方がまずかったため余計なお手間を取らせてしまって申し訳ありません。
>区分 指定商品 類似群コードが、上のフィールドA1(繰り返し数30) フィールドA2(繰り返し数30) フィールドA3(繰り返し数30)に相当するのでしたら、3個のフィールドの各繰り返し毎が1商品、という管理なんですね。
その通りです。正確には同じ類似群の商品は同一フィールドに複数列記するんですが、これはDB作成上あまり重要ではないので説明を省略しました。
削除後は、
区分 指定商品 類似群コード
1 商品B 01A02
1 商品C 01A03
になるほうがいいです(削除した行の繰り上げがあった方が便利です)。
ただこれよりも重要なのは、区分単位で指定商品を全削除した場合に、下の区分を繰り上げ表示することです。
>指定商品を補正=削除 という事ですので、指定商品を区分、などと共に関連テーブルへ収納し、7個のポータルへXリレーションで表示し、各ポータルでフィルターで表示をコントロール、という方法で出来そうに思います。
Xリレーションを使ったことがないのでもう少し調べさせてください。
あるいは、最近他の方が質問されていましたが、ポータル中にポータルを表示するという方法はどうでしょうか?大きいポータル=区分単位、小さいポータル=区分中の指定商品単位。
ポータルで表示する親テーブルのレイアウトは、データ入力用です。それとは別のレイアウトで、同一区分の商品をList関数などで一括取得することと、Bグループの位置にある「区分」「指定商品」「類似群コード」をそれぞれ取得することが必要です。
これはポータルを使用しても可能でしょうか?
Offline
miceさま
>ここで45種類あるものが、最初のでA~Gの7グループだったのは、なぜですか?
同時に使うのは高々7種類というのが確実、ということなのかな。
そうです、通常は7区分もあれば十分と考えました。ポータル表示できるようになったのでいまは10区分を表示しています。
Offline
> 同一区分の商品をList関数などで一括取得
一覧表示を行い、必要に応じてエクスポートするなどでいかがでしょう。
> Bグループの位置にある「区分」「指定商品」「類似群コード」をそれぞれ取得
2区分目、という意味ですよね。
上と同じ機構でいかがでしょう。
ポータルのみで、おそらく希望されている動きが作れました。版管理のところが運用を見ないとわかりませんので、あとはご自分で調整を。
https://www.dropbox.com/s/h5gdal9sd04tb … 18.fp7.zip
Offline
Shinさま
ありがとうございます!
こちらの動作で目的達成できそうです。構造が複雑で内容がまだ理解できていませんが、勉強しながら利用させていただきます。
ご丁寧に教えていただいた上に雛形まで作成くださり本当にありがとうございました。
Offline
構造はかなり単純化してありますよ。表示と動きに、トリックを仕込んで有ります。(どれも、10行以内のスクリプトばかりですが)
ちょっと不具合が。
プロジェクト レイアウトのレイアウトトリガで、OnRecordLoadにも、OnLayoutEnterと同じ設定の追加しが必要です。
また、ポータル行の編集のスクリプトの中身も、少し調整してあります。
再度ダウンロードしてみてください。
Last edited by Shin (2014-01-07 17:30:52)
Offline
修正していただきありがとうございました。
勉強のためそのままコピーするのではなく1つずつ再現しているので確認に時間がかかってしまっています。
私のレベルでは難しい部分も多いですが、おかげさまで一度にいろいろなことを学べています。
親切にご指導いただいたこと、重ねてお礼申し上げます。
Offline
Pages: 1
[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 657.67 KiB (Peak: 690.58 KiB) ]