- PR -

DataViewのRowFilterで論理演算子&が使えないようなのですが

1
投稿者投稿内容
apu
会議室デビュー日: 2003/10/14
投稿数: 11
投稿日時: 2003-11-14 14:11
いつも参考にさせていただいています。

DataViewのRowFilterプロパティに、
ビットごとの論理演算をする条件文を書いて
フィルタリングしたいと考えています。

DataViewのデータソースには、0〜63までの数値が入り、
6桁のビットのうち、何番目のビットが1なのかを調べたいのです。

式:45 & 8 = 8

 101101
& 001000
---------
001000

このような絞込みを
RowFilter = "列A & 8 = 8";
と書いたのですが、「&はサポートされません」
とエラーになってしまいます。

RowFilterプロパティで論理演算子の使い方をご存知の方がいらっしゃいましたらぜひご教授ください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-14 14:38
DataColumn.Expressionプロパティの説明をご覧ください。
apu
会議室デビュー日: 2003/10/14
投稿数: 11
投稿日時: 2003-11-14 15:00
返信ありがとうございます。

DataColumn.Expressionプロパティのせつめいですよね?
Microsoftのサイトだと、
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemDataDataColumnClassExpressionTopic.asp
ですよね。

穴が開くほど読んだのですが、論理演算子のことについては特に触れていなそうで、
さらに、サポート云々などということについても書いてありません。
なので、使えるのかと思ったのですが…。

もしかして書き方が間違っているんでしょうか?

DataView1.RowFilter = "列A & 8 = 8";

これで、右から4番目のビットが1であるレコードを絞り込めないのでしょうか。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-14 15:59
> 穴が開くほど読んだのですが、論理演算子のことについては特に触れていなそうで、
> さらに、サポート云々などということについても書いてありません。
> なので、使えるのかと思ったのですが…。

 使えないから書かれていないのでは?

 マニュアルに書かれていないのに使えたら、正しい使い方がわからず混乱すると思うのですが…
未記入
会議室デビュー日: 2003/11/23
投稿数: 3
投稿日時: 2003-11-23 02:11
引用:

apuさんの書き込み (2003-11-14 15:00) より:
返信ありがとうございます。

DataColumn.Expressionプロパティのせつめいですよね?
Microsoftのサイトだと、
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemDataDataColumnClassExpressionTopic.asp
ですよね。

穴が開くほど読んだのですが、論理演算子のことについては特に触れていなそうで、
さらに、サポート云々などということについても書いてありません。
なので、使えるのかと思ったのですが…。

もしかして書き方が間違っているんでしょうか?

DataView1.RowFilter = "列A & 8 = 8";

これで、右から4番目のビットが1であるレコードを絞り込めないのでしょうか。



私もおんなじ問題にはまっていて、対処法を探しているうちに
この書き込みを見ました。

しばらく考えて、以下のような方法を思いつきましたので、
お役に立てればよいですが、書き込みます。

private enum test_enum {a=1, b=2, c=4, d=8, e=16};
private Hashtable hashFilterText = new Hashtable();

private void AddFilterText(test_enum e, int code)
{
if(code & e = e)
{
string s = (string) hashFilterText[e];

if(s == null) s = "(";
else s += ") OR (";

s += ("[COLUMN_NAME] = " + code.ToString());
hashFilterText[e] = s;
}
}

private void test()
{
for(int i = 0; i < 32; i++)
{
AddFilterText(test_enum.a, i);
AddFilterText(test_enum.b, i);
AddFilterText(test_enum.c, i);
AddFilterText(test_enum.d, i);
AddFilterText(test_enum.e, i);
}

((string)hashFilterText[test_enum.a]) += ")";
((string)hashFilterText[test_enum.b]) += ")";
((string)hashFilterText[test_enum.c]) += ")";
((string)hashFilterText[test_enum.d]) += ")";
((string)hashFilterText[test_enum.e]) += ")";
}

テストはしていませんが、ご容赦ください。
それでは。

山本
未記入
会議室デビュー日: 2003/11/23
投稿数: 3
投稿日時: 2003-11-23 02:34
自己レスです。

あまりにも、間違っていたので修正しました。
大して変わっていませんが・・・

山本

private enum test_enum {a=1, b=2, c=4, d=8, e=16};
private Hashtable hashFilterText = new Hashtable();

private void AddFilterText(test_enum e, int code)
{
if((code & (int)e) == (int)e)
{
string s = (string) hashFilterText[e];

if(s == null) s = "(";
else s += ") OR (";

s += ("[COLUMN_NAME] = " + code.ToString());
hashFilterText[e] = s;
}
}

private void test()
{
for(int i = 0; i < 32; i++)
{
AddFilterText(test_enum.a, i);
AddFilterText(test_enum.b, i);
AddFilterText(test_enum.c, i);
AddFilterText(test_enum.d, i);
AddFilterText(test_enum.e, i);
}

string a = (string)hashFilterText[test_enum.a];
a += ")"; hashFilterText[test_enum.a] = a;

a = (string)hashFilterText[test_enum.b];
a += ")"; hashFilterText[test_enum.b] = a;

a = (string)hashFilterText[test_enum.c];
a += ")"; hashFilterText[test_enum.c] = a;

a = (string)hashFilterText[test_enum.d];
a += ")"; hashFilterText[test_enum.d] = a;

a = (string)hashFilterText[test_enum.e];
a += ")"; hashFilterText[test_enum.e] = a;

Console.WriteLine("test_enum.a: {0}", (string)hashFilterText[test_enum.a]);
Console.WriteLine("test_enum.b: {0}", (string)hashFilterText[test_enum.b]);
Console.WriteLine("test_enum.c: {0}", (string)hashFilterText[test_enum.c]);
Console.WriteLine("test_enum.d: {0}", (string)hashFilterText[test_enum.d]);
Console.WriteLine("test_enum.e: {0}", (string)hashFilterText[test_enum.e]);
}

