| Autor |
Beitrag |
day
      
Beiträge: 107
|
Verfasst: Di 03.06.03 11:20
hallo
ich bin noch nicht so erfahren mit delphi und hoffe ihr könnt mir helfen.
ich verwende eine table vom typ dBase. ich habe ein paar hundert daten welche jeweils aus Firma datum und Telefonnummer bestehen.
jetzt muss ich zuerst überprüfen ob die daten bereits in der datenbank vorhanden sind. wie kann ich diese abfrage machen. und wie kann ich sie anschliessend in die datenbank eintragen
Delphi-Quelltext 1:
| LineMemo.Lines.Add(StringReplace( SourceMemo.Lines[ActRecord], '#9', '#13#10', [rfReplaceAll, rfIgnoreCase] )); |
so lese ich die daten aus meinem SourceMemo unter entferne die Tabs und ersetze sie durch return.
mit
Delphi-Quelltext 1: 2: 3:
| Gefunden := TargetTable.Locate( 'Datum; Zeit', VarArrayOf(['DestMemo.Lines[1]', 'DestMemo.Lines[3]']), [loCaseInsensitive] ); |
versuche ich die datenbank zu durch suchen ob schon ein gleicher eintrag vorhanden ist. wenn nicht schreibe ich ihn rein.
aber das klappt so nicht ganz
danke für eure hilfe
gruss day
Moderiert von Klabautermann: Delphi-Tags hinzugefügt.
Zuletzt bearbeitet von day am Di 03.06.03 11:41, insgesamt 1-mal bearbeitet
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Di 03.06.03 11:32
Hallo Day und  im Delphi Forum!
Ich muss dich aber bitten deinen Topic einen aussagekräftigeren Namen zu geben. Die kannst du einfach machen, indem du beim ersten Beitrag auf Edit klickst und den Titel änderst. Wenn du dass dan Abgeschickt hast ist es auch schon geschehen  .
Beachte hierzu auch unsere Richtlinien:
| Delphi-Forum Richtlinien hat folgendes geschrieben: | 1.1 Beiträge
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist. Eine Pseudocodezeile oder die Nennung des Objektes, um welches es sich in dem Beitrag handelt, helfen da schon mehr weiter. |
Zu deiner Frage: Anhand welcher Daten willst du denn erkennen ob es den Datensatz schon gibt? An allen Feldern oder an bestimmten? Spielt Groß und kleinschreibung dabei eine Rolle? HAst du ahnung von SQL?
Gruß
Klabautermann
|
|
MKehrer
      
Beiträge: 114
NT, 2000
D6
|
Verfasst: Di 03.06.03 11:36
Titel: Re: Datenbank problem
| day hat folgendes geschrieben: | hallo
ich bin noch nicht so erfahren mit delphi und hoffe ihr könnt mir helfen.
ich verwende eine table vom typ dBase. ich habe ein paar hundert daten welche jeweils aus Firma datum und Telefonnummer bestehen.
jetzt muss ich zuerst überprüfen ob die daten bereits in der datenbank vorhanden sind. wie kann ich diese abfrage machen. |
Ich gehe mal davon aus Du hast bereits ein TQuery dann
kann Du mit
Quelltext 1: 2: 3:
| TQuery.SQL.Clear; TQuery.SQL.Add('select * from ??? where ...'); TQuery.OpenSQL; |
einen Datensatz erzeugen.
Wenn dann TTable.Recordcount=0 ist gibts den Datensatz noch nicht.
| day hat folgendes geschrieben: |
und wie kann ich sie anschliessend in die datenbank eintragen
|
Quelltext 1: 2: 3:
| TQuery.SQL.Clear; TQuery.SQL.Add('insert into ??? (Feldname1,feldname2) values (feldwert1,feldwert2)'); TQuery.ExecSQL; |
_________________ Manfred
Was Du siehst ist in Dir (Smile)
|
|
day 
      
Beiträge: 107
|
Verfasst: Di 03.06.03 11:44
was ich habe ist eine TTable
|
|
MKehrer
      
