在2000沒問題,但在xp有問題 |
答題得分者是:eaglewolf
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
畫面是不正常(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 發送簡訊給我 |
(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 發送簡訊給我 |
謝謝您的回應, 呼叫的碼很簡單純, 如下: <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 發送簡訊給我 |
方便說明一下,哪裡不正確嗎?
===================引 用 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 發送簡訊給我 |
歲數是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 發送簡訊給我 |
請確認 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 發送簡訊給我 |
是數字沒錯, 主要的疑問是, 同樣的資料庫及程式, 為何2k可以,但xp有問題, 當然先懷疑是func的問題
對了 os xp內的access版本在2003是97及正常的 ,另外一種可能,在於ado引擎在不同版本的解釋不同,因此我貼上資料庫設定畫面, 如果有先進有遇過, 有只能改自己的程式,不能改ado等大環境因素) 比如access資料庫內的設定, 更改後可以在不同的os移轉。 謝謝大家的關心。
------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2007-06-26 18:10:55, 註解 無‧
|
eaglewolf
資深會員 發表:4 回覆:268 積分:429 註冊:2006-07-06 發送簡訊給我 |
可以先讓程式執行前半段 也就是
<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 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |