全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1649
推到 Plurk!
推到 Facebook!

在2000沒問題,但在xp有問題

答題得分者是:eaglewolf
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-26 08:22:10 IP:163.29.xxx.xxx 訂閱


畫面是不正常(xp)的畫面

我用的func如下
<textarea class="delphi" rows="10" cols="60" name="code">function TForm1.OldYearCnt(birth : string):integer; var BYear, BMonth, BDay: Integer; YearOld: Integer; Year, Month, Day : Word; tst_Year, tst_Month, tst_Day :word; world_date1 : string; Tst_DateTime: TDateTime; begin if birth = '' then begin result := 0; exit; end; try Tst_DateTime := strtodatetime(birth); except result := 0; exit; end; DecodeDate(Tst_DateTime, tst_Year, tst_Month, tst_Day); YearOld := 0; DecodeDate(now, Year, Month, Day); world_date1 := birth; BYear := StrToInt(copy(world_date1, 1, 4)); delete(world_date1,1,5); BMonth := StrToInt(copy(world_date1, 1, 2)); delete(world_date1,1,3); BDay := StrToInt(world_date1); if (Month > BMonth) and (Year >= BYear) then YearOld := Year - BYear; if (Day >= BDay) and (Month = BMonth) and (Year >= BYear) then YearOld := Year - BYear; if (Day < BDay) and (Month = BMonth) and (Year >= BYear) then YearOld := Year - BYear-1; if (Month < BMonth) and (Year >= BYear) then YearOld := Year - BYear -1; result := YearOld; end;</textarea>

對了, 我用access資料庫, 有沒有可能是欄位格式的問題?
困擾很久了, 希望有人可以協助
謝謝!
------
努力會更接近成功
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-26 09:23:31 IP:211.75.xxx.xxx 訂閱
(1) function OldYearCnt 本身沒有問題 (只是 BYear, BMonth , BDay 這些有點多餘)
(2)出生日期0021/xx/xx 看起來有點奇怪(會誤認為是西元21年)
(3) 或許可以列出 呼叫 OldYearCnt 這部份的source code
簡化的OldYearCnt
<textarea class="delphi" rows="10" cols="60" name="code">function TForm1.OldYearCnt(birth : string):integer; var Year, Month, Day : Word; tst_Year, tst_Month, tst_Day :word; Tst_DateTime: TDateTime; begin if birth = '' then begin result := 0; exit; end; try Tst_DateTime := strtodatetime(birth); except result := 0; exit; end; DecodeDate(Tst_DateTime, tst_Year, tst_Month, tst_Day); DecodeDate(Now, Year, Month, Day); if (Month > tst_Month) and (Year >= tst_Year) then result := Year - tst_Year; if (Day >= tst_Day) and (Month = tst_Month) and (Year >= tst_Year) then result := Year - tst_Year; if (Day < tst_Day) and (Month = tst_Month) and (Year >= tst_Year) then result := Year - tst_Year-1; if (Month < tst_Month) and (Year >= tst_Year) then result := Year - tst_Year -1; end; </textarea>
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-26 13:12:00 IP:124.199.xxx.xxx 訂閱
謝謝您的回應, 呼叫的碼很簡單純, 如下:    <textarea name="code" class="delphi" rows="10" cols="60"> procedure TForm1.MakeDataSets(StartCombox:TComboBox;StartSpinEd:TSpinEdit;EndComBox:TComboBox;EndSpinEd:TSpinEdit;flag:integer); var mod_int , icnt ,birth_int,Range_Min,Range_Max: integer; birth, year,month,day : string; begin ProgressBar1.Position := 0; ProgressBar2.Position := 0; // 清空表格 1 report ADOQuery2.Active := false; ADOQuery2.SQL.text := 'delete from report'; ADOQuery2.ExecSQL; if flag=1 then begin // 65-89 // 清空表格 2 rpt01 ADOQuery2.Active := false; ADOQuery2.SQL.text := 'delete from rpt01'; ADOQuery2.ExecSQL; end; // detail -> report // 開啟 report ADOQuery2.Active := false; ADOQuery2.SQL.Text := 'select * from report'; ADOQuery2.Active := true; // 開啟 detail ADOQuery1.Active := false; ADOQuery1.SQL.Text := 'select * from detail'; ADOQuery1.Active := true; // 取 detail 資料到 report ProgressBar1.Min:= 0; ProgressBar1.max:= ADOQuery1.RecordCount; if StartCombox.text = '民國前' then Range_Min := 1911 - StartSpinEd.Value else Range_Min := 1911 StartSpinEd.Value; if EndCombox.text = '民國前' then Range_Max := 1911 - EndSpinEd.Value else Range_Max := 1911 EndSpinEd.Value; while not ADOQuery1.Eof do begin application.ProcessMessages; if not ADOQuery1.FieldByName('生日').isnull then begin birth_int := strtoint(copy(ADOQuery1['生日'],1,4)); if (birth_int >= Range_Min)and(birth_int <= Range_Max) then begin ADOQuery2.Insert; //戶號,個編,姓名,性別,生日,手機,統號,配偶 ADOQuery2['戶號'] := ADOQuery1['戶號']; ADOQuery2['個編'] := ADOQuery1['個編']; ADOQuery2['姓名'] := ADOQuery1['姓名']; ADOQuery2['性別'] := ADOQuery1['性別']; ADOQuery2['歲數'] := OldYearCnt(ADOQuery1['生日']); ADOQuery2['生日'] := ChngeToTaiwanDate(ADOQuery1['生日']); ADOQuery2['配偶'] := ADOQuery1['配偶']; ADOQuery2['統號'] := ADOQuery1['統號']; ADOQuery2.post; end; // if OldYearCnt(ADOQuery1['生日']) >=65 end; // if not ADOQuery1.FieldByName('生日').isnull ProgressBar1.Position := ProgressBar1.Position 1; ADOQuery1.Next; end; // master -> report ProgressBar2.Min:= 0; ProgressBar2.max:= ADOQuery2.RecordCount; ADOQuery2.Active := false; ADOQuery2.SQL.text := 'update report inner join master on report.戶號=master.戶號 set report.鄰別=master.鄰別, report.地址=master.地址,report.地址N=master.地址N,report.電話1=master.電話1'; ADOQuery2.ExecSQL; ProgressBar2.Position := ProgressBar2.Position (ProgressBar1.max div 2); // ADOQuery2.Active := false; ADOQuery2.SQL.Text := 'select * from report order by 鄰別,地址N'; ADOQuery2.Active := true; if flag=0 then begin // 65-89 mod_int := ADOQuery2.RecordCount mod 22; if mod_int > 0 then begin for icnt:=0 to (22 - mod_int)-1 do begin ADOQuery2.Append; ADOQuery2['鄰別']:= ' '; ADOQuery2.Post; end; ADOQuery2.first; end; end else begin // 89-99 ADOQuery2.First; for icnt := 0 to ADOQuery2.recordcount -1 do begin if not ADOQuery2.fieldbyname('生日').isnull then begin birth := ADOQuery2['生日']; year := copy(birth,1,4); month := copy(birth,6,2); day := copy(birth,9,2); if copy(year,1,1)='-' then begin year := '民前' inttostr(strtoint(copy(year,2,3))) '年'; end else begin year := '民國' inttostr(strtoint(year)) '年'; end; ADOQuery2.Edit; ADOQuery2['tmp1']:=year inttostr(strtoint(month)) '月' inttostr(strtoint(day)) '日'; ADOQuery2.next end; end; ADOQuery1.Active := false; ADOQuery1.SQL.Text := 'Insert Into rpt01 (tmp01,tmp02,tmp03,tmp04,tmp05,tmp06,tmp07) select 姓名, 性別, 鄰別,地址,電話1,tmp1,統號 from report order by 鄰別,地址N'; ADOQuery1.ExecSQL; end; // // ProgressBar2.Position := ProgressBar2.Position (ProgressBar1.max div 2); // Button2.Enabled := true; Button4.Enabled := true; Button6.Enabled := true; Button7.Enabled := true; end; </textarea>
------
努力會更接近成功
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-26 13:17:50 IP:140.127.xxx.xxx 訂閱
方便說明一下,哪裡不正確嗎?

