• ベストアンサー

ACCESSを活用して商品変動を捉えたい(4再再)

まだだめなようです。。。 http://okwave.jp/qa/q8782306.html ; を外すと、 !クエリ式'*'の構文エラー:演算子がありません。 と出ます。

質問者が選んだベストアンサー

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

以前の回答時に突っ込み入れるべきだったのか そもそも DBLookup って何ですか?

その他の回答 (2)

回答No.3

補足: DLookup() http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx DBLookup()はDLookup()の高速版。同時に、SELECT文全体を書ける拡張版。例えば、order by 節も書く事ができます。DLookup()は、where節のみ。よって、DLookup()は SELECT 受注履歴.受注日, 受注履歴.会員番号 FROM 受注履歴 ORDER BY 受注履歴.受注日 DESC; などのクエリを準備しなければ、DBLookup()と同じ結果は得られません。もしくは、「単一SELECT文で済ます」ことを諦めて、複雑なSQL文に挑むか? 添付図のDLookup()は、上述のSQL文を'クエリ17'として登録しています。これで、両者は同じ結果を得ます。また、注文一回のお客様を省くWhere節も同様に書き換え可能。その要領は、先に示した通りです。 PS、ただ、私は<クエリは作らない・利用しない>主義。全て、SQL文を直接に書く主義。ですから、クエリを準備するやり方には抵抗があります。

回答No.2

SELECT DBLookup("SELECT 受注日 FROM 受注履歴 WHERE 会員番号=" & [会員番号] & " AND 受注日 < #" & [受注日] & "# ORDER BY 受注日 DESC") AS 前回受注日, DateDiff("d",前回受注日,受注日) AS 切り替え, * FROM 受注履歴 WHERE (((DBLookup("SELECT COUNT(受注日) FROM 受注履歴 WHERE 会員番号=" & [会員番号]))>1)) ORDER BY 受注履歴.会員番号, 受注履歴.受注日; 修正1、*⇒,* 修正2、  DBLookup(⇒,DBLookup( 修正3、  DateDiff(*⇒,DateDiff( 後は、この3つ。 ※'スイッチング'を'受注履歴'に置換してテストしたところ、上の3つが引っかかりました。’,'を追加し、全角ブランクを消すことで保存でき実行もできました。 解答は、改行してかつ全角ブランクを挿入して視認性を高めています。いずれも、それに起因する不具合。上記3つを修正したら100%上手くいきます。標準モジュールに DBLookup()を追加しておくのは当然ですが・・・。

関連するQ&A

  • ACCESSを活用して商品変動を捉えたい(3再再)

    こちらの件ですが、 http://okwave.jp/qa/q8781488.html 最終的に以下で行こうと思っています。 テーブル名:スイッチング SQL構文 SELECT;   DBLookup("SELECT 受注日 FROM スイッチング WHERE 会員番号=" & [会員番号] & " AND 受注日 < #" & [受注日] & "# ORDER BY 受注日 DESC") AS 前回受注日,   DateDiff("d",前回受注日,受注日) AS 切り替え,   * FROM スイッチング WHERE (((DBLookup("SELECT COUNT(受注日) FROM スイッチング WHERE 会員番号=" & [会員番号]))>1)) ORDER BY スイッチング.会員番号, スイッチング.受注日; しかしながら、クエリ実行を押すと、以下メッセージが流れ動作しません。 何が不足しているのでしょうか。 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ !SELECT ステートメントが間違っている予約語や引数を含んでいるか、 区切り記号が正しくありません。

  • ACCESSを活用して商品変動を捉えたい(6再再)

    クエリー14 http://okwave.jp/qa/q8781488.html を参考にSELECT構文を作っていますが、、、 上記URLの画面のようには出ず、以下のようになります。 ※商品名、商品コードが変わらない「大島太陽」も抽出される(数量、価格が変化しているだけ) ※ 前回受注日 切り替え 受注日 氏名 会員番号 商品コード 商品名 数量 価格 2014/04/01 山田花子 12345678 55555 魔法瓶 1 2980 2014/04/01 30 2014/05/01 山田花子 12345678 33333 御茶碗 1 1280 2014/05/01 75 2014/07/15 山田花子 12345678 22222 洗面器 1 980 2014/04/02 大島太陽 34567890 55555 魔法瓶 1 2980 2014/04/02 42 2014/05/14 大島太陽 34567890 55555 魔法瓶 2 5960 クエリー14のイメージで間違えないでしょうか。 SELECT DBLookup("SELECT 受注日 FROM 受注履歴 WHERE 会員番号=" & [会員番号] & " AND 受注日 < #" & [受注日] & "# ORDER BY 受注日 DESC") AS 前回受注日, DateDiff("d",前回受注日,受注日) AS 切り替え, * FROM 受注履歴 WHERE (((DBLookup("SELECT COUNT(受注日) FROM 受注履歴 WHERE 会員番号=" & [会員番号]))>1)) ORDER BY 受注履歴.会員番号, 受注履歴.受注日;

  • ACCESSを活用して商品変動を捉えたい(5再再)

    http://okwave.jp/qa/q8782706.html 上記について標準モジュールも作成して、先のクエリーを実行しましたが、 その際に !コンパイル エラー: ユーザー定義型は定義されていません。 と出ます。 5行目の rst As ADODB.Recordset 箇所が反転されています。 一回でできるのは魅力なのですが、本当に実装できるのでしょうか。 (クエリーはたしかに保存できました) 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 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

  • ACCESSを活用して商品変動を捉えたい(2再再)

    続きです。 http://okwave.jp/qa/q8781159.html SELECT DBLookup("SELECT 受注日 FROM 受注履歴 WHERE 会員番号='" & [会員番号] & "' AND 受注日 < #" & [受注日] & "# ORDER BY 受注日 DESC") AS 前回受注日, DateDiff("d",前回受注日,受注日) AS 切り替え, * FROM 受注履歴; 上記に対して、 すみません、以下はどこに組み込まれるのでしょうか。 >・SELECT文全体に、会員番号昇順で並べるORDER BY 節が欠落しています。 >・WHERE節を追加されると目的は達成されます。 注文1回のお客は除きます。。

  • SELECT 商品.* FROM 商品 ORDER BY 品番 group by 品番;

    ACCESSのモジュールでSQLを実行すると 実行時のエラー クエリ式’品番 group by [品番]’の構文エラー :演算子がありません が出ます。 WindowXPでACCESS2003で実行しています 品番は[品番]のように括弧でくくってもダメです 手がかりとなるアドバイスをおねがいします

  • ACCESSを活用して商品変動を捉えたい(2再)

    http://okwave.jp/qa/q8776538.html について、以下回答(SELECT分)をいただいていますが、 これですと、テーブルを見ていないので会員番号を変えても動かないのではないでしょうか。 (困った!) <回答きたもの> SELECT DBLookup("SELECT 受注日 FROM 受注履歴 WHERE 氏名='" & [氏名] & "' AND 受注日 < #" & [受注日] & "# ORDER BY 受注日 DESC") AS 前回受注日, DateDiff("d",前回受注日,受注日) AS 切り替え, * FROM 受注履歴; ただし、「単一SELECT文で全てを済ます」を貫くには、DBLookup()などのSELECT文を自在に組み込めるユーザー関数が必要。

  • ACCESSを活用して商品変動を追いたい(別2)

    こちらのベストアンサーについて、 http://okwave.jp/qa/q8783133.html 以下は氏名、電話番号をKEY(該当者の一致条件)としていましたが、電話番号のみにした場合、いただいた構文がどこが変わるのでしょうか。 こちらは、氏名、電話番号がKEY(これを電話番号だけをKEYにしたい)。 ↓ SELECT T1.受付日, T1.受付日-T2.受付日 AS 切り替え, T1.氏名, T1.電話番号, T1.商品コード, T1.商品名, T1.数量, T1.価格 FROM (SELECT Q1.* FROM ★★ AS Q1 INNER JOIN (SELECT 氏名, 電話番号 FROM ★★ GROUP BY 氏名, 電話番号 HAVING Min(商品コード & 商品名)<>Max(商品コード & 商品名) ) AS Q2 ON Q1.氏名=Q2.氏名 AND Q1.電話番号=Q2.電話番号 ) AS T1 LEFT JOIN (SELECT DISTINCT Q1.受付日, Q1.氏名, Q1.電話番号 FROM ★★ AS Q1 INNER JOIN (SELECT 氏名, 電話番号 FROM ★★ GROUP BY 氏名, 電話番号 HAVING Min(商品コード & 商品名)<>Max(商品コード & 商品名) ) AS Q2 ON Q1.氏名=Q2.氏名 AND Q1.電話番号=Q2.電話番号 ) AS T2 ON T1.氏名=T2.氏名 AND T1.電話番号=T2.電話番号 AND T1.受付日>T2.受付日 WHERE T2.受付日 Is Null OR (T2.受付日= (SELECT Max(受付日) FROM ★★ WHERE 氏名=T1.氏名 AND 電話番号=T1.電話番号 AND 受付日<T1.受付日) AND Exists (SELECT 1 FROM ★★ WHERE 受付日=T2.受付日 AND 氏名=T1.氏名 AND 電話番号=T1.電話番号 AND 商品コード & 商品名<>T1.商品コード & T1.商品名)) ORDER BY T1.氏名, T1.電話番号, T1.受付日;

  • ACCESSを活用して商品変動を追いたい(別3)

    達人様 重ね重ね恐縮です。 以下構文について、 氏名、電話番号が同じお客様の場合で、 商品コード、商品名が前のリストから変わったリストのみ を、 ↓ 電話番号が同じお客様の場合で、 商品コード、商品名が前のリストから変わったリストのみ に条件をこちらも変えられますでしょうか。 http://okwave.jp/qa/q8783133.html SELECT T1.受付日, T1.受付日-T2.受付日 AS 切り替え, T1.氏名, T1.電話番号, T1.商品コード, T1.商品名, T1.数量, T1.価格 FROM (SELECT Q1.*, Q3.CT FROM (★★ AS Q1 INNER JOIN (SELECT 氏名, 電話番号 FROM ★★ GROUP BY 氏名, 電話番号 HAVING Min(商品コード & 商品名)<>Max(商品コード & 商品名) ) AS Q2 ON Q1.氏名=Q2.氏名 AND Q1.電話番号=Q2.電話番号) INNER JOIN (SELECT 受付日, 氏名, 電話番号, Count(*) AS CT FROM ★★ GROUP BY 受付日, 氏名, 電話番号) AS Q3 ON Q1.受付日=Q3.受付日 AND Q1.氏名=Q3.氏名 AND Q1.電話番号=Q3.電話番号 ) AS T1 LEFT JOIN (SELECT 受付日, 氏名, 電話番号, Count(*) AS CT FROM ★★ GROUP BY 受付日, 氏名, 電話番号) AS T2 ON T1.氏名=T2.氏名 AND T1.電話番号=T2.電話番号 AND T1.受付日>T2.受付日 WHERE T2.受付日 Is Null OR (T2.受付日= (SELECT Max(受付日) FROM ★★ WHERE 氏名=T1.氏名 AND 電話番号=T1.電話番号 AND 受付日<T1.受付日) AND IIF(T1.CT<T2.CT,True, T1.商品コード & T1.商品名 Not In (SELECT 商品コード & 商品名 FROM ★★ WHERE 受付日=T2.受付日 AND 氏名=T1.氏名 AND 電話番号=T1.電話番号) )) ORDER BY T1.氏名, T1.電話番号, T1.受付日;

  • ACCESSの更新クエリー活用方法の件(続き)

    ID 商品 価格 備考  フラグ という列をもつテーブルがあるとします。 こちらは、 テーブル名:商品名 としています。 これにたいして選択クエリーを使って、特定の商品だけを クエリーで引っ張ってきています。 クエリー名:抽出 このクエリー名:抽出で引っ張ってきたデータにあるフラグの列に「更新クエリー」で 1の数値を入れたいのですが、 それは更新クエリーでどのようにSQLをせっていするかたちになりますか。 更新クエリー名:更新 update 抽出元のテーブル set 任意のセル = 1 where 抽出の条件 update 商品名 set フラグ = 1 where 抽出 ; 上記方法、更新クエリーで上記SQLを設定しても、クエリー実行時に、 バラメータを要求され、結果 全てのテーブル列に1がふられます。 式が違うのでしょうか。あくまでもクエリーで抽出されたものだけに 1をふりたいのですが。 http://okwave.jp/qa/q7278856.html > http://okwave.jp/qa/q7277790.html の#1・#2です。 #1に「選択クエリは作れますか?」と書いたのをほったらかしにして、続きの質問とは・・・。 具体的なテーブル名・列名を提示してないので、イメージで書いてあるんだから 回答を丸写ししちゃダメでしょ。 > #1です。ごめんなさい。もっとシンプルに考えれば良いです。 デザインビューにしてSQLビューに切るかえる。 select 列 from 抽出元のテーブル where 抽出の条件 ; みたいなデータです。 where の前を書き換えます。 select 列 from 抽出元のテーブル の部分を update 抽出元のテーブル set 任意のセル = 1 としてください。

  • おしえてアクセス

    データ0000から9999まであります。 クエリ 抽出条件 で 1027~1034まで抽出したいのですが 演算式がうまく使えません たすけてください!!

専門家に質問してみよう