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

為什麼日期會亂掉?

尚未結案
tea15
初階會員


發表:64
回覆:72
積分:27
註冊:2005-06-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-23 16:13:32 IP:220.130.xxx.xxx 未訂閱
你們好 以下是我完整的程式碼.. 我要輸入的edit1避免碰到週末 且避免碰到Adoquery1內的日期.. 可分為繳款日(提前一天)及兌現日(隔一天).. 看似沒啥問題,為什麼跑出來的日期edit2怪怪的?
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-23 16:35:39 IP:60.248.xxx.xxx 未訂閱
看起來你的 ADOQuery1 是放假日資料, 不過用 Edit3 當查詢來源好像不對? 接著 Edit2 怪在哪裡最好說的詳細一些. 另外 Edit1 指定的日期要避開週六日與假日, 那麼繳款日與兌現日要不要避開呢? 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
tea15
初階會員


發表:64
回覆:72
積分:27
註冊:2005-06-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-26 08:14:00 IP:220.130.xxx.xxx 未訂閱
你好,我打錯了…不是EDIT3而是edit1當查詢資料。 我的意思是…根據edit1所輸入的日期在加一或減一後的日期要避開週末及我資料庫的日期即可。 但我是不是程式邏輯有錯呀? 當我要避開資料庫的日期就會有問題…怎麼辦咧? <>< face="Verdana, Arial, Helvetica">引言: 看起來你的 ADOQuery1 是放假日資料, 不過用 Edit3 當查詢來源好像不對? 接著 Edit2 怪在哪裡最好說的詳細一些. 另外 Edit1 指定的日期要避開週六日與假日, 那麼繳款日與兌現日要不要避開呢? 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-26 10:51:32 IP:60.248.xxx.xxx 未訂閱
為什麼你會用 RadioButton1 與 RadioButton2 ? 看不到畫面所以 R 的計算會有些奇怪. 改成用 R1 作繳款日, R2 作兌現日 然後不需要用 RadioButton . 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
tea15
初階會員


發表:64
回覆:72
積分:27
註冊:2005-06-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-28 08:12:49 IP:220.130.xxx.xxx 未訂閱
RadioButton1=繳款日 RadioButton2=兌現日 這是不一樣的功能的,所以才會用這個元件。 如果分為R1、R2.. 問題還是不能解決耶~ <>< face="Verdana, Arial, Helvetica">引言: 為什麼你會用 RadioButton1 與 RadioButton2 ? 看不到畫面所以 R 的計算會有些奇怪. 改成用 R1 作繳款日, R2 作兌現日 然後不需要用 RadioButton . 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
kartan_01
一般會員


發表:42
回覆:60
積分:20
註冊:2004-12-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-28 09:37:28 IP:61.221.xxx.xxx 未訂閱
if not adoQuery1.Locate('holiday', Edit3.Text, []) then if radiobutton1.Checked then //繳款日 begin edit2.Text:=datetostr(myworkdate(datetimepicker1.Date-1)) end else if radiobutton2.Checked then//兌現日 begin edit2.Text:=datetostr(myworkdate(datetimepicker1.Date 1)) end else edit2.Text:=datetostr(myworkdate(datetimepicker1.Date)) end; 你好像是先判斷是否是假日,再去作周末的修正 這樣如果修正完後的日期是假日怎麼辦? 我想問題應該是在這裡吧
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-28 10:27:20 IP:60.248.xxx.xxx 未訂閱
原因就是在你處理向前推或是向後推的動作是要在呼叫 MyWorkDate() 函數前作還是在 MyWorkDate() 函數內做呢? 偏偏你兩個地方都作所以才會怪。 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-28 10:36:35 IP:60.248.xxx.xxx 未訂閱
應該將 Case DOW of 6 : R := R -1; //變成本周星期五 7 : R := R -2; //變成本周星期五 1 : R := R -3; //變成本周星期五 else R := R-1; //都向後推一天 end; 改成 Case DOW of 6 : R := R -1; //變成本周星期五 7 : R := R -2; //變成本周星期五 1 : R := R -3; //變成本周星期五 end; 另外 Case DOW of 5 : R := R 3; //變成下一周星期一 6 : R := R 2; //變成下一周星期一 7 : R := R 1; //變成下一周星期一 else R := R 1; //都向前推一天 end; 改成 Case DOW of 5 : R := R 3; //變成下一周星期一 6 : R := R 2; //變成下一周星期一 7 : R := R 1; //變成下一周星期一 end; 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
tea15
初階會員


發表:64
回覆:72
積分:27
註冊:2005-06-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-28 11:49:37 IP:211.20.xxx.xxx 未訂閱
你好,我應該這麼說.. 我希望我的edit2顯示,能避開週末及資料庫的日期,而不是判斷edit1..
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-29 08:45:20 IP:60.248.xxx.xxx 未訂閱
隨手改成這樣我沒有編譯過, 請自己測試試看看
 
private
  { Private declarations }
  f, t: string;
  Function MyWorkDate_F(InDate : TDate) : TDate; // 取兌現日
  Function MyWorkDate_B(InDate : TDate) : TDate; // 取繳款日
  public
  { Public declarations }
end;
var
  Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.Button1Click(Sender: TObject);
begin
  datetimepicker1.Date := EncodeDate(strtoint(copy(edit1.Text,1,4)),strtoint(copy(edit1.Text,5,2)),strtoint(copy(edit1.Text,7,2)));
  if radiobutton1.Checked then //繳款日
  begin
    edit2.Text := datetostr(MyWorkDate_F(datetimepicker1.Date - 1))
  end
  else if radiobutton2.Checked then //兌現日
  begin
    edit2.Text := datetostr(MyWorkDate_B(datetimepicker1.Date   1))
  end
  else
    edit2.Text := datetostr(MyWorkDate_F(datetimepicker1.Date)); // 遇假日順延
end;    Function Tform1.MyWorkDate_F(InDate : TDate) : TDate;
var
  iUP :Word;
  R : TDate;
begin
  R := InDate;
  iUP := DayOfTheWeek(R);
  
  while (adoQuery1.Locate('holiday', DateToStr(R), []) )
    or (iUP = 5)
    or (iUP = 6)
    or (iUP = 7) do
  begin
    Case iUP of
      5 : R := R   3; //變成下一周星期一
      6 : R := R   2; //變成下一周星期一
      7 : R := R   1; //變成下一周星期一
    end;
    iUP := DayOfTheWeek(R);
  end;
  label1.caption := '星期'   IntToStr(DayOfTheWeek(R));
  Result := R;
end;    Function Tform1.MyWorkDate_B(InDate : TDate) : TDate;
var
  sDate: string;
  iDOW :word;
  R : TDate;
begin
  R := InDate;
  iDOW := DayOfTheWeek(R);
  
  while (not adoQuery1.Locate('holiday', DateToStr(R), []) )
    or (iDOW = 6)
    or (iDOW = 7)
    or (iDOW = 1) do
  begin
    Case iDOW of
      6 : R := R - 1; //變成本周星期五
      7 : R := R - 2; //變成本周星期五
      1 : R := R - 3; //變成本周星期五
    end;
    iDOW := DayOfTheWeek(R);
  end;
  label1.caption := '星期' IntToStr(DayOfTheWeek(R));
  Result := R;
end;
雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
系統時間:2024-06-16 10:59:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!