Announcement

Collapse
No announcement yet.

Datum-Parameter im Where

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datum-Parameter im Where

    folgende where-anweisung funktioniert:

    where von_datum = '1-JAN-1999'

    wenn ich aber 1-JAN-1999 in einen parameter schreibe, bekomme ich die fehlermeldung, das 1-JAN-1999 ein ungültiges datum ist.

    where von_datum = :dt
    parambyname('dt').value:='1-JAN-1999'

    was mache ich falsch..?

  • #2
    Hallo,

    sobald ein Parameter im WHERE-Abschnitt verwendet wird, legt Delphi eine Parameter-Objekt vom Typ TParams an. Dabei muss der Parameter-Datentyp definiert werden - wobei in diesem Fall sicherlich der Wert <b>ftDateTime</b> genutzt wird. Allerdings prüft Delphi dann nach, ob ein gültiger Datumswert übergeben wird. Das ist bei der Schreibweise <i>1-JAN-1999</i> in der aktuellen Ländereinstellung von Windows sicherlich nicht der Fall. Statt dessen muss der Datumswert im Format <b>tt.mm.yyyy</b> übergeben werden:
    <pre>
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IBQuery1.Active := False;
    IBQuery1.Params[0].Value := StrToDate(EditDatum.Text);
    IBQuery1.Active := True;
    end;
    </pre>
    Im Formular wird EditDatum mit einem Datum vorbelegt:
    <pre>
    object Form1: TForm1
    Left = 192
    Top = 107
    Width = 696
    Height = 480
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object DBGrid1: TDBGrid
    Left = 16
    Top = 80
    Width = 425
    Height = 201
    DataSource = DataSource1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    end
    object EditDatum: TEdit
    Left = 136
    Top = 48
    Width = 89
    Height = 21
    TabOrder = 1
    Text = '11.07.1996'
    end
    object Button1: TButton
    Left = 232
    Top = 48
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 2
    OnClick = Button1Click
    end
    object IBDatabase1: TIBDatabase
    Connected = True
    DatabaseName = 'C:\Database\IB\Sm.gdb'
    Params.Strings = (
    'user_name=sysdba'
    'password=masterkey'
    'lc_ctype=WIN1252')
    LoginPrompt = False
    DefaultTransaction = IBTransaction1
    IdleTimer = 0
    SQLDialect = 1
    TraceFlags = []
    Left = 16
    Top = 8
    end
    object IBTransaction1: TIBTransaction
    Active = False
    DefaultDatabase = IBDatabase1
    Left = 16
    Top = 40
    end
    object IBQuery1: TIBQuery
    Database = IBDatabase1
    Transaction = IBTransaction1
    CachedUpdates = False
    SQL.Strings = (
    'SELECT * FROM SM_KURS'
    'WHERE DATUM = :dDatum'
    '')
    Left = 56
    Top = 40
    ParamData = <
    item
    DataType = ftDateTime
    Name = 'dDatum'
    ParamType = ptInput
    end>
    object IBQuery1DATUM: TDateTimeField
    FieldName = 'DATUM'
    end
    object IBQuery1RECNO: TIntegerField
    FieldName = 'RECNO'
    end
    object IBQuery1ID: TIntegerField
    FieldName = 'ID'
    Required = True
    end
    object IBQuery1KURS: TFloatField
    FieldName = 'KURS'
    end
    object IBQuery1BEMERKUNG: TIBStringField
    FieldName = 'BEMERKUNG'
    Size = 10
    end
    end
    object DataSource1: TDataSource
    DataSet = IBQuery1
    Left = 96
    Top = 40
    end
    end
    </pre&gt

    Comment


    • #3
      mein problem ist, daß ich diese query dynamisch generiere. es geht ums thema replication. ich hab in der db stringfelder, in die ein trigger die namen und werte der schlüssel reinschreibt. ich stelle dann mit diesen infos sql's zusammen und mit parametern (-> prepare) würden diese um ein ganzes stück schneller laufen..

      Comment


      • #4
        Hallo,

        in diesem Fall sollte auch der Parameter dynamisch erzeugt werden:
        <pre>
        Query1.Close;
        Query1.SQL.Clear;
        Query1.SQL.AddStrings(Memo1.Lines);
        Query1.Params.CreateParam(ftString,'P1',ptInput);
        Query1.SQL.Add(' '); // Zeilenwechsel
        Query1.ParamByName('P1').Value := 'Wert';
        Query1.Prepare;
        Query1.ExecSQL;
        </pre&gt

        Comment

        Working...
        X