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

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

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

You are not logged in.

Announcement

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


#1 2015-10-26 20:46:46

未熟者
Guest

ポータルを含むレコードの複製。条件ありで

使用環境 WIN8.1 FM12

初めまして。ファイルメーカーを勉強しながら作成しているのですが、どうしても自分が描いているようにスクリプトを作ることが出来ずつまづいています。

テーブル構成
親テーブル:入力
子テーブル:詳細
リレーションは入力::登録NOと詳細::NOでしています
「入力::登録NO」は自動番号入力設定です

親テーブルにポタールで置いている子レコードを複製し新規でレコードを作成したいのですが、ポータルを全部複製するこは下記のスクリプトで可能になりました。

変数を設定 [ $oya no; 値:入力::登録NO ]
レコード/検索条件複製
変数を設定 [$oya no2; 値:入力::登録NO ]
レイアウト切替え [「詳細」 (詳細) ]
エラー処理 [ オン ]
検索モードに切り替え[]
フィールド設定 [詳細::NO; $oya no]
検索実行[]
If[ Get ( 対象レコード数 ) ≥ 1 ]
レコード/検索条件/ページへ移動[ 最初の ]
Loop
Exit Loop If[ 詳細::NO ≠$oya no ]
レコード/検索条件複製 //子レコードを複製する
フィールド設定 [詳細::NO; $oya no]
レコード/検索条件/ページへ移動[ 最初の ]
レコードを対象外に
End Loop
End If
レイアウト切替え[ 元のレイアウト ]

でポータルの全部の複製は出来ました。
ここからアレンジして複製したいのですが、まだ不勉強のため思うようにスクリプトが組めません。
アドバイスをいただきたいと思います。

親テーブルは子テーブル(親テーブルにポータルで表示)の共通の事項を入れています。

ポータル表示

no___車番___数量___回数___金額___残業___残業金額___備考
1___ 1234____1_____1____15000___2____4000
2____2456____1_____1____15000
3____4444____1_____1____15000___0.5__1000

現状のスクリプトですと上記がすべて複製できますが、複製したいのは状況により変わりますが、残業が入っている数値の行のみ(1と3)複製して
残業に入っている数値を数量に入れて残業の数値は消去できればと思っています(複製したレコード側を)
スクリプトは可能でしょうか?
可能であればスクリプトの作成方法などご教示おねがいします

#2 2015-10-26 23:38:44

Shin
Member

Re: ポータルを含むレコードの複製。条件ありで

複製の手順も、別ウィンドウを使えばすっきりします。

変数を設定 [ $window; 値:Get ( ウインドウ名 ) ]
関連レコードへ移動 [ テーブル: 「明細」; 使用するレイアウト: 「明細」 (明細) ][ 関連レコードだけを表示; 新規ウインドウ ]
ウインドウを選択 [ 名前: $window; 現在のファイル ]
レコード/検索条件複製
変数を設定 [ $no; 値:メイン::No ]
レコード/検索条件確定
ウインドウを選択 [ 名前: "複製"; 現在のファイル ]
Loop
 レコード/検索条件/ページへ移動[ 最初の ]
 If [ 明細::残業 > 0 ]
  レコード/検索条件複製
  フィールド設定 [ 明細::no; $no ]
  レコードを対象外に
  レコード/検索条件/ページへ移動[ 最初の ]
 End If
 レコードを対象外に
 Exit Loop If [ Get ( 対象レコード数 ) = 0 ]
End Loop
ウインドウを閉じる [ 現在のウインドウ ]

のように、複製する所を If で分岐してやれば良いでしょうね。
テーブル内のレコードの順がどうでも良ければ、

変数を設定 [ $window; 値:Get ( ウインドウ名 ) ]
関連レコードへ移動 [ テーブル: 「明細」; 使用するレイアウト: 「明細」 (明細) ][ 関連レコードだけを表示; 新規ウインドウ ]
ウインドウを選択 [ 名前: $window; 現在のファイル ]
レコード/検索条件複製
変数を設定 [ $no; 値:メイン::No ]
レコード/検索条件確定
ウインドウを選択 [ 名前: "複製"; 現在のファイル ]
ソートを解除
レコード/検索条件/ページへ移動[ 最後の ]
Loop
 If [ 明細::残業 > 0 ]
  レコード/検索条件複製
  フィールド設定 [ 明細::no; $no ]
  レコードを対象外に
 End If
 レコードを対象外に
 Exit Loop If [ Get ( 対象レコード数 ) = 0 ]
End Loop
ウインドウを閉じる [ 現在のウインドウ ]

とすればいいので、少しだけ早くなります。

Last edited by Shin (2015-10-27 20:45:48)

Offline

#3 2015-10-27 11:42:11

未熟者
Guest

Re: ポータルを含むレコードの複製。条件ありで

