grbennemsi 0 Geschrieben 4. Oktober 2022 Melden Teilen Geschrieben 4. Oktober 2022 Ich habe eine DateTable aus einer SQL Abfrage erstellt. in dieser sind diverse Namen und Adresse von Kursteilnehmern enthalten. Zusätzlich ist das Datum vom Kursstart in DateTime enthalten. Ich möchte die DateTable jetzt Filtern, so das nur noch Einträge mit einem grösser oder gleichem Datum wie heute ersichtlich sind. $OpenTable2= $OpenTable| Where-Object{$_.EventStart -ge[datetime]::today} Ich bekomme jedoch immer die Fehlermeldung: InvalidOperation: Cannot compare “” because it is not IComparable. Aus meiner Sicht müssten beide Werte als DateTime und nicht als String vorliegen. Wenn ich mit *getType() nachschaue, zeigt es mir auch DateTime an. Mit andern Tebllen hatte ich dieses Problem nicht. Liegt es eventuelle am Objekt DataTable? Hat jemand noch eine Idee? Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 4. Oktober 2022 Melden Teilen Geschrieben 4. Oktober 2022 Georg, Willkommen im MCSEboard. Die leeren Anführungszeichen in der Fehlermeldung deuten darauf hin, dass die Eigenschaft, die Du benutzen möchtest, leer ist. (oder hast Du die nur hier für das Forum entfernt?) Zitieren Link zu diesem Kommentar
grbennemsi 0 Geschrieben 5. Oktober 2022 Autor Melden Teilen Geschrieben 5. Oktober 2022 Mit dem $_.EventStart verweise ich auf auf das Startdatum des Kurses in der Variable $OpenTable. Wenn ich $OpenTable.EventStart eingebe bekomme ich ja alle Daten aus der Tabelle. Ich weiss nicht ob ich die Funktion $_. richtig begriffen habe. Hier ein Ausschnitt aus meiner Tabelle die ich von einer SQL Datenbank beziehe. EventStart und EventEnd sind als DataTime und nicht als String gespeichert: Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 5. Oktober 2022 Melden Teilen Geschrieben 5. Oktober 2022 Evtl. fehlt nur ein leerzeichen nach "-ge". Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 5. Oktober 2022 Melden Teilen Geschrieben 5. Oktober 2022 (bearbeitet) vor einer Stunde schrieb Dukel: Evtl. fehlt nur ein leerzeichen nach "-ge". Ich glaub, das ist nur ein Fehler vom Hier-Her-Kopieren. vor 3 Stunden schrieb grbennemsi: Mit dem $_.EventStart verweise ich auf auf das Startdatum des Kurses in der Variable $OpenTable. Die Fehlermeldung lässt ja leider Raum für Interpretation. Vielleicht ist auch das "[datetime]::today" die Ursache. Versuch doch stattdessen mal "$((Get-Date).Date)". Wenn das auch nix bringt ... vielleicht baust Du Deinen Code ein bissl um, um das Error-Handling zu erleichtern. Statt des "Where-Object" eine Schleife benutzen und die jeweiligen Variablen-Inhalte und -Typen ausgeben. vor 15 Stunden schrieb grbennemsi: Aus meiner Sicht müssten beide Werte als DateTime und nicht als String vorliegen. Wenn ich mit *getType() nachschaue, zeigt es mir auch DateTime an. Mit andern Tebllen hatte ich dieses Problem nicht. Liegt es eventuelle am Objekt DataTable? Hat jemand noch eine Idee? Vielleicht zeigst Du uns etwas mehr von Deinem Code ... 'ist manchmal leichter, wenn man ein bissl Kontext hat. bearbeitet 5. Oktober 2022 von BOfH_666 Zitieren Link zu diesem Kommentar
grbennemsi 0 Geschrieben 5. Oktober 2022 Autor Melden Teilen Geschrieben 5. Oktober 2022 (bearbeitet) Ich habe folgendes herausgefunden: Bei der DataTable wird immer Rows für zeile nach dem ersten Punkt hinzugefügt. Wenn ich den Code wie folgt eingebe: $OpenTable2 = $OpenTable | Where-Object {$_.Rows.EventStart -ge [datetime]::today} Dann wird die Fehlermeldung nicht mehr ausgegeben. Leider funktioniert die Filterung immer noch nicht richtig. Die Operatoren -le und -lt funktionieren. Bei den andern Operatoren bleibt die Variable $OpenTable2 leer. Hier noch mein ganzer Script: # Function SQL-Querry . .\Perform-SQL.ps1 # Path to SQL Query $SQLPath = '.\QueryTest.sql' # SQL Query $Query = Get-Content $SQLPath # Path to Data $DataPath = '.\data' # Read SQL Table in SeMI $OpenTable = Perform-SQL -sqlHost SVXXXXXXXX -DB seXXXXXX -SqlQuery $Query # Load all entries that start after today's date. $OpenTable2 = $OpenTable | Where-Object {$_.Rows.EventStart -ge [datetime]::today} Ich filtere bewusst nicht schon im SQL Query, da diese Datenbank sehr speziell aufgebaut ist und mir die Zeit fehlt mich reinzudenken. bearbeitet 5. Oktober 2022 von grbennemsi Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 5. Oktober 2022 Melden Teilen Geschrieben 5. Oktober 2022 vor 7 Minuten schrieb grbennemsi: Die Operatoren -le und -lt funktionieren. Bei den andern Operatoren bleibt die Variable $OpenTable2 leer. Das hört sich ziemlich unwahrscheinlich an. Besteht die Möglichkeit, dass die Operatoren doch richtig funktionieren? ... also, dass es einfach keine Einträge gibt, die aktuell genug sind? Zitieren Link zu diesem Kommentar
grbennemsi 0 Geschrieben 5. Oktober 2022 Autor Melden Teilen Geschrieben 5. Oktober 2022 Ich habe schon folgendes probiert: $GetDate = (Get-Date). AddYears(-1) $OpenTable2 = $OpenTable | Where-Object {$_.Rows.EventStart -ge $GetDate} Dies sollte ja das Datum vor einem Jahr in die Variable $GetDate laden. leider ohne Erfolg. In der Tabelle habe ich Daten bis ins Jahr 2023: Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 5. Oktober 2022 Melden Teilen Geschrieben 5. Oktober 2022 vor 15 Minuten schrieb grbennemsi: Dies sollte ja das Datum vor einem Jahr in die Variable $GetDate laden. leider ohne Erfolg. In der Tabelle habe ich Daten bis ins Jahr 2023: Dann zitiere ich mich mal selbst ... vor 3 Stunden schrieb BOfH_666: Wenn das auch nix bringt ... vielleicht baust Du Deinen Code ein bissl um, um das Error-Handling zu erleichtern. Statt des "Where-Object" eine Schleife benutzen und die jeweiligen Variablen-Inhalte und -Typen ausgeben. Zitieren Link zu diesem Kommentar
grbennemsi 0 Geschrieben 5. Oktober 2022 Autor Melden Teilen Geschrieben 5. Oktober 2022 Ich habe jetzt folgendes gemacht. Das Datatable Objekt in ein System.Array geladen. Braucht jedoch viel mehr Speicher. Jetzt kommt die Fehlermeldung wieder. Ich werde die Funktion wie von dir empfohlen, in einer Schleife abarbeiten. Mal schauen was es dann ausgibt. Zitieren Link zu diesem Kommentar
testperson 1.707 Geschrieben 5. Oktober 2022 Melden Teilen Geschrieben 5. Oktober 2022 Die Kursteilnehmer würden sich sicherlich freuen, wenn du die "PrivateZip" und die "PrivateStreet" unkenntlich machen würdest. 1 Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 5. Oktober 2022 Melden Teilen Geschrieben 5. Oktober 2022 Bei mir funktioniert das: $GetDate = (Get-Date).AddYears(-1) Write-Host $GetDate 05.10.2021 19:15:01 Du hast das Leerzeichen nach dem . im Original ganz sicher NICHT drin? Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben 6. Oktober 2022 Melden Teilen Geschrieben 6. Oktober 2022 Ich weise mal behutsam darauf hin, daß Datatables (falls das als Return-Typ in der SQL-Query verwendet wird) von PS automatisch in Arrays konvertiert werden. Ansonsten sind mir hier zu viele unklare Leerzeichen im Spiel Zitieren Link zu diesem Kommentar
grbennemsi 0 Geschrieben 7. Oktober 2022 Autor Melden Teilen Geschrieben 7. Oktober 2022 Die Datatable wird als DataTable (System.ComponentModel.MarshalByValueComponent) Objekt in Powershell geladen. PS D:\OneDrive\10 Programmieren\Powershell\Ad User aus SeMI> $OpenTable.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True DataTable System.ComponentModel.MarshalByValueComponent Ich kann sie jedoch mit Select-Object in ein Array umwandeln. Dazu muss ich nur die gewünschten Spalten aussuchen. $OpenTable = $OpenTable | Select-Object FirstName, LastName, Firma, Mitarbeiter, ... Jetzt wird es als System.Array angegeben. PS D:\OneDrive\10 Programmieren\Powershell\Ad User aus SeMI> $OpenTable.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array Für den Zugriff auf die SQL Daten benutze ich folgende Funktion: # Function for the SQL query function Perform-SQL { Param( [string]$sqlHost, [string]$DB, [string]$SqlQuery, [string]$User, [string]$Password ) if (($User) -and ($Password)) { $connectionParam = "Data Source=$sqlHost;User ID=$User;Password=$Password;Initial Catalog=$DB" } else { $connectionParam = "Data Source=$sqlHost;Integrated Security=SSPI;Initial Catalog=$DB" } $sqlconnection = new-object system.data.SqlClient.SQLConnection($connectionParam) $command = new-object system.data.sqlclient.sqlcommand($sqlQuery,$sqlconnection) $sqlconnection.Open() $sqlDataAdapter = New-Object System.Data.sqlclient.sqlDataAdapter $command $dataset = New-Object System.Data.DataSet $sqlDataAdapter.Fill($dataSet) | Out-Null $sqlconnection.Close() $dataSet.Tables } Diese erstellt ein DataTable (System.ComponentModel.MarshalByValueComponent) Objekt. Eventuell sollte ich hier die Funktion ändern. Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 7. Oktober 2022 Melden Teilen Geschrieben 7. Oktober 2022 Andere frage. Wieso baust du das nicht in dein SQL Query ein? Dann bekommst du nur die Einträge, die du brauchst. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.