| Autor |
Beitrag |
Markos
      
Beiträge: 67
|
Verfasst: 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.
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 Christian S.: Code- durch Delphi-Tags ersetzt.
|
|
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: Di 18.01.05 23:58
| Markos hat folgendes geschrieben: | 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
      
Beiträge: 140
zuviele
D7,D8
|
Verfasst: 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.
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 
      
Beiträge: 67
|
Verfasst: 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
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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:
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; |
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 
      
Beiträge: 67
|
Verfasst: 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 
      
Beiträge: 67
|
Verfasst: Mi 19.01.05 09:27
@jasocul
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 Christian S.: Code- durch Delphi-Tags ersetzt.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 19.01.05 09:33
Fast.
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; |
Da GID vermutlich numerisch ist, benötigst du keinen Quoted-String. Also ein paar Anführungszeichen weniger.
|
|
Markos 
      
Beiträge: 67
|
Verfasst: Mi 19.01.05 09:46
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 67
|
Verfasst: Mi 19.01.05 16:05
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 19.01.05 16:33
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
      
Beiträge: 612
WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 67
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
      
Beiträge: 612
WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
|
Verfasst: 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;
Stefan
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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? 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Markos 
      
Beiträge: 67
|
Verfasst: Mi 19.01.05 19:39
@Christian S.
Oh jetzt sehe ich es. Naja ein paar Wörter waren ja auch in blau 
|
|