Hallo zusammen,
ich bin leider noch sehr grün was Access angeht und auch meine VBA Kenntnisse beschränken sich im wesentlichen auf das Plotten von Graphen. Nun möchte ich eine Datenbank rund um meinen 3D-Drucker erstellen und bin gleich zu Beginn auf ein (für mich unlösbares) Problem gestoßen. Alleine komme ich leider nicht weiter, aber vielleicht kann mir ja hier jemand helfen.
Es gibt zwei Tabellen, wobei die erste tblLieferantCharge heißt, die zweite tblEigeneCharge. tblLieferantCharge besteht nur aus zwei Feldern: IDLieferant (Autowert) und lngLieferantCharge (langer-Text). Die Tabelle tblEigeneCharge besitzt die Felder IDEigeneCharge (Auto), lngEigeneCharge (langer-Text) und intIDLieferant.
Die zwei Tabellen sind außerdem über eine 1:n Beziehung (1: IDLieferant zu n:intIDLieferant) miteinander verknüpft.
Nun möchte ich eine Eigene Charge eingeben (gebundenes Textfeld zu lngEigeneCharge ist vorhanden), die dazu passende lngLieferantCharge aus dem Kombinationsfeld (Werte kommen von lngLieferantCharge) wählen und bei betätigen eines Buttons (z.B. speichern) soll der neue Wert lngEigeneCharge in die Tabelle tblEigeneCharge eingetragen werden. Außerdem soll nun eine Abfrage mit dem Wert aus dem Kombinationsfeld gestartet werden und die IDLieferant an eine Variable übergeben werden, die dem ausgewählten Wert des Kombinationsfeld entspricht. Diese Variable (ist ja erst einmal ein String?) soll dann in eine Integer umgewandelt werden und im Feld intIDLieferant neben dem neu eingetragenen Wert lngEigeneCharge eingetragen werden.
Ich würde so anfangen:
Sub intIDLieferant_eintragen_Klick()
Dim WertKombiFeld As String
Dim AbfrageLieferantCharge As String
WertKombiFeld = Me.NameMeinesKombiFeldes.Column(0) 'Syntax!?
AbfrageLieferantCharge = "SELECT * FROM tblLieferantCharge" _& 'Syntax!?
"WHERE tblLieferantCharge.IDlLieferant = WertKombiFeld" 'Syntax!?
...
'hier muss ja dann der String noch in eine Integer umgewandelt und mit INSERT (?) in das Feld intIDLieferant der tblEigeneCharge eingetragen werden
End Sub
Vielen Dank für eure Mühe
Felix
Hallo Felix,
gleich am Anfang: Du denkst vermutlich zu kompliziert ...
ZitatNun möchte ich eine Eigene Charge eingeben (gebundenes Textfeld zu lngEigeneCharge ist vorhanden), die dazu passende lngLieferantCharge aus dem Kombinationsfeld (Werte kommen von lngLieferantCharge) wählen und bei betätigen eines Buttons (z.B. speichern) soll der neue Wert lngEigeneCharge in die Tabelle tblEigeneCharge eingetragen werden. Außerdem soll nun eine Abfrage mit dem Wert aus dem Kombinationsfeld gestartet werden und die IDLieferant an eine Variable übergeben werden, die dem ausgewählten Wert des Kombinationsfeld entspricht. Diese Variable (ist ja erst einmal ein String?) soll dann in eine Integer umgewandelt werden und im Feld intIDLieferant neben dem neu eingetragenen Wert lngEigeneCharge eingetragen werden
vermutlich möchtest Du aus "tblLieferantCharge" einen DS mittels Kombifeld auswählen und einem neuen DS in "tblEigeneCharge" zuordnen.
Dazu ist kein VBA und auch keine Datentyp-Konvertierung (absolut ein NoGo in einer DB bei Tabellenfeldern!) erforderlich.
Grundsätzlich: Lege für jede Tabelle ein separates Formular an.
"frmLieferantCharge" enthält die Felder aus "tblLieferantCharge", "frmEigeneCharge" die Felder aus " tblEigeneCharge".
In "frmEigeneCharge" ist ein an "intIDLieferant" gebundenes Kombifeld vorhanden mit
Datensatzherkunft: Select IDLieferant , Left(lngLieferantCharge,100) as Charge from tblLieferantCharge
Gebunden Spalte : 1
Spaltenanzahl: 2
Spaltenbreiten: 0cm;10cm
Mit diesem Kombi kann eine Lieferanten-Charge ausgewählt werden, deren ID in "tblEigeneCharge" abgelegt wird.
Um alle eigenen Chargen anzuzeigen, die zu einer Lieferanten-Charge zugeordnet sind, kann eine Haupt-/Unterformular-Konstruktion verwendet werden:
Ziehe in frmLieferantenCharge das (Endlos-)Form "frmEigeneCharge" an passende Stelle im Detailbereich. Die Verknüpfungsfelder (Schlüsselfelder) werden automatisch gesetzt, wenn die Beziehungen definiert sind.
Das UFO zeigt sodann alle einem Lieferanten zugeordneten eigene Chargen an.
Tatsächlich, das funktioniert einwandfrei!
Allerdings bin ich mir noch nicht sicher ob ich das zu 100% verstanden habe.
ZitatSelect IDLieferant , Left(lngLieferantCharge,100) as Charge from tblLieferantCharge
Left(lngLieferantCharge,100): schreibt die Daten aus lngLieferantCharge in die linke Spalte einer 2-spaltigen Tabelle (deshalb fällt das Right vor IDLieferant weg?, da ja eindeutig bestimmt) mit der Zeilenbreite 10 cm. IDLieferant fällt unter den Tisch, da es in der rechten Spalte steht und im Kombinationsfeld nur die erste Spalte angezeigt wird?
Außerdem steht hier nach dem "As" "Charge". Das dient als Suchwort und würde theoretisch alle Felder mit dem Begriff "Charge" im Namen berücksichtigen (da hier nur ein Feld mit *"Charge"* vorhanden...)?
Das Eintragen des Werts intIDLieferant wird durch die Bindung an dieses Feld erzwungen. Nun ist hier ja ein String und ein Integer vorhanden (2-spaltige Tabelle). Wird dann durch die Definition des Feldtyps (Integer) der String vernachlässigt?
Vielen herzlichen Dank für die Hilfe sowie viele Grüße aus Mainz
Felix
Hallo,
mhmm, da ist Einiges verkehrt...
Die Kombifeldliste ist zweispaltig, wobei die erste (linke) wegen der Spaltenbreite von 0cm ausgeblendet ist, aber trotzdem den Primärschlüsselwert enthält. Die zweite Spalte (scheinbar als "erste" Spalte sichtbar) wird mit 100 Zeichen (willkürlich gewählt) gefüllt, deshalb , weil es sich um ein Tabellen-Memofeld (Langer Text) handelt. In einer Kombilistenspalte stehen eh nur 255 Zeichen zur Verfügung. Die Zeilen(Spalten)breite ist beliebig anpassbar und mit 10 cm willkürlich gewählt.
Dadurch, dass die erste (ausgeblendete) Spalte die gebundene ist, wird in das Fremdschlüsselfeld in "tblEigeneCharge" der ID-Wert der ausgewählten Lieferanten-Charge eingetragen.
ZitatAußerdem steht hier nach dem "As" "Charge". Das dient als Suchwort und würde theoretisch alle Felder mit dem Begriff "Charge" im Namen berücksichtigen (da hier nur ein Feld mit *"Charge"* vorhanden...)?
"Charge" ist lediglich ein Aliasname für das LangText-Feld und kommt nur im Listenfeld zum Tragen. Es würde angezeigt, wenn in den Kombifeld-Eigenschaften "Überschrift anzeigen" eingestellt ist.
Mit Such-Vorgängen hat das nichts zu tun.
ZitatNun ist hier ja ein String und ein Integer vorhanden (2-spaltige Tabelle). Wird dann durch die Definition des Feldtyps (Integer) der String vernachlässigt?
?? Das ID-Feld muss ein Autowert und damit den Datentyp LONG besitzen, desgleichen das Fremdschlüsselfeld in "tblEigeneCharge".
Hier wird nichts vernachlässigt, sondern die Datentypen konsequent verwendet.
Die Strings (die "Chargentexte") werden nirgendwo hin kopiert, sie werden lediglich durch die jeweiligen ID-Werte definiert.
Na da war ich ja total auf dem Holzweg ;D
Vielen Dank, jetzt ist alles nachvollziehbar!
Viele Grüße
Felix