generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
KoBraSoft
Beiträge: 57
Registriert: So 6. Jun 2021, 09:57
OS, Lazarus, FPC: Winux (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit 32 Bit
Kontaktdaten:

generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von KoBraSoft »

Hallo,
ich habe mir einige der restlichen (mir bekannten) Bugs im generatesqldlg vorgenommen.
Ich habe ein kleines Demoprojekt erzeugt und angehängt
Änderungen habe ich in drei Dateien vorgenommen (ibconnection.pp, generatesqldlg.lfm und generatesqldlg.pp)
Die möglicherweise weitreichendste Änderung ist wohl in ibconnection.pp. Ich habe Zeile 1595 von

Code: Alles auswählen

 'r.rdb$field_name ';
in

Code: Alles auswählen

 'r.rdb$field_position'; 
geändert Siehe https://www.firebirdfaq.org/faq174/.
Ich persönlich lege bei Tabellen immer einen Primärschlüssel mit der Bezeichnung "ID" an und möchte ihn bei Auflistungen gerne ganz oben sehen (wie zB bei Flamerobin)

Mit wäre sehr recht wenn sich jemand die Änderungen ansehen könnte, bevor sie im Bugreport vorschlage.
Dateianhänge
gerneratesqldlg.zip
(166.84 KiB) 43-mal heruntergeladen
Konrad

www.KoBraSoft.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von wp_xyz »

Die fehlenden Verankerungen sind schon erledigt: https://gitlab.com/freepascal.org/lazar ... sues/40009. Und ich im patch der Pascal-Datei sehe ich Änderungen, die nicht mehr aktuell sind.

Bitte erzeuge neue Patches bezogen auf die aktuelle Version im Main-Zweig.

KoBraSoft
Beiträge: 57
Registriert: So 6. Jun 2021, 09:57
OS, Lazarus, FPC: Winux (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit 32 Bit
Kontaktdaten:

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von KoBraSoft »

Hier die neuen Patches
generatesqldlg.pp.patch
(2.56 KiB) 45-mal heruntergeladen
ibconnection.pp.patch
(569 Bytes) 43-mal heruntergeladen
Edit:
Noch einer:
generatesqldlg.lfm.patch
(435 Bytes) 47-mal heruntergeladen
Konrad

www.KoBraSoft.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von wp_xyz »

Den generatesqldlg-Patch kann ich übernehmen, aber für den ibconnection-Patch müsstest du einen Bug-Report schreiben, ich kann das nicht beurteilen. Den Bug-Report bitte im FPC-Projekt einreichen, denn elementaren Datenbank-Units gehören dorthin.

Mich stört an dem Dialog noch, dass die Auswahl in der Key- und der Feld-Liste nach jedem Drücken von "Generate SQL" verloren geht - es könnte ja sein, dass man falsche Felder angeklickt hat, und dann muss man beim zweiten Versuch wieder von vorne anfangen. Dazu habe ich mir gedacht, man könnte am Anfang von SetFieldLists die bisher selektierten Feld-Namen in Stringlisten OldSelFields und OldSelKeyFields speichern und nach der Übernahme der Felder aus dem Parameter aFields wieder regenerieren. Etwa so:

Code: Alles auswählen

procedure TGenerateSQLForm.SetFieldLists(aFields: TStrings);

Var
  I,Idx : Integer;
  OldSelFields: TStrings;
  OldSelKeyFields: TStrings;
begin
  OldSelFields := TStringList.Create;
  for I := 0 to LBFields.Items.Count-1 do
    if LBFields.Selected[I] then
      OldSelFields.Add(LBFields.Items[I]);

  OldSelKeyFields := TStringList.Create;
  for I := 0 to LBKeyFields.Items.Count-1 do
    if LBKeyFields.Selected[I] then
      OldSelKeyfields.Add(LBKeyFields.Items[I]);

  if aFields=Nil then
    begin
    LBKeyFields.Items.Clear;
    LBFields.Items.Clear;
    end
  else
    begin
    LBKeyFields.Items:=aFields;
    LBFields.Items:=aFields;
    end;
  if not Assigned(Dataset) then exit;

  For I:=0 to FDataset.FieldDefs.Count-1 do
  begin
    Idx:= OldSelFields.IndexOf(FDataset.FieldDefs[I].Name);
    if Idx>=0 then
      LBFields.Selected[Idx]:=true
    else
    begin
      Idx:=LBFields.Items.IndexOf(FDataset.FieldDefs[i].Name);
      if Idx>=0 then
        LBFields.Selected[Idx]:=true
    end;
  end;
  if LBFields.SelCount = 0 then
    LBFields.SelectAll;

  For I:=0 to FDataset.Fields.Count-1 do
  begin
    Idx := OldSelKeyFields.IndexOf(FDataset.Fields[i].FieldName);
    if Idx>=0 then
      LBKeyFields.Selected[Idx] := true
    else
    begin
      if ((Dataset.UpdateMode=upWhereKeyOnly) and (pfInKey in FDataset.Fields[i].ProviderFlags)) or
         (Dataset.UpdateMode=upWhereAll) then
      begin
        Idx:=LBKeyFields.Items.IndexOf(FDataset.Fields[i].FieldName);
        if (Idx>=0) then
        LBKeyFields.Selected[Idx]:=true;
      end;
    end;
  end;
  if (LBKeyFields.SelCount = 0) and (LBKeyFields.Items.Count > 0) then
    LBKeyFields.Selected[0] := true;

  OldSelFields.Free;
  OldSelKeyFields.Free;
end;
Das funktioniert aber nicht, weil in den beiden Schleifen, in denen der Selected-Zustand ermittelt wird, FDataset.FieldDefs bzw. FDataset.Fields benötigt werden. Diese existieren in dem einfachen Fall deines Test-Projektes jedoch gar nicht, denn die Query ist geschlossen und enthält keine persistenten Felder...

Kannst du dir vorstellen, warum der Autor das so gemacht haben könnte? Ich würde sonst einfach die im Parameter aFields übertragenen Felder verwenden.

KoBraSoft
Beiträge: 57
Registriert: So 6. Jun 2021, 09:57
OS, Lazarus, FPC: Winux (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit 32 Bit
Kontaktdaten:

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von KoBraSoft »

wp_xyz hat geschrieben:
Mi 23. Nov 2022, 19:11
Den generatesqldlg-Patch kann ich übernehmen, aber für den ibconnection-Patch müsstest du einen Bug-Report schreiben, ich kann das nicht beurteilen. Den Bug-Report bitte im FPC-Projekt einreichen, denn elementaren Datenbank-Units gehören dorthin.
Ok, werde ich machen. Da ich in der IbConnection noch ein anderer Bug ist, den ich noch nicht ganz aufgeklärt habe, werde ich dem Einreichen noch warten bis für den zweiten auch einen Vorschlag habe.
Mich stört an dem Dialog noch, dass die Auswahl in der Key- und der Feld-Liste nach jedem Drücken von "Generate SQL" verloren geht - es könnte ja sein, dass man falsche Felder angeklickt hat, und dann muss man beim zweiten Versuch wieder von vorne anfangen.
Das dürfte in der Praxis eher selten vorkommen. Außerdem müsste man dann auch noch den Fall, dass der Nutzer die Tabelle gewechselt hat, berücksichtigen.
Mich stört noch dass ich den "old_" Prefix nicht abwählen kann, wie hier:https://gitlab.com/freepascal.org/lazar ... ratesql.pp Ich komme bis auf weiteres aber nicht dazu das einzubauen.
Das funktioniert aber nicht, weil in den beiden Schleifen, in denen der Selected-Zustand ermittelt wird, FDataset.FieldDefs bzw. FDataset.Fields benötigt werden. Diese existieren in dem einfachen Fall deines Test-Projektes jedoch gar nicht, denn die Query ist geschlossen und enthält keine persistenten Felder...
Das war Absicht, in den meisten Fällen in denen ich diesen Dialog verwende, ist die Query noch leer, deshalb auch die SelectSQL Erzeugung.
Ich bin hald faul und mag es bequem :)
Kannst du dir vorstellen, warum der Autor das so gemacht haben könnte?
Ich vermute er hat den Fall einer leeren Query nicht berücksichtigt. Ist aber reine Spekulation.
Konrad

www.KoBraSoft.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von wp_xyz »

So, jetzt habe ich den Dialog so umgestaltet, dass die Auswahl in den Listboxen bestehen bleibt, aber auch der alte Code ausgeführt wird, falls FieldDefs und Fields vorhanden sind. Außerdem habe ich diese dämliche Exception entfernt, mit der man sich die IDE abschießen kann. Über der Listbox für die Felder gibt es einen Button "All", mit dem man alle Felder auswählen kann. Und ich habe auch alle Strings als Resourcestrings definiert, so dass man den Dialog in andere Sprachen übersetzen kann.

Eine Testversion, inkl. deutscher Übersetzung, liegt bei; man muss nichts installieren (die englische Version erhält man, indem man das Test-Projekt mit Parameter "en" startet). Vielleicht könntest du das mal testen, es sind relativ viele Änderungen und es sollte jemand noch drüberschauen bevor ich das committe.
Dateianhänge
generatesqldlg-wp.zip
(137.1 KiB) 39-mal heruntergeladen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von af0815 »

Sieht gut aus (Win10 64 mit fpc/Lazarus Win32).

Wünsche hätte ich ja genug,
-> Felder in Anführungszeichen: Das ist mir noch nicht begegnet beim erstellen von SQL Statements, dafür aber das man eckige Klammern machen muß/sollte. Beispiel: Ein Feld heißt aus historischen Gründen DateTime, dann muss ich das am Server [DateTime] schreiben, damit es ein gültiger Feldnamen ist (MS-SQL Server).
Damit wäre es sinnvoller zu schreiben Felder in Begrenzer und zwei Zeichen zuzulassen.
Macht keinen Sinn

Code: Alles auswählen

select
  [date[, [prcp[, [pres[, [snow[, [tavg[, [tmax[, [tmin[, [tsun[, [wdir[, 
  [WetterDatenID[, [wpgt[, [wspd[
from [B_WetterDaten[
Das ist ja ok (aber nur bedingt brauchbar)

Code: Alles auswählen

select
  "date", "prcp", "pres", "snow", "tavg", "tmax", "tmin", "tsun", "wdir", 
  "WetterDatenID", "wpgt", "wspd"
from "B_WetterDaten"   
Ok, es gibt da jede Menge an Optimierungsmöglichkeit, da brauch ich nicht mein Maul aufreißen, sondern einfach machen :-)

Danke mal für die Möglichkeit das ganze als Standalone Testmöglichkeit. Hinweis, ich habe stat der IBConnection einen SQLConnector verwendet und zusätzlich einen SQLDBLibraryLoader auf das Formular gebracht, damit kann ich jetzt zwischen den DB-Systemen umschalten und auch die passende dll angeben. Weil mit IB fange ich absolut nichts an.
Edit:
Sieht besser aus

Code: Alles auswählen

select
  [date], [prcp], [pres], [snow], [tavg], [tmax], [tmin], [tsun], [wdir], 
  [WetterDatenID], [wpgt], [wspd]
from [B_WetterDaten] 
Dateianhänge
generatesqldlg-af.zip
Neue Version mit 2 Zeichen als Feldbegrenzer
(9.12 KiB) 42-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

KoBraSoft
Beiträge: 57
Registriert: So 6. Jun 2021, 09:57
OS, Lazarus, FPC: Winux (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit 32 Bit
Kontaktdaten:

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von KoBraSoft »

wp_xyz hat geschrieben:
Mi 23. Nov 2022, 23:22
Über der Listbox für die Felder gibt es einen Button "All", mit dem man alle Felder auswählen kann.
Den Button würde ich durch eine Checkbox ersetzen und standardmäßig auf true setzen, da alle Felder auswählen bei mir in mehr als 90% der Fälle vorkommt und keine Felder in 0%.
Ich bin auch dafür das erste Feld der LBKeyFields standardmäßig zu selektieren.
Konrad

www.KoBraSoft.de

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von Socke »

af0815 hat geschrieben:
Do 24. Nov 2022, 06:50
-> Felder in Anführungszeichen: Das ist mir noch nicht begegnet beim erstellen von SQL Statements, dafür aber das man eckige Klammern machen muß/sollte. Beispiel: Ein Feld heißt aus historischen Gründen DateTime, dann muss ich das am Server [DateTime] schreiben, damit es ein gültiger Feldnamen ist (MS-SQL Server).
Damit wäre es sinnvoller zu schreiben Felder in Begrenzer und zwei Zeichen zuzulassen.
Das hängt tatsächlich von der jeweiligen Datenbank und den dort unterstützten und eingestellten Modus ab. Siehe
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von af0815 »

Die MS-Tools verwenden generell die [] als Standard.

Aber eben wegen dieser verschiedenen 'Standards' :mrgreen: , sollte es sauber Einstellbar sein :-)
Den Button würde ich durch eine Checkbox ersetzen und standardmäßig auf true setzen, da alle Felder auswählen bei mir in mehr als 90% der Fälle vorkommt und keine Felder in 0%.
Bei mir nicht in 90% der Fälle. Ich brauche meistens nur die ersten Felder, weil der Rest ist für die Statistik (oder Fische, je nachdem). Das würde ich mal so lassen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

KoBraSoft
Beiträge: 57
Registriert: So 6. Jun 2021, 09:57
OS, Lazarus, FPC: Winux (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit 32 Bit
Kontaktdaten:

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von KoBraSoft »

Da wir uns gerade in den Standards verzetteln.
Weis jemand in welchen Datenbanken der "old_" Präfix unterstützt wird?
Konrad

www.KoBraSoft.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von af0815 »

KoBraSoft hat geschrieben:
Do 24. Nov 2022, 09:04
Da wir uns gerade in den Standards verzetteln.
Weis jemand in welchen Datenbanken der "old_" Präfix unterstützt wird?
Da war was mit der BDE bei Delphi
Zitat aus https://docwiki.embarcadero.com/RADStud ... _verstehen
Bei einem gelöschten Datensatz gibt es keine neuen Werte, deshalb verwendet die Eigenschaft DeleteSQL die Syntax ":OLD_FieldName".
Ansonsten noch nicht in freier Wildbahn gesehen, weil MS-SQL verwendet virtuelle Tabellen für die Abfrage von Änderungen zB. in Triggern.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von wp_xyz »

KoBraSoft hat geschrieben:
Do 24. Nov 2022, 07:15
Den Button würde ich durch eine Checkbox ersetzen und standardmäßig auf true setzen, da alle Felder auswählen bei mir in mehr als 90% der Fälle vorkommt und keine Felder in 0%.
Wenn der Dialog öffnet oder eine andere Tabelle gewählt wird, sind alle Felder markiert. Wo ist das Problem? Der Button "All" ist nur dafür gedacht, dass man, wenn von einem vorigen Durchlauf nur ein paar Felder markiert sind, schnell alle markieren kann - was ja ganz schön umständlich ist, wenn die Feldliste lang ist. Aber das geht alles mit SHIFT/CTRL-Klick, daher mache ich den Button wahrscheinlich wieder raus.
KoBraSoft hat geschrieben:
Do 24. Nov 2022, 07:15
Ich bin auch dafür das erste Feld der LBKeyFields standardmäßig zu selektieren.
Auch das ist schon der Fall. Aber ich überlege, das wieder rauszunehmen, denn die Feldliste ist alphabetisch sortiert (was ich im Gegensatz zu dir bei langen Feldlisten ganz nützlich finde), und damit ist überhaupt nicht klar, dass das erste Feld der relevante Index ist (und du kannst nicht von allen Usern verlangen, ihre Datenbanken so aufzubauen, dass das Feld mit dem Primärindex das erste ist).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von af0815 »

wp_xyz hat geschrieben:
Do 24. Nov 2022, 10:43
Auch das ist schon der Fall. Aber ich überlege, das wieder rauszunehmen, denn die Feldliste ist alphabetisch sortiert (was ich im Gegensatz zu dir bei langen Feldlisten ganz nützlich finde), und damit ist überhaupt nicht klar, dass das erste Feld der relevante Index ist (und du kannst nicht von allen Usern verlangen, ihre Datenbanken so aufzubauen, dass das Feld mit dem Primärindex das erste ist).
Klassisch wird eine Tabelle so designed, das zuerst die Primary Keys kommen, dann der Rest. Alphabetisch ist ein Horror und macht auch kein professionales Tool das ich kenne. Es wird vielmehr die Reihenfolge aus der Tabellendefinition übernommen. Wenn man das je nach Geschmack ändern kann, soll es auch gut sein.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: generatesqldlg Select Sql wird nicht generiert, Feldsortierung ungünstig, Feldvorauswahl funktioniert nicht

Beitrag von Socke »

af0815 hat geschrieben:
Do 24. Nov 2022, 10:47
Klassisch wird eine Tabelle so designed, das zuerst die Primary Keys kommen, dann der Rest. Alphabetisch ist ein Horror und macht auch kein professionales Tool das ich kenne. Es wird vielmehr die Reihenfolge aus der Tabellendefinition übernommen. Wenn man das je nach Geschmack ändern kann, soll es auch gut sein.
Es gibt auch Datenbanken, bei denen der Primary Key immer mit den ersten Tabellenfeldern anfangen muss.
Ich gehe auch davon aus, dass aufeinanderfolgende Tabellenfelder semantisch näher beieinander sind als die alphabetische Reihenfolge. Buttons für Suche und Sortierung helfen dann bei Bedarf.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten