みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
ファイルメーカーPro12。WINXp。
社員マスタがあります。
フィールドは社員コードと社員名などです。
社員コードを5件検索するために新規検索条件で行いましたが、
その検索結果の順番が社員マスタ登録順のようです。
検索順で表示させる方法を教えて下さい。
こんな事したら出来そう。
リレーションを使っているので検索語(社員コード)は完全一致が条件ですが。
http://pupld.net/21/140528/948dp8o5dv/index.cgi
KensakuSort.fmp12
検索条件はグローバルフィールドに改行区切りで入れる
そのフィールドを社員コードとリレーションしておいて、検索の代りに「関連レコードへ移動」
Position(グローバルフィールド;社員コード;1;1)の計算フィールドを作っておいて、それでソートする
(社員コードは桁数が一定とします)
こんな事したら出来そう。
リレーションを使っているので検索語(社員コード)は完全一致が条件ですが。http://pupld.net/21/140528/948dp8o5dv/index.cgi
KensakuSort.fmp12
サンプル作成頂き有難う御座います。
サンプルでは上手く動作するのですが、実際のDBで設計するとだめです。
条件にレコードが沢山インポートします。
スクリプト内のレコードのインポートの
ソースレコード2 ⇒ 1
ソースレコード3 ⇒ 2
しか設定できません。
これが原因でしょうか。
アップロードファイルだったのでインポートは変数にしましたが、そちらのファイルで
インポートする場合は変数はやめて、ファイル指定で自分自身を指定して手動インポート
してからインポート順を記憶(勝手に記憶します)させてみてください。
申し訳ありません。理解できずスクリプトを書きました。
どの様に修正すればよいのでしょうか。
フィールドへ移動[ ]
If[Count(Data::条件)>=1]
レイアウト切り替え[「Data」(Date)]
ウィンドウの固定
変数を設定[$p;値:Get(ファイルパス)]
レイアウト切り替え[「条件」(条件)]
全レコードを表示
対象レコード削除[ダイアログなし]
レコードのインポート[ソース:「$p」;ターゲット:「条件」;方法:追加;文字セット:「シフトJIS」;フィールドデータのインポート順:
ソースフィールド2のインポート条件::code
ソースフィールド3のインポート条件::番号]
[ダイアログなし]
関連レコードへ移動[テーブル:「Data」:使用するレイアウト:「Data」(Data)]
[関連レコードだけを表示:対象レコードの照合]
変数を設定[$r;値:1]
Loop
消去[Data::条件[$r]] 選択
変数を設定[$r:値:$r+1]
Exit Loop If[$r>5]
End Loop
レコードのソート[ソートされた順位でレコードを保持,特定のソート順:Data::code:値一覧に基づく:「新規値一覧」]
[記録する;ダイアログなし]
フィールドへ移動][ ]
End If
複雑すぎる...
Position(グローバルフィールド;社員コード;1;1)の計算フィールドを作っておいて、それでソート
なら、検索した後にこれぐらいでいいはず。
検索条件を変更
変数を設定[$条件;社員コード]
Loop
次のレコードへ移動[最後で終了]
変数を設定[$条件;$条件&¶&社員コード]
EndLoop
ブラウズモードへ切り替え[]
フィールド設定[グローバル;$条件]
レコードをソート[グローバル]
複雑過ぎたかも知れませんけど一応・・・
ステップを継ぎ接ぎしたので変な並びになってました。
変数を設定[$p;値:Get(ファイルパス)] を削除して
レコードのインポート[ソース:「$p」;・・・
ソースフィールド2のインポート条件::code
ソースフィールド3のインポート条件::番号]
[ダイアログなし]
の部分は
データソースを指定で「ファイル」で「ファイルの追加」で自分自身を指定して
インポート順指定を押せばフィールドが出ますから指定して、次に出る窓で
「繰り返しは複数のレコードに分ける」にチェックを入れるといいはずです。
最初はダイアログありにして。
複雑過ぎたかも知れませんけど一応・・・
ステップを継ぎ接ぎしたので変な並びになってました。変数を設定[$p;値:Get(ファイルパス)] を削除して
レコードのインポート[ソース:「$p」;・・・
ソースフィールド2のインポート条件::code
ソースフィールド3のインポート条件::番号]
[ダイアログなし]
の部分は
データソースを指定で「ファイル」で「ファイルの追加」で自分自身を指定して
インポート順指定を押せばフィールドが出ますから指定して、次に出る窓で
「繰り返しは複数のレコードに分ける」にチェックを入れるといいはずです。
最初はダイアログありにして。
サンプルDBに対して修正しているのですが解らず質問です。
ファイルの追加で自分自身とは file:KensakuSort.fmp12 でしょうか?
インポート順指定を押せばフィールドが出ますから指定とは?
インポート元名と先名と各フィールド名を教えて下さい。
データソースを指定で「ファイル」を押せば「ファイル指定」の窓が出ますよね。
ここで「ファイルの追加...」を押してKensakuSort.fmp12を指定します。
インポート順設定窓が出たら、インポート元をDataにして、インポート先は条件
インポートするフィールドは
条件 → code
条件順 → 番号
で、新規レコードとして追加を選びます。OKを押すと繰り返しフィールドの
インポートなので処理指定窓が出ますから、「複数のレコードに分ける」を
オンにします。
こんな感じになります。
フィールドへ移動 [ ] ——確定のため
レイアウト切り替え [ 「Data」] ----念のため
If [ Count ( Data::条件 ) ≥ 1 ]
レイアウト切り替え [「条件」]
全レコードを表示
対象レコード削除[ ダイアログなし ]
レコードのインポート [ ソース: 「file:KensakuSort.fmp12」]——ファイル指定で手動指定
関連レコードへ移動 [ 「Data」; 使用するレイアウト:「Data」関連レコードだけを表示]---検索の代わり
変数を設定 [ $r; 値: 1 ]
Loop
消去 [ Data::条件[$r] ] [ 選択 ]
変数を設定 [ $r; 値:$r+1 ]
Exit Loop If [ $r > 5 ]
End Loop
レコードのソート [ 値一覧に基づく: 「新 規値一覧」 ]----予め値一覧を作っておいてね
フィールドへ移動 [ ]——フィールドから抜けるため
End If
変数を設定からEnd Loopまでは、繰り返しに入力した条件がいつまでも
残ってしまうので一行ずつ消しているだけです。
こんな感じになります。
フィールドへ移動 [ ] ——確定のため
レイアウト切り替え [ 「Data」] ----念のため
If [ Count ( Data::条件 ) ≥ 1 ]
レイアウト切り替え [「条件」]
全レコードを表示
対象レコード削除[ ダイアログなし ]
レコードのインポート [ ソース: 「file:KensakuSort.fmp12」]——ファイル指定で手動指定
関連レコードへ移動 [ 「Data」; 使用するレイアウト:「Data」関連レコードだけを表示]---検索の代わり
変数を設定 [ $r; 値: 1 ]
Loop
消去 [ Data::条件[$r] ] [ 選択 ]
変数を設定 [ $r; 値:$r+1 ]
Exit Loop If [ $r > 5 ]
End Loop
レコードのソート [ 値一覧に基づく: 「新 規値一覧」 ]----予め値一覧を作っておいてね
フィールドへ移動 [ ]——フィールドから抜けるため
End If変数を設定からEnd Loopまでは、繰り返しに入力した条件がいつまでも
残ってしまうので一行ずつ消しているだけです。
サンプルをFMサーバ12に登録し、検索しましたが、上手くいきました。
ところが現システムを改修し、スクリプト動作させると次の不具合が出ます。
インポート表示が出てインポート元、残りのレコード数17万件やコーヒカップが出て時間が掛かっています。
中止を押すとインポートの概要表示がでるので、OKボタンを押します。
結果検索できていますが、どこが間違っているのでしょうか。
間違ってるというより、共有ファイルでの動作は想定外なのでは。
私のはグローバルフィールドなので、共有してても関係なく動作します。
If [ Count ( Data::条件 ) ≥ 1 ]
の前に
全レコードを表示
レコードを対象外に
対象外のみを表示
を入れるといいのではないかな?
If [ Count ( Data::条件 ) ≥ 1 ]
の前に
全レコードを表示
レコードを対象外に
対象外のみを表示
を入れるといいのではないかな?
修正すると解決しました。
複数の入力者に試してもらってます。
複雑すぎる...
Position(グローバルフィールド;社員コード;1;1)の計算フィールドを作っておいて、それでソート
なら、検索した後にこれぐらいでいいはず。
検索条件を変更
変数を設定[$条件;社員コード]
Loop
次のレコードへ移動[最後で終了]
変数を設定[$条件;$条件&¶&社員コード]
EndLoop
ブラウズモードへ切り替え[]
フィールド設定[グローバル;$条件]
レコードをソート[グローバル]
こちらの方法も試したいのですが。
Aグローバルフィールドを作成しました。
B計算フィールド =Position(グローバルフィールド;社員コード;1;1)を作成しました。
初心者なので具体的なスクリプトの設計方法が解らなくて困っています。
宜しくお願いします。
こういうことかな・・・
簡単過ぎたので間違ってるかも。
http://pupld.net/21/140609/jkiwi3g4nz/index.cgi
KensakuSort2.fmp12
こういうことかな・・・
簡単過ぎたので間違ってるかも。
http://pupld.net/21/140609/jkiwi3g4nz/index.cgi
KensakuSort2.fmp12
サンプルまで作成いただき大変有難うございます。
早速レコードが沢山あるDBで試しましたが、検索時間に20秒程度かかっています。
一日何十回も利用するので、残念ですが実務に耐えません。
早く出来ないでしょうか。
検索方法は全く変わらないので、検索に時間がかかるのは作り方がどこか間違ってます。
(「社員コードを5件検索するために新規検索条件で行う」)
ここで提示してるのは、検索が終わった後にソートする方法です。(どういう検索でも、検索終了時には未ソート状態になる)
私の書いた方法は非保存フィールドでソートするので、検索結果が膨大なら時間はかかりますけど、「5件」とかなら20秒もかかりません。
社員マスタの検索ですよね?「残りのレコード数17万件」とかいう記述もありましたけど、社員が17万人もいるんでしょうか?
抽出した結果を、どう使いますか。
印刷などに使うのみなら、社員番号のみをもたせたテーブルで、社員番号でリレーションしておき、抽出ソートしたい順で社員番号を入れていけば、それだけで済みませんか。社員番号以外は、関連フィールドとして表示させます。
検索の手間もありませんし、ソートも不要です。
それ以上に使うのでしたら、そのテーブルから関連レコードへ移動、などで、元のテーブルに戻れば良いでしょう。
Offline
郵便番号簿で5件探してみたけど数秒でした。
私のサンプルの中の検索実行をやめて、条件とcodeを自己リレーションして
関連レコード移動に変更して、その後ソートしたら12万件内の8件でも一瞬でした。
フィールド定義やスクリプトを確認しましたがサンプル通りでした。
スクリプトを実行すると
検索実行中。
クエリーを処理中。
と表示がでます。
これが20秒も掛かる理由でしょうか。
手動検索を数件同時にしても一瞬で完了し、「クエリーを処理中」の表示もでません。
目的は、二つあります。
1.検索結果5レコードまでをPC又はiPadに表示させ参照
2.参照後、一レコード毎にレイアウトを切り替えて入力
3.入力後、1.の画面に戻り、繰り返し入力をします
レコード数17万件は番号毎(ユニークな値)に作成してます。社員コードではありません。
ワープロミスに気が付きましたが、そのまま問い合わせをしていました。
申し訳ありません。
既に答えが出てますけど、検索してソートするんでなく、リレーションで表示すれば問題ないのでは。
検索条件を入れるテーブルを別にしておけば、大量のレコードをiPadにダウンロードする必要が無くなるでしょうし。
1.検索条件5レコードまでをPC又はiPadで入力して関連レコードを表示させ
2.参照後、関連レコードへ移動でデータのテーブルのレイアウトに切り替えて入力
>これが20秒も掛かる理由でしょうか。
レコード数が多いのでpositionのフィールドが非保存のためそうなります。
リレーションと関連レコード移動を試してください。
Pages: 1
[ Generated in 0.006 seconds, 7 queries executed - Memory usage: 621.91 KiB (Peak: 654.81 KiB) ]