![]() |
Datenbank: access • Zugriff über: ado
Datensatzfeld BEIM speichern wieder abfragen
Hi,
folgendes Problem: 2 Tabellen 1. Tabelle: --> Userdaten 2. Tabelle: --> Infos Wenn ich einen Useranlege, wird die Userid automatisch angelegt (also AUTOWERT). Gleichzeitig möchte ich beim Speichern dieses Users in die Tabelle Infos auch einen "leeren" Datensatz speichern, wo bereits diese Userid vorhanden ist. Wie kann ich das ganze machen ohne einen Query auf die Datenbank machen zu müssen um an diese Userid zu gelangen? Ich hoffe ihr versteht was ich meine Danke für die Hilfe |
Re: Datensatzfeld BEIM speichern wieder abfragen
Ich kenn mich mit Access nicht aus.
Bei meiner Datenbank würde ich einen Trigger setzen. Der kann dann, eventuell über eine stored procedure, die ID in die zweite Tabelle eintragen. |
Re: Datensatzfeld BEIM speichern wieder abfragen
ja das leider access, in sql datenbanken kann man ja auch programmieren.
mir gehts im endeffekt darum, dass in der tabelle infos ein datensatz mitd er userid ist, damit ich auf diese tabelle einen query ausführen kann und dann sozusagen diese userid finde und die restlichen leeren felder nur noch mit einem UPDATE füllen muss :( keiner eine idee? |
Re: Datensatzfeld BEIM speichern wieder abfragen
Vielleicht auf autoinc verzichten
|
Re: Datensatzfeld BEIM speichern wieder abfragen
ja würd auch gehen
ich könnte auch nochmal mit allen parametern des users (name,vorname etc.) nen query drauf machen und so die ID herausbekommen aber ich wollte es einfach kürzer lösen und v.a. wenn ichs ohne autoinc mache dann hab ich noch mehr qrys weil ich ja so den letzten datensatz ermitteln und den dann um 1 hochzählen müsste. |
Re: Datensatzfeld BEIM speichern wieder abfragen
Zitat:
<HTH> |
Re: Datensatzfeld BEIM speichern wieder abfragen
ich will sowas wie in sql
last_insert_id() heißt :) nur wie geht das in access? in access kommt hier nämlich ein fehler. das select @@identity bringt mir nichts weil ich exakt den WERT benötige |
Re: Datensatzfeld BEIM speichern wieder abfragen
so etwas gibts nicht in standard SQL. wie gesagt mein tipp, vergiss die krankheit autoInc. mach 'n ordentlichen primary key und alles funzt ... :-)
|
Re: Datensatzfeld BEIM speichern wieder abfragen
die userid ist ja ein primärschlüssel nur halt als autowert *g*
meinst du ich sollte das autoinc weg lassen und mir den wert selbst errechnen? wie oben schon geschrieben wären das dann ncoh mehr querys und programmtext als wenn ich jetzt noch 1 query mit name,vorname,strasse etc. auf die tabelle mache oder meinst du was anderes? |
Re: Datensatzfeld BEIM speichern wieder abfragen
Zitat:
lass doch 'ne UID eingeben, prüf ab, wenn sie existiert, gibts 'ne meldung user kann nicht angelegt werden, da er bereits besteht, sonst leg die nötigen felder an. wenn du die UID einheitlich formatierst, z.b. OVERLOCKER kannst auch problemlos als (fremd)schlüssel in andernen tabellen verwenden. wo liegt das probelem? solltest nur drauf achten, dass die schlüssel einheitlich formatiert sind und nicht zu lang geraten.. dafür kannste dann attribute vergeben... :-) |
Re: Datensatzfeld BEIM speichern wieder abfragen
Moin,
ich würde den eingebauten Schlüsselgenerator (AUTOINC) eines DBMS nicht einfach so verdammen. Wenn der Datensatz per ADODataSet hinzugefügt wird, dann hat der Treiber den vom DBMS vergebenen Schlüssel ja vielleicht im Record-Buffer hinterlegt. Ein Zugriff per ADODataSet.FieldByName('ID').Integer beim Event AfterPost() sollte das zeigen. Freundliche Grüße |
Re: Datensatzfeld BEIM speichern wieder abfragen
Hallo,
![]() der 1. reply. Viell. hilft es ja. Ansonsten such mal in Google nach "Access AutoNumber" Heiko |
Re: Datensatzfeld BEIM speichern wieder abfragen
@marabu:der datensatz wird mit nem ADO Command eingefügt, mit dem geht es wohl nicht oder?
hmmm scheint doch alles komplizierter zu sein als gedacht |
Re: Datensatzfeld BEIM speichern wieder abfragen
Wer zwingt dich denn einen Satz per Command einzufügen?
Probiere das einfach mal aus und entscheide dann:
Delphi-Quellcode:
Vielleicht findest du noch eine bessere Lösung.
var
id: Cardinal; begin // ... with ADODataSet do begin Append; // FieldByName['SOME_FIELD'].AsInteger := Random(10); Post; id := FieldValues['ID']; end; end; |
Re: Datensatzfeld BEIM speichern wieder abfragen
wie meinst du das mit zwingt *g+??
es zwingt mich keiner, ich versuch das mal mit deinem code aber erstmal nachlesen alles weil ich nur hobbyprogrammierer bin und noch viel lernen muss^^ |
Re: Datensatzfeld BEIM speichern wieder abfragen
ok ich hab den baum vor lauter bäume gesehen
wieso kompliziert machen wenns auch einfach geht ich mach einfach n insert mit nem normalen command füg noch ne datasource auf die form, mach nen qry (select * from xy) datasource1.dataset.last; datasource1.dataset.fieldbyname('ID').asinteger; und schon habe ich die ID die ich brauche, wunderbar :)))) somit - closed - |
Re: Datensatzfeld BEIM speichern wieder abfragen
Hallo,
das funktioniert nur zuverlässig, wenn keine konkurrierenden Zugriffe erfolgen (exclusive mode). Und selbst dann solltest du es zumindest noch optimieren:
SQL-Code:
Freundliche Grüße
SELECT MAX(ID) FROM YOUR_TABLE
|
Re: Datensatzfeld BEIM speichern wieder abfragen
Zitat:
Gehst du den dann auch wieder löschen/ändern beim ersten richtigen Einfügen eines DS in Infos :gruebel: |
Re: Datensatzfeld BEIM speichern wieder abfragen
Optimieren mit Max(ID) bringt aber meiner meinung nach auch nichts.
sagen wir mal es speichern 2 Leute GLEICHZEITIG den User ab. dann bringt das max genauso nichts weil ich ja mit dataset.last sowieso den letzten Datensatz markieren (der auch wiederum die größte ID hat). ich werd das mal testen, eigentlich müsste es da keine probleme geben weil die befehle ja innerhalb von ms ausgeführt werden und dass so ein zufall eintritt, da ist die warscheinlichkeit schon sehr niedrig. aber ich schau mir das mal an danke für den hinweis |
Re: Datensatzfeld BEIM speichern wieder abfragen
Ist es möglich, dass du mich falsch verstanden hast?
Ich hatte zwei Aussagen gemacht: (A) Eine notwendige Voraussetzung für ein zuverlässiges Funktionieren deines Ansatzes ist der Single User Modus. (B) Ist die Voraussetzung gegeben, dann kannst du den Vorgang optimieren, indem du nicht die die ganze Tabelle mit allen Spalten durch die Record Buffer scheuchst, sondern nur auf das eine interessante Feld des richtigen Datensatzes zugreifst. Bei dir scheint A UND B angekommen zu sein, ich habe aber WENN A DANN B gemeint. Wenn du konkurrierende Zugriffe nicht ausschließen willst oder kannst, dann darfst du dich nicht mit Annahmen über die Wahrscheinlichkeit eines fehlerhaften Zugriffs trösten. Fehler bei der Umsetzung einer Idee können vorkommen, ein fehlerhaftes Konzept sollte man aber garnicht erst implementieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz