Autor Beitrag
day
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 107



BeitragVerfasst: 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


ausblenden 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

ausblenden 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 user profile iconKlabautermann: Delphi-Tags hinzugefügt.


Zuletzt bearbeitet von day am Di 03.06.03 11:41, insgesamt 1-mal bearbeitet
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 03.06.03 11:32 
Hallo Day und :welcome: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

NT, 2000
D6
BeitragVerfasst: 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

ausblenden 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


ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 107



BeitragVerfasst: Di 03.06.03 11:44 
was ich habe ist eine TTable
MKehrer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

NT, 2000
D6
BeitragVerfasst: 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.


ausblenden volle Höhe Quelltext
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 107



BeitragVerfasst: 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????
ausblenden Delphi-Quelltext
1:
2:
3:
TargetTable.Insert
TargetTable.FieldValues['Datum'] := Datum;
TargetTable.FieldValues['Name'] := Name;


Moderiert von user profile iconKlabautermann: Delphi-Tags hinzugefügt.
day Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 107



BeitragVerfasst: Di 03.06.03 12:34 
:D
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Di 03.06.03 12:43 
Hi,
ausblenden Delphi-Quelltext
1:
LineMemo.Lines.Add(s: string)					


Fis

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
MKehrer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

NT, 2000
D6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 160

WIN XP, WIN 2003
D5 Enter D 2006
BeitragVerfasst: 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... :wink:

z.B:

if FindKey(......) then
begin
Table.edit;
..
....
Table.Post;
end
else
begin
Table.insert;
..
....
Table.Post;
end;


Gruß

Maggi