FileMakerあれこれブログ

FileMakerに関する、あれやこれやの解決策や小技など、思い付いたものをどんどん書き込んでいきます。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ポータルを含むレコードの複製

受注伝票、売上伝票などのように、親レコードに対して複数の子レコード(関連レコード)を持っていて、それをポータルで表示しているようなデータを、ポータルも含めて丸ごと複製しようとすると、意外と難しかったりします。
やり方は何通りもあると思いますが、定番なスクリプトと、ちょっとひねったスクリプトを紹介します。

テーブル構成は
親テーブル:SalesH
子テーブル:SalesD
リレーションキー:SalesH::snとSalesD::fksn
※フィールド「SalesH::sn」は自動番号入力の設定

まずは定番スクリプトです。
--------------------------------------------------
変数を設定 [ $sn; 値:SalesH::sn ] //複製する親レコードのシリアルNoを変数に取得
レコード/検索条件複製 //先に親レコードを複製する
変数を設定 [ $sn2; 値:SalesH::sn ] //複製した親レコードのシリアルNoを変数に取得
レイアウト切替え [「SalesD」 (SalesD) ] //子レコードのレイアウトに移動
エラー処理 [ オン ]
検索モードに切り替え[]
フィールド設定 [SalesD::fksn; $sn] //複製する親レコードのシリアルNoで子レコードを検索
検索実行[]
If[ Get ( 対象レコード数 ) ≥ 1 ] //検索して該当するレコードがあったら下記のスクリプトステップを実行
レコード/検索条件/ページへ移動[ 最初の ] //先頭のレコードに移動してからLopp開始する
Loop
Exit Loop If[ SalesD::fksn ≠ $sn ] //親レコードとのリレーションキーフィールドの値が変数$snと違っていたらLoop終了
レコード/検索条件複製 //子レコードを複製する
フィールド設定 [SalesD::fksn; $sn2] //複製した子レコードのリレーションキーフィールドに複製した親レコードのシリアルNo(変数$sn2)をセット
レコード/検索条件/ページへ移動[ 最初の ] //先頭のレコードに移動
レコードを対象外に //このレコードはすでに複製済みなので、対象外にする
End Loop
End If
レイアウト切替え[ 元のレイアウト ]
--------------------------------------------------

これでOKです。


続いて、ちょっとひねったスクリプトです。
--------------------------------------------------
変数を設定 [ $sn2; 値:GetNextSerialValue ( Get ( ファイル名 ) ; "sn" ) ] //複製する親レコードの次のシリアルNoを関数で取得し、変数にセット
変数を設定 [ $Lines; 値:Count ( SalesH_SalesD_Sn::sn ) ] //複製するポータルの行数を変数にセット
Loop
変数を設定 [ $count; 値:$count + 1 ] //ループカウンター用変数を設定
ポータル内の行へ移動[ 選択; ダイアログなし; $count ] //$countの値の行に移動
レコード/検索条件複製 //先に子レコードを複製していく
フィールド設定 [SalesD::fksn; $sn2] //複製した子レコードのリレーションキーフィールドに複製した親レコードのシリアルNo(変数$sn2)をセット
Exit Loop If[ $count ≥ $Lines ] //変数$countが変数$Lines(ポータル行数)に達したらLoop終了
End Lopp
レコード/検索条件複製 //ここで親レコードを複製する
フィールドへ移動[]
--------------------------------------------------

以上で完了です。

ちょっとひねったスクリプトでは、ポータル行を選択した状態で「レコード複製」を行うと、ポータル行が複製される機能を応用しています。
スポンサーサイト

テーマ:ソフトウェア - ジャンル:コンピュータ

コメント

ファイルメーカー初心者です。
まさに探していたスクリプトに出会えて大変感謝しています。(^_^)v 
特に青文字の解説が解りやすく、とても参考になりました。これからもファイルメーカーに関するTipsをどんどん書き込んで下さい。

  • 2012/02/03(金) 21:48:51 |
  • URL |
  • ヒロパパ #-
  • [ 編集 ]

Re: タイトルなし

> ファイルメーカー初心者です。
> まさに探していたスクリプトに出会えて大変感謝しています。(^_^)v 
> 特に青文字の解説が解りやすく、とても参考になりました。これからもファイルメーカーに関するTipsをどんどん書き込んで下さい。

