Thema: Delphi datensätze vergleichen

Einzelnen Beitrag anzeigen

Butterflyz

Registriert seit: 19. Mai 2004
19 Beiträge
 
#6

Re: datensätze vergleichen

  Alt 4. Jul 2004, 15:15
oh mein gott jetzt habe ich komplett die übersicht verloren!
also ich versuche es mal zu beschreiben:

in einer tabelle sollen die ergebnisse eines fußballspeiels eingetragen werden, also tore, punkte usw.
bestimmte daten, nämlich das datum und die beiden mannschaften werden aus einer tabelle abgerufen, in der die spieletermine stehen. man soll also nur die ergebnisse dieser spiele bearbeiten können, die in der termin-tabelle stehen.
wenn man ein neues spielergebnis eintragen möchte, wird erst geguckt, ob es überhaupt einen neuen termin gibt.
wenn ja, sollen die neuen daten (mehrzahl von datum? ), sofern es mehrere sind, in eine combobox gefüllt werden und die mannschaften werden gleichzeitig in ein label und ein DBEdit feld geschrieben und zur tabelle übertragen.
dann soll das neue datum, was in die ergebnis-tabelle aufgenommen wurde, zu den items in einer anderen combobox hinzugefügt werden (sofern es nicht schon drinsteht), so dass man die datensätze direkt per auswahl durch die combobox ansteuern kann (darin stehen nur die daten (mehrzahl von datum)).
das wärs denke ich...

was ich gemacht habe:
ich habe 2 comboboxen (Datum & Datum_Neu), Datum dient zur navigation innerhalb der ergebnistabelle, in Datum_Neu werden die neuen daten (mehrzahl von datum), sofern vorhanden, aus der termin-tabelle geschrieben.
wenn man einen datensatz bei den ergebnissen hinzufügen will, wird direkt abgefragt, ob es neue termine gibt:

Delphi-Quellcode:
procedure TForm5.ADOTable1AfterInsert(DataSet: TDataSet);
var i,n,m : integer;
begin
  form5.qryMannschaften.Close;
  form5.qryMannschaften.SQL.Clear;
  form5.qryMannschaften.SQL.Text
  := 'SELECT datum, mannschaft_1, mannschaft_2 FROM TTermin WHERE datum NOT IN (SELECT datum from TSpielergebnisse)';
  form5.qryMannschaften.Open;
  if form5.qryMannschaften.RecordCount = 0
  then
  begin
    showmessage('Es gibt keine neuen Termine!');
    exit;
  end
  else //wenn es neue termine gibts
  begin
    n := form5.qryMannschaften.RecordCount;
    i := 0;
    form5.Datum_Neu.Clear;
    repeat
    begin
      form5.Datum_Neu.Items.Add(DateToStr(form5.qryMannschaften.FieldByName('datum').AsDateTime));
      inc(i);
      form5.qryMannschaften.Next;
    end;
    until i = n; //werden die neuen daten in die combobox geschrieben
    form5.Datum_Neu.Show; //und die combobox angezeigt
    form5.Datum.Hide;
    form5.Datum_Neu.ItemIndex := 0;
    form5.Label11.Caption := form5.qryMannschaften.FieldByName('mannschaft_1').AsString;
    form5.DBEdit9.Text := form5.qryMannschaften.FieldByName('mannschaft_1').AsString;
    form5.Label12.Caption := form5.qryMannschaften.FieldByName('mannschaft_2').AsString;
    form5.DBEdit10.Text := form5.qryMannschaften.FieldByName('mannschaft_2').AsString;
    form5.ADOTable1.Post;
nachdem es dann zur tabelle geschickt wurde, wird das neue datum in die navigations combobox (Datum) geschrieben und diese wird dann wieder angezeigt:

Delphi-Quellcode:
procedure TForm5.ADOTable1AfterPost(DataSet: TDataSet);
var m,n : integer;
begin
  m := form5.Datum.Items.Count;
  n := 0;
  repeat
  begin
    form5.Datum.ItemIndex := n;
    if form5.Datum_Neu.Text <> form5.Datum.Text
    then form5.Datum.Items.Add(form5.datum_neu.Text);
    inc(n);
  end;
  until n = m;
  form5.Datum_Neu.Hide;
  form5.Datum.Show;
end;
wenn es mehrere neue termine gab und man einen anderen auswählt als den ersten, dann werden die mannschaften aus der termintabelle aus dem datensatz, der das ausgewählte datum enthält, geholt:

Delphi-Quellcode:
procedure TForm5.Datum_NeuChange(Sender: TObject);
begin
  with form5.qryDatumNeu do
  begin
    Close;
    SQL.Clear;
    SQL.Text := 'SELECT mannschaft_1, mannschaft_2 FROM TTermin WHERE datum = '
    +form5.Datum_Neu.Text;
    Open;
  end;
  form5.ADOTable1.Edit;
  form5.DBEdit1.Text := form5.Datum_Neu.Text;
  form5.Label11.Caption := form5.qryDatumNeu.FieldByName('mannschaft_1').AsString;
  form5.DBEdit9.Text := form5.qryDatumNeu.FieldByName('mannschaft_1').AsString;
  form5.Label12.Caption := form5.qryDatumNeu.FieldByName('mannschaft_2').AsString;
  form5.DBEdit10.Text := form5.qryDatumNeu.FieldByName('mannschaft_2').AsString;
  form5.ADOTable1.Post;
end;
was nicht klappt:
- das abrufen der mannschaften, wenn zwischen mehreren neuen daten ausgewählt wird ('Synatxfehler in Zahl in Abfrageausdruck 'datum = 05.07.2004"), anscheinend kann man ein DateTime-Feld nicht mit einem String vergleichen - wie dann?

- wenn es keine neuen termine gibt, wird einfach der Text 'Datum_Neu' 3 mal hinzugefügt ()anzahl der datensätze in TTermin bzw. TSpielergebnisse)

was ich nicht kann:
- wenn ich in der combobox Datum, also der combobox zum direkten ansteuern der datensätze in der Ergebnisse-Tabelle, ein datum auswähle, wie kann ich dann in der tabelle zum entsprechenden datensatz springen? muss das wieder mittels einer query geschehen oder geht das auch eleganter?

so, ist jetzt etwas mehr geworden, aber ich hoffe ich konnte jetzt meine frage einigermaßen deutlich formulieren...

PS: das 31.12.1899 Problem hat sich irgendwie von selbst gelöst, hab nur keine ahnung wie...
~stay on top or remain from the underground~
  Mit Zitat antworten Zitat