みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
お世話になります、スクリプトで下記のような検索を行いたいと考えております。
【状況】
・テーブルA/テーブルBが存在
・テーブルAを用いたレイアウト上に、テーブルBのデータがポータル表示されている
・テーブルA/テーブルBはユーザーIDフィールドでリレーション
<テーブルA=顧客情報>
・ユーザーIDフィールド
(・その他の顧客情報など)
<テーブルB=処理履歴テーブル>
・ユーザーIDフィールド
・処理結果フィールド
・処理日時フィールド
テーブルBには、処理履歴レコードが自動的に作成されます。
例えば、3回の処理が行われ、3回目で処理が成功した場合、
下記のようなレコードが生成されます。
レコード1:ユーザーID=ID1/処理結果=NG/処理日時201801011000
レコード2:ユーザーID=ID1/処理結果=NG/処理日時201801011004
レコード3:ユーザーID=ID1/処理結果=OK/処理日時201801011008
【行いたいこと】
最終的な(処理日時が最新の)処理結果がNG(OKになっていない)のデータを検索で抽出したい
当然、普通に検索すると、処理結果に一度でもNGが含まれているユーザーが抽出されていまいます。
どのようなスクリプトにすれば上記のような検索が可能か、教えて頂けますと幸いです、よろしくお願いいたします。
Offline
検索でなく参照で良ければ、
フィルター付き1行ポータルに、
最新の関連レコードのみを表示する方法。
(※この場合、スクリプトや検索は使いません。)
・既存ポータルを、複製コピーする。
・複製ポータルの行数を、1行ポータルへ縮小。
・複製ポータルに、「テーブルB::処理日時」で降順ソートの設定をする。
・複製ポータルに、下記条件式のポータルフィルターを設定。以上
テーブルB::処理結果="NG"
===========================
【 訂 正 】
上は、質問内容を読み違えたようです。
『関連レコード中の最新レコードだけに注目して、
"NG" の患者レコードのみを検出したい』
と言う事ですね。
なら、
・リレーションを処理日付の降順でソート指定して、
・テーブルAで、そのルックアップフィールドを作り、
・このルックアップフィールドで、"NG"を検索する、
と良いかな。
Last edited by Hiro (2018-03-28 11:26:13)
Offline
もし、OK になればその処理が終了するなら、
テーブルBで OK を検索して、関連レコードへ移動でテーブルAを表示、対象外を表示すればいいです。
Offline
リレーションを日付の降順でソート指定して、
テーブルAで計算フィールドを作り
テーブルB::処理結果
とします。
このフィールドで検索すればいいですね。
Offline
お世話になります、確認遅れまして申し訳ありません。
Hiro様、Shin様、チボ様、ご教授ありがとうございます。
Hiro様がおっしゃられるように、
工程A
1.リレーションを日付の降順でソート指定し、
2.テーブルAに、テーブルBの「処理結果フィールド」をルックアップするフィールド「フィールド:L」を作成
3.リレーションのキーとなっているフィールド(ユーザーIDフィールド)を再ルックアップ
4.フィールド:Lで検索
又は
チボ様がおっしゃっておられるように
工程B
1.リレーションを日付の降順でソート指定し、
2.テーブルAに、テーブルBの「処理結果フィールド」を計算で表示するフィールド「フィールド:C」
3.フィールドCで検索
で解決できると思い、実行しました。
その際に、
工程Aの3番の実行時に、
「この処理中に合計●●個のエラーが発生しました。 ●●レコードは、他のユーザーによって使用されているか、使用したアクセス権では変更できません。」
のエラーが一部のレコードに対して発生しました。
この操作は完全アクセス権で行っており、
●●個のエラーの「●●」の値は200個程度が表示されており、その●●人のユーザーが同時に本FileMakerサーバーにアクセスしていることはありません。
また、(試行した限りでは)その値は何度試行しても一緒でした。
「処理結果フィールド」に値が存在しなかったり、リレーション先が存在しないこともありません。
エラーが出たレコードと出ていないレコードの差異は、(私がチェックした範囲では)見つけられませんでした。
エラーが出たレコ―ドと思わしきレコードは再ルックアップがなされず、フィールド:Lは空白のままでした。
また、フィールド:Cは常にテーブルB::処理結果フィールドの値が表示されているはずなのですが、
エラーが出たと思わしきレコードはフィールド:Cの値は空白でした。
(すなわち、フィールドCとLは空白となっている)
上記のようなエラーが出る理由(およびフィールドCが空白となってしまう理由)が分からず難渋しています・・・。
今回の表題の質問とは離れてしまうと思うのですが、お教えいただけますと幸いです、
よろしくお願いいたします。
Shin様、私の書き方がまずくてすいません。
テーブルBには、テーブルA(およびFileMaker)とは関係ない別システムでの処理の結果、
処理履歴レコードが自動的に毎日追加されていく、ということです。
Offline
テーブルAから見て、テーブルBに関連レコードがあるのに
テーブルA::フィールドCに入力されない。
ということでしょうか?
普通に考えてあり得ませんよね。
照合フィールドに何かゴミが付いてるとか??
Offline
その通りに理解していますよ。
テーブルBで "OK" を検索して、テーブルA へ関連レコードへ移動、対象外を表示、を試してみてください。
サンプルファイルを公開しておきます。
https://www.dropbox.com/s/m69mx24n35h1y … 7.zip?dl=0
Offline
一つのユーザIDに対して
NG〜OK
のサイクルが複数あるのでは?
Offline
#3で、それについて書いているのですが、答えがないですね
Offline
テーブルAから見て、テーブルBに関連レコードがあるのに
テーブルA::フィールドCに入力されない。ということでしょうか?
普通に考えてあり得ませんよね。照合フィールドに何かゴミが付いてるとか??
私も普通に考えてあり得ないと思いまして、理由が判明しました。
テーブルAのフィールドに、「空欄不可」のフィールドがあり、空欄不可のフィールドに値が入力されていない場合、
ルックアップ又は計算値が更新されない
ということでした。
すなわち、下記の事象として認識しました。
「ルックアップフィールド(フィールド:L)について
1.空欄不可フィールドに値があるかの判定
2.ルックアップ
3.ルックアップ値が入る
という順序で処理が内部的に行われており、、1.の工程でエラーが出ているので2.3.の工程に入らない
なお、計算フィールド(フィールド:C)も近い工程となるようで、
1.空欄不可フィールドに値があるかの判定
2.計算フィールドの値が計算される
3.計算フィールドに値が入る
という順序のため、1.の工程でエラーが出ているので2.3.の工程に入らない
”ただし、本事象は、全てのレコードに対して同じ理由で生じているわけではなく、
空欄不可フィールドに値が無くても正常にルックアップや計算フィールドの値が計算されている場合もある”」
空欄不可フィールドに値を全ていれたところ下記の事象が発生しました。
・テーブルB::処理結果フィールド
を更新した際に、
・フィールド:L/フィールド:C の両方ともが更新されない
・テーブルAで何かを更新すると反映される
(空欄不可のフィールドは全て埋まっている/既存値を置き換える設定になっている ことを前提としています。)
私の認識では、
・テーブルB::処理結果フィールドを更新した段階で計算フィールドであるフィールドCに値が反映され、
・再ルックアップをするとフィールドLにも値が反映される
の想定でした。
すなわち、再ルックアップを行わないとフィールドCに値が反映されないため、再ルックアップの手間がかかってしまっています。
※上記の事象は、一部のレコードで発生しており、空欄不可フィールドに値が入っていなかった際のルックアップでエラーを吐いていたレコードのみにおいて生じているように見受けられました。
最初の質問から逸れてきてしまっているのですが、アドバイスを頂けますと幸いです、よろしくお願いいたします。
Offline
その通りに理解していますよ。
テーブルBで "OK" を検索して、テーブルA へ関連レコードへ移動、対象外を表示、を試してみてください。
サンプルファイルを公開しておきます。
https://www.dropbox.com/s/m69mx24n35h1y … 7.zip?dl=0
すいません、まだ試せていませんでした、
今から頂いた内容で試してみて報告させていただきます。
Offline
一つのユーザIDに対して
NG〜OK
のサイクルが複数あるのでは?
すいません、余り私が理解できていない気がするのですが、
日付の降順でソートして日付の値が最新のもの(日付の値は重複しません)を取ってきているので、
サイクルが複数あることがどのような影響が出るのかが分かっておりません・・・。
下記はご回答になっておりますでしょうか
↓
テーブルB::処理結果フィールドについて、
・NG1個のみ(レコードが1個しかない)
・NG2個ある(NGとなっているレコードが2個ある)
※両方とも処理結果フィールドにOKの値が入っているレコードは無し
で、両方ともフィールドC/フィールドLに値が入っていない レコードがありました。
※再ルックアップするとフィールドC/フィールドLに値が入りました。
Offline
Shin wrote:その通りに理解していますよ。
テーブルBで "OK" を検索して、テーブルA へ関連レコードへ移動、対象外を表示、を試してみてください。
サンプルファイルを公開しておきます。
https://www.dropbox.com/s/m69mx24n35h1y … 7.zip?dl=0すいません、まだ試せていませんでした、
今から頂いた内容で試してみて報告させていただきます。
すいません、試してみて、ご提案頂いている内容を理解しました。
OKとなっていた場合であっても、次がNGで帰ってくる場合もあり、
一つのユーザIDに対してNG〜OKのサイクルが複数あります。
Offline
空欄不可
の制限があるのに、空欄のレコードがある。
運用的におかしくないでしょうか、
アラートを出したいのなら他にも方法がありますよね。
しかし、だからといって、
計算フィールドCが計算されないことはないでしょう。
私の方法は、複数のサイクルを考慮していますよ。
Offline
> OKとなっていた場合であっても、次がNGで帰ってくる場合もあり、
サンプルを更新しています。最終結果を検索すればいいです。
ただ、結果レコードが非常に多くなると、処理に時間がかかるようになりますよ。
Last edited by Shin (2018-04-20 12:20:15)
Offline
[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 609.47 KiB (Peak: 626.38 KiB) ]