せっかく提示していただいたのですが、
わたしが思い描いているようには動いてはくれませんでした。

いろいろ検索して私がやりたいことは、多分だるま落としという方法ににていると思います。
まだまだ勉強中のためうまく表現できませんが、
下記のスクリプトを設定することで一応可能になっています。

変数を設定 [ $oya no; 値:入力::登録NO ]
レコード/検索条件複製
変数を設定 [$oya no2; 値:入力::登録NO ]
レイアウト切替え [「詳細」 (詳細) ]
エラー処理 [ オン ]
検索モードに切り替え[]
フィールド設定 [詳細::NO; $oya no]
検索実行[]
If[ Get ( 対象レコード数 ) ≥ 1 ]
レコード/検索条件/ページへ移動[ 最初の ]
Loop
Exit Loop If[ 詳細::NO ≠$oya no ]
レコード/検索条件複製
フィールド設定 [詳細::NO; $oya no]
レコード/検索条件/ページへ移動[ 最初の ]
レコードを対象外に
End Loop
End If
レイアウト切替え[ 元のレイアウト ]

このスクリプトですと親テーブルに表示している子テーブルのポータルがすべてコピーできます

ポータルの複製は抽出したものだけをやりたいのですが、その方法がいまいちわかりません。
ポータルに置いているフィールドAが空欄の場合、そのポータル行は複製したくない。数値が入っている場合のみ、
そのポータル行を複製したい。その複製したポータルは新規のNOとして扱いたい。


関連レコードから対象を抽出することは不可能なのでしょうか?
出来るとすれば、上記のどの部分にどのようなスクリプトを入れればよいのかアドバイスをおねがいします。

#4 2015-10-27 20:53:56

Shin
Member

Re: ポータルを含むレコードの複製。条件ありで

下側のスクリプトは、主要部分だけを抜き出していた物でしたので誤解されたかも。完全な物に書き換えておきます。この方法は、だるま落としそのものです。(FM7以降では、ソートを解除しておく必要が有ります)
上の例では、残業が0ならば複製しない、という条件が組み込んでありますし、検証ファイルでも目論み通りに動いています。
https://dl.dropboxusercontent.com/u/926 … 96.fp7.zip
関連レコードへ移動し、さらに絞り込み検索をしておく、という方法も有るでしょうね。

Offline

#5 2015-10-27 22:12:55

未熟者
Guest

Re: ポータルを含むレコードの複製。条件ありで

Shinさま

サンプルありがとうございます。
変数の設定とwindowの選択が間違っていたようで正しく設定しなおしたら動作するようになりました。

このスクリプトに、残業の数値を数量に移動(コピーでも可)して残業に入っている数値を消去したいのですが
スクリプトに組み込めますか?(複製したレコードで)
出来るのであれば、どの部分にどのように組み込めばスムーズにできるのかアドバイスをおねがいします。

#6 2015-10-27 22:59:12

未熟者
Guest

Re: ポータルを含むレコードの複製。条件ありで

残業数値を数量に移動を、自分なりにスクリプトに組み込んでみたら出来ました。

Loop
変数を設定 [ $残業数値; 値:明細::残業 ]  ← ここに残業の数値を取得するを入れました
レコード/検索条件/ページへ移動[ 最初の ]
If [ 明細::残業 > 0 ]
  レコード/検索条件複製
  フィールド設定 [ 明細::no; $no ]
  フィールド設定 [ 明細::数量; $残業数値 ]  ←ここに取得した残業をいれる
  消去[ 選択; 明細::残業 ]                       ←残業を数量にいれたので、残業の数値は消します
  レコードを対象外に
  レコード/検索条件/ページへ移動[ 最初の ]
End If
レコードを対象外に
Exit Loop If [ Get ( 対象レコード数 ) = 0 ]
End Loop
ウインドウを閉じる [ 現在のウインドウ ]



このようにスクリプトを設定しましたところ、構想どうりに動かすことができました。


複製する前の表示
ポータル表示
no___車番___数量___回数___金額___残業___残業金額___備考
1___ 1234____1_____1____15000___2____4000
2____2456____1_____1____15000
3____4444____1_____1____15000___0.5__1000

                      ↓

複製後の表示(ひねる前です)
ポータル表示
no___車番___数量___回数___金額___残業___残業金額___備考
4___ 1234____1_____1____15000___2____4000
5____4444____1_____1____15000___0.5__1000


                     ↓

複製後数値の移動(作成したスクリプトを使用で)
ポータル表示
no___車番___数量___回数___金額___残業___残業金額___備考
4___ 1234____2_____1____8000____________________
5____4444___.5_____1____2000____________________


実際にサンプルを見たことで何日もつまづいていたものが、すんなり設定することができました

ありがとうございます

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.009 seconds, 11 queries executed - Memory usage: 541.95 KiB (Peak: 562.86 KiB) ]