===================引 用 pceyes 文 章===================


畫面是不正常(xp)的畫面

我用的func如下
<textarea name="code" cols="60" rows="10" class="delphi">function TForm1.OldYearCnt(birth : string):integer; var BYear, BMonth, BDay: Integer; YearOld: Integer; Year, Month, Day : Word; tst_Year, tst_Month, tst_Day :word; world_date1 : string; Tst_DateTime: TDateTime; begin if birth = '' then begin result := 0; exit; end; try Tst_DateTime := strtodatetime(birth); except result := 0; exit; end; DecodeDate(Tst_DateTime, tst_Year, tst_Month, tst_Day); YearOld := 0; DecodeDate(now, Year, Month, Day); world_date1 := birth; BYear := StrToInt(copy(world_date1, 1, 4)); delete(world_date1,1,5); BMonth := StrToInt(copy(world_date1, 1, 2)); delete(world_date1,1,3); BDay := StrToInt(world_date1); if (Month > BMonth) and (Year >= BYear) then YearOld := Year - BYear; if (Day >= BDay) and (Month = BMonth) and (Year >= BYear) then YearOld := Year - BYear; if (Day < BDay) and (Month = BMonth) and (Year >= BYear) then YearOld := Year - BYear-1; if (Month < BMonth) and (Year >= BYear) then YearOld := Year - BYear -1; result := YearOld; end;</textarea><br />
對了, 我用access資料庫, 有沒有可能是欄位格式的問題?
困擾很久了, 希望有人可以協助
謝謝!
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-26 15:03:51 IP:211.75.xxx.xxx 訂閱
歲數是4萬多歲.... 
===================引 用 syntax 文 章===================
方便說明一下,哪裡不正確嗎?

===================引 用 pceyes 文 章===================


畫面是不正常(xp)的畫面

我用的func如下
<textarea class="delphi" rows="10" cols="60" name="code">function TForm1.OldYearCnt(birth : string):integer; var BYear, BMonth, BDay: Integer; YearOld: Integer; Year, Month, Day : Word; tst_Year, tst_Month, tst_Day :word; world_date1 : string; Tst_DateTime: TDateTime; begin if birth = '' then begin result := 0; exit; end; try Tst_DateTime := strtodatetime(birth); except result := 0; exit; end; DecodeDate(Tst_DateTime, tst_Year, tst_Month, tst_Day); YearOld := 0; DecodeDate(now, Year, Month, Day); world_date1 := birth; BYear := StrToInt(copy(world_date1, 1, 4)); delete(world_date1,1,5); BMonth := StrToInt(copy(world_date1, 1, 2)); delete(world_date1,1,3); BDay := StrToInt(world_date1); if (Month > BMonth) and (Year >= BYear) then YearOld := Year - BYear; if (Day >= BDay) and (Month = BMonth) and (Year >= BYear) then YearOld := Year - BYear; if (Day < BDay) and (Month = BMonth) and (Year >= BYear) then YearOld := Year - BYear-1; if (Month < BMonth) and (Year >= BYear) then YearOld := Year - BYear -1; result := YearOld; end;</textarea><br />
對了, 我用access資料庫, 有沒有可能是欄位格式的問題?
困擾很久了, 希望有人可以協助
謝謝!
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-06-26 16:14:55 IP:211.75.xxx.xxx 訂閱


先假設你的GRID是連到ADOQUERY2
在你的程式中間有幾行如下:

<textarea class="delphi" rows="10" cols="60" name="code"><br /> ADOQuery2.Active := false;
ADOQuery2.SQL.text := 'update report inner join master on report.戶號=master.戶號 set report.鄰別=master.鄰別, report.地址=master.地址,report.地址N=master.地址N,report.電話1=master.電話1';
ADOQuery2.ExecSQL;
ProgressBar2.Position := ProgressBar2.Position (ProgressBar1.max div 2);
//
ADOQuery2.Active := false;
ADOQuery2.SQL.Text := 'select * from report order by 鄰別,地址N';
ADOQuery2.Active := true; //這樣會改變 Grid 的內容
</textarea>


