Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL Query Update funktioniert nicht (https://www.delphipraxis.net/187114-mysql-query-update-funktioniert-nicht.html)

akio87 28. Okt 2015 17:27

Datenbank: MySQL • Version: 5 • Zugriff über: ??

MySQL Query Update funktioniert nicht
 
Hallo,

ich habe festgestellt, dass meine alte Update Funktion, siehe 2. Code, in der BDGrid mit einem Leerem String nicht funktioniert. In der neuen Variante, wo ich dachte, das es dort geht, funktioniert der leere String ebenfalls nicht + Update generell nicht, mit folgender Fehlermeldung:
Error: SQL Syntax...

Habt ihr eine Idee?

NEU:
Code:
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Clear;
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('update `' + Tabelle + '`');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('set ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Firma = :Firma, ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress1 = :Adress1, ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress2 = :Adress2, ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Straße = :Straße, ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('PLZ = :PLZ, ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Ort = :Ort, ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Land = :Land, ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such1 = :Such1 ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such2 = :Such2 ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('where ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Firma = :OLD_Firma and ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress1 = :OLD_Adress1 and ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress2 = :OLD_Adress2 and ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Straße = :OLD_Straße and ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('PLZ = :OLD_PLZ and ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Ort = :OLD_Ort and ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Land = :OLD_Land and ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such1 = :OLD_Such1 and ');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such2 = :OLD_Such2;');

Mein Alter Code: Da ging die Update Funktion. Bis auf einem Leeren String....
Code:
{MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Text := 'update ' + Tabelle + #10 +
                                                            'set' + #10 +
                                                            ' Firma = :Firma,'+ #10 +
                                                            ' Adress1 = :Adress1,'+ #10 +
                                                            ' Adress2 = :Adress2,'+ #10 +
                                                            ' Straße = :Straße,'+ #10 +
                                                            ' PLZ = :PLZ,'+ #10 +
                                                            ' Ort = :Ort,'+ #10 +
                                                            ' Land = :Land,'+ #10 +
                                                            ' Such1 = :Such1,'+ #10 +
                                                            ' Such2 = :Such2'+ #10 +
                                                            'where'+ #10 +
                                                            ' Firma = :OLD_Firma and'+ #10 +
                                                            ' Adress1 = :OLD_Adress1 and'+ #10 +
                                                            ' Adress2 = :OLD_Adress2 and'+ #10 +
                                                            ' Straße = :OLD_Straße and'+ #10 +
                                                            ' PLZ = :OLD_PLZ and'+ #10 +
                                                            ' Ort = :OLD_Ort and'+ #10 +
                                                            ' Land = :OLD_Land and'+ #10 +
                                                            ' Such1 = :OLD_Such1 and'+ #10 +
                                                            ' Such2 = :OLD_Such2';
 }

nahpets 28. Okt 2015 17:39

AW: MySQL Query Update funktioniert nicht
 
fehlt da ein Komma?
Delphi-Quellcode:
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such1 = :Such1 ');
Wie befüllst Du denn die Parameter? (Quellcode dazu?)

Was meinst Du mit 'leere String'?

Wo ist der im geposteten Quelltext zu suchen?

akio87 28. Okt 2015 17:48

AW: MySQL Query Update funktioniert nicht
 
Hallo,

mein Gott hast Du scharfsinnige Augen :D

Das Updaten der Zeilen funktioniert jetzt, Danke deiner Hilfe.

Leider noch keine Leeren Datensätze, also "" Zellen... Mal Angenommen, ich möchte das Adressfeld1 leeren und speichern in der DBGrid. Das wird nicht übernommen.

DBGrid.Datasource -> UniMainModule.DataSource3.Dataset -> mySQLQuery3.UpdateObject -> mySQLUpdateSQL1

Code komplett:
Code:
procedure TfmAdressverwaltung.UniFormShow(Sender: TObject);
begin
  UniButton1.Click;
end;

procedure TfmAdressverwaltung.UniButton1Click(Sender: TObject);
var
  search, Tabelle: String;
begin

  if UniMainModule.RRSuche = True then
   begin
     Tabelle := 'Rechnungsadressen';
   end else
   begin
     Tabelle := 'Lieferadressen';
   end;

  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Clear;
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('update `' + Tabelle + '`');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('set');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Firma = :Firma,');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress1 = :Adress1,');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress2 = :Adress2,');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Straße = :Straße,');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('PLZ = :PLZ,');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Ort = :Ort,');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Land = :Land,');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such1 = :Such1,');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such2 = :Such2');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('where');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Firma = :OLD_Firma and');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress1 = :OLD_Adress1 and');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress2 = :OLD_Adress2 and');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Straße = :OLD_Straße and');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('PLZ = :OLD_PLZ and');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Ort = :OLD_Ort and');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Land = :OLD_Land and');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such1 = :OLD_Such1 and');
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such2 = :OLD_Such2');


  search := '%' + UniEdit1.Text + '%';

  fmstart1.UniMemo1.Lines.Clear;
  fmstart1.UniMemo1.Lines.Text := 'select Firma, Adress1, Adress2, Straße, PLZ, Ort, Land, Such1, Such2 from ' + Tabelle + #10 +
                         'where Ident = ' + IntToStr(UniMainModule.Ident) + #10 +
                         'AND (Firma like '+QuotedStr(search)+' OR Adress1 like '+ QuotedStr(search)+' OR Adress2 like '+ QuotedStr(search)+' OR Straße like '+ QuotedStr(search)+ 'OR PLZ like '+ QuotedStr(search)+ 'OR Ort like '+ QuotedStr(search)+ 'OR Land like '+ QuotedStr(search)+ 'OR Such1 like '+ QuotedStr(search)+ 'OR Such2 like '+ QuotedStr(search)+')';

  UniMainModule.mySQLQuery3.SQL.Text := fmstart1.UniMemo1.Lines.Text;
  UniMainModule.mySQLQuery3.Open;

  UniDBGrid1.Columns[0].Width := 250;
  UniDBGrid1.Columns[1].Width := 100;
  UniDBGrid1.Columns[2].Width := 70;
  UniDBGrid1.Columns[3].Width := 150;
  UniDBGrid1.Columns[4].Width := 50;
  UniDBGrid1.Columns[5].Width := 100;
  UniDBGrid1.Columns[6].Width := 100;
  UniDBGrid1.Columns[7].Width := 100;
  UniDBGrid1.Columns[8].Width := 100;
