# Textfeld automatisch füllen



## silkeR (20. August 2006)

Hallo, habe folgendes Problem:

ich möchte mit einer VB-Oberfläche Datensätze (Adressen mit Name und so) aus einer Access-DB abfragen, Datensätze hinzufügen und löschen. In der DB habe ich ein Feld AdressID mit dem Datentyp Zahl. Nun soll das Feld AdressID aber beim Hinzufügen von DS über VB (mit Textfeld) automatisch vergeben werden. Ich behalte ja nicht den Überblick (insbesondere wenn ich DS dazwischen mal lösche), welche Zahlen alle schon vergeben sind. Will das Feld AdressID also nicht per Hand eingeben. Wenn ich für das Feld AdressID im Access den Datentyp Autowert nehme, kann das Feld nicht aktualisiert werden (DS kann also nicht hinzugefügt werden).
Hat jemand eine gute Idee, wie ich das lösen kann. 

Ist mein Problemfall zu verstehen? Ist für VB-Kenner bestimmt gar kein Problem, aber für Anfänger wie mich  

Besten Dank!
Silke


----------



## DevHB (21. August 2006)

Hi,

wie fügst Du DS hinzu?
Per SQL oder per Recordset?


----------



## silkeR (21. August 2006)

Hallo, 

ich füge die DS mit Recordset hinzu.


----------



## DevHB (21. August 2006)

Hi,

wenn Du die Änderungen (INSERT, UPDATE) per SQL machst, kann auch der Autowert verändert werden.

Aber das ist nicht die Lösung des Problems.

Lass das Feld bei der Aktualisierung doch einfach weg, oder verstehe ich da was falsch?

Zeig mal den Code fürs Aktualisieren.


----------



## silkeR (21. August 2006)

Hallo,

hatte ich auch schon so gedacht, diese ID einfach wegzulassen und schon probiert. Aber dann funktioniert gar nichts mehr. Es wird aus mir noch unerklärlichen Gründen der DS der schon drin steht überschrieben und der DS den ich anhängen will, trotzdem noch mal angefügt. Steht dann also zweimal drin und der vorhergehende gar nicht mehr. ?

Wenn ich dann noch einen DS anfügen will kommt folgende Fehlermeldung: „Die Schlüsselspalteninformationen sind ungenügend oder inkorrekt. Es sind zu viele Zeilen von der Aktualisierung betroffen.“ à Deshalb habe ich wahrscheinlich diese ID als Primärschlüssel in Access eingefügt. Finde aber auch, dass die überflüssig ist. Mein Fehler liegt also bestimmt woanders – keine Ahnung.  

Danke für die Hilfe.  

Gruß, Silke

___________

So hatte ich das gedacht. Erst Daten in die Textfelder schreiben, dann auf Button hinzufügen klicken und DS ist in DB. Und hatte gehofft, dass geht mit dem Programmcode hier:

Private Sub cmd_add_Click()

   Dim Vorname As String
   Dim Nachname As String
   Dim Ort As String

'Adodc1.BOFAction ?
Adodc1.Recordset.MoveLast

Vorname = txt_vorname.Text
Nachname = txt_nachname.Text
Ort = txt_ort.Text


Adodc1.Recordset.AddNew
Adodc1.Recordset!Vorname = Vorname
Adodc1.Recordset!Nachname = Nachname
Adodc1.Recordset!Ort = Ort

Adodc1.Recordset.Update

txt_vorname.Text = ""
txt_nachname.Text = ""
txt_ort.Text = ""

MsgBox "Der Name wurde hinzugefügt"
End Sub


----------



## DevHB (22. August 2006)

Hi,

Dein Fehler liegt in der Benutzung des ADODC - Steuerelemtes.
Das Ding ist buggy bis zum geht nicht mehr und führt zu unerklärlichen Verhalten.
Mach die Connection und die Recordsets per Code, dann hast Du mehr Kontrolle im
Verhalten und weißt, was passiert.

Siehe hier, ein gutes Tutorial:
Der große ADO-Kurs

Danach schau Dir dieses Beispiel an, dass ist auch sehr gut:
SQL-Adress


> ein Demo für eine Adressverwaltung in einer Access. Insert, Update und Delete erfolgt ausschliesslich über SQL Anweisungen, unterstützt wird das alles von einer speziellen Klasse.


----------



## silkeR (22. August 2006)

Hi,

Connection und Recordset per Code -  (ich dachte, das ist schon ein Programmcode). - Nun gut, egal.

Besten Dank für die Hilfe und die Links. Werde mich mal einlesen in diese Thematik. 

Gruß, Silke


----------



## DevHB (23. August 2006)

Hi,

sicher ist das Programmcode, jedoch lässt Du die Verbindung und deren Handling vom ADODC - Steuerlement machen und das ist nicht gut.
Mach Änderungen in der DB möglichst nur mit SQL und über die "Connection.Execute" - Methode, dann hast Du wesentlich weniger Probleme und die Daten landen schneller in der DB als mit dem Recordset.
Zudem hast Du beim refreshen von Listen o.ä. weniger Probleme, weil die Daten halt schon in der DB drin sind (durch Connection.Execute(SQLStatement).


----------



## silkeR (23. August 2006)

Hallo,

wenn ich dich richtig verstehe, rätst du mir eher das mit SQL zu machen. Dazu hab ich aber mal noch 'ne Frage. Wollte eigentlich, wenn ich nach einem DS suche, z.B. nur Vor- u./o. Nachname in ein Textfeld eingeben. Geht das auch mit SQL Bisher dachte ich, mit SQL müsste ich immer eine komplette Abfrage eintippen, also Select * from ... where ... Und das will ich nicht. Will ja bei der Suche nach DS nicht auch noch über den richtigen SQL-Text nachdenken müssen  Hast du noch einen guten Tipp, wo ich SQL in Verbindung mit VB (so im allg. und Grundlagen) gut nachlesen kann (Buch oder online).

Danke und Gruß,
Silke


----------



## DevHB (23. August 2006)

Hi,

Das mit der Eingabe des Vor / Nachnamens in der Textbox bleibt auch so, jedoch baust Du dir dann mit der Eingabe des Textfeldes die SQL - Anweisung zusammen, z.B. so:

```
Private Sub txtSuche_LostFocus()
    Dim sSQL As String
    Dim Rs     As ADODB.Recordset

    sSQL = "SELECT * FROM DeineTabelle " & _
                "WHERE Vorname = '" & txtSuche.Text & "'"
    
    Set Rs = New ADODB.RecordSet
    With Rs
       ' einstellungen 
       Call .Open (sSQL, AktiveConnectionZurDB)
    End With     
    ' daten aus Recordset darstellen
End Sub
```
Der Code soll nur verdeutlichen, wie es ungefähr funktioniert!

Schau Dir am Besten mal die SQL-Adress-Demo an, dort wird das gut erläutert.


----------