結果:

test_enum.a: ([COLUMN_NAME] = 1) OR ([COLUMN_NAME] = 3) OR ([COLUMN_NAME] = 5) OR ([COLUMN_NAME] = 7) OR ([COLUMN_NAME] = 9) OR ([COLUMN_NAME] = 11) OR ([COLUMN_NAME] = 13) OR ([COLUMN_NAME] = 15) OR ([COLUMN_NAME] = 17) OR ([COLUMN_NAME] = 19) OR ([COLUMN_NAME] = 21) OR ([COLUMN_NAME] = 23) OR ([COLUMN_NAME] = 25) OR ([COLUMN_NAME] = 27) OR ([COLUMN_NAME] = 29) OR ([COLUMN_NAME] = 31)
test_enum.b: ([COLUMN_NAME] = 2) OR ([COLUMN_NAME] = 3) OR ([COLUMN_NAME] = 6) OR ([COLUMN_NAME] = 7) OR ([COLUMN_NAME] = 10) OR ([COLUMN_NAME] = 11) OR ([COLUMN_NAME] = 14) OR ([COLUMN_NAME] = 15) OR ([COLUMN_NAME] = 18) OR ([COLUMN_NAME] = 19) OR ([COLUMN_NAME] = 22) OR ([COLUMN_NAME] = 23) OR ([COLUMN_NAME] = 26) OR ([COLUMN_NAME] = 27) OR ([COLUMN_NAME] = 30) OR ([COLUMN_NAME] = 31)
test_enum.c: ([COLUMN_NAME] = 4) OR ([COLUMN_NAME] = 5) OR ([COLUMN_NAME] = 6) OR ([COLUMN_NAME] = 7) OR ([COLUMN_NAME] = 12) OR ([COLUMN_NAME] = 13) OR ([COLUMN_NAME] = 14) OR ([COLUMN_NAME] = 15) OR ([COLUMN_NAME] = 20) OR ([COLUMN_NAME] = 21) OR ([COLUMN_NAME] = 22) OR ([COLUMN_NAME] = 23) OR ([COLUMN_NAME] = 28) OR ([COLUMN_NAME] = 29) OR ([COLUMN_NAME] = 30) OR ([COLUMN_NAME] = 31)
test_enum.d: ([COLUMN_NAME] = 8) OR ([COLUMN_NAME] = 9) OR ([COLUMN_NAME] = 10) OR ([COLUMN_NAME] = 11) OR ([COLUMN_NAME] = 12) OR ([COLUMN_NAME] = 13) OR ([COLUMN_NAME] = 14) OR ([COLUMN_NAME] = 15) OR ([COLUMN_NAME] = 24) OR ([COLUMN_NAME] = 25) OR ([COLUMN_NAME] = 26) OR ([COLUMN_NAME] = 27) OR ([COLUMN_NAME] = 28) OR ([COLUMN_NAME] = 29) OR ([COLUMN_NAME] = 30) OR ([COLUMN_NAME] = 31)
test_enum.e: ([COLUMN_NAME] = 16) OR ([COLUMN_NAME] = 17) OR ([COLUMN_NAME] = 18) OR ([COLUMN_NAME] = 19) OR ([COLUMN_NAME] = 20) OR ([COLUMN_NAME] = 21) OR ([COLUMN_NAME] = 22) OR ([COLUMN_NAME] = 23) OR ([COLUMN_NAME] = 24) OR ([COLUMN_NAME] = 25) OR ([COLUMN_NAME] = 26) OR ([COLUMN_NAME] = 27) OR ([COLUMN_NAME] = 28) OR ([COLUMN_NAME] = 29) OR ([COLUMN_NAME] = 30) OR ([COLUMN_NAME] = 31)
未記入
会議室デビュー日: 2003/11/23
投稿数: 3
投稿日時: 2003-11-23 20:47
さらに自己レスです。

あれから、さらに考えて以下の式でビット毎のANDをとる事に成功しましたので
ご参考ください。

columnTarget.RowFilter = string.Format(
"( {0} >= {1} ) AND ( ( ( CONVERT( {0} / {1}, 'System.Int32' ) % 2 ) = 1 ) OR ( ( ( {0} % {1} ) = 0 ) AND ( ( {0} / {1} - CONVERT( {0} / {1}, 'System.Int32' ) ) = 1 ) ) )"
, columnName, findBit);

ここで、columnName 対象のカラム名、findBitは表示したい2のべき乗値をStringにしたものです。
私のテストでは、問題なくこれでいけてましたが、よく検証していただくことをお奨めします。

(DataColumn.Expression(RowFilter)のCONVERTの挙動には悩まされました...)

それでは。

山本
1

スキルアップ/キャリアアップ(JOB@IT)