みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
FMS19とFMP19でWindows環境、ServerはMACMini(Ventura13.1)の構成です。
フィールドが空白であるレコードを抽出しようと検索から演算子「=」をいれて検索実行します。ところが結果は空白でないものも表示されてしまいます。
今度は、演算子「*」をいれて、検索後対象外のみ表示にしますと、ちゃんと空白であるレコードが表示されます。わけがわかりません。
なにが間違っているのでしょうか?
Offline
あなたが見ているものを私たちは見えていません。
人に伝えたいのであれば、もう少し伝えようとする努力をすることをお勧めいたします。
これだけの情報で出てくる答えとしては「破損しているのではないか?」という回答だけです。
スクリプトで実行しようとしたのか、検索モードに切り替えて該当するフィールドに手動で=を入力して検索実行したのか、スクリプトデバッガを立ち上げた状態で操作した時にどうなるかなど、もう少し詳しく教えてください。
ありがとうございます。検索モードで手動なのです。なんとも状況を伝えにくいのですが、ひょっとして単純なミスがあるのかと思い聞きました。
Offline
検索しているのは、現在のレイアウトのTOのフィールドですか?それとも関連レコードのフィールドですか?
検索がうまくいかない場合は、索引が壊れてる可能性もあるかな。
関連レコードのフィールドの場合、関連レコードが1件でも一致すれば該当となるので、見えてるものとは違うものが検索されることがあります。
関連レコードがない場合は空欄ではないので=ではヒットしませんね。なるほど。これかな。
計算式でIsEmpty ( 関連テーブル::フィールド )だと、関連レコードがなくても真なので、ちょっとわかりづらいかも。
関連レコードなんです。空白(=)を検索しているのに、データが入っているものもでてきてしまいます。関連レコードの検索は問題がでるのですね。なにがなにやらまだわかっていません。データは63000件ほどなんです。
Offline
>関連レコードの検索は問題がでるのですね
問題ではありません。仕様を理解して検索すれば良いということです。
上ですでに書かれていますが、関連レコードに検索条件と合致するレコードが1件でもあればヒットします。
例)関連レコードが2件あり、1件が「=(空白)」ならばもう1件が空白でなくてもヒットします。
また、これも上に書かれていますが「=(空白)」は関連レコードがないという意味ではないので
関連レコードがないレコードを検索するために空白検索は利用できません。
Offline
Mozさんやhimadaneeさんが書いている事と同じになりますが、レコードがない事とフィールドが空白である事は全く違う事象です。
もっとさんさんにお願いがあります。
今後は、テーブルの構造や前提条件をきちんと書いてみてください。2−3スレッドで解決すると思います。
> なんとも状況を伝えにくいのですが
伝えにくい事は重々理解いたしますが、伝えようという意識を少しは持ってください。
伝えないことによって時間が浪費されることもある事を認識してください。
現在取り扱っているファイルが複雑なものであるならば、新規で新しいファイルを作って再現するか確認するようにしてください。
今回の場合は、「関連レコードで、ポータルの中にあるフィールドに=と手打ちで入力して検索実行した」という程度なので、伝えにくいものとは思えません。
今回、データがあるレコードがたくさん検索されたのは、関連レコードの中に、そのフィールドに空白のレコードがあったからなのでしょうね。
新しいファイルでポータルを配置して、それを確認してみてください。
関連レコードがないレコードを検索したい場合は、関連レコードの主キーやリレーションシップで利用している外部キーなど必ずデータのあるフィールドに*を入れて検索して、対象外のレコードを表示させます。(他のテクニックもあります)
関連レコードが存在しないレコードを検索するのは、誰しもが引っかかるところですね。
今回の件でもっとさんさんが新しいファイルで検証を少しでもしてきてくれる人になってくれる事を願っています。
新しいファイルを作れば、テーブル構造とか前提条件とか伝えやすいですよね。
関連レコードの1行目のレコードのフィールドが空欄のレコードを検索したい場合は、少し工夫が要ります。
親テーブルに計算フィールドを作成し、子供::フィールド とします。
この計算フィールドを = で検索すると良いでしょう。
すみません。安易に質問してしまいました。
関連レコードは1件だけなんです。
関連レコードのフィールドには空白のレコードはたくさんあります。
似たようなテーブルで同じようにポータルのデータのところで=手動検索をしますが、このような現象はおこなないんです。
Offline
関連レコードが必ずあってそれが1件だけ、だったら普通は1つのテーブルにした方がいいですが。
その場合にポータルを使う意味は全くないでしょうし。
ファイルのバックアップを別の場所にコピーして、スタンドアロンで索引の再構成とファイルの修復を試してみてはどうですか。
1. レイアウトを新規で作成してください。今回と同じテーブルオカレンス(TO)とします。(親)
2. ポータルをその新しいレイアウト上に配置してください。今回と同じTOとします。(子)。行数は3-4にしてください。
3. ポータル上に子のフィールドを配置してください。
4. レイアウトを保存して、検索モードにしてください。
5. このフィールドに=を入力して検索実行してください。
6. 結果を教えてください。同じ結果かどうかなど。
レイアウトを新しくつくりました。
検索モードで=での検索実行では、空白でないデータも検出されてしまいます。
検索モードで*で検索して対象外を表示にしたら、空白だけ検出されています。
検索しているフィールドは日付フィールドです。
Offline
もっとさんさん、試していただきありがとうございます。
その検索された結果のポータルに表示されている、関連レコードの数は、もっとさんさんのいう通り、1つだけですか?
今回の例で出てくるTOは、親と子だけですか?
それとも孫ひ孫も関わってきますか?
ポータルは子ですか?孫ですか?
検索しているフィールドは子ですか孫などですか?
あたらしくテーブルを作りました。
テーブルは、受注伝票と納品伝票なんです。
あたらしく受注伝票テストを作り、納品伝票と製品番号でリレーションシップをつくりまいsた。
受注天平テストのフィールドは製品番号だけにしています。
そして受注伝票テストに4つほどレコードを作成しました。
そしてポータルから検収日を表示するようにしました。
4つのレコードの納品伝票にひとつだけ検収日のないものをつくりました。
検索から=をいれて検索すると、ちょっとおかしなことが起こりました。
なんどもこの検索をしていると、この検収日のないものがヒットしないことがあるのです。
おなじように検索しているつもりなのですが、20回に1回ぐらいヒットしないのです。
これは、検索するフィールドを間違えて検索したのかとも思います。
しかし、本番では空白がヒットしないのではなく、空白でないものもでてくるという状況です。
Offline
製品番号が主キーということですか?
受注伝票テストと納品伝票の両方で、重複禁止・常時にしてありますか?
もっとさんさん、詳細情報をありがとうございます。
そのレイアウトで、ポータルを配置してみてください。
そうですね、そのポータルのTOは納品伝票のソレです。間違えてはいけません。
そのポータルの行は、1行ではなく、必ず複数行に設定してくださいね。
次の質問にお答えください。質問は複数あります。回答するときは、質問の番号を記載していただくと良いと思います。
質問1. 空白でないものが出てくる時のそのポータルに表示されているレコード数は何個ですか?
質問2. TOが納品伝票のレイアウトを作成し、製品番号フィールドをそのレイアウトに配置してください。検索モードに切り替え、製品番号フィールドに ! を入力して、検索実行してみた結果を詳細にお答えください。
よろしくお願いいたします。
受注伝票のほうは、ユニークですが、納品伝票のほうは、この受注伝票のポータルから作成されるので、ユニークにしていませんでした。納品伝票のほうもユニークにしましたが、=より空白以外の日付が検出されてしまうのはかわりませんでした。
Offline
ホットさん、すみません。ポータルの行は複数行にするということはどういう操作
本番のほうのレコードで=検索で46/62945が表示されます。ところが36が検収日にデータがあり、10個が空白なんです。
実際には、197/62945こが空白なんです。
受注伝票の数は、62945こ
納品伝票の数は、62163こ
そして納品伝票の検収日は62/62163が空白なんです。
Offline
もっとさんさん、情報ありがとうございます。
#12 の時にポータルの行数の設定を知らないと言って欲しかったですね。
すいません、愚痴です。
さて、一つずつ確実に確認していきましょう。
次の質問にお答えください。
質問は複数あります。回答するときは質問の番号を記載してください。
ポータルの複数行については、質問2で方法を提示いたします。
質問1. TOが納品伝票のレイアウトを作成し、製品番号フィールドをそのレイアウトに配置してください。検索モードに切り替え、製品番号フィールドに ! を入力して検索実行してください。
答えは、次のうちどちらですか? A または B でお答えください。
A: 検索実行した結果、レコード数は 0 個だった。
B: 検索実行した結果、レコード数は 0 個ではなかった。
注意事項 : レイアウトに指定されている TO は[納品伝票]を指定してください。レイアウトに指定されている TO は [ファイル] > [管理] > [レイアウト...] の [関連づけられているテーブル] で確認する事ができます。
また、答えが B だった場合、0 個ではない考察があれば記載してください。
質問2. もっとさんさんは次の操作をしました。その後に続く問題に答えてください。
□ 新規でレイアウトを作成します。レイアウトは[受注伝票]を指定しました。
□ レイアウトモードに切り替えてポータルを配置しました。
□ ポータルの設定ダイアログで [レコードを表示:] のプルダウンをクリックして、[納品伝票]を指定しました。
□ [垂直スクロールを許可] にチェックをつけました。
□ [行数:] の設定で 5 を入力しました。
□ [OK] ボタンを押しました。
□ 作成されたポータルに [納品伝票::検収日] フィールドを配置しました。
□ 検索モードに切り替えて、[納品伝票::検収日] フィールドに = を入力して検索実行をしました。
上記の操作をしたところ、全レコード 62945 件中 46 件が表示されました。
ところが、そのうち 36 件が [納品伝票::検収日] フィールドにデータが入っており、期待した結果にはなりませんでした。
問題 : 検索された結果のうち [納品伝票::検収日] フィールドにデータが入っていたレコードにもっとさんさんが移動した時、ポータルに表示されている関連レコードの件数を次の選択肢の中から答えてください。
A: ポータルに表示されている関連レコードの件数は 1 個
B: ポータルに表示されている関連レコードの件数は 0 個
C: ポータルに表示されている関連レコードの件数は 2 個以上
回答は、回答例にならって記載してください。
回答例
質問1: B
質問2: C
納品伝票の方が数が少ないですから、受注伝票のレイアウトで納品伝票のフィールドを=で検索しても782レコード分はヒットしません。
>納品伝票のほうは、この受注伝票のポータルから作成されるので、ユニークにしていませんでした。
あとからユニークにしても既存のレコードはそのままです。製品番号が重複しているのがあるのでは。
ポータル行数を複数にすれば見た目でわかりますが 行数の設定はレイアウトモードでポータル設定です。
重複があるか確認するだけなら、納品伝票のレイアウトで重複検索した方が早いですね。
=で検索したのに空欄でない、というのを確認するのは、複数行のポータルで見ればすぐわかります。
追伸 : #20 で出した質問は、本番のもので試してみてくださいね。
これだけは、本当にお願いいたします。一生のお願いです。
ホットさん
質問1 B レコード数は0ではない。
納品伝票の製品番号は重複していました。これは、分納があるのでしかたないことです。
重複の!は桁数が8桁ぐらいしか抽出できなかたのではなかったですかね。
質問2 A
46個のうちポータルには1個しか見えません
Offline
受注伝票と納品伝票テーブルで、納品伝票と製品番号でリレーションシップ
この構成は変じゃないですか。全て1品ものなら、製品番号はユニークになりますが、分納があるという事は、1ピンものではないですよね
Offline
ごめんなさい。製品番号ではなく製造番号なんです。製造番号自体は、受注伝票では、ユニークなんですが、納品伝票では分納になることがあるのでユニークではないわけです。
Offline
[ Generated in 0.035 seconds, 9 queries executed - Memory usage: 577.97 KiB (Peak: 614.51 KiB) ]