![]() |
Datenbank: DBISAM • Version: 4 • Zugriff über: Direkt
OnCalcFields... gibt es einen effizienteren Weg?
Hallo,
ich bin an einer Software dran und habe ein Performance Problem. Lokal kann man arbeiten aber übers Netzwerk wird es schnell sehr träge. Hier ein Auszug aus dem Datenmodell: Zitat:
In meinem Hauptfenster ist ein Grid das mit einem Query verbunden ist (qartikel). Hier der SQL-Code:
SQL-Code:
So, jetzt will in in diesem Grid die Datensätze aus Nachweise und Behandlungszustand anzeigen. Aber da es ja 1:N-Beziehung ist kann ich kein lookup-Feld einsetzen. Was ich will ist quasi eine mit Komma getrennte Anzeige der entsprechenden Datensätze. Dafür habe ich mich der OnCalcFields-Methode bedient. Dies funktioniert auch, aber ist leider recht langsam.
SELECT *
FROM artikel AS A LEFT OUTER JOIN bestellungenpos AS B ON A.lfdnr = B.artikel ORDER BY lfdnr DESC Jetzt meine Frage, fällt jemandem ein Weg ein wie man das Effizienter und Performanter implementieren kann?
Delphi-Quellcode:
Zum Anschluss noch eine auswertung die DBIsam mir ausspuckt wenn ich das Query Ausführe:
procedure Tfmain.qartikelCalcFields(DataSet: TDataSet);
var i: integer; tmpstr: string; begin tmpstr := ''; if (DataSet.FieldByName('lfdnr').value <> NULL) and (DataSet.FieldByName('lfdnr').Asinteger <> 0) then begin qartikelbz.open; qartikelbz.Filter := '(lfdnr = ' + DataSet.FieldByName('lfdnr').AsString + ')'; qartikelbz.filtered := true; for i := 0 to qartikelbz.filterrecordcount - 1 do begin tmpstr := tmpstr + '+' + qartikelbz.FieldByName('bztext').AsString; qartikelbz.next; end; DataSet.FieldByName('behandlungszustand').AsString := tmpstr; tmpstr := ''; qartikelnw.open; qartikelnw.Filter := '(lfdnr = ' + DataSet.FieldByName('lfdnr').AsString + ')'; qartikelnw.filtered := true; for i := 0 to qartikelnw.filterrecordcount - 1 do begin tmpstr := tmpstr + qartikelnw.FieldByName('nachweisetext').AsString + ', '; qartikelnw.next; end; i := length(tmpstr); if (tmpstr <> '') and (tmpstr[i-1] = ',') then setlength(tmpstr,i - 2); DataSet.FieldByName('nachweise').AsString := tmpstr; end; end; Zitat:
Gruß florian |
Re: OnCalcFields... gibt es einen effizienteren Weg?
Die Berechnung direkt in der Abfrage durchführen
|
Re: OnCalcFields... gibt es einen effizienteren Weg?
Versteh nich was du meinst. Kannst du vielleicht etwas präziser werden? :)
|
Re: OnCalcFields... gibt es einen effizienteren Weg?
Ich meinte die temporären Felder direkt in der Abfrage berechnen zu lassen. in deinem fall würde ich aber eigen Abfragen verwenden
|
Re: OnCalcFields... gibt es einen effizienteren Weg?
hmm du meinst SubQuerys oder was? Aber ich kann doch mit SQL keinen String aus den Elementen bauen, oder doch?
|
Re: OnCalcFields... gibt es einen effizienteren Weg?
Nein als eigene Abfrage. Die Berechnung wird sonst für jede Zeile durchgeführt. Bei 1000 zeilen würde diese dann 1000 mal erfolgen ( wobei er jedes Mal über alle 100 Zeilen gehen würde)
Deshalb eine Abfrage die die Anzahlen der mittlet ( einmalig) |
Re: OnCalcFields... gibt es einen effizienteren Weg?
hmm ok macht sinn...aber dann kann ich keine Berechneten Felder mehr benutzen oder? Weil die kann ich ja nur in dem OnCalcFields bearbeiten und sonst nicht.
|
Re: OnCalcFields... gibt es einen effizienteren Weg?
Brauchst du aber auch nicht, weil du auch in einer Abfrage virtuelle Felder erzeugen kannst
|
Re: OnCalcFields... gibt es einen effizienteren Weg?
hmm also ich habs jetz so gemacht: Hab ein neues Query gemacht in dem ich die Felder berechne. Im OnCalcFields von meinem qartikel Query hab ich jetz nur noch diesen code:
Delphi-Quellcode:
War das das was du meintest?
qbznw.Locate('lfdnr', DataSet.FieldByName('lfdnr').AsString, []);
DataSet.FieldByName('behandlungszustand').AsString := qbznw.FieldByName('behandlungszustaende').AsString; DataSet.FieldByName('nachweise').AsString := qbznw.FieldByName('nachweise').AsString; Leider ist es aber damit immernoch nicht schneller :( #EDIT Also das da oben kann ich mir ja sparen, da ich die Felder ja jetz als Lookup-Felder definieren kann. Das Funktioniert auch. Aber lahm isses immernoch. GN8 zack0r |
Re: OnCalcFields... gibt es einen effizienteren Weg?
Du brauchst keine CalcFelder mehr. Im ersten Schritt Anzahl berechnen, dann die eigentlichen Werte
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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 by Thomas Breitkreuz