end;

nahpets 28. Okt 2015 17:53

AW: MySQL Query Update funktioniert nicht
 
Vielleicht, weil leere Datenbankfelder nicht = "" sind sondern Null?

Also müsstest Du ggfls. überall auch noch auf
SQL-Code:
or spalte is Null
abfragen?

akio87 28. Okt 2015 18:08

AW: MySQL Query Update funktioniert nicht
 
Ändert sich etwas, wenn ich in der Datenbank die Spalten "Standard" -> "Kein(e)" anpasse und bei "NULL" den haken entferne?

Hab es zwar gerade getestet, scheint so ohne weiteres nicht zu funktionieren...

Spalten auf Null abfragen? Dies bräuchte ich eigentlich dann nur für "Adress1, Adress2, Such1, Such2"...

Wie baut man sowas jetzt da mit ein? So in etwa:

Code:
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress1 = :Adress1 or spalte is Null');

nahpets 28. Okt 2015 18:11

AW: MySQL Query Update funktioniert nicht
 
jo, genau so, wie in Deinem Beispiel.
Delphi-Quellcode:
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress1 = :Adress1 or Adress1 is Null');

akio87 28. Okt 2015 18:21

AW: MySQL Query Update funktioniert nicht
 
Klappt nur zu hälfte...

jetzt erscheinen "0" in den leeren Zellen...

Jetzt vielleicht etwas in der Datenbank anpassen?

EDIT:
Updatefunktion geht wieder an den stellen nicht. Es bleibt jetzt "0":

Zitat:


MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('update `' + Tabelle + '`');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('set');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Firma = :Firma,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress1 = :Adress1 or Adress1 is Null,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress2 = :Adress2 or Adress2 is Null,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Straße = :Straße,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('PLZ = :PLZ,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Ort = :Ort,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Land = :Land,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such1 = :Such1 or Such1 is Null,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such2 = :Such2 or Such2 is Null');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('where');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Firma = :OLD_Firma and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress1 = :OLD_Adress1 and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress2 = :OLD_Adress2 and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Straße = :OLD_Straße and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('PLZ = :OLD_PLZ and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Ort = :OLD_Ort and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Land = :OLD_Land and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such1 = :OLD_Such1 and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such2 = :OLD_Such2');

nahpets 28. Okt 2015 18:35

AW: MySQL Query Update funktioniert nicht
 
Sorry, da hab' ich wohl was falsch verstanden oder mich ungeschickt ausgedrückt.
Code:
or spalte is null
gehört nur in die Where-Bedingung aber nicht in den Teil, in dem per Set eine Wertzuweisung erfolgt.

