【发布时间】:2014-01-23 12:47:43
【问题描述】:
我想根据某些条件(例如)更改水晶报表中对象的背景颜色
if (({DataTableCable.ColumnChange} and 4) = 4) then
crGreen
DataTableCable.ColumnChange 是一个包含数字的字段,我想按位和 4,如果结果为 4,则更改对象的背景 但我收到以下错误 “需要一个布尔值” 应该如何制作按位和在水晶报表?
【问题讨论】:
我想根据某些条件(例如)更改水晶报表中对象的背景颜色
if (({DataTableCable.ColumnChange} and 4) = 4) then
crGreen
DataTableCable.ColumnChange 是一个包含数字的字段,我想按位和 4,如果结果为 4,则更改对象的背景 但我收到以下错误 “需要一个布尔值” 应该如何制作按位和在水晶报表?
【问题讨论】:
您的代码根本无法在 C# 或 VB.NET 中编译。但是,也许你想要这样的东西:
if (DataTableCable.ColumnChange == 4)
{
// change to green
}
【讨论】:
= 而不是 == 您正在尝试将变量分配为 4 而不是将其与 4 进行比较
& 而不是and
{DataTableCable.ColumnChange} 中提供的值进行按位比较
我想检查 ColumnChange 与 4 的逻辑和是否为 4,然后做剩下的事情
所以你需要使用& ==(比较)而不是=(赋值)
if ((DataTableCable.ColumnChange & 4)== 4)
{
// change to green
}
【讨论】:
因此,如果我正确阅读了您的帖子,您正尝试在 Crystal Reports 代码中与您的值 ({DataTableCable.ColumnChange}) 进行位比较。
在网上环顾四周,我似乎看不到任何表明水晶可以进行这种比较的东西。一种替代方法是在您的 .Net 代码中执行该计算,并将其存储在数据源对象的属性/列中 - 这样您就可以简单地检查属性是否为真/假。
更新
也许,另一种选择是执行手动算术来计算它。 Nopadol(OP 提供的链接)似乎有很好的例子来说明如何做到这一点(我已经为后代复制了下面的代码)。 No Stress Tech Guide to Crystal Reports Basic for Visual Studio 2008(第 9 课)似乎涵盖了公式编辑器的使用,这应该可以帮助您入门。
Function Name: ToBin
Function (NumberVar n)
(
Local StringVar b;
Local NumberVar d;
b := "";
d := n;
Do
(
b := CStr(Truncate(d Mod 2),0) & b;
d := Truncate(d / 2);
)
While (d > 1);
CStr(Truncate(d),0) & b;
)
Function Name: ToNum
Function (StringVar b)
(
Local NumberVar lng := length(b);
Local NumberVar n := 0;
Local NumberVar i;
For i := lng To 1 Step -1 Do
(
n := n + ((2 ^ (lng – i)) * Truncate(ToNumber(Mid(b,i,1))))
);
n;
)
Function Name: BitAnd
Function (NumberVar n1, NumberVar n2)
(
Local StringVar b1 := ToBin(n1);
Local StringVar b2 := ToBin(n2);
Local NumberVar l1 := length(b1);
Local NumberVar l2 := length(b2);
Local NumberVar lng := IIF(l1 > l2, l1, l2);
Local StringVar x;
Local StringVar y;
Local StringVar z := "";
Local NumberVar i;
For i := lng To 1 Step -1 Do
(
x := "0";
If (l1 >= i) Then
x := Mid(b1, (l1-i)+1, 1);
y := "0";
If (l2 >= i) Then
y := Mid(b2, (l2-i)+1, 1);
z := z & IIF(x=y And x="1","1","0");
);
ToNum(z);
)
Function Name: BitXOr
Function (NumberVar n1, NumberVar n2)
(
n1 + n2 – (BitAnd(n1, n2) * 2)
)
Function Name: BitOr
Function (NumberVar n1, NumberVar n2)
(
n1 + n2 – BitAnd(n1, n2)
)
Example
BitAnd(1, 5) // = 1
BitXOr(1, 5) // = 4
BitOr(1, 5) // = 5
【讨论】: