Neueinsteiger Zeos Mysql

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
mori
Beiträge: 53
Registriert: Di 24. Okt 2006, 08:31
OS, Lazarus, FPC: Winux (L 1.1.xy FPC 2.7.1.z)
CPU-Target: xxBit
Wohnort: Mixdorf
Kontaktdaten:

Neueinsteiger Zeos Mysql

Beitrag von mori »

Hallo zusammen,
nun war ich ein paar Tage nicht mehr online, da ich mich um Haus und Hof kuemmern musste...
Momentan habe ich folgendes Problem:
Mittels ComboBox rufe ich verschiedene SQL-Abfragen ab. Das klappt auch wunderbar.
Auch der Wechsel ueber mehrere Tabellen funktioniert problemlos.
Aber: Sobald ich sortiert habe, findet ZQuery die Felder nicht mehr.
So sortiere ich:

Code: Alles auswählen

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  st:ZAbstractRODataset.TSortType;
begin
  st:=ZReadOnlyQuery1.SortType;
  ZReadOnlyQuery1.SortedFields:=Column.FieldName;
  If st = stAscending then ZReadOnlyQuery1.SortType:=stDescending else ZReadOnlyQuery1.SortType:=stAscending;
  DataSource1.DataSet.First;
end;
Und hier zur Uebersicht meine ComboBox (hier wird auch automatisch ueber ZQuery, Zconnect connected):

Code: Alles auswählen

procedure TForm1.SqlComboBoxChange(Sender: TObject);
begin
  If (SqlComboBox.Items.Count>0) and (SqlComboBox.ItemIndex>-1) then
  begin
    DBGrid1.Visible:=False;
    ZReadOnlyQuery1.Close;
    case SqlComboBox.ItemIndex of
      0: ZReadOnlyQuery1.SQL.Text:='SELECT DISTINCT x,y,z FROM test1';       // Das sind im Original sehr komplexe Abfragen!
      1: ZReadOnlyQuery1.SQL.Text:='SELECT DISTINCT a,b,c FROM auchwas';
      2: ZReadOnlyQuery1.SQL.Text:='SELECT w,e,r,t FROM naja';
      3: ZReadOnlyQuery1.SQL.Text:='SELECT NUMMER,NAME,STRASSE,PLZ,ORT,TELEFON FROM heimat';
    end;
    try
      ZReadOnlyQuery1.Open;
    except
      ShowMessage('Kein Connect, oder fehlerhafte SQL-Abfrage!');
      Form1.Close;
    end;
    DBGrid1.Visible:=True;
  end;
end;
Vermutlich muss ich vor einer erneuten Abfrage aufraeumen, Aber wo und was genau?
Bin fuer jeden Tip dankbar!

MfG Th. Moritz
Zuletzt geändert von mori am Do 19. Apr 2012, 15:19, insgesamt 2-mal geändert.

MmVisual
Beiträge: 1579
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Neueinsteiger Zeos Mysql

Beitrag von MmVisual »

Kannst du mal sowas rein machen:

Code: Alles auswählen

try
    ZReadOnlyQuery1.Open;
  except
    On E: Exception do
    begin
      ShowMessage('Kein Connect, oder fehlerhafte SQL-Abfrage!'#13#10 + E.Message);
      Form1.Close;
    end;
  end;
Und schreiben was in der Bog dann steht?
EleLa - Elektronik Lagerverwaltung - www.elela.de

mori
Beiträge: 53
Registriert: Di 24. Okt 2006, 08:31
OS, Lazarus, FPC: Winux (L 1.1.xy FPC 2.7.1.z)
CPU-Target: xxBit
Wohnort: Mixdorf
Kontaktdaten:

Re: Neueinsteiger Zeos Mysql

Beitrag von mori »

MmVisual hat geschrieben:Kannst du mal sowas rein machen:

Code: Alles auswählen

try
    ZReadOnlyQuery1.Open;
  except
    On E: Exception do
    begin
      ShowMessage('Kein Connect, oder fehlerhafte SQL-Abfrage!'#13#10 + E.Message);
      Form1.Close;
    end;
  end;
Und schreiben was in der Bog dann steht?
OK, erstmal Danke, dass Du Dir den Kram anschaust :-)

ZReadOnlyQuery1: Field not found: "ORT"

Nach ORT hatte ich zuvor sortieren lassen und wollte mir dann ein anderes Select ueber andere Tabellen anzeigen lassen.
Nach dem Sortieren muss ich vmtl. irgendwas aufraeumen. Leider komme ich seit 2 Tagen nicht weiter...

MfG Th. Moritz

MmVisual
Beiträge: 1579
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Neueinsteiger Zeos Mysql

Beitrag von MmVisual »

Ja, genau aufräumen....

ZReadOnlyQuery1.SortedFields := '';
EleLa - Elektronik Lagerverwaltung - www.elela.de

mori
Beiträge: 53
Registriert: Di 24. Okt 2006, 08:31
OS, Lazarus, FPC: Winux (L 1.1.xy FPC 2.7.1.z)
CPU-Target: xxBit
Wohnort: Mixdorf
Kontaktdaten:

Re: Neueinsteiger Zeos Mysql

Beitrag von mori »

Du bist der Groesste!
Vielen Dank!

MfG Th. Moritz

mori
Beiträge: 53
Registriert: Di 24. Okt 2006, 08:31
OS, Lazarus, FPC: Winux (L 1.1.xy FPC 2.7.1.z)
CPU-Target: xxBit
Wohnort: Mixdorf
Kontaktdaten:

Re: Neueinsteiger Zeos Mysql

Beitrag von mori »

Hallo zusammen,
nun habe ich das naechste Problem an der Backe...
Hier lokal mit meinen 20000 Datensaetzen klappt das Wechseln der Abfragen wunderbar.
Auf dem Produktiv-Server liegen aber mehrere 100000 Datensaetze. Ab einer bestimmten
Menge an Antworten vom Server bricht mein Tool zusammen, wenn ich die naechste Abfrage starte.
Ich muss also sinnvoller Weise alle bisherigen Daten loeschen, bevor ich die naechste Abfrage
starte. Mit .free knall ich die Instanzen weg, also muss ich feinfuehliger rangehen.
Was waere der beste und gruendlichste Weg? Ich denke, die folgenden Objekte muss ich
komplett leeren:

ZReadOnlyQuery -> Dataset ?
Datasource ?
DBGrid ?

MfG Th. Moritz

mori
Beiträge: 53
Registriert: Di 24. Okt 2006, 08:31
OS, Lazarus, FPC: Winux (L 1.1.xy FPC 2.7.1.z)
CPU-Target: xxBit
Wohnort: Mixdorf
Kontaktdaten:

Re: Neueinsteiger Zeos Mysql

Beitrag von mori »

Ich schreibe mir mal selbst :-)

Sollte das nicht eigentlich reichen?

Code: Alles auswählen

ZReadOnlyQuery1.ClearFields;
Ups, gerade neu gebaut -> Exception in ZDbCache.
Nun bin ich wieder ratlos...

MfG Th. Moritz

MmVisual
Beiträge: 1579
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Neueinsteiger Zeos Mysql

Beitrag von MmVisual »

Was wird denn alles im Quellcode extra gesetzt?

die diese 4 Abfragen würde ich 4 verschiedene Queries nehmen, und jeweils verbunden mit dem einen DataSource. Damit hat man das erreicht:

- Sortierung muss nicht gelöscht werden und bleibt für die nächste Auswahl erhalten
- Nichts muss aufgeräumt werden
- Das DBGrid zeigt einfach die Daten der anderen Query.

Die Zuweisung Datasource.Dataset := ZQueryxyz kann jederzeit irgendwo im Quellcode gemacht werden.
EleLa - Elektronik Lagerverwaltung - www.elela.de

mori
Beiträge: 53
Registriert: Di 24. Okt 2006, 08:31
OS, Lazarus, FPC: Winux (L 1.1.xy FPC 2.7.1.z)
CPU-Target: xxBit
Wohnort: Mixdorf
Kontaktdaten:

