線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3109
推到 Plurk!
推到 Facebook!

日期轉換發生問題

答題得分者是:pedro
zoezoe
一般會員


發表:10
回覆:25
積分:12
註冊:2009-04-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-11 16:28:14 IP:60.248.xxx.xxx 訂閱
小弟有一個字串為 "97/01/23" 我想把它轉為西元年成 "2008/01/23" 並寫入資料庫

小弟是先在FormCreate 裡面寫 shortdateformat := 'ee/mm/dd'; 先把所有日期格式改為民國年

之後在function裡面先把字串轉日期 strtodate(str) 然後再把日期格式做轉換

str:=formatdatetime('yyyy/mm/dd',str); ,最後再轉換為字串,datetostr(str);

然後存入我資料庫的table , cds1['date']:=day; ,就發生問題了

錯誤訊息是
There is no overloaded version of 'FormatDateTime' that can be called with these arguments
There is no overloaded version of 'DateToStr' that can be called with these arguments

請問是發生什麼問題了呢?!請各位前輩們指點迷津,謝謝
編輯記錄
zoezoe 重新編輯於 2009-05-11 16:28:58, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-11 17:29:46 IP:122.116.xxx.xxx 未訂閱
您好,

formatdatetime 是把日期值依指定格式轉成字串, 所以他吃 formatstr 及 datetime 值 兩個參數
轉出來已經是字串, 不必再用 datetostr

str := formatdatetime('yyyy/mm/dd', strtodate(str));

應該就可以了
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
zoezoe
一般會員


發表:10
回覆:25
積分:12
註冊:2009-04-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-11 17:41:15 IP:60.248.xxx.xxx 訂閱
感謝前輩指導,果然可以了

不過我明明已經把格式改為 yyyy/mm/dd 了

為什麼轉出來的資料變成 2007/01/ 後面變沒有東西了呢!應該是要變成2007/01/23 才對的啊

怎麼會這樣?!
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-05-11 23:08:10 IP:122.116.xxx.xxx 未訂閱
您是在 
1. 存 table 之前看到 2007/01/
還是
2. 存 table 之後再讀出來看到 2007/01/
可否把程式片段 post 出來看看
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
zoezoe
一般會員


發表:10
回覆:25
積分:12
註冊:2009-04-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-05-12 08:14:25 IP:60.248.xxx.xxx 訂閱
您好~我是在存table之前所看到的
我會先在DBGrid上先讓使用者確認完按存檔之後~才會存入!以下是我程式碼

[code delphi]
procedure TForm1.Bit_tClick(Sender: TObject);
var
TF:TEXTFILE;
str,nm,sup,wd,day:STRING;
begin
bit_t.Enabled:=false;
t1.Enabled := false;
s2.Enabled := true;
bit_s.Enabled:=true;
adoquery1.Open;
cds1.Open;
memo1.Lines.Clear;
assignFile(TF,'C:\TF2.txt');
reset(TF);
while not eof(TF) do
begin
cds1.Append;
cds1.Edit;
readln(TF,str);
if trim(str) <> '' then
begin
Memo1.Lines.Add(str);
if copy(str,1,8)='採購單號' then
begin
nm:=copy(str,11,8);
sup:=copy(str,39,12);
end
else
begin
cds1['pur_sup']:=sup;
cds1['pur_nm']:=nm;
cds1['pur_sn']:=copy(str,1,2);
cds1['pur_snm']:=copy(str,4,10);
cds1['pur_st']:=copy(str,15,20);
cds1['pur_unit']:=trim(copy(str,36,4));
day:=copy(str,73,8); \\日期轉換
day:=formatdatetime('yyyy/mm/dd',strtodate(day));
cds1['pur_date']:=day; \\寫入table
wd:=copy(str,41,8);
if copy(wd,3,1)=',' then
begin
wd:=copy(wd,1,2) copy(wd,4,5);
end;
cds1['pur_qty']:=strtofloat(trim(wd));
wd:=copy(str,50,9);
if copy(wd,4,1)=',' then
begin
wd:=copy(wd,1,3) copy(wd,5,5);
end;
cds1['pur_pri']:=strtofloat(trim(wd));
wd:=copy(str,60,12);
if copy(wd,7,1)=',' then
begin
wd:=copy(wd,5,2) copy(wd,8,5);
end;
cds1['pur_amt']:=strtofloat(trim(wd));
end;
end;
end;
closefile(TF);
end;
[/code]
編輯記錄
zoezoe 重新編輯於 2009-05-12 08:15:40, 註解 無‧
zoezoe 重新編輯於 2009-05-12 08:17:13, 註解 無‧
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-05-12 08:52:11 IP:60.248.xxx.xxx 未訂閱
pur_date欄位長度?
其實可以用debug模式,執行到day:=form....這一行,看day被賦的值是?
cds1['pur_date']:=day
zoezoe
一般會員


