AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Einzelne Daten aus Firebird lesen
Thema durchsuchen
Ansicht
Themen-Optionen

Einzelne Daten aus Firebird lesen

Ein Thema von Jens Schumann · begonnen am 25. Sep 2007 · letzter Beitrag vom 27. Sep 2007
Antwort Antwort
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#1

Einzelne Daten aus Firebird lesen

  Alt 25. Sep 2007, 16:29
Datenbank: Firebird • Version: 2 • Zugriff über: IBX
Hallo,
wie in diesem Thread beschrieben greife ich über eine
ins Excel importierte DLL auf eine Firebird Datenbank zu. Es funktioniert auch einwandfrei. Ich schreibe eine
Formel in die Excelzelle und die Funktion holt den Wert aus der Datenbank. D.h. aber auch, dass für jede einzelne
Zelle ein Wert aus der Datenbank geholt wird. Dafür wird z.Z. für jeden Wert der Abfrageprozess durchlaufen.
- Transaktion starten
- Abfrageparameter setzen
- Dataset öffnen
- Wert holen
- Dataset schließen
- Transaktion schließen

Delphi-Quellcode:
function TPMValue1(Year, Partner, Entity, Posnr, Bwa : PChar) : Double; stdcall;
begin
  Result:=0;
  With DModule do
    begin
      If Not Transaction.Active then
        Transaction.StartTransaction;
      Dataset.SelectSQL.Text:=sqlTpmValue1;
      Dataset.ParamByName('Jahr').AsString:=String(Year);
      Dataset.ParamByName('Partner').AsString:=String(Partner);
      Dataset.ParamByName('Entity').AsString:=String(Entity);
      Dataset.ParamByName('PosNr').AsString:=String(PosNr);
      Dataset.ParamByName('Bwa').AsString:=String(Bwa);
    Try
      Dataset.Open;
      Result:=Dataset.FieldByName('DEZ').AsFloat;
    Finally
      Dataset.Close;
      Transaction.Commit;
      end;
    end; // With DModule do
end;
Das dauert bei 1000 und mehr Werten ziemlich lange.
Weiss jemand wie ich das Beschleunigen kann.

Hinweis: Alle Werte in eine Abfrage packen und die Excelzellen über ein Routine füllen habe ich schon. Geht ziemlich schnell.
Auch bei über 1000 Werten. Ich möchte aber explizit den Weg über die Excelzellenformel gehen.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Einzelne Daten aus Firebird lesen

  Alt 25. Sep 2007, 16:39
Du könntest eine persistente Verbindung verwenden und die Inserts von der Transaktion trennen
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Einzelne Daten aus Firebird lesen

  Alt 27. Sep 2007, 07:54
Hallo mkinzler,
Beispiel: In 5 Zellen steht die Formel.
Bei der ersten Berechnung der ersten dieser 5 Zellen wird von Excel die DLL geladen.
Dabei wird die Verbindung zur Datenbank aufgebaut. Die Verbindung bleibt bis zum Entladen
der DLL bestehen.
Damit habe ich doch eine persistene Verbindung?

Als problematisch sehe ich das ständige Starten und Schließen einer Transaktion pro Wert.
Evt. spendiere ich im Excel einen Menüpunkt "Daten aktualisieren". Mit Klick auf diesen
Menüpunkt wird die aktuelle Transaktion geschlossen und wieder geöffnet. Anschließend werden
die Werte neu gerechnet.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Einzelne Daten aus Firebird lesen

  Alt 27. Sep 2007, 11:44
Hi,

wie du korrekt vermutest wird viel Zeit beim Öffnen und Schließen der Transaktion verblasen, deshalb wäre da mein erster Ansatzpunkt. Als weiteren Punkt würde sich anbieten den Select in eine StoredProcedure zu verlegen und das ständige Parsen durch den SQL-Server zu sparen, was bei vielen WErten wieder Geschwindigkeit kostet.

Die Alternative über eine Schleife die 1000 Zellen zu füllen würde mir im Moment als beste Lösung einfallen (da sparst Du dir immer die Transaction zu öffnen/schließen sowie das parsen der SQL, weil Du die nur einmal ausführst...

Grüße
Lemmy
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: Einzelne Daten aus Firebird lesen

  Alt 27. Sep 2007, 12:11
Du brauchst keine Transaktion, da du nur lesend zugreifst.
Du solltest nicht jede Zelle einzeln holen, sondern alle auf einen Rutsch.
Dazu muss der Rückgabewert von Double zu Variant geändert werden.
Genauer gesagt du musst die Daten in einem 2-dimensionalen Variant-Array verpacken.
Wenn du in Excel dann ein Range-Objekt hast, dass die gleiche Anzahl von Reihen und Spalten hat, kann man das Varaint-Array direkt zuweisen. (rangeobj.Value := variantarray
Natürlich ist es nicht ganz einfach Variant-Arrays aus DLLs rauszutransportieren (wer legt es an, wer gibt es frei ?).
Andreas
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#6

Re: Einzelne Daten aus Firebird lesen

  Alt 27. Sep 2007, 12:54
Zitat von shmia:
Du brauchst keine Transaktion, da du nur lesend zugreifst.
Hier muss ich doch mal protestieren.
Grundsätzlich wird bei Firebird/Interbase jede Datenoperation (auch Lesen) in einem Transactionskontext durchgeführt.
Bei vielen Komponenten muss man sich nur nicht selbst darum kümmern, weil die das dann selbst erledigen.

Ich gehe mal davon ais, dass Du Deine DLL mit einem Init versehen hast, welches die Connection zur Datenbank herstellt.
Komm jetzt bitte nicht auf die Idee, im gleichen Zuge eine Transaction zu öffnen, die dann die ganze Zeit durchgängig genutzt wird. Damit blockierst Du Dir dann nämlich Deinen Datenbankserver (Stichwort Oldest Active Transaction).

Zitat von Jens Schumann:
Ich möchte aber explizit den Weg über die Excelzellenformel gehen.
Ich fürchte, dann bleibt Dir die geringe Geschwindigkeit erhalten

Gruß

Thomas
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Einzelne Daten aus Firebird lesen

  Alt 27. Sep 2007, 13:33
Zitat von shmia:
Genauer gesagt du musst die Daten in einem 2-dimensionalen Variant-Array verpacken.
Wenn du in Excel dann ein Range-Objekt hast, dass die gleiche Anzahl von Reihen und Spalten hat, kann man das Varaint-Array direkt zuweisen. (rangeobj.Value := variantarray
Natürlich ist es nicht ganz einfach Variant-Arrays aus DLLs rauszutransportieren (wer legt es an, wer gibt es frei ?).
Die Lösung habe ich schon realisiert. Das eignet sich hervorragend wenn man mehrere Werte aus der Datenbank holen will.
Ich möchte aber einen Wert aus der Datenbank holen und innerhalb einer Excelformel verwenden. Das ist der Unterschied.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Einzelne Daten aus Firebird lesen

  Alt 27. Sep 2007, 13:38
Zitat von onlinekater:
Ich gehe mal davon ais, dass Du Deine DLL mit einem Init versehen hast, welches die Connection zur Datenbank herstellt.
Komm jetzt bitte nicht auf die Idee, im gleichen Zuge eine Transaction zu öffnen, die dann die ganze Zeit durchgängig genutzt wird. Damit blockierst Du Dir dann nämlich Deinen Datenbankserver (Stichwort Oldest Active Transaction).
Das habe ich natürlich nicht gemacht. Deshalb öffne ich ja z.Z. bei jeder Abfrage eine Transaktion.
Mein Ansatz ist jetzt folgender:
- Starte tatsächlich beim Laden der DLL eine Transaktion.
- Biete einen Menüpunkt an, der es ermöglich die laufende Transaktion zu beenden und eine neue zu starten.
Anschließend wird das Tabellenblatt neu berechnet. (Dann sind auch die aktuellen Daten da)
- Schließe die Transaktion beim Entladen der DLL
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 Uhr.
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