1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

SSRS Abfage über Parameter vom Typ "Datum/Zeit" steuern

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von CopWorker, 7 November 2019.

  1. CopWorker

    CopWorker Benutzer

    Hallo zusammen,

    gerade bin ich an einem SQL Server Report Service Bericht dran.
    In dem möchte ich im DataSet in der Abfrage eine "WHERE" Klausel einbauen.
    Die "WHERE" Klausen soll unter anderem auf einen Zeitbereich verweisen der wiederum aus
    2 Parametersets stammt.
    Hier die Abfrage
    Code:
    SELECT
        mat.MatCode, mat.MatName,
    FROM mat, matverb 
    
    WHERE mat.MatCode = matverb.MatCode
      and 
          matVerb.VerbrDatumZeit between ? and ?
    
    GROUP BY mat.MatCode, mat.MatName
    
    Die 2 Fragezeichen sollen nicht irritieren, diese werden als Verweis auf die
    Parameter1 und Parameter2 eingesetzt, siehe "param1-und-param2.PNG".
    Es handelt sich um ein Datenbank vom Typ ODBC.
    Die Spalte "matVerb.VerbrDatumZeit" ist vom Typ "TIMESTAMP".

    Jetzt kommen die Parameter1 (param_begin) und Parameter2 (param_end) ins Spiel.
    Diese sind vom Datentyp "Datum/Zeit" eingestellt, siehe "param_begin.PNG".

    Wie muss der Vergleich, bzw. die Syntax im Parameter Ausdruck lauten? Siehe "dataset_param_ausdr.PNG"
    Das Problem ist der Spaltenwert "matVerb.VerbrDatumZeit" ist vom Typ "TIMESTAMP".
    Der Wert aus dem Parameter kommt von einem, der Art nach, DateTimePicker.
    Ich komme absolut mit der Konvertierung nicht klar.
    Es ist ja nicht möglich eine Wert vom Typ "TIMESTAMT" mit einem unbekannten Typ mit "=" zu vergleichen.


    Vielen Dank mal vorab.
    Grüße von CopWorker
     

    Anhänge:

  2. ukulele

    ukulele Datenbank-Guru

    TIMESTAMP hat offensichtlich in Sybase, ebenso wie in MSSQL, keinen Bezug zur Zeit und ist daher nicht vergleichbar. TIMESTAMP legt eine Reiehnfolge fest und kann Datensätze eindeutlich ordnen aber nicht einer Uhrzeit zuordnen - so kenne ich das auch.
    What is the mysterious 'timestamp' datatype in Sybase?
     
  3. Walter

    Walter Administrator Mitarbeiter

    Kein Wunder, stammen ja voneinander ab.
     
  4. CopWorker

    CopWorker Benutzer

    Hallo zusammen,

    vielen Dank, dass ihr euch dem Thema annehmt.
    Ich habe das jetzt so gelöst indem ich in meinem SSRS Bericht ein weiteres DataSet einrichte.
    In diesem DataSet bilde ich die Abfragen nach dem Zeitstempel mit dem höchsten Wert und
    dem Zeitstempel mit dem niedrigsten Wert aus der Datenbank Tabelle.
    Diese Werte nehme ich als Defaultwerte für die jeweiligen Parameter.
    Die Verknüpfung in der Abfrage im Main DataSet scheint zu funktionieren:
    "matVerb.VerbrDatumZeit between ? and ?"
    Aber dies kann ich erst behaupten wenn ich alles genau geprüft habe.

    Übrigens liegt da noch ein weiteres Problem vor:
    Folgende Syntax in der "WHERE" Klausel funktioniert nicht:
    "matVerb.ProdLinCode like @param_line"
    "matVerb.ProdLinCode in @param_line"
    Die Operatoren "like" oder "in" werden nicht akzeptiert.
    Bei Zugriff auf Datenquellen wie "SQL" ist das kein Problem, da funktioniert das.

    Wenn jemand einen kleinen Schimmer hat warum das so ist oder besser
    wie man das Problem lösen kann, bitte melden.

    Dafür wäre ich sehr dankbar.
    Grüße von CopWorker
     
  5. ukulele

    ukulele Datenbank-Guru

    LIKE arbeitet mit Platzhaltern, wenn du also @param_line = 'asdf' hast und mit LIKE @param_line suchst dann findet er nur die Einträge mit exakt asdf. Du müsstest idealerweise %-Zeichen anhängen, z.B. so
    Code:
    WHERE matVerb.ProdLinCode like '%' + @param_line + '%'
    Bei IN ist es etwas anders, IN erwartet eine Parameterliste. Du kannst aber nicht einfach alle Werte in eine Variable schreiben denn die Variable wird grundsätzlich wie ein Wert behandelt. Natürlich ginge es mit einer Liste von genau einem Parameter aber das ist ja nicht Sinn der Sache.

    Du müsstest hier mit dynamischem SQL arbeiten um Code aus einer Variable als Abfrage an die DB zu senden. Das ist aber nicht ganz trivial und auch Sicherheitstechnisch nicht ungefährlich, da sollte man eventuell auch mit prepared statements arbeiten.
     
  6. CopWorker

    CopWorker Benutzer

    Hallo zusammen,

    ich habe das Problem über die Filter der Dataset-Eigenschaft gelöst.
    Da ist der Operator "In" zulässig. Siehe "dataset_filter.png"
    dataset_filter.PNG
    Der Nachteil ist, dass die kompletten Inhalte der Datenbank ins Dataset geladen wird
    und anschließend gefiltert wird.
    Dauert bei meiner aktuellen Datenbanktabelle mit knapp 2,3 Mio Datensätzen geschätzt 5 - 6 Sekunden.
    Kann ich gerade noch ertragen.

    Vielen Dank nochmal an alle
    Grüße von CopWorker
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden