Entwickler-Ecke

Datenbanken - if funktion benötigt habe aber keine ahnung wie


EddieMcCool - So 17.02.08 20:00
Titel: if funktion benötigt habe aber keine ahnung wie
habe diesen quelltext:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm2.BitBtn2Click(Sender: TObject); 
begin 
form3.Table1.Insert; 
form3.Table1.FieldValues['Datum'] := dbedit2.text; 
form3.Table1.FieldValues['Stunde'] := DBLookupComboBox3.text; 
form3.Table1.FieldValues['Haus'] := DBLookupComboBox1.text; 
form3.Table1.FieldValues['Raum'] := DBLookupComboBox2.text; 
form3.Table1.FieldValues['Klassenstufe'] := DBLookupComboBox4.text; 
form3.Table1.FieldValues['Klasse'] := DBLookupComboBox5.text; 
form3.Table1.FieldValues['Fach'] := DBLookupComboBox6.text; 
form3.Table1.FieldValues['Materialien'] := DBLookupComboBox7.text; 
form3.Table1.FieldValues['Lehrer'] := dbedit1.text; 
form3.Table1.Post; 
end;


jetzt soll wenn die ersten vier fieldvalues bereits schon hintereinander in einem datensatz vorhanden sind eine fehlermeldung erscheinen und nicht der gleiche datensatz noch einmal in der tabelle auftachen.
hoffe jemand hat eine ahnung ich weis einfach nich wie ich dass machen soll.
aber trotzdem schon mal danke an alle.

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


icho2099 - So 17.02.08 20:32

da musst du wohl erst mal in Table1 nachschauen, ob es schon einen Satz mit den Werten gibt und dann entscheiden was passieren soll.

Die Methode locate von Table1 sollte dir helfen:


Delphi-Quelltext
1:
2:
3:
function Locate(const KeyFields: string; 
const KeyValues: Variant; 
Options: TLocateOptions): Boolean;


Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


EddieMcCool - So 17.02.08 20:40

ja aber das nützt mir ja nichts es sind enorm viele datensätze und er soll ja bei der eingabe erkennen ob dieser datensatz bis zum 4. wert schon vorhanden ist.aber trotzdem danke.


Delete - So 17.02.08 22:31

wie wär's damit, die ersten vier felder als primary keys zu spezifizieren? dann macht das die db von alleine...


GericasS - Mo 18.02.08 08:01
Titel: Re: if funktion benötigt habe aber keine ahnung wie
user profile iconEddieMcCool hat folgendes geschrieben:
habe diesen quelltext

nutze demnächst bitte die Delphi-Tags damit alles ein wenig übersichtlicher wird !


LG

GericasS

Moderiert von user profile iconNarses: Quote gekürzt


Xong - Mo 18.02.08 09:19

user profile iconGrenzgaenger hat folgendes geschrieben:
wie wär's damit, die ersten vier felder als primary keys zu spezifizieren? dann macht das die db von alleine...

Außerdem dürfte eine Selectanweisung mit einer entsprechenden WHERE-Bedingung nicht sehr schwer aufzusetzen sein.


EddieMcCool - Fr 22.02.08 20:59

ja sorry ich kann leider nicht viel mit den hilfestellungen anfangen ich bin blutiger anfänger. wäre echt nett falls jemand mir das mal einfacher erklären könnte.

habe mich aber trotzdem daran versucht. das mit dem primärkey klappt zwar aber dann kann ich gar kein wert mehr eingeben der schon vorhanden ist. er soll aber nur nicht speichern wenn alle vier in einem einzigen datensatz hintereinander schon mal vorhanden sind hoffe jemand kann mir helfen.


EddieMcCool - Sa 23.02.08 21:02

hat den niemand mitleid?


EddieMcCool - So 24.02.08 17:52

hat noch jemand ne idee?


MSCH - So 24.02.08 18:48

Versuchs mal so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var Query: TAdoQuery; // oder ähnliches
    Exists: Boolean;
begin
  Query:= TAdoQuery.Create(Nil);
  try
    Query.SQL.Text:= 'Select Count(*) as CNT from TableName where spalte1= :wert1 and spalte2 = :wert2';
    Query.ParamByName('Wert1').Value:= '1';
    Query.ParamByName('Wert2').Value:= '2';
    Query.Connection:= <deine Verbindungskomponente>;
    try
      Query.Open;
      Exists:= Query.FieldByName('CNT').asInteger>0;
    except
      Exists:= False; // hier eigentlich nur, wenn SQL fehlerhaft
    end;
  Finally
    Query.Free;
  end;
  if not Exists then
  // hier Append oder Insert
  else
  // hier Locate(..) und dann Edit;
end;


alles klar?
grez
Msch


EddieMcCool - So 24.02.08 19:13

sorry funzt irgendwie nicht bereits bei der deklaration von query spinnt er


icho2099 - So 24.02.08 20:12

Wie genau stellst du dir denn "bei der Eingabe schon merken" vor ?

Man kann jedesmal, wenn ein Zeichen für einen der vier Werte eingegeben wird,
prüfen, ob es bereits einen solchen Satz gibt.

Man kann auch erst alle vier Werte eingeben und dann prüfen.

Man kann die Prüfung parallel in einem Thread ausführen, dann wird die Eingabe
nicht unterbrochen, die Programmierung ist dann etwas aufwendiger, du musst u.a.
darauf achten, dass der Thread seine eigene Session verwendet.

oder du machst es eben doch mit locate() in deiner Methode BitBtn2Click()


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm2.BitBtn2Click(Sender: TObject);   
begin   
  If Table1.Locate('Datum;Stunde;Haus;Raum',
                    VarArrayOf([dbedit2.text,DBLookupComboBox3.Text,
                    DBLookUpComboBox1.Text,DBLookUpComboBox2.Text]),
                    [loCaseInsensitive]) then begin
    (* Fehlermeldung anzeigen *)
    MessageDlg('Satz bereits vorhanden',mtWarning,mbOK,0);
  end else begin
    form3.Table1.Insert;   
    form3.Table1.FieldValues['Datum'] := dbedit2.text;   
    form3.Table1.FieldValues['Stunde'] := DBLookupComboBox3.text;   
    form3.Table1.FieldValues['Haus'] := DBLookupComboBox1.text;   
    form3.Table1.FieldValues['Raum'] := DBLookupComboBox2.text;   
    form3.Table1.FieldValues['Klassenstufe'] := DBLookupComboBox4.text;   
    form3.Table1.FieldValues['Klasse'] := DBLookupComboBox5.text;   
    form3.Table1.FieldValues['Fach'] := DBLookupComboBox6.text;    
    form3.Table1.FieldValues['Materialien'] := DBLookupComboBox7.text;   
    form3.Table1.FieldValues['Lehrer'] := dbedit1.text;   
    form3.Table1.Post;
  end;
end;