請確認 report 資料表中歲數這個 欄位的格式是數字
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-06-26 18:06:58 IP:122.127.xxx.xxx 訂閱
數字沒錯, 主要的疑問是, 同樣的資料庫及程式, 為何2k可以,但xp有問題, 當然先懷疑是func的問題
對了
os xp內的access版本在200397正常

,另外一種可能,在於ado引擎在不同版本的解釋不同,因此我貼上資料庫設定畫面,
如果有先進有遇過, 有只能改自己的程式,不能改ado等大環境因素)
比如access資料庫內的設定, 更改後可以在不同的os移轉。

謝謝大家的關心。

------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2007-06-26 18:10:55, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-06-26 23:25:53 IP:61.231.xxx.xxx 訂閱
可以先讓程式執行前半段 也就是
<textarea class="delphi" rows="10" cols="60" name="code">ProgressBar1.Position := 0; ProgressBar2.Position := 0; ADOQuery2.Active := false; ADOQuery2.SQL.text := 'delete from report'; ADOQuery2.ExecSQL; if flag=1 then begin ProgressBar1.Position := 0; ProgressBar2.Position := 0; ADOQuery2.Active := false; ADOQuery2.SQL.text := 'delete from report'; ADOQuery2.ExecSQL; if flag=1 then begin ADOQuery2.Active := false; ADOQuery2.SQL.text := 'delete from rpt01'; ADOQuery2.ExecSQL; end; ADOQuery2.Active := false; ADOQuery2.SQL.Text := 'select * from report'; ADOQuery2.Active := true; ADOQuery1.Active := false; ADOQuery1.SQL.Text := 'select * from detail'; ADOQuery1.Active := true; ProgressBar1.Min:= 0; ProgressBar1.max:= ADOQuery1.RecordCount; if StartCombox.text = '民國前' then Range_Min := 1911 - StartSpinEd.Value else Range_Min := 1911 StartSpinEd.Value; if EndCombox.text = '民國前' then Range_Max := 1911 - EndSpinEd.Value else Range_Max := 1911 EndSpinEd.Value; while not ADOQuery1.Eof do begin application.ProcessMessages; if not ADOQuery1.FieldByName('生日').isnull then begin birth_int := strtoint(copy(ADOQuery1['生日'],1,4)); if (birth_int >= Range_Min)and(birth_int <= Range_Max) then begin ADOQuery2.Insert; ADOQuery2['戶號'] := ADOQuery1['戶號']; ADOQuery2['個編'] := ADOQuery1['個編']; ADOQuery2['姓名'] := ADOQuery1['姓名']; ADOQuery2['性別'] := ADOQuery1['性別']; ADOQuery2['歲數'] := OldYearCnt(ADOQuery1['生日']); ADOQuery2['生日'] := ChngeToTaiwanDate(ADOQuery1['生日']); ADOQuery2['配偶'] := ADOQuery1['配偶']; ADOQuery2['統號'] := ADOQuery1['統號']; ADOQuery2.post; end; end; end; </textarea>
確認歲數的值

小弟的環境 是XP SP2 , Access 2003 , Delphi 6 ,顯示很正常
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-06-27 08:29:43 IP:163.29.xxx.xxx 訂閱
您的回應誏我突然想到, 我的delphi是D5或許是它的bug, 
另外照您的說法, 若先測前半段, 是否表示後半段有問題, 不對呀!後面沒有別的程式了。
OldYearCnt() func 我在別的地方有使用, 在xp沒有問題, 原來我用的傳回是string
因此我想的是把access欄位改為文字, 不用數字, 或許問題就解決了, 待我測後再告訴大家。
------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2007-06-27 08:31:32, 註解 無‧
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-06-28 07:37:34 IP:163.29.xxx.xxx 訂閱
我把欄位格式由數字改為文字, 輸出改為string後, 已經可以了, 只是仍不知原因, 以後只能欄位儘量用文字了, 謝謝各位的指教。
------
努力會更接近成功
系統時間:2024-04-29 23:59:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!