2014-02-27 66 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];