Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Access 2013)
日時範囲指定でのデータ削除
投稿日時: 18/10/31 15:11:15
投稿者: 阮氏洪

お世話になります。
 
10/31の8時〜11/1の8時までで、KUBUN_MEIが追込では無いデータを全て消したいのですが、追込も全て消えてしまいます。
BETWEEN句を使って含まない条件で消すには、どうしたらよろしいでしょうか。
 
DELETE * FROM KOTEIHYO WHERE (SYURYO_TIME Between #2018/10/31 08:00:00# AND #2018/11/01 08:00:00#) AND KUBUN_MEI <> '追込'
 
よろしくお願いします

回答
投稿日時: 18/10/31 15:42:52
投稿者: sk

引用:
10/31の8時〜11/1の8時までで、KUBUN_MEIが追込では無い
データを全て消したいのですが、追込も全て消えてしまいます。

具体的にどのような操作/コードを
実行なさろうとしているのでしょうか。
 
引用:
DELETE * FROM KOTEIHYO
WHERE (SYURYO_TIME Between #2018/10/31 08:00:00#
                       AND #2018/11/01 08:00:00#)
  AND KUBUN_MEI <> '追込'

少なくとも、上記の DELETE 文に関して
特に誤りは認められません。
([KUBUN_MEI]の値が Null であるレコードは
削除の対象には含まれませんが)
 
例えば、新規作成したクエリの SQL ビューに
上記の SQL 文 をそのまま貼り付けてクエリを
実行しても同様の現象が発生するのでしょうか。

投稿日時: 18/10/31 16:49:39
投稿者: 阮氏洪

skさんありがとうございます。
 
確かにアクセスのクエリで実行すると問題ございませんでした。
 
>具体的にどのような操作/コードを
>実行なさろうとしているのでしょうか。
 
エクセルのVBAから実行しております。

回答
投稿日時: 18/10/31 16:57:41
投稿者: sk

引用:
エクセルのVBAから実行しております。

ならば実際に記述されたコードに何らかの問題があるのでしょう。

投稿日時: 18/10/31 17:01:34
投稿者: 阮氏洪

skさん何度もすみません。
実際のコードの一部ですが、このような感じです。
 
    cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Adr_MDB
    cn.Open
     
    '**** 古いデータの消去 ***********************************************************
        mySQL = "DELETE * FROM KOTEIHYO"
            mySQL = mySQL & " " & "WHERE DATE_TXT < " & KILL_DATE '2年1ヶ月前より小さい製造日を消す
         
        cn.Execute mySQL
         
    '*************************************************************************************
     
    '**** 該当データの事前消去 ***********************************************************
        mySQL = "DELETE * FROM KOTEIHYO"
            mySQL = mySQL & " " & "WHERE (SYURYO_TIME Between #" & DS1 & "#" '工程開始日時
            mySQL = mySQL & " " & "AND #" & DS2 & "#)" '工程終了日時
            mySQL = mySQL & " " & "AND KUBUN_MEI <> '追込'" '追込数量は消さない
            Debug.Print mySQL
        cn.Execute mySQL
         
    '*************************************************************************************

回答
投稿日時: 18/10/31 17:14:15
投稿者: Suzu

阮氏洪 さんの引用:
skさんありがとうございます。
 
確かにアクセスのクエリで実行すると問題ございませんでした。
 
>具体的にどのような操作/コードを
>実行なさろうとしているのでしょうか。
 
エクセルのVBAから実行しております。

 
引用:
#2018/10/31 08:00:00#

 
【条件式における日付リテラル】
https://winofsql.jp/VA003334/infoboard_page.php?mid=jetsql&id=040404160431 
 
ADOなのか、DAOなのか、プロバイダによっても
使用できるSQLが変わり、リテラル文字が変わる事になります。

投稿日時: 18/10/31 17:28:03
投稿者: 阮氏洪

ありがとうございます。
 
ADOだと思います。
Micrisift Office 15.0 Access database engine Object Libraryを参照設定しております。
 
 

回答
投稿日時: 18/10/31 17:42:45
投稿者: sk

引用:
mySQL = "DELETE * FROM KOTEIHYO"
    mySQL = mySQL & " " & "WHERE (SYURYO_TIME Between #" & DS1 & "#" '工程開始日時
    mySQL = mySQL & " " & "AND #" & DS2 & "#)" '工程終了日時
    mySQL = mySQL & " " & "AND KUBUN_MEI <> '追込'" '追込数量は消さない
    Debug.Print mySQL
cn.Execute mySQL

上記のコードだけを実行してみた結果は
既にご確認されたのでしょうか。
 
今のところ、上記以外の DELETE 文によってレコードが削除された、
というだけのような気がしますが。
 
例えば以下のコード。
 
引用:
mySQL = "DELETE * FROM KOTEIHYO"
    mySQL = mySQL & " " & "WHERE DATE_TXT < " & KILL_DATE '2年1ヶ月前より小さい製造日を消す
  
cn.Execute mySQL

・テーブル[KOTEIHYO]のフィールド[DATE_TXT]のデータ型は何なのか。
 
・変数 KILL_DATE のデータ型は何なのか。
 
・上記のコードが実行されようとした時点において
 変数 KILL_DATE にどのような値が格納されているのか。

投稿日時: 18/10/31 17:53:36
投稿者: 阮氏洪

誠にすみません。
 
まず、この
'**** 古いデータの消去 ***********************************************************
         mySQL = "DELETE * FROM KOTEIHYO"
             mySQL = mySQL & " " & "WHERE DATE_TXT < " & KILL_DATE '2年1ヶ月前より小さい製造日を消す
          
         cn.Execute mySQL
           
     '*************************************************************************************
で、データを確認した結果は、問題ございませんでした。
 
さらに、
 
mySQL = mySQL & " " & "AND KUBUN_MEI <> '追込'" '追込数量は消さない
 
を入れると、その前のBETWEEN 〜 AND 〜が全く利かず、テーブルのデータが全て消えてしまいます。
ここが無ければ、何も問題が無いようです。
 
>・テーブル[KOTEIHYO]のフィールド[DATE_TXT]のデータ型は何なのか。
 数値型にしております。(形式はYYYYMMDD)
>・変数 KILL_DATE のデータ型は何なのか。
 数値型のYYYYMMDDです
>・上記のコードが実行されようとした時点において
 変数 KILL_DATE にどのような値が格納されているのか。
 20160930です。
 
追込のデータを別のテーブルにした方がいいでしょうか。

回答
投稿日時: 18/10/31 18:42:57
投稿者: sk

引用:
10/31の8時〜11/1の8時までで、KUBUN_MEIが追込では無いデータを全て消したいのですが、
追込も全て消えてしまいます

[SYURYO_TIME]の値が 2018/10/31 08:00:00 から
2018/11/01 08:00:00 までの範囲に含まれているレコードが
([KUBUN_MEI]の値が "追込" であるものも含めて)
全て削除されてしまうのか、
 
引用:
mySQL = mySQL & " " & "AND KUBUN_MEI <> '追込'" '追込数量は消さない
  
を入れると、その前のBETWEEN 〜 AND 〜が全く利かず、テーブルのデータが全て消えてしまいます

[KOTEIHYO]に格納されている全てのレコードが
削除されてしまうのか、どちらなのでしょうか。
 
引用:
ここが無ければ、何も問題が無いようです。

[SYURYO_TIME]に対する抽出条件だけを指定した場合は
その条件通りのレコードが削除される、ということでしょうか。
 
また、逆に[KUBUN_MEI]に対する抽出条件だけを指定して
DELETE 文を実行した場合はどうなるのでしょうか。

回答
投稿日時: 18/10/31 20:27:17
投稿者: Moko

直観的には、
[KUBUN_MEI] という名称から察するに、
実際にはルックアップフィールドで、
格納されている値は KUBUN_CODE のようなものであるとか?
 
 

回答
投稿日時: 18/10/31 22:45:17
投稿者: Suzu

引用:
'**** 該当データの事前消去 ***********************************************************
        mySQL = "DELETE * FROM KOTEIHYO"
            mySQL = mySQL & " " & "WHERE (SYURYO_TIME Between #" & DS1 & "#" '工程開始日時
            mySQL = mySQL & " " & "AND #" & DS2 & "#)" '工程終了日時
            mySQL = mySQL & " " & "AND KUBUN_MEI <> '追込'" '追込数量は消さない
            Debug.Print mySQL
        cn.Execute mySQL

 
まずは イミディエイトウィンドに吐き出された mySQL を
DELETE ではなく、SELECT句に変え、SQLビューに貼りつけ、クエリを実行し
削除目的のレコードが削除されるかを確認されてはいかがですか。

投稿日時: 18/11/01 07:39:28
投稿者: 阮氏洪

skさんありがとうございます。
 
>また、逆に[KUBUN_MEI]に対する抽出条件だけを指定して
>DELETE 文を実行した場合はどうなるのでしょうか。
 
DELETE * FROM KOTEIHYO WHERE KUBUN_MEI <> '追込'
 
これだけで、検証してみたところ、KOTEIHYOテーブルの中身は全て消えてしまいました。
KUBUN_MEIフィールドの "追込" を除くという事が出来ていないようです。
 
KUBUN_MEIは短いテキスト型で、中に入っているのは「予測」「確定」「追加」「追込」という文字と空白です。

投稿日時: 18/11/01 07:53:22
投稿者: 阮氏洪

原因がわかりました。
問題は前の古いデータの削除でした。
 
 mySQL = "DELETE * FROM KOTEIHYO"
             mySQL = mySQL & " " & "WHERE DATE_TXT < " & KILL_DATE '2年1ヶ月前より小さい製造日
 
追込はDATE_TXTが0になっていただけでした。
 
皆様お騒がせ致しました。