Re: Neueinsteiger Zeos Mysql

Beitrag von mori »

Hallo MmVisual,

im Quellcode wird bisher noch nichts extra gesetzt! Bin ja noch am Anfang [1].
Es geht hier auch nicht um 4 Abfragen, sondern inzwischen knapp 20 (zunehmend!).
Diese Abfragen beinhalten viele Verknuepfungen mit
INNER JOIN, LEFT JOIN usw. + WHERE SELECT MAX(...) AND ...uvm.
... und erstrecken sich ueber viele verschiedene Tabellen pro Query.

Waere es nicht einfacher, die alte Query samt Daten/Cache loszuwerden und neu zu initialisiern?
Leider stehe ich an diesem Punkt voellig auf dem Schlauch.
Egal, welchen Versuch ich starte: Exception in ZDbCache...
Ich ging urspruenglich davon aus, das zeos dies intern klaert.

[1] moechte ich hier eigentlich vorerst nicht ansprechen :-(
Heute habe ich eine auszuwertende Tabelle gefunden, die nicht indiziert ist!
Gibt es eigentlich eine Moeglichkeit beim Einlesen lokal im Dataset zu indizieren?
Auf dem Server darf ich nichts aendern! Auch nicht ausversehen!
Dazu werde ich notfalls eine separate Anfrage ans Forum stellen, sollte ich inzwischen
in den MySQL-Referenzen nicht fuendig werden.

MfG Th. Moritz

EgonHugeist
Beiträge: 93
Registriert: Di 17. Apr 2012, 22:41

Re: Neueinsteiger Zeos Mysql

Beitrag von EgonHugeist »

Mori, unter Experten :)

Mir schein irgend eines deiner Controls ist via DataSource mit dem Zeos.DataSet verknüpft. Änders du deine Abfragen, solltest du auch deine Felder innerhalb deiner cases berücksichtigen. Zeos kann in dem Fall nix dafür. Die Unit db greift nun auf Zeos zu, nachdem das DataSet(TZReadOnlyQuery, TZQuery, TZTable..) wieder geöffnet wurde. Alle von den Controls belegten Felder versuchen sich nun ihre Daten zu holen. Was passiert denn nun, wenn eines der von dir verwendeten Felder der Controls nicht mehr verfügbar ist? Rein aus Neugier :D . Schau doch einfach mal welche Controls mit den Feldern belegt sind, welche dir hier angemahnt werden. Kann sein das es einfach je nach Abfrage mehr nicht mehr verfügbare sein werden...

Was den Cache angeht liegst du richtig. Aber was hat der denn mit deinem Problem zu tun? Veränderbare DataSets wie TZQuery und TZTable sind gecached, um deine Veränderungen aufzunehmen/vergleichen und ultraschall schnelle nicht Server-Request basierende Filter- oder Sortier-Funktionen zu bieten.

Michael
ZeosDevTeam

mori
Beiträge: 53
Registriert: Di 24. Okt 2006, 08:31
OS, Lazarus, FPC: Winux (L 1.1.xy FPC 2.7.1.z)
CPU-Target: xxBit
Wohnort: Mixdorf
Kontaktdaten:

Re: Neueinsteiger Zeos Mysql

Beitrag von mori »

Hallo EgonHugeist
wenn ich richtig liege, dann kommt mir der Name von Zeos bekannt vor?
Mir schein irgend eines deiner Controls ist via DataSource mit dem Zeos.DataSet verknüpft.


Ja genau. DataSource1 -> ZReadOnlyQuery1
Änders du deine Abfragen, solltest du auch deine Felder innerhalb deiner cases berücksichtigen.


Vielleicht verstehe ich Dich hier nicht richtig...
In meinem Fall sollte eine neue Abfrage nichts mit der vorhergenden zu tun haben.
(Neue Abfrage = neue Tabellen, neue Felder)
Daher ging ich von einem Aufraeumproblem aus. Alte Daten weg - neue, komplett andere Abfrage.
Zeos kann in dem Fall nix dafür. Die Unit db greift nun auf Zeos zu, nachdem das DataSet(TZReadOnlyQuery, TZQuery, TZTable..) wieder geöffnet wurde. Alle von den Controls belegten Felder versuchen sich nun ihre Daten zu holen.


Genau hier liegt imho das Problem! Die vorher belegten Felder gibt es teilweise nicht mehr!
Was passiert denn nun, wenn eines der von dir verwendeten Felder der Controls nicht mehr verfügbar ist? Rein aus Neugier :D . Schau doch einfach mal welche Controls mit den Feldern belegt sind, welche dir hier angemahnt werden. Kann sein das es einfach je nach Abfrage mehr nicht mehr verfügbare sein werden...
OK, ich versuche hier die Verbindungen darzustellen:

ZReadOnlyQuery1:
Connection -> ZConnection1
DataSource '' //leer

DataSource1:
DataSet -> ZReadOnlyQuery1

DBGrid1:
DataSource -> DataSource1

Wie schon geschrieben, habe ich das Problem nur bei groesseren Datenmengen.
Hier lokal mit 20000 Datensaetzen, wo pro Abfrage mal 500 Zeilen kommen,
rennt alles prima!

MfG Th. Moritz

EgonHugeist
Beiträge: 93
Registriert: Di 17. Apr 2012, 22:41

Re: Neueinsteiger Zeos Mysql

Beitrag von EgonHugeist »

mori hat geschrieben:Hallo EgonHugeist
wenn ich richtig liege, dann kommt mir der Name von Zeos bekannt vor?
Na sowas, grins, wird doch wohl kein Doppelgänger sein? :lol: (Siehe Signatur)
mori hat geschrieben:Genau hier liegt imho das Problem! Die vorher belegten Felder gibt es teilweise nicht mehr!
Nun wird es kompliziert dir DIE Lösung die du hier brauchst in irgendeiner Art zu präsentieren. Da das Problem einzig bei dir und den bereits geschaffenen Verknüpungen liegen kann. Egal was du über Zeos versuchst aufzuräumen, die Controls greifen über die Unit Db auf Zeos zu. Soll heißen: irgendein verflixtes Control/Field/GridColumn irgendwas ist da über die DataSource verknüpft. Kappst du die Verbindung DS.DataSource := nil; sollte alles in Ordnung sein, nur nicht, wenn du Felder angelegt hast.

Also nochmal: Schau dir genau an was alles mit der DataSource gekoppelt ist. Hast du Fields angelegt, wenn ja, überlege dir, ob du die wirklich brauchst, schmeiß sie raus. Hast du im Grid Columns angelegt? Selbe Antwort. Sind Edit's verknüpft dann pass auf, das die Felder die deine nächste Query zum Vorschein bringt, diese unterstützt usw...

Alle Antworten liegen ganz klar auf deinem Formular und nirgendwo anders, haben auch nix mit großen Mengen zu tun. Bsp. von mir und einer meiner kleinen Firmen: ca. 300.000 lese und Schreibaktionen/Tag importe von 10.000 MasterRows mit diversen Child-Tables mit joins usw. jeden Morgen. Mit allem was man da halt so braucht. Habe auch da Zeos7 im Einsatz... Habe da schon diverse Server geschaft (alle 100.000 DS mal ein sleep(10000) damit der Luft holen kann, warum auch immer), aber Zeos noch nicht.

Und meiner Meinung nach kann dir da so wirklich keiner helfen...
Oder vielleicht denkst du besser nochmal über die Architektur deine App nach?

Michael
ZeosDevTeam

mori
Beiträge: 53
Registriert: Di 24. Okt 2006, 08:31
OS, Lazarus, FPC: Winux (L 1.1.xy FPC 2.7.1.z)
CPU-Target: xxBit
Wohnort: Mixdorf
Kontaktdaten:

Re: Neueinsteiger Zeos Mysql

Beitrag von mori »

