Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO, Access und das alles vergleichen (https://www.delphipraxis.net/26220-ado-access-und-das-alles-vergleichen.html)

motu 20. Jul 2004 14:36


ADO, Access und das alles vergleichen
 
Hallo,

ich habe ein Programm, das bisher über ADO neue Datensätze in eine AccessDB einfügt. Nun ist gefordert, das vor dem Eintrag in der DB geschaut wird, ob ein ähnlicher Datensatz schon vorhanden ist. Wenn ja, soll er angezeigt werden und auf Wunsch überschrieben werden.

Vorschläge?

Stevie 20. Jul 2004 14:39

Re: ADO, Access und das alles vergleichen
 
Ein DataSet mit dem passenden SQL, wenn Satz gefunden, dann ändern... :gruebel:

motu 20. Jul 2004 14:44

Re: ADO, Access und das alles vergleichen
 
:wiejetzt:
also det SQL-Statement krieg ich ja noch hin, aber zu allem anderen bin ich heut kognitiv nicht mehr fähig und generell sind meine Delphifähigkeiten für deine Aussage nicht ausgeprägt genug.

Zu deutsch: Schön wär der fertige Code. :roll:

Stevie 20. Jul 2004 14:51

Re: ADO, Access und das alles vergleichen
 
Ein ADODataSet auf's Form usw...
Delphi-Quellcode:
try
  ADODataSet1.CommandText := 'SELECT hier, dort FROM irgendwas WHERE dies AND das';
  ADODataSet1.Open;
  if ADODataSet1.RecordCount > 0 then
  begin
    ADODataSet1.Edit;
    ADODataSet1.FieldValues['hier'] := 'irgendwas';
    ADODataSet1.FieldValues['dort'] := 'irgendwas anderes';
    ADODataSet1.Post;
  end;
finally
  ADODataSet1.Close;
end;

motu 20. Jul 2004 14:56

Re: ADO, Access und das alles vergleichen
 
Des sieht doch jut aus. :-D
Danke erst einmal. Ich versuch das grad mal ein bisschen anzupassen.

Stevie 20. Jul 2004 14:58

Re: ADO, Access und das alles vergleichen
 
Oh, btw... HERZLICH WILLKOMMEN IN DER :dp: :hi:

motu 20. Jul 2004 15:08

Re: ADO, Access und das alles vergleichen
 
Hmm. Habe grad gemerkt, das ich gar kein DataSet habe, bisher ging alles über ADOTable.
Da muß ich wohl noch eins reinbasteln.

Aber mir ist eingefallen, wie kann ich denn den Output in einer Messagebox ausgeben?

Aber jetzt jeh ick erstmal heeme. bis morgen.

motu 21. Jul 2004 07:11

Re: ADO, Access und das alles vergleichen
 
Nun stellt sich die Frage, wie bekomme ich meine Variablen in den SQL Ausdruck, und wie kann ich, sofern es passende Datensätze gibt, diese dem Nutzer anzeigen?

shmia 21. Jul 2004 07:32

Re: ADO, Access und das alles vergleichen
 
Zitat:

Zitat von motu
Nun stellt sich die Frage, wie bekomme ich meine Variablen in den SQL Ausdruck, und wie kann ich, sofern es passende Datensätze gibt, diese dem Nutzer anzeigen?

Damit dies sauber funktioniert brauchst du ein (oder mehrere) Primärschlüsselfeld (z.B. Kundennummer).
So wird ein Datensatz eindeutig identifiziert.
Delphi-Quellcode:
  ADOQuery1.SQL.Text := 'SELECT * FROM Tabelle WHERE pkeyfeld=:pkeyfeld';
  ADOQuery1.Parameters.ParamValues['pkeyfeld'] := akt_pkey;
  ADOQuery1.Open;
  // die Abfrage kann entweder leer sein oder liefert genau 1 Datensatz
  if ADOQuery1.IsEmpty then
  begin
    // neuen Datensatz einfügen
    ADOQuery1.Insert;
    ADOQuery1.FieldValues['pkeyfeld'] := akt_pkey;
    ADOQuery1.FieldValues['Feld2'] := 'irgendwas anderes';
    ADOQuery1.Post;
  end
  else
  begin
     // form2 ist ein Hilfsformular, dass die Datenfelder eines Datensatzen anzeigt
     // der Benutzer kann entweder OK oder Abbrechen klicken
     form2.Dataset := ADOQuery1;
     if form2.ShowModal = mrOK then
     begin
       // bestehender Datensatz überschreiben
       ADOQuery1.Edit;
       // alle Felder bestücken mit Ausnahme des pkeyfeld
       ADOQuery1.FieldValues['Feld2'] := 'irgendwas anderes';
       ADOQuery1.Post;
     end
     else
        ShowMessage('Daten wurde nicht überschrieben'); // später weglassen
  end;
  ADOQuery1.Close;

motu 21. Jul 2004 07:40

Re: ADO, Access und das alles vergleichen
 
Danke, aber geht auch ohne Schlüssel? Ich hab zwar einen, aber den kann ich nicht benutzen.
Es sollen Werte in zwei Spalten gesucht werden. In einer Spalte der genaue Werte in der anderen mit einer Toleranz von 10% (SQL-Statement hab ich schon). Wenn dem so ist soll der geasamte Datensatz angezeigt werden, mit der Option des überschreibens, ansonsten soll ein neuer hinzugefügt werden. Das Einfügen haben wir ja schon. :)

