2016-07-28 67 views
0

私はアンドロイドアプリで作成されたテーブルを持っています。Delphi 10.1 FireDacとSqliteの日付発行

CREATE TABLE IF NOT EXISTS `TimeSheet 
    `TKey` INTEGER PRIMARY KEY AUTOINCREMENT, 
    `PriKey1` INT NOT NULL, 
    `PriKey2` DEFAULT NULL, 
    `PriKey3` DEFAULT NULL, 
    `STime` DATETIME DEFAULT NULL, 
    `ETime` DATETIME DEFAULT NULL, 
    `Note` BLOB); 

いくつかのデータをさまざまな日付でロードしました。

また、一度に1日のデータしか表示されないようにフィルタリングする必要があります。私はどこステートメントSDATEは、いくつかのDD-MM-1800の日付を持って削除した場合、そうする

Delphiコードは

FD := "a date"; 
QuTimeSheet.Active := False; 
QuTimeSheet.SQL.Text := 'Select Date(STime) as SDate, Time(STime) as STime,  Time(ETime) as ETime, Task.TaskName From TimeSheet' + #13 + #10 + 
' LEFT JOIN task ON (TimeSheet.PriKey1 = task.TKey)';// + #13 + #10 + 
'Where SDate = ''' + formatdatetime('YYYY-MM-DD',FD) + ''';'; 
QuTimeSheet.Active := True; 

を下回っています。これは、Date(STime)dosentがDelphiで動作することを示しています。

もSDATE

デルファイdosentとしてSTRFTIME(%Y- & M-%のD、STIME)を試みたSTRFTIME Androidデバイスのクラッシュを好むように見えます。

はフィルタ

QuTimeSheet.Filtered := False; 
    QuTimeSheet.Filter := 'SDate = ''' + formatdatetime('YYYY-MM-DD',FD) + ''''; 
    QuTimeSheet.Filtered := True; 

または

QuTimeSheet.Filtered := False; 
    QuTimeSheet.Filter := 'SDate = ''' + Datetostr(FD) + ''''; 
    QuTimeSheet.Filtered := True; 

これは何をフィルタリングしないを使用してみました。

これはMySqlとSqlite turorialsサイトで動作するような簡単なステートメントです。

なぜ私のアプリにはありませんか?

+0

を停止し、SQLを連結します。パラメータ化されたクエリを代わりに使用します。 DBドライバは、パラメータ値を適切にフォーマットし、SQLから 'Date()'を削除し、基本的なクエリを最初にパラメータで正しく動作させるよう心配してください。ここでは、Delphiでパラメータを使用する方法について複数の例があります。 'formatdatetime'とそのすべてで停止し、単にパラメータを使用してください。 –

+0

これを含める必要があります:TFDQuery.ParamByNameを参照し、FDQuery1.ParamByName( 'SDate')で使用します。文字列に書式設定する代わりにAsDateTime。 FireDACのためのものではありませんが、[この回答](http://stackoverflow.com/a/11834743/62576)は一般的な考え方を示します。 –

+0

文字列にチューニングすることなく、日付スクリプト変数(FD)をテキストスクリプトに渡すことはできません。連結とパラメータ化された平均とは何ですか?値の時間的な側面を無視する必要があるので、値をフォーマットする必要があります。 –

答えて

3

SQLの連結を停止し、代わりにパラメータを使用します。また、あるタイプから別のタイプへの変換をやめ、データベース・ドライバーがそれをあなたに任せるようにしてください。引用符で囲む必要があるものを引用する方法(引用しないものを引用しない)と、日付の値を適切に書式設定する方法を知っています。また、SQLインジェクションを防止します。

(私はこのマシン上のSQLiteを持っていないので、テストされていない)このような何かが動作するはずです:

var 
    TheDate: TDateTime; 
begin 
    TheDate := EncodeDate(2015, 1, 1); 
    QuTimeSheet.Active := False; 
    QuTimeSheet.SQL.Text := 'Select Date(STime) as SDate, Time(STime) as STime,'#13 + 
         ' Time(ETime) as ETime, Task.TaskName From TimeSheet'#13 + 
         ' LEFT JOIN task ON (TimeSheet.PriKey1 = task.TKey)'#13 + 
         'Where SDate = :SDateVal'; 
    QuTimeSheet.ParamByName('SDateVal').AsDateTime := TheDate; 
    QuTimeSheet.Active := True; 
end; 
+0

OKなので、私はあらゆる種類の組み合わせを試しました。私はあなたの提案が好きです。私はこのようにすべての種類の利点を見ています。さて、私はアプリをコンパイルすることができますし、それをロックアップします。しかし、それは任意のデータを表示します。私はIDEで遊んで、コマンドを実行しています。私がwhereステートメントを削除すると、時間が読み込まれている特定のデータのデータがあることがわかりました。つまり、STimeは '2016-07-31 12:00 AM'で埋められていますが、SDate列は空です。 –

+0

私はそれが '2016-07-31'を持っていることを理解しています。これは私がなぜwhereステートメントdosntが動作するのかを信じています。私はその日付のために私がなぜフィルタのためのフィールドから時間を取り除こうとしているのかを示す必要があることを何度も持っています。 –

+0

私が(複数回)説明したように、AsDateTimeを使用すると自動的に適切なフォーマットに設定されるので、そうする必要はありません。私はあなたの特定のデータを持っていないので、(私がすでに書いた以外の)回避策を提案することはできません。 –