我正在使用Crystal Reports 2016.我有一些datetime
值表示某些内容发生了变化。我有datetime
值变化的数值。在这种情况下,某些网络连接正在改变3个值(0,1,2)之间的状态。我想计算期间和期间的总数;然后绘制各个时期的比例和报告的时间。我已经完成了一些,但我认为我采取了错误的方法,因为最后一点不起作用。
我有在线,离线和部分在线的公式,(分别)如此:
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}))
部分在线 strong>
abs(dateDiff("s", next({@TimeStampPartiallyOnline}), {@TimeStampOffline})) +
abs(dateDiff("s", next({@TimeStampPartiallyOnline}), {@TimeStampOnline}))
我不能总结计算期间的公式,大概是因为我有第一组有效变量的公式; Crystal Reports不喜欢公式的嵌套。我不能只用copypasta用if ... then
表达式替换公式名称;当我检查错误时,这会给我一个错误(一个字段必须在这里)。我想过将if语句放在前面,只做一个操作,如果它是一个离线记录,但我不能引用其他时间戳。
我可以将时间段放入图表中,然后将它们添加起来。但是,计算的时间并不代表报告执行期间的所有时间,因此,虽然比率仍然大部分都很好,但由于数据的特性,结果图表不是100%正确。对于边缘情况,我无法计算连接脱机的总时间。例如,如果连接在报告的整个长度上处于脱机状态,则会有许多时间戳表示它处于脱机状态,但由于没有时间戳记在线,因此脱机时间段为0,从而丢失图表。
如何计算这些期间,然后将它们与报告的时间长度进行比较?我已经创建了一个公式,它给出了报告中的时间长度(除数又称分子),但我需要分红(分母)进行计算。
有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
使用Next()函数的Crystal Reports计算必须等到所有排序,分组和总计完成之后。他们工作,但他们严格限制你可以用Crystal做的结果。最好的方法是编写SQL查询,以便将每条记录链接到下一条记录。这样,Crystal看到的数据集包括同一记录中的句点的开头和句点的结尾。如何编写SQL将是一个很好的单独问题。
对于没有值的边缘情况,我认为您希望使用IF-THEN逻辑将缺失值替换为目标周期的开始或目标周期的结束。