shmia 21. Jul 2004 07:53

Re: ADO, Access und das alles vergleichen
 
Zitat:

Zitat von motu
Danke, aber geht auch ohne Schlüssel? Ich hab zwar einen, aber den kann ich nicht benutzen.

Es geht schon, du musst halt damit rechnen, mehr als einen Treffer (=Datensatz) zu landen.
Also musst du bei vorhandenen Datensätzen diese in einem DBGrid anzeigen lassen.
Der Benutzer wählt dann den Datensatz im Grid, den er überschreiben möchte und klickt dann
OK oder Abbrechen.
Das Formular zum Auswählen des Datensatzes, der überschrieben werden soll ist ganz einfach
zusammengeklickt: ein DBGrid, ein DataSource, 2 BitButtons mit ModalResult mrOK und mrAbort

motu 21. Jul 2004 07:54

Re: ADO, Access und das alles vergleichen
 
Na dann probier ich das mal aus.

Danke.

motu 21. Jul 2004 11:19

Re: ADO, Access und das alles vergleichen
 
Sooo.

Delphi-Quellcode:
...
 begin
     form2.Dataset := ADOQuery1;
     if form2.ShowModal = mrOK then
...

Nun bekomm ich folgenden Meldung:

[Fehler] Undefinierter Bezeichner: 'Dataset1'

:?: :?: :?:

motu 21. Jul 2004 13:43

Re: ADO, Access und das alles vergleichen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
begin
  SQLDurchmesser1 := Nutzdurchmesser.Value - (Nutzdurchmesser.Value*0.1);
  SQLDurchmesser2 := Nutzdurchmesser.Value + (Nutzdurchmesser.Value*0.1);

  SQLStatement1 := 'SELECT Probeglaeser.SollRadius, Probeglaeser.IstRadius, Probeglaskennzeichnung.Kennzeichnungsname, Probeglaeser.PGlasKonvex, Probeglaeser.PGlasKonkav, Probeglaeser.PruefdmKonkav, ';
  SQLStatement2 := 'Probeglaeser.PruefdmKonvex, Messart.Messartname, Probeglaeser.Pruefdatum, Probeglaeser.Pruefer, Probeglaeser.Bemerkungen, Probeglaeser.Passe, Probeglaeser.PHDifferenz FROM Probeglaeser, Messart, ';
  SQLStatement3 := 'Probeglaskennzeichnung WHERE Probeglaeser.IstRadius = DBIstRadius AND ((Probeglaeser.PGlasKonvex >= SQLDm1 AND Probeglaeser.PGlasKonvex <= SQLDm2) OR (Probeglaeser.PGlasKonkav ';
  SQLStatement4 := '>= SQLDm1 AND Probeglaeser.PGlasKonkav <= SQLDm2)) AND Probeglaeser.Kennzeichnung = Probeglaskennzeichnung.ID AND Probeglaeser.Messart = Messart.ID ORDER BY Messart.ID;';

  ADOQuery1.SQL.Text := 'SQLStatement1 + SQLStatement2 + SQLStatement3 + SQLStatement4';
  ADOQuery1.Parameters.ParamValues['SQLDm1'] := SQLDurchmesser1;
  ADOQuery1.Parameters.ParamValues['SQLDm2'] := SQLDurchmesser2;
  ADOQuery1.Open;
doch leider bekomm ich den unten angefügten fehler

shmia 21. Jul 2004 15:19

Re: ADO, Access und das alles vergleichen
 
Zitat:

Zitat von motu
Delphi-Quellcode:
  SQLStatement1 := ....
  SQLStatement2 := ....
  ....
 
  ADOQuery1.SQL.Text := 'SQLStatement1 + SQLStatement2 + SQLStatement3 + SQLStatement4'; //*****
doch leider bekomm ich den unten angefügten fehler

Hast du bei deinem Delphi nicht das Syntaxhighlighting eingeschaltet ??
Dann müsste dir doch auffallen, dass obige markierte Anweisung falsch ist. (die Hochkommas!!)

motu 21. Jul 2004 15:29

Re: ADO, Access und das alles vergleichen
 
Zitat:

Hast du bei deinem Delphi nicht das Syntaxhighlighting eingeschaltet ??
Dann müsste dir doch auffallen, dass obige markierte Anweisung falsch ist. (die Hochkommas!!)
Doch schon und jetzt wo du es sagst, erinnere ich mich auch an mein ähnliches Messageboxproblem. Inzwischen habe ich es folgermaßen gelöst:

Delphi-Quellcode:
  ADOQuery1.SQL.Text := 'SELECT * FROM Probeglaeser, Messart, Probeglaskennzeichnung WHERE Probeglaeser.IstRadius = '+ floattostr(DBIstRadius) +' AND ((Probeglaeser.PGlasKonvex >= '+ floattostr(SQLDurchmesser1) +' AND Probeglaeser.PGlasKonvex <= '+ floattostr(SQLDurchmesser2) +') OR (Probeglaeser.PGlasKonkav >= '+ floattostr(SQLDurchmesser1) +' AND Probeglaeser.PGlasKonkav <= '+ floattostr(SQLDurchmesser2) + ')) AND Probeglaeser.Kennzeichnung = Probeglaskennzeichnung.ID AND Probeglaeser.Messart = Messart.ID ORDER BY Probeglaeser.IstRadius;';
und det jet erstmal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz