Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: tismo am Oktober 29, 2012, 21:50:15

Titel: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: tismo am Oktober 29, 2012, 21:50:15
Hallo zusammen,

ich sitze jetzt seit einigen Tagen an folgendem Problem:

mein Kombinationsfeld übergibt nicht die richtigen Daten an die entsprechenen Textfelder. Im Kombinationsfeld kann ich aus allen möglichen Datensätzen aussuchen. Es wird ausschließlich der erste erstellte Datensatz übergeben

On Error GoTo Err_FremdleisterAuswahl_AfterUpdate

     Dim strFilter As String
   
     strFilter = "[FremdleisterAuswahl] = " & Me![FremdleisterAuswahl]

     Me!FremdleisterStraße = DLookup("Adresse", "Lieferanten", strFilter)
     Me!Fremdleister = DLookup("LieferantenName", "Lieferanten", strFilter)
     Me!FremdleisterOrt = DLookup("Ort", "Lieferanten", strFilter)
   
Exit_FremdleisterAuswahl_AfterUpdate:
     Exit Sub
Err_FremdleisterAuswahl_AfterUpdate:
     MsgBox Err.Description
     Resume Exit_FremdleisterAuswahl_AfterUpdate

End sub


weder bei der VBA noch als Makro mit 'setzen Wert' funktioniert die Übergabe korrekt.
Bei anderen Kombinationsfeldern in anderen Formularen funktioniert alles einwandfrei.

Ich verzweifele langsam  >:( ???


Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: bahasu am Oktober 29, 2012, 22:21:11
Hi,

ist Fremdleisterauswahl ein Text-Feld?
Wenn ja =>
strFilter = "[FremdleisterAuswahl] = '" & Me![FremdleisterAuswahl & "'"

Harald
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: tismo am Oktober 29, 2012, 22:26:32
Hallo Harald,

FremdleisterAuswahl ist das Kombinationsfeld

Gruß,

Lars
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: MzKlMu am Oktober 30, 2012, 00:35:13
Hallo,
hier war der Datentyp des Tabellenfeldes gefragt.

Ich halte das ganze Vorhaben in der Form für völlig überflüssig. Im Regelfalle übergibt man mit dem Kombi den Primärschlüssel des Lieferanten an das Fremdschlüsselfeld.
Das Kombi bindet man an das entsprechende Tabellenfeld das den Fremdschlüssel aufnimmt. Weitere Felder (Straße, Ort, Name etc.) zu speichern ist der falsche Weg und auch nicht notwendig.

Das Ganze lässt sich ohne eine einzige Zeile VBA vollautomatisch mit den Standardfunktion von Access erreichen.
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: tismo am November 02, 2012, 09:36:31
Hallo,

1. das Kombinationsfeld ist ein Textfeld
2. Bislag speichere aus Sicherheitsgründen die übergebenen Daten immer wieder im Datensatz, d.h. die übergebenen Daten werden in den oben beschriebenen Feldern abgelegt und dementsprechend gespeichert.  Bislang funktionierte dieses Methode einwandfrei und fehlerlos. Doch hierbei wird immer nur der erste Datensatz an die Felder übergeben, egal, was im Kombi-Feld steht.

Gruß,
Tismo
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: MzKlMu am November 02, 2012, 09:50:03
Hallo,
Zu 2)
Was ergibt sich daraus für ein Sicherheitsgewinn?
Es ist überflüssig die Daten mehrfach zu speichern, der Primärschlüssel als Fremdschlüssel reicht, der Rest ist redundant und in einer Datenbank zu vermeiden.
Der Primärschlüssel des Lieferanten bleibt bei Deinem Code ohnehin außen vor, was ein weitere Fehler ist. Du programmierst Sachen, die man nicht braucht, bzw. Access mit seinen Standardfunktionen schon besser beherrscht.
Und wer so wie Du DLookup verwendet/verwenden muss, verschenkt auch viele Automatismen die Access serienmäßig hat.
Für Dein Vorhaben bedarf es keines einzigen Buschstabens VBA Code, korrekter Aufbau vorrausgesetzt.

Trotzdem der Hinweis:
Da Textfeld müssen Hochkomma verwendet werden.
strFilter = "[FremdleisterAuswahl] = '" & Me![FremdleisterAuswahl] & "'"
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: bahasu am November 02, 2012, 11:36:04
Hi,

solch ein Speichern aus "Sicherheitsgründen" macht Sinn, wenn man eine Historie festhalten will:
z.B. der Preis eines Angebotes ändert sich mit jedem Angebot und soll daher beim Angebot festgehalten werden.

Ein ständiges Ändern der Adresse ist (hoffentlich) nicht der Fall. Also gilt der Vorschlag von Klaus.

Was ist eigentlich das Ergebnis aus  « Antworten #1 am: Oktober 29, 2012, 22:21:11 »?  ???

Harald
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: tismo am November 02, 2012, 20:48:19
Danke für die Hilfe  ;D

jetzt funktioniert alles!
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: tismo am November 02, 2012, 22:50:49
... leider zu früh gefreut  >:(

nach dem abspeichern der Datenbank

kam wieder das selbe Problem:

der im Kombinationsfeld 'FremdleisterAuswahl' ausgesuchte Datensatz wird nicht in die entsprechendenen Felder übertragen.
Egal welchen Datensatz ich aussuche , es wird grundsätzlich der ertse Datensazt in die Felder gesetzt.

Hier nochmal der Code
Private Sub FremdleisterAuswahl_AfterUpdate()

On Error GoTo Err_FremdleisterAuswahl_AfterUpdate

     Dim strFilter As String

     strFilter = "[FremdleisterAuswahl] = '" & Me![FremdleisterAuswahl] & "'"
   
     Me!FremdleisterStraße = DLookup("Adresse", "Lieferanten", strFilter)
     Me!Fremdleister = DLookup("LieferantenName", "Lieferanten", strFilter)
     Me!FremdleisterOrt = DLookup("Ort", "Lieferanten", strFilter)
     Me!FremdleisterPlz = DLookup("Postleitzahl", "Lieferanten", strFilter)
     Me!FemdleisterAnsprechpartner = DLookup("Kontaktperson", "Lieferanten", strFilter)
     Me!FremdleisterTelefon = DLookup("Telefonnummer", "Lieferanten", strFilter)
     Me!FremdleisterTelefon1 = DLookup("Faxnummer", "Lieferanten", strFilter)
     Me!FremdleisterMail = DLookup("eMailAdresse", "Lieferanten", strFilter)
     Me!FremdleisterTelefon2 = DLookup("Telefonnummer2", "Lieferanten", strFilter)
     Me!FremdleisterTelefon3 = DLookup("Telefonnummer3", "Lieferanten", strFilter)

Exit_FremdleisterAuswahl_AfterUpdate:
     Exit Sub
Err_FremdleisterAuswahl_AfterUpdate:
     MsgBox Err.Description
     Resume Exit_FremdleisterAuswahl_AfterUpdate



End Sub


In der Tabelle Lieferanten ist kein Primärschlüssel


Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: MzKlMu am November 02, 2012, 23:20:29
Hallo,
ZitatIn der Tabelle Lieferanten ist kein Primärschlüssel
eine Tabelle ohne Primärschlüssel ist ein absolutes No Go in einer Datenbank. Lege einen Primärschlüssel (Autowert) an und speichere diesen in der jetzigen Tabelle als Fremdschlüssel.
Das Kombi wird an das Fremdschlüsselfeld gebunden und fertig. Es wird überhaupt kein Code benötigt, was ich ja die ganze Zeit schon sage, aber Du vollständig ignorierst.
Du kannst über eine Abfrage aus beiden Tabellen jederzeit alle Felder (aus beiden Tabellen) anzeigen. Den ganzen Krampf mit den DLookups kannst Du einfach sein lassen. Diese Felder in die Tabelle zu übertragen ist schlicht und einfach völlig daneben. Das ganze Konzept so wie Du das jetzt hast, kann gar nicht funktionieren. Wo ist denn das Feld "FremdleisterAuswahl", das muss für den Filter Bestandteil der Tabelle "Lieferanten" sein, diese Feld willst Du ja filtern. Ist es das?

Du solltest Dich dringend mit den Grundlagen zum Aufbau einer Datenbank beschäftigen. Primärschlüssel und Fremdschlüssel sind eine unabdingbare Vorraussetzung für eine funktionierende Datenbank.
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: database am November 03, 2012, 08:27:39
Hallo,

neben den absolut zu beachtenden Hinweisen von MzKlMu, liegt dein Problem hier begraben:

strFilter = "[FremdleisterAuswahl] = '" & Me![FremdleisterAuswahl] & "'"

strFilter = "[FremdleisterAuswahl] = ...

Bedeutet, dass '[FremdleisterAuswahl]' ein Feld in deiner Tabelle 'Lieferanten' sein muss!

Me![FremdleisterAuswahl]

... hast du als ein Formularfeld, dein Kombi bekanntgegeben. Wie ist den das Feld aufgebaut, woher bezieht es denn seine Daten?
Vor Allem - was steht denn in der gebundenen Spalte - dieser Inhalt soll den Vergleich mit dem Tabellenfeld [FremdleisterAuswahl] liefern - tut es aber offensichtlich nicht.

Wenn du aus diesem Feld einen Wert beziehst und auf diesem begründet Daten aus der Lieferanten-Tabelle holen willst MUSS der ausgewählte Wert auch in der Tabelle Lieferanten vorkommen!
Der Inhalt der Variablen 'strFilter' MUSS in einer Domänenfunktion - in deinem Fall DLookup - eine gültige, auswertbare WHERE Klausel darstellen.

Ich vemute sehr stark, dass deine Klausel jedoch keine Einschränkung auf einen bestimmten Datensatz liefert und daher wird der erste Datensatz aus der Tabelle genommen.

M.E. sollte das Kombi eine Liste der Lieferanten darstellen oder liege ich da falsch?
In dem Fall sollte die gebundene Spalte des Kombis den Primärschlüssel der Lieferanten-Tabelle enthalten.
Nur so ist es möglich die Adresse, den Namen, ... zu einem ausgewählten Lieferanten aus der Tabelle abzufragen!

Vielleicht hilft dir zum Verständnis ein wenig Pseudocode ...
Diese Anweisung  ....  DLookup("Adresse", "Lieferanten", strFilter) ....
bedeutet:

Lese aus der Tabelle 'Lieferanten' die Adresse des Lieferanten, wobei der Wert in [FremdleisterAuswahl] dem Inhalt des Formularfeldes [Fremdleisterauswahl] entspricht.

Würde deine Lieferantentabelle einen Primärschlüssel enthalten und das Kombi sowie die Zusammensetzung der WHERE Klausel RICHTIG aufgebaut sein würde die gleiche Anweisung u.U.

Lese aus der Tabelle 'Lieferanten' die Adresse des Lieferanten, wobei der Primärschlüssel den Wert 3 enthält (wenn der Lieferant mit dem PK 3 ausgewählt wurde)
und das funktioniert - GARANTIERT
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: MzKlMu am November 03, 2012, 10:39:12
Hallo,
damit das Ganze nicht alzu abstrakt abläuft habe ich Dir mal ein einfaches Beispiel gebastelt.
Schaue Dir auch mal die Beziehungen im Beziehungsfenster an.
Öffne das Formualr und wähle mit dem Kombi einen Lieferanten. Wie Du siehst, hast Du dann sofort auch die restlichen Felder eines Lieferanten im Formular sichtbar.
Es genügt vollständig nur den Primärschlüssel (LieferantenNummer) als Fremdschlüssel in der Datentabelle zu speichern. Mit einer Abfrage kannst Du Dir immer auch die restlichen Felder anzeigen.
Das Beispiel enthält kein VBA Code.

Anzumerken wäre noch, dass die Lieferrantentabelle an sich auch falsch aufgebaut ist. Die Kontaktperson gehört in eine eigene Tabelle und auch die Kommunikationsmöglichkeiten sind in eigene Tabellen als n:m Beziehung auszulagern.
Genau genommen, wäre hier noch zu unterscheiden, ob die Kommunikationsmöglichkeiten zur Person oder zur Firma direkt gehören. Z.B. Tel.Nummer der Zentrale gehört zur Firma, Durchwahl zur Person.

[Anhang gelöscht durch Administrator]
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: tismo am November 03, 2012, 18:12:53
Der Fehler lag im Formular.  :o

Nachdem ich das Formular neu erstellt habe funktioniert alles einwandfrei.
Trotzdem Danke an alle, die mir Ratschläge und Hilfe gegeben haben.
Die Lösung mit der Abfrage ist absolut korrekt, kann hier jedoch nicht eingesetzt werden, da bei Änderung der Daten im Formular, sofort die 'Stammdaten' geändert werden.
Titel: Re: Kombinationsfeld übergibt die Daten nicht richtig
Beitrag von: MzKlMu am November 03, 2012, 18:21:55
Hallo,
Zitatkann hier jedoch nicht eingesetzt werden, da bei Änderung der Daten im Formular, sofort die 'Stammdaten' geändert werden.
Doch, kannst Du auch verwenden, Du kannst direkt im Formular auch die Stammdaten ändern, sogar einen Lieferanten neu erstellen.