- - PR -
DataViewのRowFilterで論理演算子&が使えないようなのですが
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2003-11-14 14:11
いつも参考にさせていただいています。
DataViewのRowFilterプロパティに、 ビットごとの論理演算をする条件文を書いて フィルタリングしたいと考えています。 DataViewのデータソースには、0〜63までの数値が入り、 6桁のビットのうち、何番目のビットが1なのかを調べたいのです。 式:45 & 8 = 8 101101 & 001000 --------- 001000 このような絞込みを RowFilter = "列A & 8 = 8"; と書いたのですが、「&はサポートされません」 とエラーになってしまいます。 RowFilterプロパティで論理演算子の使い方をご存知の方がいらっしゃいましたらぜひご教授ください。 | ||||
|
投稿日時: 2003-11-14 14:38
DataColumn.Expressionプロパティの説明をご覧ください。
| ||||
|
投稿日時: 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であるレコードを絞り込めないのでしょうか。 | ||||
|
投稿日時: 2003-11-14 15:59
> 穴が開くほど読んだのですが、論理演算子のことについては特に触れていなそうで、
> さらに、サポート云々などということについても書いてありません。 > なので、使えるのかと思ったのですが…。 使えないから書かれていないのでは? マニュアルに書かれていないのに使えたら、正しい使い方がわからず混乱すると思うのですが… | ||||
|
投稿日時: 2003-11-23 02:11
私もおんなじ問題にはまっていて、対処法を探しているうちに この書き込みを見ました。 しばらく考えて、以下のような方法を思いつきましたので、 お役に立てればよいですが、書き込みます。 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 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 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