AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQLLite mit INTEGER für DATETIME
Thema durchsuchen
Ansicht
Themen-Optionen

SQLLite mit INTEGER für DATETIME

Ein Thema von wschrabi · begonnen am 9. Sep 2014 · letzter Beitrag vom 9. Sep 2014
Antwort Antwort
wschrabi

Registriert seit: 16. Jan 2005
448 Beiträge
 
#1

SQLLite mit INTEGER für DATETIME

  Alt 9. Sep 2014, 13:06
Datenbank: SQLLite • Version: letzte • Zugriff über: FireMonkey
Hallo,
ich knoble jetzt schon den ganzen Tag.
Ich möchte ineinem SQLite Feld das Messdatum als INTEGER (= UNIX TIME STAMP) speichern.
Doch in dem ListView soll es HUMAN READABLE Sein. Also hab ich mir gedacht, mit OnCalcFields arbeiten.
Doch es klappt einfach nicht.
Was mache ich da falsch? Es soll unter XE6 auf Android laufen.
Delphi-Quellcode:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
  FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async,
  FireDAC.Phys, FireDAC.Phys.SQLite, FireDAC.Stan.ExprFuncs,
  FireDAC.FMXUI.Login, FireDAC.Comp.UI, Data.DB, FireDAC.Comp.Client,
  FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt,
  FMX.ListView.Types, Data.Bind.EngExt, Fmx.Bind.DBEngExt, Data.Bind.Controls,
  System.Rtti, System.Bindings.Outputs, Fmx.Bind.Editors, Data.Bind.Components,
  FMX.Layouts, Fmx.Bind.Navigator, Data.Bind.DBScope, FMX.ListView,
  FireDAC.Comp.DataSet, FMX.StdCtrls, FireDAC.FMXUI.Wait, System.IOUtils, DateUtils;

const
  cnFormat = 'yyyy-mm-dd';
    
type
  TForm1 = class(TForm)
    FDConnection1: TFDConnection;
    FDGUIxLoginDialog1: TFDGUIxLoginDialog;
    FDQueryCreateTable: TFDQuery;
    ListView1: TListView;
    BindSourceDB1: TBindSourceDB;
    BindingsList1: TBindingsList;
    FDQuery1: TFDQuery;
    BindSourceDB2: TBindSourceDB;
    FDQuery2: TFDQuery;
    NavigatorBindSourceDB2: TBindNavigator;
    ButtonDelete: TButton;
    FDQueryIns: TFDQuery;
    ButtonAdd: TButton;
    FDGUIxWaitCursor1: TFDGUIxWaitCursor;
    FDQueryDel: TFDQuery;
    Label1: TLabel;
    LinkFillControlToFieldMessdatum: TLinkFillControlToField;
    FDQueryDrop: TFDQuery;
    Label2: TLabel;
    procedure ListView1ItemClick(const Sender: TObject;
      const AItem: TListViewItem);
    procedure ButtonAddClick(Sender: TObject);
    procedure FDConnection1BeforeConnect(Sender: TObject);
    procedure ButtonDeleteClick(Sender: TObject);
    procedure ButtonDropClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FDQuery2CalcFields(DataSet: TDataSet);
    
  private
    { Private-Deklarationen }
    FmtStngs: TFormatSettings;
    
    
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}


procedure TForm1.ButtonAddClick(Sender: TObject);
var
  TaskName: String;
begin
  try
    TaskName:=DateToStr(now()(*, FmtStngs*));
    if InputQuery('Bitte neues Meßdatum eingeben', 'Messdatum', TaskName) and (TaskName.Trim <> '') then
    begin
      ShowMessage('UNIX Timestamp:'+Inttostr( DateTimeToUnix(StrToDateTime(TaskName))));
      //FDQueryIns.ParamByName('MessDatum').AsDate := StrToDate(TaskName(*, FmtStngs*));
      FDQueryIns.ParamByName('MessDatum').AsInteger := DateTimeToUnix(StrToDateTime(TaskName));
      FDQueryIns.ExecSQL();
      FDQuery2.Close;
      FDQuery2.Open;
      Label2.Text:= 'Total:' + IntTOStr(FDQuery2.RowsAffected);
      
      ButtonDelete.Visible := ListView1.Selected <> nil;
    end;
  except
    on e: Exception do
    begin
      ShowMessage(e.Message);
    end;
  end;
