2017-02-28 138 views
1

我正在使用Crystal Reports 2016.我有一些datetime值代表什么时候发生了变化。我有一个数值在datetime值的变化。在这种情况下,一些网络连接在3个值(0,1,2)之间改变状态。我想计算期间和期间的总数;然后绘制期间对彼此的比率以及报告的时间。我已经完成了一些工作,但我认为我采取了错误的做法,因为最后一点不起作用。如何计算和仅有时间戳的总时间长度?

I(分别地)具有公式在线,离线,和部分联机,像这样:

If {CRV_AttributeLog.AnalogValue}=2 
    Then {CRV_AttributeLog.LogTimeStamp} 

If {CRV_AttributeLog.AnalogValue}=0 
    Then {CRV_AttributeLog.LogTimeStamp} 

If {CRV_AttributeLog.AnalogValue}=1 
    Then {CRV_AttributeLog.LogTimeStamp} 

我的公式来计算所述状态之间的时间段:

在线

abs(dateDiff("s", next({@TimeStampPartiallyOnline}), {@TimeStampOffline})) + 
abs(dateDiff("s", next({@TimeStampPartiallyOnline}), {@TimeStampOnline})) 

脱机

abs(dateDiff("s", next({@TimeStampOffline}), {@TimeStampOnline})) + 
abs(dateDiff("s", next({@TimeStampOffline}), {@TimeStampPartiallyOnline})) 

部分联机

abs(dateDiff("s", next({@TimeStampPartiallyOnline}), {@TimeStampOffline})) + 
abs(dateDiff("s", next({@TimeStampPartiallyOnline}), {@TimeStampOnline})) 

我不能作出这样的计算周期,大概是因为我有第一组是有效的变量的公式的计算公式的总结; Crystal Reports不喜欢公式的嵌套。我不能只是用if ... then表达式替换公式名称;当我检查错误时(这个字段必须在这里),这给了我一个错误。我考虑过如果前面有if语句,并且只有在它是脱机记录时才进行操作,但我不能参考其他时间戳。

我可以把时间段放到一个图表中,然后将它们相加。但是,所计算的时间并不代表执行报告期间的所有时间,因此,尽管由于数据的特殊性,比率仍然大部分不错,但所得到的图表不是100%正确的。对于边缘情况,我无法计算连接离线的时间。例如,如果连接在整个报告长度下都处于脱机状态,则会有许多时间戳记表明它处于脱机状态,但由于没有时间戳记,因此脱机时间段为0,因此会丢弃图表。

如何计算这些时间段,然后将它们与报告的时间长度进行比较?我已经创建了一个公式,给出了报告中的时间长度(除数又称分子),但我需要分配(分母)来计算。

有没有更好的方法来解决这个问题?

+0

到目前为止你做了什么?你可以在这里展示它 –

回答

1

使用Next()函数的Crystal Reports计算必须等到所有排序,分组和总计完成后。他们工作,但他们严格限制你可以用Crystal的结果做什么。最好的方法是编写SQL查询,以便每条记录链接到下一条记录。这样,Crystal查看的数据集既包括期间的开始,也包括同一记录中期间的结束。你如何编写SQL将是一个很好的单独问题。

对于没有任何价值的边缘情况,我认为您会希望使用IF-THEN逻辑来将目标期间开始或目标期间结束时的缺失值替换掉。

+0

似乎我在Crystal Reports中尝试做的大多数答案都是“在SQL中执行”。 – YetAnotherRandomUser