Autor Beitrag
Wurstbrot
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 17.04.07 12:41 
Guten Tag,

ich habe eine Menge Kurven, von denen immer 3 mit je 328 Punkten zusammengehören in einer DB abgelegt.
Das sieht ungefähr so aus:

id | messnr| messpunkt | xdata | ydata

ID identifiziert immer die Kurve.
MessNr geht dabei immer von 1 - 3.
MessPunkt immer von 1 -328.
Für die Ausgabe in einem Chart muss ich immer die 3 zusammengehörigen
Punkte mit messnr 1, 2 und 3 mitteln.
Das habe ich auch gemacht und es funktioniert, aber es ist keine schöne Lösung.
Denn die for - Schleife die 328 mal eine SQL Anfrage an den Server sendet und dort
ein AVG aus den werten für die MessNummern 1 bis 3 errechnet dauert fast 30 sekunden.

Ich habe mir überlegt, dass es sicher günstiger wäre, die 3 Kurven einzeln Komplett
abzufragen, die ausgegebenen Rows 'irgendwie' in 3 Arrays zu speichern und die werte
der arrays Zeile für Zeile zu mitteln.

Die einige Stelle an der die Realisierung scheitert, ist der wo 328 Rows die von einer
einfachen Anfrage kommen in ein Array müssen.

Mit einem DBGrid geht das ja nicht, weil ich das nicht wert für wert auslesen kann.

Hat jemand eine Idee wie man das realisieren kann?



1000 Dank

Wurstbrot
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Di 17.04.07 12:47 
mh, ich versteh jetzt nicht genau, wovon du jeweils den mittelwert brauchst. Ich gehe mal davon aus, dass du den MW aus den 3 Werten pro Messpunkt brauchst.

Dann versuchs mal mit

ausblenden SQL-Anweisung
1:
2:
3:
  select avg(messnr), messpunkt 
  from Tabelle
  group by messpunkt


Ansonsten halt genau andersrum.

_________________
Bravery calls my name in the sound of the wind in the night...
Wurstbrot Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 17.04.07 14:43 
Danke erstmal für die schnelle Antwort.
GROUP BY hatte ich auch schon angedacht, aber auch da habe ich wieder das Problem:

1. Wie übergebe ich 328 ErgebnisRows in einem Rutsch?

2. Wie stelle ich sie in einem TChart dar? (denn bisher habe ich bei jeder Schleifeniteration nur
einen Wert zurückbekommen und der ließ sich schön einfach mit
Chart1.Series[0].AddXY(sfield[xdata,i],sfield[ydata,i]);
einfügen und nach 328 Iteratonen hatte ich meine Kurve auf dem Schirm)

Das Problem liegt also eher im Bereich Delphi als bei SQL :)

Gruß

Das Wurstbrot
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Di 17.04.07 15:23 
Ich nehme mal an, die Datenabfrage machst du über irgend ein query-Object, nenn wir es qry:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
I := 0;
qry.SQL.Text := 'Select ...';
qry.open (execute, opensql, was auch immer die komponente braucht)
while not qry.eof do
begin
  inc(I);
  Chart1.Series[0].AddXY(sfield[qry.FieldByName('X-Feld').asFloat,i],
                         sfield [qry.FieldByName('Y-Feld').asFloat,i]);
  qry.next;
end;
qry.close;


So in etwa müssts gehen, auch ne Schleife, aber halt nur eine Abfrage.

_________________
Bravery calls my name in the sound of the wind in the night...
Wurstbrot Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 17.04.07 19:08 
Ich habe gerade entdeckt, dass ja ein TDBChart existiert.
Dort kann man ohne weiteres einfach ein ADODataSet anhängen.
Einziges Problem ist, dass der CommandText beim Start nicht leer
sein darf, ich muss quasi eine "Dummy - Kurve" laden und übergebe
zur Laufzeit einfach meinen individuellen Query.
Und mit dem GROUP BY und nur einer statt 328 Anfragen, dauert eine
Kurve nicht mehr 30 Sekunden sondern so schnell, dass ich das gern
als LIVE bezeichne :)

Jetzt muss ich mal schaun ob ich das noch irgendwie als CSV exportiert
kriege und andere sachen machen kann.

Soweit erstmal vielen Dank für die Hilfe.

Gruß
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Mi 18.04.07 07:17 
CSV ist kein Ding:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var
  SL : TStringList;
  Str : String;
  I : Integer;
begin
  qry.First;
  while not qry.eof do 
  begin
    Str := '';
    for I := 0 to pred(qry.FieldCount) do
    begin
      Str := Str + '"' + qry.Fields.Field[I].asString +'"'; 
      if I < (qry.FieldCount - 1) then
        Str := Str + ','
    end;
    SL.Add(Str);
  end;
  qry.Close;
  SL.SaveToFile('Datei.csv');
end;

_________________
Bravery calls my name in the sound of the wind in the night...
Wurstbrot Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 19.04.07 20:29 
Vielen Dank, damit wären meine Probleme gelöst. :)