end;

procedure TForm1.ButtonDeleteClick(Sender: TObject);
var
  TaskName: String;
begin
  TaskName := ListView1.Selected.Text;

  try
    FDQueryDel.ParamByName('MessDatum').AsInteger := DateTimeToUnix(StrToDateTime(TaskName));
    FDQueryDel.ExecSQL();
    FDQuery2.Close;
    FDQuery2.Open;
    Label2.Text:= 'Total:' + IntTOStr(FDQuery2.RowsAffected);
    ButtonDelete.Visible := ListView1.Selected <> nil;
  except
    on e: Exception do
    begin
      SHowMessage(e.Message);
    end;
  end;
end;

procedure TForm1.ButtonDropClick(Sender: TObject);
begin
   FDQueryDrop.ExecSQL();
end;

procedure TForm1.FDConnection1BeforeConnect(Sender: TObject);
begin
  {$IF DEFINED(iOS) or DEFINED(ANDROID)}
  FDConnection1.Params.Values['Database'] :=
      TPath.Combine(TPath.GetDocumentsPath, 'lipoapp.s3db');
  {$ENDIF}
end;

procedure TForm1.FDQuery2CalcFields(DataSet: TDataSet);
begin
   DataSet.FieldByName('Messdatum').AsDateTime := UnixToDateTime(DataSet.FieldByName('Messdatum').AsInteger);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    FmtStngs:=TFormatsettings.Create;
    FmtStngs.DateSeparator := '.';
    FmtStngs.ShortDateFormat := 'yyyy.mm.dd';
    FmtStngs.TimeSeparator := ':';
    FmtStngs.LongTimeFormat := 'hh:mm:ss';
  //fSetting := GetCustomDateFormatSettings;
end;

procedure TForm1.ListView1ItemClick(const Sender: TObject;
  const AItem: TListViewItem);
begin
   ButtonDelete.Visible:=ListView1.Selected <> nil;
end;

end.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: SQLLite mit INTEGER für DATETIME

  Alt 9. Sep 2014, 13:15
Ich kenne mich mit Datenbanken nicht aus, aber muss man das Feld dann nicht auch explizit als "berechnetes Feld" kennzeichnen?

Ansonsten warum als Integer-Feld? Nimm doch direkt ein Datumsfeldtyp. Was einen zur nächsten Frage bringt: Zugriff über was? FireMonkey oder VCL ist in dem Fall (glaube ich) völlig egal, gemeint ist eher "dbExpress", "FireDAC" oder anderes.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: SQLLite mit INTEGER für DATETIME

  Alt 9. Sep 2014, 13:17
Hallo,

was spricht dagegen den Unix-Timestamp erst beim befüllen des ListViews in
ein TDateTime Wert zu wandeln?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#4

AW: SQLLite mit INTEGER für DATETIME

  Alt 9. Sep 2014, 13:23
@Günther: Hab ich auch erst gedacht, aber SQLite kennt sowas nicht www.sqlite.org/datatype3.html. Irrsinnig.
Augrund der Gegebenheiten würde ich dann aber eigentlich ein Text als Datentyp nehmen.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: SQLLite mit INTEGER für DATETIME

  Alt 9. Sep 2014, 13:37
Das ist der Punkt den ich auch nicht ganz verstehe-

Ich habe eine sqLite-Datenbank mit "SQLite Expert" angelegt. Ein Feld habe ich als Typ "TIMESTAMP" deklariert. dbExpress erkennt da nur ein WIDEMEMO-Feld. FireDAC ist so schlau und macht da ein TSQLTimestampField draus. Der Theorie nach dürfte das ja gar nicht gehen.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: SQLLite mit INTEGER für DATETIME

  Alt 9. Sep 2014, 17:25
Reicht es nicht, bei der Abfrage eine Formatfunktion zu verwenden?
Code:
SELECT datetime(1092941466, 'unixepoch');
oder
Code:
SELECT datetime(1092941466, 'unixepoch', 'localtime');
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz