Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Umstellung Paradox ->Firebird die 2. (https://www.delphipraxis.net/47581-umstellung-paradox-firebird-die-2-a.html)

BrunoT 13. Jun 2005 14:29

Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos

Umstellung Paradox ->Firebird die 2.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DP'ler,

ich habe es nun geschafft, mit den Datensteuerungskomponenten auf die Datenbank zuzugreifen. aber die Daten editieren kann ich nicht. Ich habe schon eine Kompo TZUpdateSQL eingefügt und mit dem TZQuery verbunden, dann die SQL-Statements über den Generator erstellen lassen.

Aber der DB-Navigator lässt nur ein Navigieren zu.
Wie erreiche ich, dass ich in die DBEdit-Kompos was eintragen kann und dann speichern?

Auch arbeitet meine Filterbedingung nun nicht mehr( durch TabControl gesteuert):

Delphi-Quellcode:
procedure TFinanzaemter.TabChange(Sender: TObject);
var
  F: string;
begin
  begin
    if tab.tabindex = 26 then
      ZQFinanzamt.Filtered := false
    else
    begin
      F := format('Name = ''%s*''', [chr(Tab.TabIndex + 65)]);

      ZQFinanzamt.Filtered := false; //TZQuery
      ZQFinanzamt.Filter := F;
      ZQFinanzamt.Filtered := True;
    end;
  end;
end;
Muss ich hier von TZQuery die SQL-Anweisung ändern?

Ich wollte nicht TZTable verwenden, da ich später von embedded Server auf den richtigen Server umstellen will.

Ich habe schon in der DP gesucht, aber nichts entsprechendes gefunden.(bzw so viele Antworten)

mfg

BrunoT

BrunoT 13. Jun 2005 15:02

Re: Umstellung Paradox ->Firebird die 2.
 
Hallo,

für das eine Problem habe ich die Antwort bei sourceforge.net gefunden:

Im ZQuery muss die Property RequestLive auf True gesetzt werden(warum nicht Standard)?
Bleibt noch die Frage, wie ich das mit dem Filter löse.
Außerdem habe ich gelesen, dass der Befehl
SQL-Code:
select * from Finanzamt
ungünstig im Client/Server - Betrieb ist, da die ganze Tabelle zum Clienten kopiert wird.
Wie löst man das für mein Beispiel, da ich ja über die Tabelle browse?

Zu Beginn baue ich eine TStringlist auf, um den Suchvorgang über den Namen zu beschleunigen, da würde sicherlich ausreichen
wenn ich
SQL-Code:
select Name from Finanzamt
abfrage.
Kann ich denn einfach in der Laufzeit die SQL-Abfrage in TZQuery ändern?

mfg

BrunoT

marabu 13. Jun 2005 15:57

Re: Umstellung Paradox ->Firebird die 2.
 
Hallo Bruno,

Zitat:

Zitat von BrunoT
Bleibt noch die Frage, wie ich das mit dem Filter löse.

als Vorlage für deine Query wäre das hier wohl geeignet:

Delphi-Quellcode:
resourcestring
  FMT_FINANZAMT = 'SELECT id ... FROM tabelle WHERE name like ''%s%%'' ORDER BY %s';
Wenn du deine Daten on-demand besorgst, brauchst du nichts zu selektieren außer dem primary key. Wenn nicht, dann solltest du die benötigte Feldliste ergänzen. Die WHERE Klausel nimmt deine Filterbedingungen auf und die ORDER-BY Klausel spiigelt die Einstellungen deiner Benutzeroberfläche wieder. Immer, wenn der Benutzer die Sortierung oder ein Filterkriterium ändert, dann generierst du mit Format(FMT_FINANZAMT, [...]) das passende SQL-Statement und aktualisierst deine Query.

Grüße vom marabu

GuenterS 13. Jun 2005 16:01

Re: Umstellung Paradox ->Firebird die 2.
 
Zitat:

Zitat von marabu
Hallo Bruno,

Zitat:

Zitat von BrunoT
Bleibt noch die Frage, wie ich das mit dem Filter löse.

als Vorlage für deine Query wäre das hier wohl geeignet:

Delphi-Quellcode:
resourcestring
  FMT_FINANZAMT = 'SELECT id ... FROM tabelle WHERE name like ''%s%%'' ORDER BY %s';
Wenn du deine Daten on-demand besorgst, brauchst du nichts zu selektieren außer dem primary key. Wenn nicht, dann solltest du die benötigte Feldliste ergänzen. Die WHERE Klausel nimmt deine Filterbedingungen auf und die ORDER-BY Klausel spiigelt die Einstellungen deiner Benutzeroberfläche wieder. Immer, wenn der Benutzer die Sortierung oder ein Filterkriterium ändert, dann generierst du mit Format(FMT_FINANZAMT, [...]) das passende SQL-Statement und aktualisierst deine Query.

Grüße vom marabu

Wieso eigentlich als resourcestring?

Ich hätte das als Konstante gemacht, nachdem ich nicht glaub den SQL String übersetzen zu müssen.

marabu 13. Jun 2005 16:23

Re: Umstellung Paradox ->Firebird die 2.
 
Hallo Guenter,

es ist generell eine gute Idee, wenn du die in deinem Programm verwendeten SQL-Befehle an einer zentralen Stelle verwaltest. Wenn du keine eigene Lösung für das Laden zur Laufzeit entwickelt hast, dann würde ich dir Stringtable Resourcen empfehlen. So kann der Betreiber deines Programms ohne Zugriff auf die Quellen die Erstellung des Zugriffsplans beeinflussen.

Grüße vom marabu

BrunoT 14. Jun 2005 07:26

Re: Umstellung Paradox ->Firebird die 2.
 
Hallo, :bouncing4: :bounce1: :bounce2:

@Marabu, @GuenterS und @alle Anderen: Danke für die Hilfe :cheers:

ich habe noch nicht so viel Erfahrung mit SQL (nur Access und vor ca 15 Jahren ein RDBS unter UNIX V5).
@marabu:

Was meinst du mit
Zitat:

Wenn du deine Daten on-demand besorgst, brauchst du nichts zu selektieren außer dem primary key
?
Der Primärschlüssel heisst FANr.
Also so:
SQL-Code:
SELECT fanr FROM finanzamt WHERE name LIKE A* ORDER BY name
dann kann ich auf alle Felder der Tabelle zugreifen?

Übrigens scheint in Firebird LIKE nicht zu funktionieren :gruebel:

Ich musste
Delphi-Quellcode:
ZQFinanzamt.SQL.Add('SELECT * FROM Finanzamt WHERE name STARTING WITH '''+chr(Tab.TabIndex + 65)+''' ORDER BY name');
statt

Delphi-Quellcode:
ZQFinanzamt.SQL.Add('SELECT * FROM Finanzamt WHERE name LIKE '''+chr(Tab.TabIndex + 65)+'*'' ORDER BY name');
nehmen. Letztere Abfrage ergibt zwar keine Fehlermeldung, aber auch keine Daten.

Wo erhalte ich mal eine vollständige Sprachreferenz von Firebird 1.5?(mit Beispielen)?? :wall:

Was die Ressource-String-variante betrifft, da bin ich vieleicht etwas komisch oder skeptisch.
Ohne eine Diskussion vom Zaun brechen zu wollen, für mich erschließt sich der Quelltext so besser
Delphi-Quellcode:
ZQFinanzamt.SQL.Add('Select * from Finanzamt Where Name LIKE '''+chr(Tab.TabIndex + 65)+'*''');
als
Delphi-Quellcode:
ZQFinanzamt.SQL.Add(format(RSting1234,['S*','Name']);
da bin ich vieleicht etwas altmodisch, oder ich kommentiere zu wenig IMHO. :oops:


@marabu:
Ich programmiere zwar mit Unterbrechungen seit 1988 in verschiedenen Sprachen aber manchmal merke ich, dass ich nichts weiss(frei nach Seneca). :shock:
Was meinst du mit
Zitat:

Wenn du keine eigene Lösung für das Laden zur Laufzeit entwickelt hast,
dann würde ich dir Stringtable Resourcen empfehlen.
So kann der Betreiber deines Programms ohne Zugriff auf die Quellen die Erstellung des Zugriffsplans beeinflussen.
Da stehe ich im Wald:
1. Gibt es auch eigene Lösungen für den Zugriff auf SQL-DB's?
2. Wie legt man Stringlist - Ressourcen an und benutzt sie? muss mal googlen!
Wenn die Verwaltung einfach ist und der Zugriff schnell(beim Programmieren, man kann sich ja nicht alles merken), dann
schau ich mir das mal an. Mehrsprachigkeit benötige ich nicht.
3. Was ist ein Zugriffsplan? In den seltensten Fällen soll der Anwender vorgegebene Pfade verlassen(DAU)!


Wie kann ich mit der Gestaltung der Abfragen die Performance des Programms positv beeinflussen?

ich danke noch mal für die schnelle Hilfe :hello:

mfg

BrunoT

marabu 14. Jun 2005 08:50

Re: Umstellung Paradox ->Firebird die 2.
 
Hallo Bruno,

mit "Daten on-demand besorgen" meine ich, dass du nicht alle 1000 Zeilen deiner Tabelle auf einmal besorgst, sondern nur die am Bildschirm sichtbaren. Dazu brauchst du eine visuelle Komponente wie z.B. TListView, die so konfiguriert (OnOwnerData) werden kann, dass sie keine Daten aufnimmt, sondern die Daten nach Bedarf anfordert. Bei dieser Vorgehensweise besorgt man sich einen DB-Cursor
mit den Primärschlüsseln und holt erst bei der konkreten Datenanforderung die benötigten Felder aus der Datenbank - bei mir mit einem application cache gekoppelt.


Zitat:

Zitat von BrunoT
Übrigens scheint in Firebird LIKE nicht zu funktionieren

Die wildcards in SQL sind nicht "*" und "?", sondern "%" und "_".

Später mehr.

marabu

BrunoT 14. Jun 2005 09:00

Re: Umstellung Paradox ->Firebird die 2.
 
Hi Marabu,

wenn ich das richtig verstanden habe, verschiebe ich sozusagen ein Fenster über die Datenbank, so wie ich das früher bei untypisierten Dateien gemacht habe. :gruebel:

Das mit den Wildcards ist mir noch nicht untergekommen :oops: , danke! Ich teste gleich mal. :hello:

mfg

BrunoT

das geeht!

marabu 14. Jun 2005 09:27

Re: Umstellung Paradox ->Firebird die 2.
 
Hallo Holger,

Zitat:

1. Gibt es auch eigene Lösungen für den Zugriff auf SQL-DB's?
"Eigene Lösung" bezog sich nicht auf die Datenbankzugriffe, sondern auf die Bereitstellung von zentral verwaltetem SQL-Code.

Zitat:

2. Wie legt man Stringlist - Ressourcen an und benutzt sie? Wenn die Verwaltung einfach ist und der Zugriff schnell(beim Programmieren, man kann sich ja nicht alles merken), dann schau ich mir das mal an. Mehrsprachigkeit benötige ich nicht.
Durch die Verwendung des Schlüsselwortes resourcestring anstelle von const kannst du beliebige Zeichenketten externalisieren. So kann ein Literal später in eine andere Sprache übersetzt werden, aber mir ging es um die Zugriffsmöglichkeit für den Datenbank-Administrator.

Zitat:

3. Was ist ein Zugriffsplan? In den seltensten Fällen soll der Anwender vorgegebene Pfade verlassen(DAU)!
Wir arbeiten heute alle mit SQL, aber intern dürften alle RDBMS mit relationaler Algebra hantieren. Die Regeln dieser Algebra in Verbindung mit den Zugriffsstatistiken ermöglichen dem Planersteller (query optimizer) verschiedene Formen der Optimierung. Wenn unter bestimmten Randbedingungen die Optimierung unterbleibt, dann kann der Datenbank-Administrator deine SQL-Statements mit Hints anreichern, die eine bestimmte Optimierung erzwingen. Ganz sicher nichts für Endanwender.

Zitat:

wenn ich das richtig verstanden habe, verschiebe ich sozusagen ein Fenster über die Datenbank, so wie ich das früher bei untypisierten Dateien gemacht habe.
Richtig verstanden. Allerdings muss diese Metapher bei GUI-Anwendungen stark verfeinert werden. Eine unbedachte Mausbewegung löst mitunter Datenbankzugriffe aus - deshalb mein Hinweis auf den application cache.

marabu

BrunoT 14. Jun 2005 09:41

Re: Umstellung Paradox ->Firebird die 2.
 
Thanks Marabu

für die Erklärungen, was SQL betrifft, bin ich noch blind wie ein Maulwurf.
Zitat:

Die Regeln dieser Algebra in Verbindung mit den Zugriffsstatistiken ermöglichen dem Planersteller (query optimizer) verschiedene Formen der Optimierung.
Das würde ja bedeuten, der Server würde bei Mehrfachaufruf der Anfrage diese optimiert ausführen(sozusagen halbintelligent)?

Wie funktioniert der Application-Cache?
Sollte das bedeuten, das ich anstelle dem DBGrid ein StringGrid verwende, eine Stringlist intern zur Verwaltung der benötigten Schlüssel oder Daten(vorauslesend)? das übersteigt meinen Horizont im Augenblick glaub ich.

mfg

BrunoT

marabu 14. Jun 2005 11:09

Re: Umstellung Paradox ->Firebird die 2.
 
Zitat:

Zitat von BrunoT
Das würde ja bedeuten, der Server würde bei Mehrfachaufruf der Anfrage diese optimiert ausführen(sozusagen halbintelligent)?

Grundsätzlich besteht diese Möglichkeit, aber die einzelnen RDBMS unterscheiden sich sehr stark in der Qualität ihrer query optimizer. Einen Parser für SQL bereit zu stellen ist da ungleich einfacher.

Zitat:

Zitat von BrunoT
Wie funktioniert der Application-Cache?

Ich habe dazu eine spezielle Klasse implementiert.

Delphi-Quellcode:
  TReadonlyCache = class
  ...
  public
    constructor Create(Size: integer; onRead: TReadFunc);
    ...
    procedure Clear;
    function Get(Key: integer): string;
  end;
Create() limitiert den Cache auf Size Einträge und definiert eine interne Lesefunktion. Mit Clear() kann der Cache geleert werden, um sich besser an eine neue Darstellung anzupassen. Mit Get() werden die benötigten Feldinhalte bereit gestellt, wobei key die recno des DB-Cursors ist und sich bei einer virtuellen ListView aus Succ(listitem.index) ergibt.

Zitat:

Zitat von BrunoT
Sollte das bedeuten, das ich anstelle dem DBGrid ein StringGrid verwende, eine Stringlist intern zur Verwaltung der benötigten Schlüssel oder Daten(vorauslesend)?

Eher eine TListView oder eine ähnliche Komponente, würde ich sagen.

marabu

BrunoT 14. Jun 2005 12:06

Re: Umstellung Paradox ->Firebird die 2.
 
Hi Marabu,

danke mochmal. Mir raucht der Kopf.
Ich habe mich bisher nicht an SQL-Datenbanken herangetraut, da diese u.U. sehr langsam sind (KHK- Handwerkerpaket mit MS-SQL bei 300.000 Artikelsätzen 10 sec. für eine Suchanfrage unter Paradox 1 sec.) und einen grossen Installationsaufwand bzw. Probleme mit TCP/IP(localhost unter XP) besitzen, ausserdem kaum ausführbar auf älterer Hardware (ab AMD k6/600, P3/700). Firebird scheint da ja besser zu sein.
Ich habe da bloss Manschetten, das die Performance meines Programmes durch ungünstige Zugriffsgestaltung leidet.
Wenn du da noch ein paar Literaturhimweise hättest? Oder nen Beitrag in der DP?

Ist es möglich, mit Firebird, einen Teil (readonly) der Datenbank auf der lokalen Festplatte zu halten und nur den verändelichen Teil(Tabellen) auf dem Server?(readonly = PLZ, Orte, Finanzämter - veränderlich = Kundendaten).
Oder in einen Application-Cache oder sollte ich bei jedem Programmstart diese Daten in einen Stream kopieren und damit arbeiten?

Ich hoffe, ich habe nicht zu grosse Löcher in den Bauch gefragt.

Ansonsten muss ich das erstmal verdauen und dann step by step.

mfg

BrunoT

marabu 14. Jun 2005 12:32

Re: Umstellung Paradox ->Firebird die 2.
 
Zitat:

Zitat von BrunoT
Ich habe mich bisher nicht an SQL-Datenbanken herangetraut, da diese u.U. sehr langsam sind.

Das ist ein Gerücht. Oft ist die Applikationslogik nicht auf Client-Server ausgelegt oder die Server werden falsch administriert. 300.000 Artikelsätze sind für ein RDBMS kein Problem, wenn sonst alles stimmt.

Deine Beschreibungen klingen so, als ob du bestehende Anwendungen aus der LAN-Welt durch "ein paar Änderungen am Quellcode" auf Client-Server migrieren möchtest. Das ist in der Regel unwirtschaftlich, besonders wenn das auch noch ein Forschungsgebiet für dich darstellt. Da wäre ein erfahrener Kollege an deiner Seite goldrichtig.

Zitat:

Zitat von BrunoT
Wenn du da noch ein paar Literaturhinweise hättest?

Eine Antwort darauf traue ich mir nicht zu - vielleicht weil ich schon zu lange in diesem Geschäft bin. Vielleicht gebe ich ein paar Hinweise, wenn ich deinen Kenntnisstand besser einschätzen kann.
Hier im Forum sind recht viele junge Leute unterwegs, die sich vielleicht in einer ähnlichen Lernsituation befinden, wie du. Vielleicht ergibt sich da noch etwas. Ich würde dich jetzt nur mit teurer Fachliteratur zuwerfen, die dir evtl. nicht wirklich was bringt.

Zitat:

Zitat von BrunoT
Ist es möglich, mit Firebird, einen Teil (readonly) der Datenbank auf der lokalen Festplatte zu halten

Natürlich geht sowas, aber ich bin nicht sicher, ob das was für dich ist - momentan - verstehe mich bitte nicht falsch.

marabu

MagicAndre1981 14. Jun 2005 12:40

Re: Umstellung Paradox ->Firebird die 2.
 
Zitat:

Zitat von BrunoT
Übrigens scheint in Firebird LIKE nicht zu funktionieren :gruebel:

Doch, das funktioniert, ist aber bei Strings sehr laaaangsam.

André

Hansa 14. Jun 2005 12:55

Re: Umstellung Paradox ->Firebird die 2.
 
Zitat:

Zitat von MagicAndre1981
Zitat:

Zitat von BrunoT
Übrigens scheint in Firebird LIKE nicht zu funktionieren :gruebel:

Doch, das funktioniert, ist aber bei Strings sehr laaaangsam.

André

Wie kommst Du denn da drauf ? :shock: Ich benutze LIKE z.B. sogar mit 2 %, also %Suchwort%. Jeder DS, der in einem einzugebenden Feld einen Bestandteil des Suchwortes enthält, wird dabei aus der DB gefischt. Dabei sind bisher keinerlei Langsamkeiten aufgefallen. Das dürfte wohl schon langsamer sein, als den genauen Text einzugeben, aber spürbar ist das nicht.

MagicAndre1981 14. Jun 2005 13:05

Re: Umstellung Paradox ->Firebird die 2.
 
Zitat:

Zitat von Hansa
Wie kommst Du denn da drauf ? :shock: Ich benutze LIKE z.B. sogar mit 2 %, also %Suchwort%. Jeder DS, der in einem einzugebenden Feld einen Bestandteil des Suchwortes enthält, wird dabei aus der DB gefischt. Dabei sind bisher keinerlei Langsamkeiten aufgefallen. Das dürfte wohl schon langsamer sein, als den genauen Text einzugeben, aber spürbar ist das nicht.

So wars bei mir. Andreas Kosch hatte in dem Buch zum Interbase das Thema angeschnitten und dann hab ich mir ein Testtool geproggt und da war LIKE langsamer als STARTING WITH.

Kann sein, dass das im FB1.5 anders ist, meine aussage bezog sich auf den FB1.0.3.

BrunoT 14. Jun 2005 13:07

Re: Umstellung Paradox ->Firebird die 2.
 
Hi Marabu,

ich bin hier um zu lernen. Die DP hat mir schon viel geholfen.

zu den "langsamen SQL-Datenbanken": als EDV-Dienstleister bin ich oft über solche schlecht gemachten Client-Server-Applicationen gestolpert.

Natürlich werde ich ein bestehendes Programm nicht zu SQL portieren(never touch a runnig system). Das ist ein neues Projekt, wo ich Teile aus alten Projekten recycle. Als Anfang mit Firebird habe ich mir natürlich eine vorhandene Programmlogik genommen, um mich nicht darum kümmern zu müssen.

Zu den getrennt abgelegten Daten: Ich werde warscheinlich zwei Datenbankdateien auf dem Server ablegen, eine mit den veränderlichen Daten, die andere mit den statischen. Das erleichtert die Datensicherung und ist vieleicht auch für die Performance besser.

Ach so: warum geht in einer Query der Filter nicht?(keine Datensätze) wozu benutzt man den überhaupt, wenn man alles mit SQL-Abfragen erschlagen kann?

Delphi-Quellcode:
procedure TFinanzaemter.TabChange(Sender: TObject);
var
  F: string;
begin
  begin
    if tab.tabindex = 26 then
    begin
//      ZQFinanzamt.Filtered := false
      ZQFinanzamt.Active := False;
      ZQFinanzamt.SQL.clear;
      ZQFinanzamt.SQL.Add('Select * from Finanzamt ORDER BY name');
      ZQFinanzamt.Active := True;

    end
    else
    begin
   {   F := format('Name = ''%s*''', [chr(Tab.TabIndex + 65)]);

      ZQFinanzamt.Filtered := false;
      ZQFinanzamt.Filter := F;
      ZQFinanzamt.Filtered := True; }
      ZQFinanzamt.Active := False;
      ZQFinanzamt.SQL.clear;
      ZQFinanzamt.SQL.Add('Select * from Finanzamt Where Name LIKE ''' + chr(Tab.TabIndex + 65) + '%'' ORDER BY name');
      ZQFinanzamt.Active := True;

    end;
  end;
end;
oder hätte ich dort auch % nehmen sollen?

mfg

BrunoT

P.S. @MagicAndre1981 Abfragen wie sonst? hat sich erledigt s.o.

marabu 14. Jun 2005 16:23

Re: Umstellung Paradox ->Firebird die 2.
 
Zitat:

Zitat von BrunoT
warum geht in einer Query der Filter nicht? (keine Datensätze)

Sollte eigentlich funktionieren, wenn du die richtigen wildcards verwendest.

Zitat:

Zitat von BrunoT
wozu benutzt man den überhaupt, wenn man alles mit SQL-Abfragen erschlagen kann?

Gute Frage. Bei SQL bin ich mir sicher, dass die Daten auf dem Server selektiert werden. Die Filter-Möglichkeiten von TDataset (Filter, Filtered, OnFilterRecord) stammen noch aus einer Zeit, als SQL noch nicht überall verfügbar war - sprich dBase III etc. Damit OnFilterRecord arbeiten kann muss jeder Datensatz erstmal vom Server zum Client transportiert werden. Das kann weh tun, aber ich kann mir auch positive Anwendungen vorstellen.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz