Autor Beitrag
DJ22
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 27.02.03 09:29 
Hi,

ich habe z.B. folgende Datenbank namens Note:
Sie ist mit einer Tablekomponente verbunden.

Note
----

Matrikelnummer Fach Note1 Note2 Note3 Note4 Note5 Note
100030 Mathe 1 1,5 2,5 NULL NULL
100031 Physik NULL NULL 3,5 4,25 5
100032 Englisch 2,75 NULL 3,25 5,75 NULL

Nun möchte ich einfach, dass die Note für die ganze Datenbank berechnet wird. In Pseudo-Code würde ich es so schreiben:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
for i:='erste Zeile' bis 'letzte Zeile'
begin
  k:=5;
  for j:=1 to 5
  begin
    if 'Note(j) = NULL then 
          begin
          k:=k-1;
          Note(j)=0;
          end;
        end;
        Note=(Note1+Note2+Note3+Note4+Note5)/k
end;

Nun weiss ich leider nicht, wie ich dieses Problem in Delphi syntaktisch korrekt umsetzen könnte. Ich möchte einfach, dass der Durchschnitt der Noten berechnet wird und in der Spalte Note eingetragen wird. Dabei ist es egal wo und welche Noten eingetragen sind. Dort wo nichts eingetragen ist steht halt ein NULL wert. Ich wäre euch sehr dankbar für eure Hilfe. Ihr könnt meinen Lösungsweg syntaktisch korrekt durchführen oder auch eine ganz andere Lösung vorschlagen.

Vielen Dank im Voraus für eure Hilfe

Dirk

Moderiert von user profile iconKlabautermann: Code-Tags hinzugefügt.
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: Do 27.02.03 09:48 
Die einfachste Möglichkeit dürfte sein, das über eine SQL-Abfrage zu lösen. Welche Datenbank benutzt Du denn?

Viele Grüße,

Matthias

_________________
Ha! Es compiliert! Wir können ausliefern!
DJ22 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 27.02.03 11:19 
Ich benutze eine Paradox 7 Datenbank. Aber ich glaube nicht, dass es
über SQL so einfach ist, da man ja nie weiss wieviele Noten eingetragen sind. Sind nur 3 Noten eingetragen, dann darf ich natürlich auch nur durch 3 beim Durchschnitt teilen.

Dirk
GuGl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 35



BeitragVerfasst: Do 27.02.03 12:19 
Hallo DJ22,

versuch mal diese procedure, habe ich jetzt allerdings nicht
getestet, sollte aber so funktionieren:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
var
   i, j, k : integer;
   gesamt, schnitt : extended;
begin
     table.first;
     i := table.fieldcount;
     while not table.eof do begin
           gesamt := 0;
           k := 0;
           for j := 0 to i do begin
               if (copy(table.Fields[j].fieldname,1,4) = 'Note') and (table.Fields[j].fieldname <> 'Note') then begin
                  if table.Fields[j].value <> '' then begin
                     gesamt := gesamt + table.Fields[j].value;
                     inc(k);
                  end;
               end;
           end;
           if k > 0 then begin
              schnitt := gesamt / k;
              table.edit;
              table.FieldByName('Note').AsFloat := schnitt;
              table.post;
           end;
           table.next;
     end;
end;

_________________
Gruß, GuGl
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: Do 27.02.03 13:20 
ausblenden Quelltext
1:
SELECT AVG(note) FROM tabelle					


berechnet den Durchschnitt über die ganze Tabelle und eine Spalte.

Über mehrere Spalten müsste man das dann so lösen:

ausblenden Quelltext
1:
SELECT AVG(note1+note2+note3+note4+note5)/5 FROM tabelle					


Hat aber den Nachteil, weil Deine Datenbank nicht richtig normalisiert ist, weißt Du nie, wie viele Noten effektiv eingetragen sind.

Unter mySQL könnte man dann evtl. mit Bedingungen noch was drehen.

Aber besser wäre es, die Datenbank richtig zu normalisieren und dann damit zu arbeiten.

Viele Grüße,

Matthias

_________________
Ha! Es compiliert! Wir können ausliefern!
GuGl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 35



BeitragVerfasst: Do 27.02.03 13:28 
@neojones

ist schon klar, damit erhält er den Schnitt aller im Feld note
eingetragenen Werte.
Er will aber den Schnitt der Felder Note1-Note5 innerhalb
eines Datensatzes ermitteln.

_________________
Gruß, GuGl
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: Do 27.02.03 14:56 
Das ist dasselbe!

ausblenden Quelltext
1:
SELECT AVG(note1+note2+note3+note4+note5) FROM tabelle					


Beim von mir oben genannten Beispiel müsste man hinten an das FROM tabelle noch ein "GROUP BY" hängen um den Average auf alle Tupel auszudehnen.

Viele Grüße,

Matthias

_________________
Ha! Es compiliert! Wir können ausliefern!
GuGl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 35



BeitragVerfasst: Do 27.02.03 15:12 
klar, mit Group By Martikelnummer hat er den Schnitt innerhalb
eines Satzes.

_________________
Gruß, GuGl
DJ22 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 27.02.03 16:52 
Ist es so von euch gemeint?
Bei mir passiert da irgendwie gar nichts.
Ich möchte dass der Durchschnitt dauerhaft in der Spalte Note
abgespeichert wird.

SELECT AVG(Note1+Note2+Note3+Note4+Note5) FROM "M:\db\Note.db"
GROUP BY Matrikelnummer

@Gugl
ich habe deine Quellcodelösung ausprobiert.
Ich bekomme den Fehler ungültige Typumwandlung in Variant.

Meine Datenbank sieht so aus:
Matrikelnummer(I)
Fach(A)
Note1(N)
...
Note5(N)
Note(N)

Vielen Dank im Voraus

Dirk
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: Fr 28.02.03 10:11 
Wenn Du den Wert abspeichern willst musst Du das machen mit

ausblenden Quelltext
1:
UPDATE tabelle SET note=AVG(note1+note2+note3+note4+note5);					

_________________
Ha! Es compiliert! Wir können ausliefern!