Beiträge: 114
NT, 2000
D6
|
Verfasst: Di 03.06.03 11:58
Du brauchst eigentlich nur ein TQuery
ich hab Dir hier mal ein paar Codes gepostet (Var queDB ist vom Typ TQuery)
LoadAllProjekts benutzt queDB.SQLOpen
dann wird alles ausgelesen (queDB.FieldbyName('???'=.As???)
und wieder geschlossen (queDB.SQLClose)
Wenn Du die datenbank ändern willst mußt Su statt SQLOpen SQLExec verwenden.
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: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84:
| function TDmodDB.LoadAllProjekts(clx: TCheckListBox): Boolean; //---------------------------------------------------------------------- Var s:String; begin Result:=false; If not Assigned(clx) then Exit; clx.Items.Clear;
If not SQLOpen('select * from '+TBL_Projekt+' order by NR') then Exit; queDB.First; while not queDB.Eof do Begin s:='H'+C3(queDB.FieldByName('NR').AsInteger)+': '+queDB.FieldByName('INFO').AsString; clx.Items.Add(s); If queDB.FieldByName('AKTIV').AsBoolean then clx.State[clx.Items.Count-1]:=cbChecked; queDB.Next; End; SQLClose; Result:=true; end;
function TDmodDB.SQLOpen(SQLString:String): Boolean; //---------------------------------------------------------------------- begin Result:=false; SetCursor(LoadCursor(0,IDC_WAIT)); With queDB do Begin Close; SQL.Clear; SQL.Add(SQLString); try Prepare; Open; Except on E:Exception do Begin Close; UnPrepare; SetCursor(LoadCursor(0,IDC_ARROW)); MessageDlg('"'+E.Message+'" bei SQL-Anweisung'#13#10'"'+SQLString+'"',mtError,[mbOK],0); Exit; End; End; End; SetCursor(LoadCursor(0,IDC_ARROW)); Result:=true; end;
function TDmodDB.SQLExec(SQLString:String): Boolean; //---------------------------------------------------------------------- begin Result:=false; SetCursor(LoadCursor(0,IDC_WAIT)); With queDB do Begin Close; SQL.Clear; SQL.Add(SQLString); try Prepare; ExecSQL; Except on E:Exception do Begin Close; UnPrepare; SetCursor(LoadCursor(0,IDC_ARROW)); MessageDlg('"'+E.Message+'" bei SQL-Anweisung'#13#10'"'+SQLString+'"',mtError,[mbOK],0); Exit; End; End; End; SetCursor(LoadCursor(0,IDC_ARROW)); Result:=true; end;
procedure TDmodDB.SQLClose; //---------------------------------------------------------------------- begin With queDB do Begin Close; UnPrepare; RequestLive:=true; End; end; |
_________________ Manfred
Was Du siehst ist in Dir (Smile)
|
|
day 
      
Beiträge: 107
|
Verfasst: Di 03.06.03 12:17
meine datenbank existiert bereits und es ist keine sql sondern eine dBase (4.0).
frage:
wenn ich folgenden befehl ausführe wird dann das Datum automatisch an letzter stelle eingefügt und werden (Datum , NAme ,....) als ein datensatz angesehen bis wieder ein neues insert aufgerufen wird????
Delphi-Quelltext 1: 2: 3:
| TargetTable.Insert TargetTable.FieldValues['Datum'] := Datum; TargetTable.FieldValues['Name'] := Name; |
Moderiert von Klabautermann: Delphi-Tags hinzugefügt.
|
|
day 
      
Beiträge: 107
|
Verfasst: Di 03.06.03 12:34
|
|
Tweafis
      
Beiträge: 647
WinXP + fbsd
Delphi 5 Prof
|
Verfasst: Di 03.06.03 12:43
Hi,
Delphi-Quelltext 1:
| LineMemo.Lines.Add(s: string) |
Fis
_________________ .: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
|
|
MKehrer
      
Beiträge: 114
NT, 2000
D6
|
Verfasst: Di 03.06.03 13:39
| day hat folgendes geschrieben: | meine datenbank existiert bereits und es ist keine sql sondern eine dBase (4.0).
|
wenn Du mit dem SQL-Explorer (StartMenu\Programmeborland\delphi..) einen Datenbank-Alias mit Namen "MeineDB" und diese mit einem DBase-Treiber anlegst, kannst Du TQuery.DatabaseName auf "MeineDB" setzen und das ganze funktioniert. Dann hast Du den Vorteil von SQL-Anweisungen zum suchen bereits existenter Datensätze.
| day hat folgendes geschrieben: |
frage:
wenn ich folgenden befehl ausführe wird dann das Datum automatisch an letzter stelle eingefügt und werden (Datum , NAme ,....) als ein datensatz angesehen bis wieder ein neues insert aufgerufen wird????
TargetTable.Insert
TargetTable.FieldValues['Datum'] := Datum;
TargetTable.FieldValues['Name'] := Name; |
Wenn Du insert aufrufts wird immer ein Datensatz eingefügt, solange es keine Schlüsselprobleme gibt und der alte Datensatz bleibt natürlich drin.
Du willst wahrschenlich wissen ob es eine Datensatz schon gibt. Dafür sind die SQL-Anweisungen m.e. am besten geeignet.
_________________ Manfred
Was Du siehst ist in Dir (Smile)
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Di 03.06.03 14:08
Hallo,
| day hat folgendes geschrieben: | versuche ich die datenbank zu durch suchen ob schon ein gleicher eintrag vorhanden ist. wenn nicht schreibe ich ihn rein.
aber das klappt so nicht ganz |
dehalb noch mal die Frage: Identifiezierst du die Datensätze an bestimmten Spalten der Tabelle oder an allen? Und du verwendest scheinbar Zeitfelder für den Vergleich ist das richtig? Diese lassen sich nur schlecht auf gleichheit überprüfen, da es zu Rundingsfehlern kommen kann.
Gruß
Klabautermann
|
|
Maggi
      
Beiträge: 160
WIN XP, WIN 2003
D5 Enter D 2006
|
Verfasst: Fr 06.06.03 10:25
Hi,
nun ich denke du möchtest nach Name und Telefonnummer vergleichen, denn datum macht ja keinen Sinn, außer es wäre vielleicht das Geburtsdatum?
Dann machst du einfach einen Findkey() mit deinen neuen Values auf deine bestehende Datenbank und wenn du keinen findest fügst du einen neuen hinzu. Vorrausgesetzt du hast einen passenden Index dazu, den könntest du dir ja aber auch noch erstellen...
z.B:
if FindKey(......) then
begin
Table.edit;
..
....
Table.Post;
end
else
begin
Table.insert;
..
....
Table.Post;
end;
Gruß
Maggi
|
|