Access (VBA)

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

 
(Windows 10 Pro : 指定なし)
オリジナル関数によるビット制御
投稿日時: 21/03/04 08:39:15
投稿者: S.Kos

みなさま、こんにちは。
 
Win10(PRO) + Office365環境下、ACCESSデータファイルに、EXCEL・VBAで接続しています。
SQLSERVER上の巨大なシステムの一部をACCESSに移行したもので、Table.Flag に置いた整数値をビット制御し、そのレコードの属性を管理しています。
 
SQLSERVERでなら WHERE ((Table.Flag AND 128) = 128) と書けるのですが、ACCESSではこれが機能しません。
 
そこでACCESSにオリジナル関数を用意しました
Public Function funcBitAND(intNum1 As Long, intNum2 As Integer) As Long
 funcBitAND = intNum1 And intNum2
End Function
 
ACCESSデータファイルを開き、クエリ1のSQLビューに
  SELECT * FROM Table1 WHERE (funcBitAND(Table.Flag, 128) = 128)
とすると、期待どうりに動きます
 
ところがこれをEXCEL・VBAで
  Dim Rec As ADODB.Recordset, SqlStr As String
  SqlStr = "SELECT * FROM Table1 WHERE ( funcBitAND(Table1.Flag , 128) = 128 ) "
  Set Rec = DbInfo.AdCon.Execute(SqlStr)
とすると、
  式に未定義関数 'fincBitAND' があります
と怒られます。
 
これを解決する技をご教示いただければ幸いです

回答
投稿日時: 21/03/04 10:53:52
投稿者: Suzu

JET-SQL は ビット演算はできなかったはずです。
 
なので、VBAで、組み込み関数として用意し計算させているのが funcBitAND
それを、ADO等経由で実行しようとしても 参照できないのでエラーになると思います。
 

引用:
SQLSERVER上の巨大なシステムの一部をACCESSに移行したもので

なのであれば、その部分だけでも、SQLServerから取得するなり、
 
EXCEL に出力するのであれば、EXCEL側で判定してはいかがでしょうか?

回答
投稿日時: 21/03/04 12:01:26
投稿者: sk

引用:
SQLSERVER上の巨大なシステムの一部をACCESSに移行したもので、
Table.Flag に置いた整数値をビット制御し、そのレコードの属性を管理しています。

引用:
SQLSERVERでなら WHERE ((Table.Flag AND 128) = 128) と書けるのですが、
ACCESSではこれが機能しません。

引用:
これを解決する技をご教示いただければ幸いです

[Flag]に格納される実質的な最大値がいくらであるか
(最大何ビットの数値を扱っているのか)によるかと。
 
仮に最大ビットを 12 とする( 0 〜 4095 までの整数を扱う)場合であれば、
 
1. [Flag]の値を 2 の 11 乗( 2048 )で除し、その剰余を求める。
 
2. その剰余を 2 の 10 乗( 1024 )で除し、その剰余を求める。
 
3. その剰余を 2 の 9 乗( 512 )で除し、その剰余を求める。
 
4. その剰余を 2 の 8 乗( 256 )で除し、その剰余を求める。
 
5. その剰余が 2 の 7 乗( 128 )以上であれば真とする。
 
------------------------------------------------------------------------
 
SELECT [Table].*
FROM [Table]
WHERE (((([Table].[Flag] Mod 2048) Mod 1024) Mod 512) Mod 256) >= 128;
 
------------------------------------------------------------------------
 
という計算によって求めることは一応出来ますが、
最大ビット数と調べるビットの位置との差が大きければ大きいほど、
剰余計算のネスト回数は増えることになります。

投稿日時: 21/03/04 12:26:42
投稿者: S.Kos

早速のご教示、ありがとうございます。
 
Suzuさん
J>ET-SQL は ビット演算はできなかったはずです
>
あぁ、そーいうことでしたか!
そもそも「できない」のであれば、手の打ちようはありませんね。
 
skさん
>WHERE (((([Table].[Flag] Mod 2048) Mod 1024) Mod 512) Mod 256) >= 128;
>・・
>剰余計算のネスト回数は増えることになります。
>
確かに!
読み出し側(EXCEL・VBA)で判定するのと、どっちが効率的か・・?
 
ここで閉じます。