Delphi - 更新日期输入条形图

Delphi - Updating Bar Chart on Date Inputs

当日期输入到文本框中时,我正在尝试更新我的条形图,但出现错误。我正在努力寻找解决方案,因此我们将不胜感激。我希望它更新 dbGrid 和图表,以仅显示输入到文本框中的日期的前 5 位培训师。

procedure TFTrainerChart.btnSubmitClick(Sender: TObject);
var FromDate,ToDate:TDateTime;

  begin

if AdoQuery1.Active then
    AdoQuery1.Close;

    FromDate:=strtoDateTime(txtFromDate.Text);
    ToDate:=strtoDateTime(txtToDate.Text);

     AdoQuery1.SQL.Add ( 'SELECT TOP 5 tblTrainers.Forename,');
      AdoQuery1.SQL.Add (' COUNT(tblTrainerBookings.TrainerID) AS Bookings');
      AdoQuery1.SQL.Add (' FROM tblTrainers,tblTrainerBookings') ;
      AdoQuery1.SQL.Add (' WHERE tblTrainers.TrainerID = tblTrainerBookings.TrainerID');
        AdoQuery1.SQL.Add ('AND tblTrainerBookings.DateOfBooking >= :FromDate');

      AdoQuery1.SQL.Add ('AND tblTrainerBookings.DateOfBooking <= :ToDate');

       AdoQuery1.SQL.Add ('GROUP BY tblTrainers.Forename');
       AdoQuery1.SQL.Add ('ORDER BY COUNT(tblTrainerBookings.TrainerID) DESC ');

       AdoQuery1.Parameters.ParamByName('ToDate').Value := ToDate;
       AdoQuery1.Parameters.ParamByName('FromDate').Value := FromDate;

       AdoQuery1.Open

cs:='CREATE TABLE tblTrainers('+
  'TrainerID Number, '+
  'Forename TEXT(15), '+
  'Surname TEXT(20), '+
  'Address TEXT(30), '+
  'PostCode TEXT(9), '+
  'MobileNumber TEXT(11), '+
  'Email TEXT (40))';
  ADOCommand1.CommandText := cs;
  ADOCommand1.Execute;

 cs:='CREATE INDEX idxTrainer ON tblTrainers (TrainerID) WITH PRIMARY';
 ADOCommand1.CommandText := cs;
 ADOCommand1.Execute;

cs:='CREATE TABLE tblTrainerBookings ('+
 'BookingID Number,'+
 'MemberID Number CONSTRAINT FKY_MemberID References tblMembers (MemberID),'+
 'TrainerID Number CONSTRAINT FKY_TrainerID References tblTrainers (TrainerID),'+
 'DateOfBooking Date,'+
  'TimeOfBooking Time)';
 ADOCommand1.CommandText :=cs;
 ADOCommand1.Execute;

 cs:='CREATE INDEX idxTrainerBooking ON tblTrainerBookings (BookingID) with PRIMARY';
 ADOCommand1.CommandText :=cs;
 ADOCommand1.Execute;

这对我有用(SQL Server 2012,Delphi 10 Seattle):

ADOQuery1.SQL.Clear;
ADOQuery1.Add('SELECT TOP 5 t.Forename, COUNT(b.TrainerID) AS Bookings');
ADOQuery1.Add('FROM tblTrainers t');
ADOQuery1.Add('INNER JOIN tblTrainerBookings b on b.TrainerID = t.ID');
ADOQuery1.Add('WHERE b.DateOfBooking >= :FromDate');
ADOQuery1.Add('AND b.DateOfBooking <= :ToDate');
ADOQuery1.Add('GROUP BY t.Forename');
ADOQuery1.Add('ORDER BY Bookings DESC');

FromDate := EncodeDate(2015, 12, 1);
ToDate   := EncodeDate(2015, 12, 31);
ADOQuery1.Parameters.ParamByName('ToDate').Value := ToDate;
ADOQuery1.Parameters.ParamByName('FromDate').Value := FromDate;

ADOQuery1.Open;

对于不允许在 ORDER BY 中使用别名列名的数据库,您可以使用列在结果集中的位置代替。下面的 ORDER BY 相当于上面示例中的那个:

ADOQuery1.Add('ORDER BY 2 DESC');

请注意,我会将 WHERE 子句更改为更具可读性:

ADOQuery1.Add('WHERE b.DateOfBooking BETWEEN :FromDate AND :ToDate');