Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトルWHERE句の構文エラー
記事No42905
投稿日: 2018/04/03(Tue) 10:21
投稿者あいかんな
解決済: ON
OS:Windows 7
Access Version:2016

フォームに必要項目を入力し、検索結果を表示しています。

Private Sub 抽出_Click()
Dim stSql As String
Dim stcri As String
stSql = "select * from 履歴 WHERE"
stcri = ""


If 日付from <> "" And 日付to = "" Then
日付to = Date
ElseIf 日付from = "" And 日付to <> "" Then
日付from = #1/1/1990#
End If


If 日付from <> "" Then
'変数に条件設定済みに場合、AND条件を追加
If stcri <> "" Then stcri = stcri & " And "
stcri = stcri & " [日付] between #" & 日付from & "# And #" & 日付to & "#"
End If

'[txt氏名]が空の文字列ではないとき、変数に条件を格納
If txt氏名 <> "" Then
'変数に条件設定済みに場合、AND条件を追加
If stcri <> "" Then stcri = stcri & " And "
stcri = stcri & " [氏名] like " & " '*" & txt氏名 & "*'"
End If

End If
stSql = stSql & stcri
DoCmd.OpenForm "検索結果", , stSql
End Sub

項目を選んだ場合は問題ないのですが、項目を選択せずに抽出を行った場合、
WHERE句の構文エラーの表示が出ます。デバックすると

DoCmd.OpenForm "検索結果", , stSql

にエラーがあるようですがわかりません。
よろしくお願いいたします。

タイトルRe: WHERE句の構文エラー
記事No42906
投稿日: 2018/04/03(Tue) 10:35
投稿者RI
解決済: ON
DoCmd.OpenForm "検索結果", , stSqlの行にブレークポイントを置いてエラー時のstSqlの値を調べれば一目瞭然かと思いますが

日付fromも日付toもtxt氏名も未入力の場合、stcriが空白のままなので
stSqlが"select * from 履歴 WHERE"というSQL文として成り立っていない構文となりエラーです

タイトルRe^2: WHERE句の構文エラー
記事No42907
投稿日: 2018/04/03(Tue) 10:52
投稿者あいかんな
解決済: ON
> DoCmd.OpenForm "検索結果", , stSqlの行にブレークポイントを置いてエラー時のstSqlの値を調べれば一目瞭然かと思いますが
>
> 日付fromも日付toもtxt氏名も未入力の場合、stcriが空白のままなので
> stSqlが"select * from 履歴 WHERE"というSQL文として成り立っていない構文となりエラーです

RIさま

ありがとうございます。
stcriが空白の場合、どのようなコードにすれば良いのか教えていただけないでしょうか?

タイトルRe^3: WHERE句の構文エラー
記事No42909
投稿日: 2018/04/03(Tue) 11:03
投稿者RI
解決済: ON
そもそも検索条件なしでの実行を許すシステムなのであれば

stSql = "select * from 履歴 WHERE"とするべきではなく
stSql = "select * from 履歴"とするべきです

If stcri <> "" Then stcri = stcri & " And "ということができているのであれば
stcri = ""のときに初めて stcri = stcri & " WHERE "としたほうがいいのではないでしょうか

タイトルRe^4: WHERE句の構文エラー
記事No42911
投稿日: 2018/04/03(Tue) 15:39
投稿者あいかんな
解決済: ON
> そもそも検索条件なしでの実行を許すシステムなのであれば
>
> stSql = "select * from 履歴 WHERE"とするべきではなく
> stSql = "select * from 履歴"とするべきです
>
> If stcri <> "" Then stcri = stcri & " And "ということができているのであれば
> stcri = ""のときに初めて stcri = stcri & " WHERE "としたほうがいいのではないでしょうか

RIさま

教えていただいたとおりにすると、
項目を選ぶ→エラー
項目を選ばない→エラーが出ない
となります。

項目を選ばない場合の抽出ボタンを別に用意する方法が良いでしょうか?

タイトルRe: WHERE句の構文エラー
記事No42908
投稿日: 2018/04/03(Tue) 10:52
投稿者hatena
解決済: ON
下記でどうでしょう。

Private Sub 抽出_Click()
    Dim stcri As String


    If Me.日付from <> "" Then
        If IsDate(Me.日付from) Then
            stcri = stcri & " And [日付] >=#" & Me.日付from & "#" 
        Else
            Msgbox "正しい日付を入力してください。"
            Me.日付from.SetFocus
            Exit Sub
        End If
    End If
    If Me.日付to <> "" Then
        If IsDate(Me.日付to) Then
            stcri = stcri & " And [日付] <=#" & Me.日付to & "#" 
        Else
            Msgbox "正しい日付を入力してください。"
            Me.日付to.SetFocus
            Exit Sub
        End If
    End If

   If Me.txt氏名 <> "" Then
         stcri = stcri & " AND [氏名] like '*" & txt氏名 & "*'"
   End If

   stcri = Mid(stcri, 6) '先頭の不要な" AND "を除去
   DoCmd.OpenForm "検索結果", , , stcri
End Sub

※
日付として有効かどうかチェックしたほうがよい。
2018/2/29 などと入力するとエラーになる。

期間条件は、 Between を使わずに、>= と <= を組みわせたほうがシンプル。 

OpenForm の第4引数(Where Condition)なら、抽出条件式のみでよい。
SELECT 〜 FROM は不要。

すべての条件の先頭に " AND " を付けておいて、最後に削除するのがシンプル。
 

タイトルRe^2: WHERE句の構文エラー
記事No42912
投稿日: 2018/04/03(Tue) 15:42
投稿者あいかんな
解決済: ON
> 下記でどうでしょう。
>
> Private Sub 抽出_Click()
> Dim stcri As String
>
>
> If Me.日付from <> "" Then
> If IsDate(Me.日付from) Then
> stcri = stcri & " And [日付] >=#" & Me.日付from & "#"
> Else
> Msgbox "正しい日付を入力してください。"
> Me.日付from.SetFocus
> Exit Sub
> End If
> End If
> If Me.日付to <> "" Then
> If IsDate(Me.日付to) Then
> stcri = stcri & " And [日付] >=#" & Me.日付to & "#"
> Else
> Msgbox "正しい日付を入力してください。"
> Me.日付to.SetFocus
> Exit Sub
> End If
> End If
>
> If Me.txt氏名 <> "" Then
> stcri = stcri & " AND [氏名] like '*" & txt氏名 & "*'"
> End If
>
> stcri = Mid(stcri, 6) '先頭の不要な" AND "を除去
> DoCmd.OpenForm "検索結果", , , stcri
> End Sub
>
> ※
> 日付として有効かどうかチェックしたほうがよい。
> 2018/2/29 などと入力するとエラーになる。
>
> 期間条件は、 Between を使わずに、>= と <= を組みわせたほうがシンプル。
>
> OpenForm の第4引数(Where Condition)なら、抽出条件式のみでよい。
> SELECT 〜 FROM は不要。
>
> すべての条件の先頭に " AND " を付けておいて、最後に削除するのがシンプル。
>

hatenaさま

教えていただいた方法でエラーは出ないのですが、
項目を選択しない場合、全データの表示になるはずが、
何故かフィルターがかかっており、すべてのデータが表示されません。

タイトルRe^3: WHERE句の構文エラー
記事No42913
投稿日: 2018/04/03(Tue) 16:45
投稿者hatena
解決済: ON
> 教えていただいた方法でエラーは出ないのですが、
> 項目を選択しない場合、全データの表示になるはずが、
> 何故かフィルターがかかっており、すべてのデータが表示されません。

そんな、はずはないと思います。
下記のように1行挿入して実行するとどうなりますか。

stcri = Mid(stcri, 6) '先頭の不要な" AND "を除去
MsgBox "抽出条件は'" & strcri & "'です" 'このコードを挿入
DoCmd.OpenForm "検索結果", , , stcri


全項目が未入力なら、

抽出条件は''です

と表示されるはずです。
つまり抽出条件は無しということです。

もし、その状態で全レコードが表示されないなら、
レコードソースがクエリになっているとして考えられない。

タイトルRe^4: WHERE句の構文エラー
記事No42915
投稿日: 2018/04/03(Tue) 17:20
投稿者あいかんな
解決済: ON
> > 教えていただいた方法でエラーは出ないのですが、
> > 項目を選択しない場合、全データの表示になるはずが、
> > 何故かフィルターがかかっており、すべてのデータが表示されません。
>
> そんな、はずはないと思います。
> 下記のように1行挿入して実行するとどうなりますか。
>
> stcri = Mid(stcri, 6) '先頭の不要な" AND "を除去
> MsgBox "抽出条件は'" & strcri & "'です" 'このコードを挿入
> DoCmd.OpenForm "検索結果", , , stcri
>
>
> 全項目が未入力なら、
>
> 抽出条件は''です
>
> と表示されるはずです。
> つまり抽出条件は無しということです。
>
> もし、その状態で全レコードが表示されないなら、
> レコードソースがクエリになっているとして考えられない。

hatenaさま

ご指摘のとおり、レコードソースがクエリになっておりました。
レコードソースを見直し、正しく表記されるようになりました。
ありがとうございました。

タイトルRe^5: WHERE句の構文エラー
記事No42916
投稿日: 2018/04/03(Tue) 17:22
投稿者あいかんな
解決済: ON
> > > 教えていただいた方法でエラーは出ないのですが、
> > > 項目を選択しない場合、全データの表示になるはずが、
> > > 何故かフィルターがかかっており、すべてのデータが表示されません。
> >
> > そんな、はずはないと思います。
> > 下記のように1行挿入して実行するとどうなりますか。
> >
> > stcri = Mid(stcri, 6) '先頭の不要な" AND "を除去
> > MsgBox "抽出条件は'" & strcri & "'です" 'このコードを挿入
> > DoCmd.OpenForm "検索結果", , , stcri
> >
> >
> > 全項目が未入力なら、
> >
> > 抽出条件は''です
> >
> > と表示されるはずです。
> > つまり抽出条件は無しということです。
> >
> > もし、その状態で全レコードが表示されないなら、
> > レコードソースがクエリになっているとして考えられない。
>
> hatenaさま
>
> ご指摘のとおり、レコードソースがクエリになっておりました。
> レコードソースを見直し、正しく表記されるようになりました。
> ありがとうございました。

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る