Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Abragen über mehrere Tabellen

Begonnen von gsaccess, Dezember 17, 2024, 00:26:14

⏪ vorheriges - nächstes ⏩

gsaccess

Hallo,

Danke für eure Hilfe!!

ZitatUnd was wird angezeigt, wenn du bei der Fehlermeldung auf "debuggen" klickst?
siehe Bild. Debuggen steht nicht zur Verfügung.
Zitatdas wird so nicht gehen. Erstens braucht die Query qryKundeAdressePLZ sicherlich einen eindeutige ID, damit nur eine Adresse ausgewählt wird und zweitens sind die Formularfelder natürlich als "private" deklariert, somit nicht von außerhalb des Formulars sichtbar.
In der Abfrage ist eine ID:
SELECT DISTINCTROW tblKunden.KundenID, tblKunden.KundenNrAlt, LTrim((+[firmenname] & " ") & (+[Hauptname]) & (" "+[vorname]) & (" "+[zusatz])) AS Kundenname, tblAdresse.Straße, tblPlz.PLZ, tblPlz.Ort, tblAdresse.AdressenartID_F, tblAdresse.ArchivJN
FROM tblPlz RIGHT JOIN (tblKunden LEFT JOIN tblAdresse ON tblKunden.KundenID = tblAdresse.KundenID_F) ON tblPlz.PLZID = tblAdresse.PlzID_F
WHERE (((tblAdresse.AdressenartID_F)=1) AND ((tblAdresse.ArchivJN)=False));
ZitatSchreibe dir eine Funktion, welcher die aktuelle ID als Argument übergeben wird. Diese Funktion erstellt ein neues Recordset basierend auf der Query mit der ID als Kriterium und gibt dieses dann an den Aufrufer zurück.
Kannst du mir dazu einen Link oder etwas code schicken. Damit bin ich leider überfordert.
Der Code von mir funktioniert im jeweiligen Formular.
Option Compare Database
Option Explicit
Public Sub FelderFuellen()
Me.Kunden_Nr = Me.cboKundenNr.Column(0)
'Me.Kunden_Nr = DLookup("KundennrAlt", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
Me.txtKunde = DLookup("Kundenname", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
Me.txtStraße = DLookup("Straße", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
Me.txtPLZ = DLookup("plz", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
Me.txtOrt = DLookup("Ort", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)

Me.txtauftragsbeschreibung = Me.cboKundenNr.Column(3)
Me.txtReNr = DMax("[rechnungnr]", "tblRechnung") + 1  'Format(Date, "jj.mm") &
Me.Rechnungsdatum = Date 'ist das Rechnungsdatum
Me.Lieferdatum_von = Me.cboKundenNr.Column(7)
Me.Lieferdatum_bis = Date
'wenn keine Lieferadresse eingetragen ist, wird die Rechnungsadresse übernommen
        If IsNull(DLookup("KundennrAlt", "qryKundeLieferAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)) Then
'        Lieferadresse = MsgBox("Die Rechnungsadresse ist die Lieferadresse- mit enter bestätigen", vbYesNo + vbQuestion, "Rückfrage zur Lieferadresse")
'            If Lieferadresse = vbYes Then
            Me.LEmpfaenger = DLookup("Kundenname", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
            Me.LStrasse = DLookup("Straße", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
            Me.LPlz = DLookup("plz", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
            Me.LOrt = DLookup("Ort", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
'            End If
        Else
               Me.LEmpfaenger = DLookup("Kundenname", "qryKundeLieferAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
            Me.LStrasse = DLookup("Straße", "qryKundeLieferAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
            Me.LPlz = DLookup("plz", "qryKundeLieferAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
            Me.LOrt = DLookup("Ort", "qryKundeLieferAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
           
   
       
        End If
End Sub
Ich möchte aber den code nicht in jedes Formular kopieren.

Gruß Günther



Knobbi38

Hallo Günther,

bei aller Liebe, aber irgendwann kommt der Zeitpunkt, da solltest du dir besser selber mal ein Fachbuch zur Hand nehmen, als hier im Forum für immer neue/alte Probleme Hilfestellung zu erwarten. Diese fällt zudem auch noch Unterschiedlich aus, je nach vorherrschender Meinung des jeweiligen Helfers. Genau das ist damit gemeint, wenn es heißt: "viele Köche verderben den Brei".

Deine Query um Kunden und Adressinformationen zusammen zu bringen ist ja schön, aber Right Joins und Left Joins in Verbindung mit Distincrow? Das geht sicher auch einfacher und ein Kriterium für eine  Kundenauswahl sehe ich jetzt auch nicht. Fragt sich, ob so eine Query überhaupt notwendig ist.

Du scheinst ja ein Freund von DLookup zu sein, bei dem exzessiven Gebrauch davon. Eigentlich brauch man Dlooklup nur ganz selten, den in Formularen und Berichten wird durch die Verwendung von Komboboxen so etwas obsolet. Und dabei solltest du nicht vergessen, daß jedes einzelne DLookup einen separaten Zugriff auf die Datenbank darstellt. Die anderen Nutzer im Netzwerk werden dir das danken und deine Formulare werden früher oder später Performanceprobleme bekommen.

Für so einen Zugriff:
Me.LEmpfaenger = DLookup("Kundenname", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
            Me.LStrasse = DLookup("Straße", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
            Me.LPlz = DLookup("plz", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
            Me.LOrt = DLookup("Ort", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
macht man genau ein SQL Select und verwendet für die Zuweisung dann die Daten des Recordsets.

Wenn du schon das Schlüsselwort Me verwendest, hast du das überhaupt jemals in der VBA-Sprachreferenz nachgeschlagen, wofür das steht und was damit gemacht wird? Hättest du das gemacht, wüßtest du, daß Me nur innerhalb von Objekten verwendet werden kann ein Bezug auf die eigene Instanz ist - also außerhalb eines Objekts völlig sinnfrei.

Ich hoffe, du bist mir nicht böse, wenn ich das so sage. Es scheint mir jedoch wichtig, dass du nicht nur CP machst, sondern versuchst auch den Inhalt zu verstehen und auch die bisher erlernten Inhalte anwendest, damit du damit wirklich etwas erreichen kannst. Aber das sehe ich noch nicht so. Ein Forum ist leider wirklich kein geeignetes Medium, um Grundlagen zu vermitteln, daß solltest du mittlerweile erkannt haben.

In #14 habe ich verbal genau beschrieben, wie so eine Funktion aussehen könnte, aber es gibt noch nicht mal ansatzweise von dir den Versuch, geschweige denn einen Codevorschlag, daß umzusetzen. Ein bißchen mehr Eigeninitiative hätte ich schon erwartet.
Ich verstehe ein Forum immer noch als Mittel zur Selbsthilfe, nicht als Code-Writing-Service - Sorry.

Gruß
Ulrich

gsaccess

Hallo Ulrich,
Vielen Dank für die ausführliche Antwort.
Da gibt es für mich ja einiges an Basics zu erlernen und zu bearbeiten.
Ich habe schon Fachbücher. Aber mit der Umsetzung hapert es noch.
Ich werde versuchen das Problem mit deinen Hinweisen dem Netz und den Fachbüchern zu lösen und in dieser Sache nicht mehr lästig zu sein.

Gruß Günther

Beaker s.a.

Dieses DLookup-Gewitter würde bei einfach nur so aussehen
Me.LEmpfaenger = DLookup("FullAdress", "qryKundeAdressePLZ", "[kundenid] =" & Me.Kunden_Nr)
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Knobbi38

Hallo Günther,

Zitat von: gsaccess am Dezember 20, 2024, 16:51:54in dieser Sache nicht mehr lästig zu sein.
Das war nicht so gemeint, sondern einfach als Anregung gedacht, nicht einfach etwas zu übernehmen, sondern zu versuchen, die Vorschläge und Ideen der Helfer zu verstehen und dann für sich umzusetzen. Einfach mal ein paar Dinge in der Doku nachlesen, was da eigentlich gemacht wird.

Wenn du also jetzt ein paar Felder als Kopie in die Rechnung übernehmen möchtest, solltest du das mit dem Datenmodell auch abgleichen und überprüfe, ob das noch so passt bzw. sinnvoll ist.

Was das VBA mit der Abfrage betrifft, habe ich mal eine kleine Demo mit verschiedenen Varianten erstellt.
Schau es dir mal an und gehe vielleicht auch mal mit dem Debugger im Einzelschrittmodus durch den Code und öffne parallel dazu das Lokalfenster, um den Inhalt der Variablen zu verfolgen.
Wenn du den Code in deinem Projekt übernehmen möchtest, mußt du den natürlich an deine Gegebenheiten anpassen.

Wenn etwas noch nicht richtig verständlich ist, bitte einfach hier Rückfragen.

VG
Ulrich



gsaccess

Hallo Ulrich,

vielen Dank für deine Erklärungen und die Code Beispiele. Ich habe mir den Code der Beispiele über ChatGPD erklären lassen. Aus meiner derzeitigen Sicht sehr komplex aber für Abfragen sehr nützlich. Ich werde mich einfach noch mit Basics von VBA befassen. Dann werde ich irgendwann auch so koplexe Codes verstehen.

Gruß Günther

Knobbi38

#21
Kein Problem, wir haben alle mal angefangen. Auf ChatGPT zum erklären von Code wäre ich jetzt nicht sofort gekommen, man lernt doch immer noch dazu, aber wenn du Fragen dazu hast, einfach hier melden.

Ansatt ChatGPT kannst du auch mit KI deine Suchanfragen optimieren:
https://www.perplexity.ai/

VG
Ulrich