In etwa so:
Delphi-Quellcode:
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('update `' + Tabelle + '`');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('set');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Firma = :Firma,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress1 = :Adress1,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress2 = :Adress2,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Straße = :Straße,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('PLZ = LZ,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Ort = :Ort,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Land = :Land,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such1 = :Such1,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such2 = :Such2');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('where');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Firma = :OLD_Firma and');
if :OLD_Adress1 = '' then begin <-- hier natürlich die Variabel abfragen, die dem Parameter :OLD_Adress1 zugewiesen wird.
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress1 is null and');
end else begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress1 = :OLD_Adress1 and');
end;
if :OLD_Adress2 = '' then begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress2 is null and');
end else begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress2 = :OLD_Adress2 and');
end;
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Straße = :OLD_Straße and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('PLZ = :OLD_PLZ and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Ort = :OLD_Ort and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Land = :OLD_Land and');
if :OLD_Such1 = '' then begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such1 = :OLD_Such1 and');
end else begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such1 = :OLD_Such1 and');
end;
if :OLD_Such2 = '' then begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such2 = :OLD_Such2'); Such2 = :OLD_Such2';
end else begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such2 = :OLD_Such2'); Such2 = :OLD_Such2';
end;
Die IF-Abfragen dürfen natürlich nicht auf die Parameter gehen, sondern auf die Variabeln..., deren Werte den Parametern zugewiesen werden.

akio87 28. Okt 2015 19:01

AW: MySQL Query Update funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ah herrje, darauf wäre ich ja nie gekommen :D

Die Eingabe erfolgt ja direkt in der UniDBGrid, screenshot im Anhang.
Das heißt, ich muss für die Variable in der IF Anfrage dierekt die Zelle ansprechen?

Code:
if UniDBGrid1.??????? = '' then begin //<-- hier natürlich die Variabel abfragen, die dem Parameter :OLD_Adress1 zugewiesen wird.
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress1 is null and');
UniDBGrid hat leider keine SelectedField funktion
Code:
DBGrid1.SelectedField.AsString;
Und damit scheint es auch nicht zu funktionieren, bleibt wie gehabt "0" und andere werden dann mit Sntaxfehler angezeigt:
Code:
Query1.FieldByName(Feldname).Asxxx

EDIT: 20:48 Uhr
Hab es nun soweit, dass ich Updaten kann, aber er übernimmt noch immer nicht die Null-Strings:
Code:
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Clear;
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('update `' + Tabelle + '`');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('set');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Firma = :Firma,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress1 = :Adress1,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress2 = :Adress2,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Straße = :Straße,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('PLZ = :PLZ,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Ort = :Ort,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Land = :Land,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such1 = :Such1,');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Such2 = :Such2');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('where');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Firma = :OLD_Firma and');

if MainModule.UniMainModule.mySQLQuery3.FieldByName('Adress1').AsString = '' then begin //<-- hier natürlich die Variabel abfragen, die dem Parameter :OLD_Adress1 zugewiesen wird.
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress1 is null and');
end else begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress1 = :OLD_Adress1 and');
end;

if MainModule.UniMainModule.mySQLQuery3.FieldByName('Adress2').AsString = '' then begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress2 is null and');
end else begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Adress2 = :OLD_Adress2 and');
end;

MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Straße = :OLD_Straße and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('PLZ = :OLD_PLZ and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Ort = :OLD_Ort and');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Land = :OLD_Land and');

if MainModule.UniMainModule.mySQLQuery3.FieldByName('Such1').AsString = '' then begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such1 is null and');
end else begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such1 = :OLD_Such1 and');
end;

if MainModule.UniMainModule.mySQLQuery3.FieldByName('Such2').AsString = '' then begin
  MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such2 is null'); //Such2 = :OLD_Such2';
end else begin
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Add('Such2 = :OLD_Such2'); //Such2 = :OLD_Such2';
end;

akio87 28. Okt 2015 20:17

AW: MySQL Query Update funktioniert nicht
 
Mir fällt gerade auf, sollte es nicht ehr sorum lauten, wenn ich den neuen Wert als NULL definieren will, wenn der String leer ist?

Code:
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL.Clear;
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('update `' + Tabelle + '`');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('set');
MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Firma = :Firma,');

if :Adress1 = '' then
 begin
   MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress1 = NULL,');
 end
else
 begin
   MainModule.UniMainModule.mySQLUpdateSQL1.ModifySQL .Add('Adress1 = :Adress1,');
 end;
Aber wie komme ich an den neuen Wert :Adress1 nach der Eingabe in der DBGrid heran?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.
Seite 1 von 3  1 23      

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