發表:10
回覆:25
積分:12
註冊:2009-04-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-05-12 09:14:13 IP:60.248.xxx.xxx 訂閱
欄位長度這我一開始就有考慮到了

我有馬上到資料庫裡面去修改字串長度~把原本的8變成10了

就是因為這樣子他還是顯示2007/01/ 八碼我才覺得奇怪~我現在就在一一Debug了

還沒找出原因而已~希望各位前輩們一起找找吧!^^"
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-05-12 09:22:36 IP:60.248.xxx.xxx 未訂閱
資料庫有改,DataSet欄位編輯器裡欄位長度有改到麼?
zoezoe
一般會員


發表:10
回覆:25
積分:12
註冊:2009-04-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-05-12 09:38:30 IP:60.248.xxx.xxx 訂閱
您是指?因為我一開始設定的欄位長度只有資料庫而已

其他應該是沒有什麼關聯才對呢,還是找不到~好討厭>"<

採購單號: P9701001 供 應 商: 4110金達晟企
01 E10-1651-0 AS27.5溫度開關KA-313 個 100.0 385.0 38,500.0 97/01/25

這是我文字檔的一小小一段,我一開始是在想說後面日期部份就是copy(str,73,8)

因為只到25後面就沒字了,想說再多兩個空白看看還是沒有,真煩ˋˊ
===================引 用 pedro 文 章===================
資料庫有改,DataSet欄位編輯器裡欄位長度有改到麼?
zoezoe
一般會員


發表:10
回覆:25
積分:12
註冊:2009-04-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-05-12 10:14:23 IP:60.248.xxx.xxx 訂閱
剛剛有試了,我知道值一定沒問題

因為我讓她寫入pur_date這個table前先秀在另一個Edit上顯示

明明就是2007/01/23的,寫入table之後就變成2007/01/ 了

我的天啊~我沒有去改DBGrid裡面的欄位長度啊!怎麼會這樣呢?

各位前輩們救救命啊~
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-05-12 10:19:06 IP:60.248.xxx.xxx 未訂閱
推定底下第一第二行程式沒問題,因為資料庫已存入2xxx/xx/
那麼有可能只剩第3行,day是2xxxx/xx/xx完整日期,賦值後存到資料庫會被截斷,資料庫欄位長度又夠,那要看看你DataSet.Fields是否有定義到這個欄位的size,這個屬性值也可能導致被截斷的可能

[code delphi]
day:=copy(str,73,8); \\日期轉換
day:=formatdatetime('yyyy/mm/dd',strtodate(day));
cds1['pur_date']:=day; \\寫入table

[/code]

===================引 用 zoezoe 文 章===================
您是指?因為我一開始設定的欄位長度只有資料庫而已

其他應該是沒有什麼關聯才對呢,還是找不到~好討厭>"<

採購單號: P9701001 供 應 商: 4110金達晟企
01 E10-1651-0 AS27.5溫度開關KA-313 個 100.0 385.0 38,500.0 97/01/25

這是我文字檔的一小小一段,我一開始是在想說後面日期部份就是copy(str,73,8)

因為只到25後面就沒字了,想說再多兩個空白看看還是沒有,真煩ˋˊ
===================引 用 pedro 文 章===================
資料庫有改,DataSet欄位編輯器裡欄位長度有改到麼?
編輯記錄
pedro 重新編輯於 2009-05-12 10:20:18, 註解 無‧
pedro 重新編輯於 2009-05-12 10:21:12, 註解 無‧
zoezoe
一般會員


發表:10
回覆:25
積分:12
註冊:2009-04-28

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-05-12 10:33:28 IP:60.248.xxx.xxx 訂閱
OK啦~終於找到問題了!

果然是我CDS裡面欄位長度的問題,我原以為修改我的ADOQuery就會跟著改了

結果沒有~還要自己手動改一次!謝謝前輩指導囉~^^"
系統時間:2024-11-22 22:33:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!