このようなコメントを頂けますと非常に励みになります。
ありがとうございます。
自分が悩んだことは、おそらく他にも悩んでいる人がいるのではと思い、あれこれ書き込んでいます。
できるだけ分かりやすく書くように心掛けておりますので、これからもよろしくお願いします。
リクエストも歓迎いたしますので、またコメントください。

  • 2012/02/04(土) 00:06:06 |
  • URL |
  • ティーアールプロジェクト #-
  • [ 編集 ]

リクエスト

早速、リクエストします。
ポータルを含むレコードを複数コピーし、それぞれに入力した日から連番で日付けが入るスクリプトを教えて下さい。
例えば、スクリプトを実行すると日数を求めるダイアログが出て日数を"3"と入力するとレコードが3部複製され2/7,2/8,2/9と日付けが入るようにしたいのです。
色々、考えたのですが、どういった関数を使えばいいのか分かりません。よろしくお願いします。

  • 2012/02/07(火) 18:47:46 |
  • URL |
  • ヒロパパ #-
  • [ 編集 ]

Re: リクエスト

> 早速、リクエストします。
> ポータルを含むレコードを複数コピーし、それぞれに入力した日から連番で日付けが入るスクリプトを教えて下さい。
> 例えば、スクリプトを実行すると日数を求めるダイアログが出て日数を"3"と入力するとレコードが3部複製され2/7,2/8,2/9と日付けが入るようにしたいのです。
> 色々、考えたのですが、どういった関数を使えばいいのか分かりません。よろしくお願いします。


リクエストをありがとうございます。
このところ仕事が忙しくてブログの更新ができずにいます...
数日のうちにはブログにてご回答できると思います。
今しばらくお待ちください...

  • 2012/02/08(水) 00:09:32 |
  • URL |
  • ティーアールプロジェクト #-
  • [ 編集 ]

Re: リクエスト

> 早速、リクエストします。
> ポータルを含むレコードを複数コピーし、それぞれに入力した日から連番で日付けが入るスクリプトを教えて下さい。
> 例えば、スクリプトを実行すると日数を求めるダイアログが出て日数を"3"と入力するとレコードが3部複製され2/7,2/8,2/9と日付けが入るようにしたいのです。
> 色々、考えたのですが、どういった関数を使えばいいのか分かりません。よろしくお願いします。

大変遅くなりましたが、リクエストいただきましたスクリプトのサンプルを作ってみました。
お試しください。

  • 2012/02/12(日) 20:24:09 |
  • URL |
  • ティーアールプロジェクト #-
  • [ 編集 ]

リクエスト2

二つほどリクエストします。
1. ポータルを含む親テーブルがあり、このテーブルをある条件(部署、日付など)で検索し、検索した対象レコードをすべて複製し、複製したレコードの日付をすべて指定した日付に置き換えるスクリプト。
2.ポータルを含む親テーブルがあり、子テーブルには金額フィールドがあり、この金額を親テーブルで指定した範囲の日付(開始日2/1,終了日2/29の様に)で検索し集計し結果を求めるスクリプト(レポート)。開始日と終了日はそれぞれダイアログが表示され入力できるようにしたい。日付の範囲は一月毎の集計でも構いません。
どちらも自分でやってみましたが、思う様にできません(涙)どうかよろしくお願いします。

  • 2012/02/24(金) 21:43:35 |
  • URL |
  • ヒロパパ #-
  • [ 編集 ]

Re: リクエスト2

> 二つほどリクエストします。
> 1. ポータルを含む親テーブルがあり、このテーブルをある条件(部署、日付など)で検索し、検索した対象レコードをすべて複製し、複製したレコードの日付をすべて指定した日付に置き換えるスクリプト。
> 2.ポータルを含む親テーブルがあり、子テーブルには金額フィールドがあり、この金額を親テーブルで指定した範囲の日付(開始日2/1,終了日2/29の様に)で検索し集計し結果を求めるスクリプト(レポート)。開始日と終了日はそれぞれダイアログが表示され入力できるようにしたい。日付の範囲は一月毎の集計でも構いません。
> どちらも自分でやってみましたが、思う様にできません(涙)どうかよろしくお願いします。


