Autor Beitrag
Markos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Di 18.01.05 22:04 
Hallo,

ich verwende eine Access 2000 Datenbank mit einer Tabelle "Adressen". Das Feld GID ist dort als Felddatentyp "Autowert" deklariert mit Indiziert "Ja Ohne Duplikate".

Wenn die nachfolgende Routine ausgeführt wird, erscheint folgende Fehlermeldung:
AdoQuery_Adressen: Field 'GID' not found.



ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  with ADOQuery_Adressen do
  begin

    SQL.Clear;
    SQL.Text:='UPDATE adressen SET VORNAME = '''+AdvLUEdit4.Text+''', FIRMA = '''+AdvLUEdit2.Text+''','+#13#10+
    'WHERE (GID= '+ADOQuery_Adressen.FieldByName('GID').AsString+')';
    ExecSQL;
  end;


Die Datensatzauswahl erfolgt über ein DBGrid zuvor. Das kommische ist wenn ich mir AdoQuery_Adressen.FieldByName('GID').AsString einen Label zuordne wird die Zahl richtig dargestellt. Was mache ich falsch?

Bin für jeden Hinweis dankbar - ich verzweifele hier gerade :(

Gruß
Markos

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Di 18.01.05 23:58 
Markos hat folgendes geschrieben:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  with ADOQuery_Adressen do
  begin

    SQL.Clear;
    SQL.Text:='UPDATE adressen SET VORNAME = '''+AdvLUEdit4.Text+''', FIRMA = '''+AdvLUEdit2.Text+''','+#13#10+
    'WHERE (GID= '+ADOQuery_Adressen.FieldByName('GID').AsString+')';
    ExecSQL;
  end;

...

Hi,

kann es sein, daß adoquery_adressen beim sql.clear ein close ausführt?
dann ist das feld nicht mehr da.

Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
tmc2004
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140

zuviele
D7,D8
BeitragVerfasst: Mi 19.01.05 03:07 
Das sollte nicht das Problem sein. Das Problem sollte eher sein. Ob bei diesen code clear aufgerufen wird oder nicht spielt hier keine Rolle. Hätte er auch weg lassen können das sql.text immer einen neuen sql zuweißt im gegensatz zu sql.add aber jetzt gehe ich am Thema vorbei. Das Problem sollte sein das Access den Wert selber setzen will d. h. es läßt sich nicht in die Karten Pfuschen. Versuch doch mal in Access selber einen Wert einzugeben in einen Feld mit Autowert du wirst sehen es geht nicht sehen kannst du die zahl aber. Wenn du aber eh Manuel was in die db schreibst kannst du dir auch leicht selbst mit zahlenwert pflegen bau dir eine Funktion inctabelle z. B.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function TDataModule1.inctabelle(const tabelle,spalte: string): string;
var sql1: string;
begin
inctabelle:= inttostr(1);
ADOvorhandencheck.SQL.Clear;
sql1 := 'SELECT '+ spalte +' FROM ' +tabelle+ ' ORDER by '+spalte+' desc' ;
ADOvorhandencheck.SQL.add (sql1);
ADOvorhandencheck.Open;
if ADOvorhandencheck.RecordCount > 1 then
  begin
    inctabelle := inttostr(ADOvorhandencheck.fieldbyname(Spalte).AsInteger +1);
  end
  else
  begin
    inctabelle :='1'
  end;
ADOvorhandencheck.SQL.Clear;
ADOvorhandencheck.Close;
end;


So kannst du auch einen Aufzälenden Index erreichen und kannst ihn editieren.

Gruß

tmc

_________________
it's not a bug it's a feature
Markos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Mi 19.01.05 07:53 
@CenBells
Nein klappt ja bei "INSER INTO ..." einwandfrei, weil ich da aber auch nicht das "WHERE (GID ..." angehängt habe. Also einen Datensatz an die Tabelle anhängen klappt einwandfrei.

Einen Datensatz aus der Access Tabelle über ein DBGrid auslesen und editieren geht auch. Ich will dann die Edit Felder wieder zurück schreiben in die Access Tabelle mit dem Update Befehl.

@tmc2004
Ich füge doch gar keinen Datensatz hinzu. Ich update doch nur einen Datensatz und da frage ich noch mal am ende mit WHERE die ID ab, den ich gerade selektiert habe.

Ich hatte erst ein Feld Kunden_Nr in die Tabelle eingebaut und dort mit RecordCount immer hochgezählt, nur ist das nicht zuverlässig.

Ich kann in das Feld mit "Autowert" und LongInteger nichts eingeben. Hmm die anderen hier im Thread was ich so gelesen habe fragen auch ab mit WHERE ID = +++AdvLUEdit4.Tetx++, dann müsste deren Datenbank Index aber nicht sauber hochzählen, wenn man zwischenzeitlich etwas löscht ?!?

Gibt es noch eine alternative die Update Routine abzuwandeln? Ich übergebe die Daten von einem selektieren DBGRid EIntrag in Edit Felder und will dieser wieder zurückschreiben...


Markos
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 19.01.05 08:30 
Markos hat folgendes geschrieben:
@CenBells
Nein klappt ja bei "INSER INTO ..." einwandfrei, weil ich da aber auch nicht das "WHERE (GID ..." angehängt habe. Also einen Datensatz an die Tabelle anhängen klappt einwandfrei.

Ist ja auch logisch. CenBells hat IMHO schon recht, bei Clear wird die Datenmenge geschlossen, damit kann auf die Felder nicht mehr zugegriffen werden. Nimm das einfach mal raus, dann könnte es funktionieren. EVtl. musst Du nur noch vorher den Wert in einer Variable zwischenspeichern, glaube ich aber eher nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 19.01.05 08:45 
Um es mal ganz deutlich zu schreiben, bevor ihr aneinander vorbei schreibt:
In deinem Update-Statement greifst du als Referenz auf die ADO-Query zu, bei der du gerade das Statement einbaust.
Der Fehler ist nicht das SQL-Statement, sondern der Rückgriff auf die ADOQuery:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  with ADOQuery_Adressen do
  begin

    SQL.Clear;
    SQL.Text:='UPDATE adressen SET VORNAME = '''+AdvLUEdit4.Text+''', FIRMA = '''+AdvLUEdit2.Text+''','+#13#10+
    'WHERE (GID= '+ADOQuery_Adressen.FieldByName('GID').AsString+')'; // HIER !!!
    ExecSQL;
  end;

Durch das ExecSQL schließt du dein bisheriges ADOQuery_Adressen.
In dem Moment kennt das Programm ADOQuery_Adressen.FieldByName('GID').AsString nicht mehr!
Du musst dir diesen Wert zwischenspeichern oder ein anderes ADOQuery für das Update verwenden.
Markos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Mi 19.01.05 08:49 
@jasocul

Vielen Dank und auch Dir UGrohne. Ich werde das heute abend sofort testen und Euch mitteilen ob es geht !

Markos
Markos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Mi 19.01.05 09:27 
@jasocul
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Var gidnummer : string;
Begin

gidnummer:= ADOQuery_Adressen.FieldByName('GID').AsString;

with ADOQuery_Adressen do
  begin
    SQL.Clear;
    SQL.Text:='UPDATE adressen SET VORNAME = '''+AdvLUEdit4.Text+''', FIRMA = '''+AdvLUEdit2.Text+''','+#13#10+
    'WHERE (GID= '''+GidNummer+''' ')';
    ExecSQL;
  end;


Ist das so richtig und damit müsste es funktionieren?

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 19.01.05 09:33 
Fast.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Var gidnummer : string;
Begin

gidnummer:= ADOQuery_Adressen.FieldByName('GID').AsString;

with ADOQuery_Adressen do
  begin
    SQL.Clear;
    SQL.Text:='UPDATE adressen SET VORNAME = '''+AdvLUEdit4.Text+''', FIRMA = '''+AdvLUEdit2.Text+''','+#13#10+
    'WHERE (GID= '+GidNummer+')'; // Änderung.
    ExecSQL;
  end;

Da GID vermutlich numerisch ist, benötigst du keinen Quoted-String. Also ein paar Anführungszeichen weniger.
Markos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Mi 19.01.05 09:46 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Var gidnummer : string;
Begin

gidnummer:= ADOQuery_Adressen.FieldByName('GID').AsString;

with ADOQuery_Adressen do
  begin
    SQL.Clear;
    SQL.Text:='UPDATE adressen SET VORNAME = '''+AdvLUEdit4.Text+''', FIRMA = '''+AdvLUEdit2.Text+''','+#13#10+
    'WHERE (GID= '+GidNummer+')'; // Änderung.
    ExecSQL;
  end;


Ist das so auch möglich da ja GID ein Feld mit "Long Integer" ist ?!?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Var gidnummer : integer;
Begin

gidnummer:= StrToInt(ADOQuery_Adressen.FieldByName('GID').AsString);

with ADOQuery_Adressen do
  begin
    SQL.Clear;
    SQL.Text:='UPDATE adressen SET VORNAME = '''+AdvLUEdit4.Text+''', FIRMA = '''+AdvLUEdit2.Text+''','+#13#10+
    'WHERE (GID= GidNummer)';
    ExecSQL;
  end;


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 19.01.05 09:53 
Nein, da das SQL-Statement als String übergeben werden muss. In deinem Beispiel müsstest du dann beim SQL-String wieder eine IntToStr auf gidnummer machen. Das kannst du dir also sparen.
Markos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Mi 19.01.05 16:05 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.BitBtn4Click(Sender: TObject);
var gidnummer : string;
begin
  gidnummer:= ADOQuery_Adressen.FieldByName('GID').AsString;
  Panel1.Caption:=gidnummer;
  IF menueselector = 2 THEN
  BEGIN

  with ADOQuery_Adressen do
  begin
    SQL.Text:='UPDATE adressen SET VORNAME = '''+AdvLUEdit4.Text+''','+#13#10+
    'WHERE (GID = gidnummer)';
    ExecSQL;
  end;
end;


Es kommt die Fehlermeldung bei Ausführung " Syntaxfehler in UPDATE Anweisung". In der Caption wird mir aber die Zahl angezeigt. Was stimmt jetzt an der Update Routine noch nicht? jasocul?

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 19.01.05 16:33 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.BitBtn4Click(Sender: TObject);
var gidnummer : string;
begin
  gidnummer:= ADOQuery_Adressen.FieldByName('GID').AsString;
  Panel1.Caption:=gidnummer;
  IF menueselector = 2 THEN
  BEGIN

  with ADOQuery_Adressen do
  begin
    SQL.Text:='UPDATE adressen SET VORNAME = '''+AdvLUEdit4.Text+'''' + ' WHERE (GID = gidnummer)';
    ExecSQL;
  end;
end;

Ich denke den Zeilenumbruch brauchst du da nicht, das Komma war zuviel, dafür brauchst du aber ein Leerzeichen.
Ob die Anführungszeichen jetzt so stimmen, weiß ich jetzt so nicht. Aber ich glaube schon.
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mi 19.01.05 16:42 
Mit ADO kenne ich mich jetzt nicht so gut aus, aber unterstützt das keine Parameter? Die würden dein SQL-Statement etwas übersichtlicher machen und kommen auch mit fieseren Eingabewerten klarkommen - z.B. wenn jemand ein Anführungszeichen in die Edit-Box einträgt.

Stefan
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 19.01.05 16:46 
Da hast du auf jeden Fall recht.
Ich kenne ADO aber auch nicht. Deswegen habe ich mich da zurück gehalten.
Markos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Mi 19.01.05 16:50 
@jasocul
Ich bin eben beinahe ausgetickt, die tollsten Fehlermeldungen... So funktioniert die Update Routine einwandfrei:

Zitat:

SQL.Text:='UPDATE adressen SET VORNAME = '''+AdvLUEdit4.Text+'''' + ' WHERE (GID = '+gidnummer+')';


Vielen Dank jasocul, denke ich werde noch eingige fragen haben .. Tabellen sotieren.. sollte ich hier im Forum nichts finden.. Ich hoffe ich darf Dich dann weiter fragen?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 19.01.05 16:53 
Sortieren: siehe "Order by"

Ansonsten darfst du im Forum so ziemlich alles fragen.


Zuletzt bearbeitet von jasocul am Mi 19.01.05 16:54, insgesamt 1-mal bearbeitet
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mi 19.01.05 16:54 
Besonders nett ist es, wenn die Query-Komponente so freundlich ist, mehrere Statements auf einmal auszuführen. Dann kann man nämlich lustige Effekte erzielen, wenn man sowas in die Edit-Box reinschreibt: ' where 0=1; delete from ADRESSEN; commit;
:twisted:

Stefan
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 19.01.05 18:42 
Hallo, Markos!

Bitte nutze für Deinen Delphi-Code die Delphi- anstatt der Code-Tags. Dadurch wird der Sourcecode mit Syntax-Highlighting angezeigt!

Danke
Christian :-)

P.S.: Hast Du nicht gewundert, weshalb die Quelltexte der anderen so schön bunt sind? :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Markos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Mi 19.01.05 19:39 
@Christian S.
Oh jetzt sehe ich es. Naja ein paar Wörter waren ja auch in blau :lol: