问题在某种程度上与这个有关,除了我使用参数。我的按钮上有这个:
procedure TForm1.Button1Click(Sender: TObject);
begin
with ABSQuery1 do begin
ABSQuery1.Close;
ABSQuery1.SQL.Clear;
ABSQuery1.SQL.Add('select * from ROOM_RATES where CENIK_ID = :a4 and ROOM_TYPE = :A1');
ABSQuery1.SQL.Add('and rate_Start_DATE < :a3 AND rate_End_DATE > :a2 ORDER BY rate_Start_DATE ASC ');
ABSQuery1.Params.ParamByName('a1').Value:= cxLookupComboBox2.Text;
ABSQuery1.Params.ParamByName('a2').Value:= cxDateEdit1.Date;
ABSQuery1.Params.ParamByName('a3').Value := cxDateEdit2.Date;
ABSQuery1.Params.ParamByName('a4').Value := cxLookupComboBox1.Text;
ABSQuery1.Open;
end;
end;
这种工作但不是我真正想要的。问题与这个有关: Hotel Booking Rates SQL Problem
问题在于提到的超链接中的重叠日期。现在我得到这个:
如何在上述示例中获得与上述超链接相似的结果?
这是 db 表的快照:
更新(新):这是按钮上的代码 click :
procedure TForm1.AdvGlowButton1Click(Sender: TObject);
var
nxt : integer;
mem_from : TDateTime;
mem_to : TDateTime;
mem_RATE_ID : integer;
mem_ROOM_TYPE : string[10];
mem_Start_DATE_1 : TDateTime;
mem_End_DATE_1 : TDateTime;
mem_RATE_Price_1 : Currency;
mem_calc_END : TDateTime;
mem_calc_DAYS : integer;
c_from : TDateTime;
c_to : TDateTime;
c_from_test : TDateTime;
c_to_test : TDateTime;
begin
ABSQuery2.Close;
ABSQuery2.SQL.Text:='DELETE from TEMP';
ABSQuery2.ExecSQL;
ABSQuery2.SQL.Text:='SELECT * from TEMP ORDER BY ID ';
ABSQuery2.Open;
c_from := cxDateEdit1.Date;
c_to := cxDateEdit2.Date;
mem_from := cxDateEdit1.Date;
mem_to := cxDateEdit2.Date;
with ABSQuery1 do begin
ABSQuery1.Close;
ABSQuery1.SQL.Clear;
ABSQuery1.SQL.Add('select * from ROOM_RATES where CENIK_ID = :a4 and ROOM_TYPE = :A1');
ABSQuery1.SQL.Add('and rate_Start_DATE < :a3 AND rate_End_DATE > :a2 ORDER BY rate_Start_DATE ASC ');
ABSQuery1.Params.ParamByName('a1').Value:= cxLookupComboBox2.Text;
ABSQuery1.Params.ParamByName('a2').Value:= cxDateEdit1.Date;
ABSQuery1.Params.ParamByName('a3').Value := cxDateEdit2.Date;
ABSQuery1.Params.ParamByName('a4').Value := cxLookupComboBox1.Text;
ABSQuery1.Open;
nxt := 1;
mem_RATE_ID := ABSQuery1.FieldByName('RATE_ID').AsInteger;
mem_ROOM_TYPE := ABSQuery1.FieldByName('ROOM_TYPE').AsString ;
mem_Start_DATE_1 := ABSQuery1.FieldByName('RATE_START_DATE').AsDateTime;
mem_End_DATE_1 := ABSQuery1.FieldByName('RATE_END_DATE').AsDateTime;
mem_RATE_Price_1 := ABSQuery1.FieldByName('RATE_PRICE').AsCurrency;
if mem_to > mem_End_DATE_1 then begin
mem_calc_END := mem_End_DATE_1;
mem_calc_DAYS := Daysbetween(mem_from,mem_End_DATE_1);
end else begin
mem_calc_END := mem_to;
mem_calc_DAYS := Daysbetween(mem_from,mem_calc_END);
end;
end;
if ABSQuery1.RecordCount > nxt then ABSQuery1.Next;
with ABSQuery2 do begin
open;
Insert;
ABSQuery2.FieldByName('RATE_ID').AsInteger:=mem_RATE_ID;
ABSQuery2.FieldByName('ROOM_TYPE').AsString:=mem_ROOM_TYPE;
ABSQuery2.FieldByName('DATE_FROM').AsDateTime:=mem_from;
ABSQuery2.FieldByName('DATE_TO').AsDateTime:= mem_to;//mem_calc_END;
ABSQuery2.FieldByName('RATE_PRICE').AsCurrency:=mem_RATE_PRICE_1;
ABSQuery2.FieldByName('DAYS').AsInteger:=mem_calc_DAYS;
ABSQuery2.FieldByName('TOTAL').AsCurrency:=mem_RATE_PRICE_1 * mem_calc_DAYS;
post;
end; ///////////////////////////////////////////////////////////////////
if ABSQuery1.RecordCount > nxt then begin
inc(nxt);
if mem_to < ABSQuery1.FieldByName('rate_End_DATE').AsDateTime then begin
mem_calc_END := mem_to;
mem_calc_DAYS := Daysbetween(ABSQuery1.FieldByName('rate_Start_DATE').AsDateTime,mem_calc_END);
end else begin
mem_calc_END := ABSQuery1.FieldByName('rate_End_DATE').AsDateTime;
mem_calc_DAYS := Daysbetween(ABSQuery1.FieldByName('rate_Start_DATE').AsDateTime, ABSQuery1.FieldByName('rate_End_DATE').AsDateTime);
end;
mem_RATE_ID := ABSQuery1.FieldByName('RATE_ID').AsInteger;
mem_ROOM_TYPE := ABSQuery1.FieldByName('ROOM_TYPE').AsString;
mem_Start_DATE_1 := ABSQuery1.FieldByName('rate_Start_DATE').AsDateTime;
mem_End_DATE_1 := ABSQuery1.FieldByName('rate_End_DATE').AsDateTime;
mem_Rate_Price_1 := ABSQuery1.FieldByName('RATE_PRICE').AsCurrency;
// calculation : second row.
with ABSQuery2 do begin
Insert;
FieldByName('RATE_ID').AsInteger:=mem_RATE_ID;
FieldByName('ROOM_TYPE').AsString:=mem_ROOM_TYPE;
FieldByName('DATE_FROM').AsDateTime:=mem_Start_DATE_1;
FieldByName('DATE_TO').AsDateTime:= mem_calc_END;
FieldByName('RATE_PRICE').AsCurrency:=mem_RATE_PRICE_1;
FieldByName('DAYS').AsInteger:=mem_calc_DAYS;
FieldByName('TOTAL').AsCurrency:=mem_RATE_PRICE_1 * mem_calc_DAYS;
post;
end;
ABSQuery2.refresh;
end;
end;
我得到的结果是这样的:
从数据库快照中可以看出,价格设置正常。