コメントをありがとうございます。
かなりお悩みのようですが、リクエストの内容が、簡単にブログでご説明できる域を超えています...
ヒント的な内容になるかも知れませんが、幾つかのパートに分けて記載しようと思います。
しばらくお時間をください。

  • 2012/02/25(土) 08:54:43 |
  • URL |
  • ティーアールプロジェクト #-
  • [ 編集 ]

Re: リクエスト2

> 二つほどリクエストします。
> 1. ポータルを含む親テーブルがあり、このテーブルをある条件(部署、日付など)で検索し、検索した対象レコードをすべて複製し、複製したレコードの日付をすべて指定した日付に置き換えるスクリプト。
> 2.ポータルを含む親テーブルがあり、子テーブルには金額フィールドがあり、この金額を親テーブルで指定した範囲の日付(開始日2/1,終了日2/29の様に)で検索し集計し結果を求めるスクリプト(レポート)。開始日と終了日はそれぞれダイアログが表示され入力できるようにしたい。日付の範囲は一月毎の集計でも構いません。
> どちらも自分でやってみましたが、思う様にできません(涙)どうかよろしくお願いします。


すみません、大変遅くなりました。
かなり個別な内容であることと、細かくブログに記事を記載する時間的余裕がありませんので、下記にザッとスクリプトの手順をご説明します。

まずは1.に付いてですが、

日付などの検索条件で検索した後、Get ( 対象レコード )の値を変数にセットします。
その後、下記スクリプトを実行すれば検索されたレコード分だけ複製を繰り返します。

検索モードに切り替え[]
フィールド設定 [親::日付; yyyy/mm/dd...yyyy/mm/dd] //期間検索
検索実行

If [ Get ( 対象レコード数 ) ≥ 1 ] //検索結果が0件でなかったら下記スクリプトを実行
 変数を設定 [ $Result; Get ( 対象レコード数 ) ]

 Loop
 変数を設定 [ $Rep; $Rep + 1 ] //複製回数をカウントする変数をセット
 変数を設定 [ $count; 値:"" ] //2個目のLoop回数をカウントする変数をクリア※ここを忘れるとLoopが止まらなくなるので注意してください。

 変数を設定 [ $sn2; 値:GetNextSerialValue ( Get ( ファイル名 ) ; "sn" ) ]
 変数を設定 [ $Lines; 値:Count ( SalesH_SalesD_Sn::sn ) ]
 Loop
 変数を設定 [ $count; 値:$count + 1 ]
 ポータル内の行へ移動[ 選択; ダイアログなし; $count ]
 レコード/検索条件複製
 フィールド設定 [SalesD::fksn; $sn2]
 Exit Loop If[ $count ≥ $Lines ]
 End Lopp
 レコード/検索条件複製

 フィールド設定 [SalesH::Date; SalesH::Date + 1] //複製前から入力されていた日付に1を加算(1日送ることになる)
 Exit Loop If[ $Rep ≥ $Result ] //$Repの値が対象レコード数($Result)の数値に達したらLoop終了※ここも忘れるとLoopが止まらなくなるので注意してください。
 End Loop
 フィールドへ移動[]

End If


次に2.ですが、集計はスクリプトを使わなくてもできます。
親テーブルに開始日と終了日のグローバルフィールドを作成し、子テーブルの日付フィールドとリレーションを設定します。

リレーション名「親_子_日付」
親テーブル::g開始日 ≤ 子テーブル::日付
親テーブル::g終了日 ≥ 子テーブル::日付

そして親テーブルに、合計金額を算出する計算フィールドを作成します。
計算式は下記です。

Sum ( 親_子_日付::金額 )

これで、親テーブルのグローバルフィールドに入力された期間で集計された、子テーブルの金額が計算されます。

開始日と終了日のグローバルフィールドに値を入力する方法は、ダイアログでは無理ですが、開始日と終了日のグローバルフィールドを配置した入力用のレイアウトを作成し、それを別ウィンドウで表示する方法が良いのではないかと思います。
別ウィンドウを表示するスクリプトは下記です。

