3

ADOquery からの誤ったデータを表示する Fast Report に問題があります。次のsql.textを使用します

SELECT * FROM JOB_DATA 
INNER JOIN CUSTOMER ON JOB_DATA.CUST_CODE = CUSTOMER.CUST_CODE 
WHERE JOB_DATA.SHIP_DATE Between [Date1] And [Date2] 
ORDER by SHIP_DATE

高速レポートには、SHIP_DATE = null のデータのみが表示されます。

TDBgrid をスローして、同じ ADOquery に接続されたデータ ソースに接続すると、dbgrid は正確に正しい情報を表示します。

私はアイデアがありません、何か提案はありますか?

日付の由来に関する質問に答えるには:

var
  date1:string;
  date2:string;
  sql_str:string;
begin
  date1:=inputbox('Date Range','Enter Beginning Date','');
  Try
    StrToDate(date1);
  Except 
    On EConvertError Do
    Begin
      MessageDlg('Please enter a valid date.  Format xx/xx/xx',
         mtError, [mbOK], 0);
      //ShowMessage('Please enter a valid date.  Format `enter code here`xx/xx/xx');
      Exit;
    End;
  End;

  date2:=inputbox('Date Range','Enter Ending Date','');
  Try
    StrToDate(date2);
  Except 
    On EConvertError Do
    Begin
      MessageDlg('Please enter a valid date.  Format xx/xx/xx',
          mtError, [mbOK], 0);
      //ShowMessage('Please enter a valid date.  Format `enter code here`xx/xx/xx');
      Exit;
    End;
  End;

  sql_str:= 'SELECT * FROM JOB_DATA INNER JOIN CUSTOMER ON ' +
            'JOB_DATA.CUST_CODE = CUSTOMER.CUST_CODE ' +
            'WHERE JOB_DATA.SHIP_DATE Between ';
  sql_str:= sql_str+ ''' ';
  sql_st:=sql_str + date1;
  sql_str:= sql_str+ '''';
  sql_str:= sql_str+ ' AND ';
  sql_str:= sql_str+ ''' ';
  sql_str:= sql_str+ date2;
  sql_str:= sql_str+ ' ''';

  with ADOQuery5 do 
  begin
    Close;
    SQL.Clear;
    SQL.text:= sql_str;
    Open;
  end;
  frxreport2.ShowReport();
end;

ADOquery は、frxReport2 に接続されている frxDBDataset2 に接続されています。クエリの結果を変更するために何もしていません。

いいえ、レポートにコードはありません。すべてウィザードから生成されたものです。

4

2 に答える 2

2

FastReportは、が適切に割り当てられている場合、句に基づいてクエリがレコードを返すべきではないため、SHIP_DATEがである場所にのみレコードを表示することはできません。これは、データセットと FastReport が正しく接続されていないか、句の日付値を割り当てるコード内の何かが間違っていて、日付がクエリに正しく提供されていないことを意味します。NULLWHEREDate1Date2BETWEEN

TfrxDataSetまず最初に、すべてのレポート列に適切なデータベース列が正しく割り当てられていることを確認します。(レポート アイテム (テキスト オブジェクトなど) をクリックし、そのアイテムDataSetDataFieldプロパティをチェックして、それらが正しいことを確認します。)

それが問題でない場合は、クエリの作成方法に問題がある可能性があります。これは、ADO の日付を正しくフォーマットしていない可能性があります。StrToDate(例外を発生させずに呼び出しを渡すために、たまたまどんな形式を使用しているだけです。)

SQL を設定する方法は、本当にお勧めできません。コードで自分自身を引用することを管理しようとすると、それは読みにくく、保守できません。

パラメータを使用する必要があります。これにより、SQL インジェクションから保護されますが、データベース ドライバが引用符で囲まれた値と日付を適切にフォーマットし、読みやすい状態に保つこともできます。(パラメーターに読みやすい名前を使用することもできます。これにより、今から 6 か月後にパラメーターを参照したときに、その意味がわかります。)

var
  // Your other variable declarations here
  StartDate, EndDate: TDateTime;
begin
  Date1 := InputBox(Whatever);
  try
    StartDate := StrToDate(Date1);
  except
    // Handle EConvertError
  end;
  Date2 := InputBox(Whatever);
  try
    EndDate := StrToDate(Date2);
  except
    // Handle EConvertError
  end;

  sql_str := 'SELECT * FROM JOB_DATA J'#13 +
             'INNER JOIN CUSTOMER C'#13 +
             'ON J.CUST_CODE = C.CUST_CODE'#13 +
             'WHERE J.SHIP_DATE BETWEEN :StartDate AND :EndDate';

  with ADOQuery5 do 
  begin
    Close;
    // No need to clear. If you're using the same query more than once,
    // move the SQL assignment and the Parameter.DataType somewhere
    // else, and don't set them here.
    // The query can be reused just by closing, changing parameter values,
    // and reopening.
    SQL.Text := sql_str;
    with Parameters.ParamByName('StartDate') do
    begin
      DataType := ftDate;
      Value := StartDate;
    end;
    with Parameters.ParamByName('EndDate') do
    begin
      DataType := ftDate;
      Value := EndDate;
    end;
    Open;
  end;
  frxReport2.ShowReport;
end;
于 2013-08-07T22:53:27.090 に答える