Hallo EgonHugeist
Alle Antworten liegen ganz klar auf deinem Formular und nirgendwo anders,
Und meiner Meinung nach kann dir da so wirklich keiner helfen...
Oder vielleicht denkst du besser nochmal über die Architektur deine App nach?
Kurz und knapp, hier der Code zur App:
Nur die "SELECT" habe ich gekuerzt und die Anzahl reduziert.
Das Ganze ist eigentlich so simpel...
Aber auch hier kann ein Fehler drin sein, den ich staendig uebersehe.
Ab einer Zeilenanzahl > 5000 dauert das Sortieren > 5 Sek. bei 100% CPU.

Code: Alles auswählen

unit abfrage;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, db, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  DBGrids, ActnList, ZConnection, ZDataset, ZAbstractRODataset;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    ButtonClose: TButton;
    Memo1: TMemo;
    SqlComboBox: TComboBox;
    Datasource1: TDatasource;
    DBGrid1: TDBGrid;
    LabelSql: TLabel;
    ZConnection1: TZConnection;
    ZReadOnlyQuery1: TZReadOnlyQuery;
    procedure ButtonCloseClick(Sender: TObject);
    procedure SqlComboBoxChange(Sender: TObject);
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
 
procedure TForm1.SqlComboBoxChange(Sender: TObject);
begin
  If (SqlComboBox.Items.Count>0) and (SqlComboBox.ItemIndex>-1) then
  begin
    DBGrid1.Visible:=False;
    ZReadOnlyQuery1.Close;
    ZReadOnlyQuery1.SortedFields := '';
    case SqlComboBox.ItemIndex of
      0: ZReadOnlyQuery1.SQL.Text:='SELECT DISTINCT ...';
      1: ZReadOnlyQuery1.SQL.Text:='SELECT DISTINCT ...';
      2: ZReadOnlyQuery1.SQL.Text:='SELECT DISTINCT ...';
      3: ZReadOnlyQuery1.SQL.Text:='SELECT NUMMER,NAME,STRASSE,PLZ,ORT,TELEFON FROM platz';
     //[...cut...]
    end;
    try
      ZReadOnlyQuery1.Open;
    except
      On E: Exception do
      begin
        ShowMessage('Fehlerhafte SQL-Abfrage!'#13#10 + E.Message);
        Form1.Close;
      end;
    end;
    DBGrid1.Visible:=True;
    //Showmessage('Anzahl Zeilen: '+IntToStr(DBGrid1.DataSource.DataSet.RecordCount));
  end;
end;
 
procedure TForm1.ButtonCloseClick(Sender: TObject);
begin
  ZConnection1.Connected:=False;
  DataSource1.DataSet.Close;
  DBGrid1.Clear;
  Form1.Close;
end;
 
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  st:ZAbstractRODataset.TSortType;
begin
  st:=ZReadOnlyQuery1.SortType;
  ZReadOnlyQuery1.SortedFields:=Column.FieldName;
  If st = stAscending then ZReadOnlyQuery1.SortType:=stDescending else ZReadOnlyQuery1.SortType:=stAscending;
  DataSource1.DataSet.First;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.Visible:=False;
  ZConnection1.Properties.Clear;
  ZConnection1.Properties.Add('codepage=utf8');
  try
    ZConnection1.Connect;
  except
    ShowMessage('Kein Connect zum Server!');
    Form1.Close;
  end;
end;
 
end.
MfG Th. Moritz

EgonHugeist
Beiträge: 93
Registriert: Di 17. Apr 2012, 22:41

Re: Neueinsteiger Zeos Mysql

Beitrag von EgonHugeist »

Zum Sortieren: Benutz du da String Felder?

Zum Quellcode:

der Schlüssel liegt in der *.lfm ..... nicht hier.
ZeosDevTeam

EgonHugeist
Beiträge: 93
Registriert: Di 17. Apr 2012, 22:41

Re: Neueinsteiger Zeos Mysql

Beitrag von EgonHugeist »

Kann so nix weiter erkennen. Hast to Columns im Grid angelegt? Um Größen zu ändern oder so? -> .lfm

Kenn mich jetzt weniger mit dem Verhalten von LCL aus, aber was passiert, wenn du das Grid nicht verbirgst und wieder sichtbar machst? Warum überhaupt?
ZeosDevTeam

Antworten