新規ウィンドウ [名前: 日付入力]
レイアウト切り替え [日付入力レイアウト]

以上、試してみてください。

  • 2012/03/03(土) 23:58:17 |
  • URL |
  • ティーアールプロジェクト #-
  • [ 編集 ]

お忙しい中、大変ありがとうございました。m(_ _)m
なにせ年度末ですからネエ(^_^;)
まだ、取り掛かってませんが、取り急ぎお礼のみで失礼します。出来たら、コメントします…

  • 2012/03/05(月) 22:51:20 |
  • URL |
  • ヒロパパ #-
  • [ 編集 ]

ありがとうございます!

まさに探していたスクリプトで、大変参考になりました。
有難う御座いました。

  • 2012/09/11(火) 10:12:18 |
  • URL |
  • ごろう #-
  • [ 編集 ]

Re: ありがとうございます!

> まさに探していたスクリプトで、大変参考になりました。
> 有難う御座いました。

ごろう様
コメントをありがとうございます。
お役に立てたことを嬉しく思います。
このところ更新が滞っておりますが、頑張ってアップしていきたいと思いますので、今後ともよろしくお願いします。

  • 2012/09/11(火) 10:24:53 |
  • URL |
  • ティーアールプロジェクト #-
  • [ 編集 ]

承認待ちコメント

このコメントは管理者の承認待ちです

  • 2013/10/09(水) 15:49:35 |
  • |
  • #
  • [ 編集 ]

Re: 定番スクリプト

> 初めて、書き込みさせていただきました。ファイルメーカー歴、半年のビギナーです。
> (Winxp & FILE Maker pro8.5)
> 定番スクリプト、参考にさせていただきました。ようやくロジックを理解し、ファイル名、フィールド名等の固有名詞を変更し、作成プログラムにスプリクトを組み込み、テストしてみたところ、ポータル行が2行までしか、複製されません。(テストデータは3行)。流れを追いかけたところ、2回複製し終えた後の、<次のレコード/検索条件/ページへ移動[ 最初の>のところで、次に対象外となるべき、複製元の2行目のデータに移動せず、LOOPを抜け出す条件が成立してしまうようです。(一度目は、先頭に移動したようですが..)
> (こんな場合、ソートが有効なのかと、勝手に考えましたが、検索で抽出したレコードと、複製したレコードが混在する子レコードのファイル(?)において、そもそもスクリプト内のソートは機能するのでしょうか?)
> 話は前後しますが、したいことは、複数ポータル行の丸ごとの複製です。
> どなたか御教授、ぜひともおねがいします。表現が稚拙な点、ご容赦のほど。


はじめまして。
ほとんどアップしていないブログですが、見ていただいて、ありがとうございます。

ご質問のスクリプトですが、ポータルの全ての明細行を一気に複製させるとしたら、下記のようなスクリプトが良いのではと思います。

・ポータル行数を変数($Num)に取得(ループ回数制御用)
・ポータル明細行の元テーブルのレイアウトに移動
・該当の明細行レコードを検索
・ここからLoop
・$Count + 1(Loopカウンター用変数を設定)
・レコード/検索条件/ページへ移動を計算式で指定→移動する行番号は$Countの値
・レコード/検索条件を複製
・Exit Loop If [$Count >= $Num]→最初に取得したポータル行数分を複製したらLoop終わり
・End Loop

複製したレコードは最終行に追加されますので、ループカウンター用変数で複製する行を明示的に指定すれば、
全ての行を一気に複製出来ると思います。
お試しください。

  • 2013/10/09(水) 16:47:16 |
  • URL |
  • ティーアールプロジェクト #-
  • [ 編集 ]

承認待ちコメント

このコメントは管理者の承認待ちです

  • 2013/10/09(水) 17:10:56 |
  • |
  • #
  • [ 編集 ]

承認待ちコメント

このコメントは管理者の承認待ちです

  • 2013/10/10(木) 11:53:22 |
  • |
  • #
  • [ 編集 ]

承認待ちコメント

このコメントは管理者の承認待ちです

  • 2013/10/17(木) 17:38:25 |
  • |
  • #
  • [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://trprojectfm.blog.fc2.com/tb.php/14-99ad7733
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。