2014-02-27 67 views
0

我们的数据库中有一个值,它是一个表示时间值的字符串,其值为类似于8.7698的示例值,必须将其转换为实际时间。我已经开始这方面的工作,在这里就是我想出了这么远:需要帮助修复水晶报表公式中的错误

stringvar x; //original value, string datatype ex data 9.8765, get value before decimal point 
numbervar x2; //convert value before decimal into a double 
stringvar xH; //Convert value before decimal back to string for concatenation 
stringvar x3; //value after decimal 
numbervar x4; //convert value after decimal to double and multiply by .60 for conversion 
stringvar xM; //Convert value after decimal back to string for concatenation 
x := left({PO_PurchaseOrderHeader.TimeUpdated}, InStr ({PO_PurchaseOrderHeader.TimeUpdated},".")); 
x2 := cdbl(x); 
x3 := mid({PO_PurchaseOrderHeader.TimeUpdated}, InStr ({PO_PurchaseOrderHeader.TimeUpdated},"."), length({PO_PurchaseOrderHeader.TimeUpdated}) - InStr ({PO_PurchaseOrderHeader.TimeUpdated},".")); 
x4 := CDbl (x3) * .60; 
xH := cstr(x2); 
xM := cstr(x4); 
xH + ":" + xM; 

它说没有错误,当我检查,但该报告未能从我们的软件中(鼠尾草100)和我运行相信这个公式存在一个问题。任何人都可以看到我可能搞砸了吗?谢谢!

回答

0

让我们回过头来尝试简化这个公式,因为它很难理解它。你有很多不必要的变量和类型转换可以完全删除。尝试这样的事情,而不是:

local stringvar timeString := '9.8765'; //Example value 

local stringvar hr := split(timeString,'.')[1]; //the hour value 
local stringvar min := split(timeString,'.')[2]; //the fractional hour to convert to mins 

//the below line concatenates the hour and the newly calculated minutes 
// which is just the first two digits with necessary leading/trailing zeros 
hr + ':' + totext(tonumber(min) * 0.6, '00')[1 to 2] 

如果你没有得到任何错误消息,当您保存公式,它甚至可能不报告失败的原因。在这种情况下,您需要提供更多关于发生的情况和调试步骤的详细信息。

+0

使用什么值9.8765应该显示为答案吗?我得到9.52。不知道它是否正确。 – aMazing

+0

谢谢大家的帮助。我知道我可能正在艰难地前进,感谢瑞恩为你的优雅解决方案和其他愿意帮助的人。 –

0
Note: Below formula is used assuming number before decimal is hour and number after decimal is minute. IF this is not your requirement ignore the solution 

以下公式

Local NumberVar a; 
Local NumberVar b; 
Local NumberVar c; 
Local StringVar d; 


c:=RoundUp(ToNumber("8.669"),2); 
a:=ToNumber(Split ('8.669',".")[1]); 
b:=ToNumber(Split ('8.669',".")[2]); 
d:=Split(CStr(ToNumber(Split(Totext(c),".")[2])/60))[1]; 
if(ToNumber(Split(Totext(c),".")[2])<60) 
then 
ToText(a,0)+":"+Split(ToText(c),".")[2] 
else 
ToText(a+ToNumber(d),0)+":"+Split(Totext(c/60),".")[2];