【问题标题】:A Boolean is required [closed]需要一个布尔值[关闭]
【发布时间】:2014-01-23 12:47:43
【问题描述】:

我想根据某些条件(例如)更改水晶报表中对象的背景颜色

  if (({DataTableCable.ColumnChange} and 4) = 4) then
  crGreen

DataTableCable.ColumnChange 是一个包含数字的字段,我想按位和 4,如果结果为 4,则更改对象的背景 但我收到以下错误 “需要一个布尔值” 应该如何制作按位和在水晶报表?

【问题讨论】:

    标签: crystal-reports-2008


    【解决方案1】:

    您的代码根本无法在 C# 或 VB.NET 中编译。但是,也许你想要这样的东西:

    if (DataTableCable.ColumnChange == 4) 
    {
        // change to green
    }
    

    【讨论】:

    • 我想检查 4 的 ColumnChange 的逻辑和是否为 4 然后做剩下的,ColumnChange 可以是任何值
    • @nnmmss 看来您正在使用单个 = 而不是 == 您正在尝试将变量分配为 4 而不是将其与 4 进行比较
    • 抱歉,我不明白您的要求(语言障碍)。如果您显示一个可以澄清问题的编译 sn-p 可能会有所帮助。
    • @nnmmss 你正在寻找& 而不是and
    • @TimSchmelter 我认为问题在于这是 Crystal 代码,而不是 .Net,并且 OP 正在寻求对{DataTableCable.ColumnChange} 中提供的值进行按位比较
    【解决方案2】:

    我想检查 ColumnChange 与 4 的逻辑和是否为 4,然后做剩下的事情

    所以你需要使用& ==(比较)而不是=(赋值)

    if ((DataTableCable.ColumnChange & 4)== 4) 
    {
        // change to green
    }
    

    【讨论】:

    • 在水晶报表中它不接受 ==,它说“需要一个数字、货币金额、日期、时间或字符串”
    【解决方案3】:

    因此,如果我正确阅读了您的帖子,您正尝试在 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
    

    【讨论】:

    • ColumnChange 字段包含一个值,我可以理解我的哪一列与旧版本有差异。我的报告中有大约 15 列。所以你的意思是我必须在 .Net 代码中有 14 个其他值才能查看相应的列是否已更改?对不起英语
    • 如果您需要对所有 15 列执行这种操作,那么是的,我想这就是我要说的。您将什么传递到 Crystal 数据源?它是一个数据表,还是一个类的列表?如果它是一个类列表,您可能会编写一个函数来处理给定的值?老实说,我没有使用 Crystal,我只是想澄清您的要求并根据在线搜索提供一些信息。
    • 我找到了这个nopadolsiri.wordpress.com/2008/12/30/…,但我不知道如何创建一个新的 Forumla 编辑器
    • 这可能会有所帮助:msdn.microsoft.com/en-us/library/ms227603(v=vs.80).aspx 编辑:也许没有。似乎与他们在您的链接中所说的不同。
    • 或者试试这本电子书。第 9 课似乎涵盖了它。 books.google.co.uk/…
    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多