Thema: Delphi Sql insert into

Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#47

AW: Sql insert into

  Alt 29. Mär 2020, 17:04
Zitat von Never01:
Was ich möchte: Im Diagramm soll angezeigt werden, wie oft ein Spieler das erste, zweite und dritte Spiele gegen den selben Spieler gewonnen hat.
Du möchtest also das oben beschriebene "irgendwie" grafisch darstellen.

Bei genauerer Überlegung scheint mir das bei dem vorliegenden Datenmodell, also der vorliegenden Art der Daten und deren Gestaltung, nicht wirklich (mit vertretbarem Aufwand) möglich.

Da der Punktestand nicht für Gewinner und Verlierer separat gespeichert ist, sondern in der Form Gewinner:Verlierer (also z. B. 1:0) muss man bei einer Auswertung erstmal die Datenbankinhalte aufteilen.

Meine Kenntnisse bezüglich Access sind nicht ausreichend, um hier einen halbwegs sinnvollen Lösungsbeitrag zu liefern. Datenbankseitig sehe ich momentan keine Lösungsmöglichkeit, die lesbar und verständlich wäre. Hier wären schon sehr fundierte Kenntnisse in der SQL-Variante von Access nötig.

Es bliebe also noch die Möglichkeit, die Auswertung innerhalb von Delphi vorzunehmen.

Dazu sollte eine Abfrage in dieser Form ausreichen:

datamodule3.ADOQuery3.SQL.Text:='select Spieler1nn, Spieler1vn, Spieler2nn, Spieler2vn, Punktestand1, Punktestand2, Punktestand3, Sieger_NN from Spiel where (Spieler1vn = :sp1vn5 and Spieler1nn = :sp1nn5) and (Spieler2vn = :sp2vn5 and Spieler2nn = :sp2nn5)';

Danach müsstest Du das Ergebnis in einer Schleife abarbeiten und für jeden Datensatz prüfen, welcher Spieler welches Spiel gewonnen hat (also die Punktstände prüfen) und abhängig vom Ergebnis zählen.

Sowas in der Art (wobei das weder geprüft noch korrektes Delphi ist, sondern nur 'ne hingedaddelte Idee)
Delphi-Quellcode:
const
  csCaption = 'Spieler %d hat Spiel %d %d mal gewonnen.';
var
  Punktestand : String;
  PunkteSpieler1 : Integer;
  PunkteSpieler2 : Integer;
  GewinnSpiel1_Spieler1 : Integer;
  GewinnSpiel1_Spieler2 : Integer;
  GewinnSpiel2_Spieler1 : Integer;
  GewinnSpiel2_Spieler2 : Integer;
  GewinnSpiel3_Spieler1 : Integer;
  GewinnSpiel3_Spieler2 : Integer;
begin
  GewinnSpiel1_Spieler1 := 0;
  GewinnSpiel1_Spieler2 := 0;
  GewinnSpiel2_Spieler1 := 0;
  GewinnSpiel2_Spieler2 := 0;
  GewinnSpiel3_Spieler1 := 0;
  GewinnSpiel3_Spieler2 := 0;

  datamodule3.ADOQuery3.SQL.Text:='select Spieler1nn, Spieler1vn, Spieler2nn, Spieler2vn, Punktestand1, Punktestand2, Punktestand3, Sieger_NN from Spiel where (Spieler1vn = :sp1vn5 and Spieler1nn = :sp1nn5) and (Spieler2vn = :sp2vn5 and Spieler2nn = :sp2nn5)';
  // ---------------------------------------------
  // Hier noch die Parameter der Abfrage befüllen.
  // ---------------------------------------------
  datamodule3.ADOQuery3.Open;
  while not datamodule3.ADOQuery3.EoF do begin
    // Hier jetzt die Punktstände auswerten:
    // Punktestand 1
    Punktestand := datamodule3.ADOQuery3.FieldByName['Punktestand1').AsString;
    PunkteSpieler1 := StrToInt(Copy(Punktestand,1,Pos(':',Punktestand) - 1));
    PunkteSpieler2 := StrToInt(Copy(Punktestand,Pos(':',Punktestand) + 1,Lenght(Punktestand)));
    if PunkteSpieler1 > PunkteSpieler2 then GewinnSpiel1_Spieler1 := GewinnSpiel1_Spieler1 + 1;
    if PunkteSpieler1 < PunkteSpieler2 then GewinnSpiel1_Spieler2 := GewinnSpiel1_Spieler2 + 1;
    // Punktestand 2
    Punktestand := datamodule3.ADOQuery3.FieldByName['Punktestand2').AsString;
    PunkteSpieler1 := StrToInt(Copy(Punktestand,1,Pos(':',Punktestand) - 1));
    PunkteSpieler2 := StrToInt(Copy(Punktestand,Pos(':',Punktestand) + 1,Lenght(Punktestand)));
    if PunkteSpieler1 > PunkteSpieler2 then GewinnSpiel2_Spieler1 := GewinnSpiel2_Spieler1 + 1;
    if PunkteSpieler1 < PunkteSpieler2 then GewinnSpiel2_Spieler2 := GewinnSpiel2_Spieler2 + 1;
    // Punktestand 3
    Punktestand := datamodule3.ADOQuery3.FieldByName['Punktestand3').AsString;
    PunkteSpieler1 := StrToInt(Copy(Punktestand,1,Pos(':',Punktestand) - 1));
    PunkteSpieler2 := StrToInt(Copy(Punktestand,Pos(':',Punktestand) + 1,Lenght(Punktestand)));
    if PunkteSpieler1 > PunkteSpieler2 then GewinnSpiel3_Spieler1 := GewinnSpiel3_Spieler1 + 1;
    if PunkteSpieler1 < PunkteSpieler2 then GewinnSpiel3_Spieler2 := GewinnSpiel3_Spieler2 + 1;
    datamodule3.ADOQuery3.Next;
  end;
  // Hier haben wir jetzt sechs Zahlen als Ergebnis, die ggfls. mit TLabel oder TProgressbar
  // ausgegeben werden können. (lbSpiel... = TLabel, pgSpiel... = TProgressbar)
  lbSpiel1_Spieler1.Caption := Format(csCaption, [1,1,GewinnSpiel1_Spieler1]);
  lbSpiel1_Spieler2.Caption := Format(csCaption, [2,1,GewinnSpiel1_Spieler2]);
  lbSpiel2_Spieler1.Caption := Format(csCaption, [1,2,GewinnSpiel2_Spieler1]);
  lbSpiel2_Spieler2.Caption := Format(csCaption, [2,2,GewinnSpiel2_Spieler2]);
  lbSpiel3_Spieler1.Caption := Format(csCaption, [1,3,GewinnSpiel3_Spieler1]);
  lbSpiel3_Spieler2.Caption := Format(csCaption, [2,3,GewinnSpiel3_Spieler2]);
  pgSpiel1_Spieler1.Position := GewinnSpiel1_Spieler1;
  pgSpiel1_Spieler2.Position := GewinnSpiel1_Spieler2;
  pgSpiel2_Spieler1.Position := GewinnSpiel2_Spieler1;
  pgSpiel2_Spieler2.Position := GewinnSpiel2_Spieler2;
  pgSpiel3_Spieler1.Position := GewinnSpiel3_Spieler1;
  pgSpiel3_Spieler2.Position := GewinnSpiel3_Spieler2;
  pgSpiel1_Spieler1.Max := datamodule3.ADOQuery3.RecordCount;
  pgSpiel1_Spieler2.Max := pgSpiel1_Spieler1.Max;
  pgSpiel2_Spieler1.Max := pgSpiel1_Spieler1.Max;
  pgSpiel2_Spieler2.Max := pgSpiel1_Spieler1.Max;
  pgSpiel3_Spieler1.Max := pgSpiel1_Spieler1.Max;
  pgSpiel3_Spieler2.Max := pgSpiel1_Spieler1.Max;
end;
In den Variabeln GewinnSpiel1_Spieler1 bis GewinnSpiel3_Spieler2 sollte nun stehen, welcher der beiden ausgewerteten Spieler welches Spiel wie oft gewonnen hat.

Habe keine Ahnung, ob das jetzt ein wirklich sinnvoller Ansatz ist. Mir erscheint er unnützt kompliziert.

Da die Aufgabenstellung wohl leider eher diffus zu sein scheint und ich keine Ahnung habe, welche Delphi- und welche Datenbankkenntnis als gegeben vorausgesetzt werden können, ist eine sinnvolle Hilfestellung leider kaum möglich.
  Mit Zitat antworten Zitat