• 締切済み

Access フォームで最小値を取得したい

お願いします Win7, Access2013です メインフォームのTextコントロールに、サブフォームの特定フィールドの最小値をある条件により取得したいと、悪戦苦闘していますが、自分の知識ではお手上げになりました。 下記は見よう見まねで作った「式」ですが、コントロールの書式を m/d(aaa) にしているのにも係わらず、また、[確認日] にも記入があるにも係わらず、全体の最小値をyyyy/mm/dd で返してきます。 【したい事】 ・SubFormのレコードの[確認日](日付型)に記入がない[確認期限](日付型)の最小値をメインフォームの作成したコントロールに取得したい =IIf(IsNull("確認日") & "","" & (DMin("[確認期限]","確認","旅行ID=" & [旅行ID]))) とコントロールソースに記述してみましたが、これでは、無理みたいです。 どちら様か、ご教示をお願いいたします。

みんなの回答

noname#231195
noname#231195
回答No.4

テーブルやフォーム、サブフォームがどうなっているのかわからなければ、ご教示しようがないです。 でも、ご参考までに、気が付いたことを以下に列記します。 =IIf(IsNull("確認日") & "","" & (DMin("[確認期限]","確認","旅行ID=" & [旅行ID]))) IsNull("確認日"): 「確認日」がコントロールの名前なら[確認日]と書かれるべきです。これは「確認日」という文字列を評価していますから、これがFalseを返してくることはないでしょう。 また、この「確認日」というのがサブフォーム上にあり、この数式の入っているコントロールがメインフォーム上にあるなら、「[確認日]」とただ書いただけではサブフォーム上のコントロールの値を参照できません。 サブフォーム上のコントロールの値を見に行く方法については、こちらが参考になるでしょう。 http://www.tohmawari.com/biz/201504032300.html IsNull("確認日") & "": & ""これはどいう目的でつけたのですか? でも、これでも走るんだ、と新しい発見をしました。 DMin("[確認期限]","確認","旅行ID=" & [旅行ID]): DMin関数の仕様から理解するところでは、「確認期限」は「確認」というテーブルないしクエリーのフィールドの名前であるべきなのですから、「[確認期限]」とは書きません。「確認期限」です。 また、「旅行ID」というのは数値型のフィールドなんでしょうね? 私には、意図されている通りにこの数式が書かれているようには思いませんでした。 それでもエラーを出さずに値を返してくるというのは、ずいぶんMSはずいぶんロバストに設計しているんだな、と感じました。

southbreeze
質問者

補足

szo_orz様 ご回答ありがとうございます。 >IsNull("確認日") と、しましたのは, IsNull([確認日])とすると、Nameエラーになり、 ("確認日")としたらうまく出来た為です。 >IsNull("確認日") & "" これは、このような記述方法がWEBページで示されているのを発見してやってみたらエラーではじかれなかった...のです。 ・別のフォームの見方につきましては「やはり、そうだよなぁ」と思った次第です。 ■一つの旅行記録(旅行ID)につき、いくつかのサブフォームがあって、リレーションで繋げていますが、この[確認]は、リレーションせずに、[旅行ID]という数値型のコントロールに旅行IDをその都度入力して繋げています。[確認]は一つの旅行IDに対して「変更した」,「発券した」、「チケットを郵送した」などの何でも自由に記録に残せるようにしていて複数あり、処理が済んだ記録には[確認日]に日付をいれています。 そこで、メインフォームに新規作成した「コントロール」に、F_確認(データシートビュー)の[確認日]が入力されていない(処理できていない)確認事項の中で、一番早く処理しないといけない日はいつか(確認期限の最小値)を表示して欲しいのです。 以上が、今回成し遂げたい事です。読みに行くFormの前に Forms![確認]を付けてやってみたいと思います (これまでやりましたが、エラーで何回か返されましたが、どこか悪かったのでしょうね?) お気づきのことがありましたら、お教え願いたいとおもいます。

回答No.3

>テストして回答するにも主表、従表の構造が不明。 >だから、私の回答はここまで。 70歳にもなると実際にテストしてからでないとミスるもんです。

回答No.2

【補足】SQL文はテストしてから組み込むと試行錯誤の回数を減らせますよ。 私は、以下の関数でSQL文をテストしています。この関数を利用するとDMin()の三倍速で結果を取得できます。関数を利用するには 1、標準モジュールに登録・追加する。 2、ADODBへの【参照設定】を設定する。 3、イミディエイトウインドウでSQL文をテストする。 の手順で可。 先の回答には、チョイ不満足かと思って補足しておきます。 Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function

回答No.1

1、現行のSQL文を見直しましょう。  SELECT Min(確認期限) FROM 確認 WHERE 旅行ID=XXX  これが、現行の質問文。抽出条件(WHERE節)は、《旅行IDが一致していれば》ということ。だから、その限りでの最小が求められています。 2、サブフォームに呼び出している範囲に限定すれば解決。  でも、それをテストして回答するにも主表、従表の構造が不明。だから、私の回答はここまで。 3、あるいは、サブフォームを探索して最小値を取得して解決。  でも、それをテストして回答するにも主表、従表の構造が不明。だから、私の回答はここまで。

southbreeze
質問者

お礼

f_a_007様 ご回答、ありがとうございます。返事を書くのが遅くなり、すみません。 SELECT はクエリだけではなく、フォームにも使えるのですか? 知識が薄いものですから、こんなこと聞いて申し訳ないです。 日付の最小値を表示させたいフォームのコントロールのコントロールソースに、どのように記述すればよいか、ご教示くださると助かります。 お手数ですが、よろしくお願いします。

関連するQ&A