Hallo ich habe folgendes Problem.
Ich habe 5 Formulare die im Kopf alle mit den gleichen Kontaktdaten gefüllt werden sollen.
Von daher dachte ich mir, es wäre schön wenn ich eine FUnktion bastle was nach Eingabe der Kundennummer die Felder automatisch füllt (damit ich das nciht in allen Formularen nochmal schreiben muss)
Meine Funktion sieht folgendermaßen aus
Public Sub Kundendaten(KD_NR As String)
Namen = DLookup("name1", "dbo_Kusta", "frems = " & KD_NR)
Strasse = DLookup("str1", "dbo_Kusta", "frems = " & KD_NR)
PLZ = DLookup("plz", "dbo_Kusta", "frems = " & KD_NR)
Ort = DLookup("ort", "dbo_Kusta", "frems = " & KD_NR)
Inhaber = DLookup("name2", "dbo_Kusta", "frems = " & KD_NR)
End Sub
Aufrufen funktionert dann ja ganz einfach mit
Modul1.Kundendaten (KD_NR)
wobei KD_NR das Feld ist in dem ich was eingebe
Jetzt ist nur die Frage wie ich es so weit verändere, dass die Variablen an das passende Formular zurückgegeben werden.
Hatte es schon mit
Public Sub Kundendaten(KD_NR As String, Formular As Form)
...
versucht und die Funktion dann mit 2 Werten versucht aufzurufen das hat aber nciht geklappt
Weiß jemand einen Rat oder geht das überhaupt?
Gruß
Hallo,
ich will Dich ja in Deiner Begeisterung für VBA nicht bremsen, aber das ganze Vorhaben dürfte ziemlich überflüssig sein.
Du kannst mit einem einfachen Kombifeld den Primärschlüssel (KD_NR) des Datensatzes (aus dem Kombi) in der anderen Tabelle/Formular abspeichern. Die restlichen Felder noch mal zu speichern ist auch überflüssig. Das wäre ja redundant. Mit einer einfachen Abfrage mit beiden Tabellen (und der Beziehung) hast Du alle Felder zur Verfügung. Alles sehr komportabel und ohne eine einzeige Zeile VBA.
Es so wie vorgeschlagen zu machen, ist ja gerade der Sinn einer Datenbank.
Hi,
Aber dann hätte ich in allen 5 Tabellen den gleichen Kunden hinterlegt. Die Kundennummer ändert sich aber ständig.
Oder versteh ich dich falsch? Hinzu kommt das später noch Daten aus anderen Tabellen geholt werden sollen und will nicht zig abfragen machen ;)
Hallo,
ZitatOder versteh ich dich falsch?
Vermutlich. Du kannst doch in jeder Tabelle einen anderen Wert eintragen.
In den Formularen ist je ein Kombifeld in dem die Kundennummer ausgewählt und dann als Fremdschlüssel gespeichert wird. Da brauchst Du noch nicht mal einen einzigen Buchstaben eingeben. Oder zur Vorauswahl, das Kombi verfeinert nähmlich automatisch mit jedem Zeichen die Auswahlmöglichkeit.
ZitatIch habe 5 Formulare die im Kopf alle mit den gleichen Kontaktdaten gefüllt werden sollen.
Auch da sehe ich Ungereimtheiten. Wozu 5 Formulare mit den gleichen Kopfdaten?
Weil jedes Formular aus "Kundeninformationen" besteht die immer gleich sind und weiteren Ansprechpartnern, etc die sich unterscheiden und unterschiedliche Bezeichnungen haben.
Bei 17000 Kunden ist eine Vorauswahl nicht sinnvoll da man die Nummer dann eh immer komplett eingibt (ist schneller als erst 3 Zeichen einzugeben und dann den Rest per auswahl)
Klar könnt ich die khndendaten auch in einem Formular und alle anderen Daten in einem weiteren Formular, aber jetzt hat man alle Daten auf einen bluck
Hallo,
das ganze Konzept ist mürbe. Hast Du auch 5 Tabellen und jedes Formular greift auf eine andere Tabelle zu?
Wenn ja warum 5 Tabellen?
Irgentwie habe ich das im Zusammnhang noch nicht verstanden. Auf jeden Fall ist mal die redundante Speicherung von Feldwerten überflüssig. Ich bin auch der Überzeugung Du denkst viel zu kompliziert. Du willst Dinge programmieren, die Access automatisch kann.
Erkläre das mal etwas ausführlicher.
Hi,
also folgendes Szenario
Ich habe eine Tabelle da stehen die ganzen Kunden drin
Ich habe eine Tabelle da stehen Ansprechpartner drin
Ich habe eine Tabelle da stehen Inventardaten vom Kunden drin
Jetzt habe ich verschiedene Möglichkeiten
Kunden anlegen (einfach weil alles muss eingetragen werden)
Kunde wird geschlossen (Brauch Kundendaten, Inventardaten und Asprechpartner um diese zu informieren)
Kunde wechselt den Inhaber (Brauch Kundendaten, Inventardaten und Asprechpartner um diese zu informieren)
Kunde zieht um (Brauch Kundendaten, Inventardaten und Asprechpartner um diese zu informieren)
Bei jedem Vorgang werden unterschiedliche Leute angesprochen.
Was bei allen gleich ist, ist dass die Kundendaten aus der Tabelle geholt werden.
Von daher war meine Überlegung dieses mit einer Funktion und den DLookUp Befehlen zu machen und immer nur die Funktion aufzurufen
Ich will ungern für jeden Fall eine Abfrage machen, weil ich lieber mit VBA arbeite (auch wenn es vielleicht umständlicher ist)
Da der Kunde sich nach mind. 8 Kriterien unterscheidet (die in unterschiedlichen Konstellationen auftreten können) möchte ich ungern Abfragen erstellen
Hallo,
In die 5 Tabellen kommt nur die Kundennummer. Dann brauchst Du genau 5 Abfragen. In jeder Abfrage kommt noch die Kundentabelle mit einer Beziehung über die Kundennummmer dazu. Das wars. Zukünftig arbeitest Du nur mit den Abfragen. Es ist sowieso nicht empfehlenswert mit den Tabellen direkt zu arebeiten. In Tabellen kann man z.B. nicht zuverlässig sortieren.
Wenn ich die Tabellen schreiben würde, wäre es ja möglich. Die Kundeliste bekomme ich per ODBC aus einer anderen Datenbank.
Aber naja werd ich mal weitersuchen wie es möglich ist die Textfelder direkt zu füllen. Hat eigentlich auch wenig mit Redundanz zu tun, weil bei der Funktion doch auch nur aus der Tabelle die Daten der Kundennummer direkt in die Textfelder geschrieben wird.
Hätte ich vielleicht erwähnen sollen, dass es sich in der Funktion nicht um Variablen sondern um Namen der Textfelder handelt?
Gruß
Trotzdem danke für deine Hilfe
Hallo,
ZitatHat eigentlich auch wenig mit Redundanz zu tun, weil bei der Funktion doch auch nur aus der Tabelle die Daten der Kundennummer direkt in die Textfelder geschrieben wird.
Natürlich ist das Redundanz. Du hast doch die schon mal in einer Tabelle und willst diese noch mal in eine andere Tabelle schreiben.
Du unterschätzt/überschätzt das Problem in seiner Einfachheit.
ZitatNatürlich ist das Redundanz. Du hast doch die schon mal in einer Tabelle und willst diese noch mal in eine andere Tabelle schreiben
Ich glaube wir missverstehen uns :)
Ich habe zwar Tabellen aus denen ich diese Informationen ziehe aber diese werden nirgends neu gespeichert.
Die Formulare dienen nur zur Kontrolle der Daten um im Anschluss daran einen Bericht zu generieren der per Email versandt wird.
Danach werden diese Daten nirgends gespeichert.
Gruß
Hallo,
aber dann ist es doch erst recht überflüssig. Über eine Abfrage kannst Du doch jederzeit die fehlenden Felder anzeigen, wenn die Tabellen mit einer Beziehung über die Kundennummer verknüpft sind.
Naja schöner wäre es zwar wenn du mir verraten würdest wie es über VBA gehen würde da es eben nciht nur 2 Abfragen sind, aber gut werd ich weitersuchen müssen.
Ich habe hinterher 30 Felder die insgesamt aus den unterschiedlichsten Feldern gefüllt werden müssen in unterschiedlichen Konstellationen. Da mit Abfragen zu arbeiten ist für mich einfach zu unübersichtlich. Da arbeite ich lieber mit Funktionen und VBA und schon läufts :) Da komm ich besser mit klar
Hallo,
ich gebe noch nicht auf. Du brauchst genau 5 Abfragen, keine mehr und keine weniger. Du arbeitest auch nach wie vor mit Formularen und nicht mit den Abfragen direkt. Die Formaulare werden an die Abfrage(n) gebunden. Du merkst gar nicht, dass Du Abfragen hast. Da ist nichts unübersichtlich, im Gegenteil.
Im Verhältnis zu den Abfragen ist die VBA Version eine lahme Ente. Im Regelfall ist ohnehin VBA zur Datenmanipulation zu vermeiden. Das ist eine Datenbank und da verwendet man SQL (=Abfragen).
Wenn ich dich richtig verstehe brauche ich
Abfrage für die Kundeninformationen
Abfrage für die ANsprehcpartner die immer verschieden sind (sowohl in Anzahl als auch vom Namen her)
Abfrage für weitergehende Informationen zum Kunden (sind ca 20 und immer verschieden)
Die Kundeninformationen kann ich immer aus der gleichen Tabelle holen.
Die Ansprechpartner sind in mehreren Tabellen
Die weitergehenden Informationen sind in anderen Tabellen
Ob ich per VBA DLookup verwende (SQL) oder ob ich ne Abfrage erstelle und darauf zugreife. Wo soll da der Unterschied sein?
Mag ja sein dass VBA langsamer ist, aber Geschwindigkeitsverluste sind mir bisher noch nciht aufgefallen
Hallo,
ich fürchte, da liegt noch viel mehr im Argen.
ZitatDie Ansprechpartner sind in mehreren Tabellen
Wieso hast Du mehrere Tabellen für die Ansprechpartner?
ZitatOb ich per VBA DLookup verwende (SQL) oder ob ich ne Abfrage erstelle und darauf zugreife. Wo soll da der Unterschied sein?
Na Du musst nichts programmieren. DLookup mit VBA ist kein SQL.
Das ganze Vorhaben lässt sich z.B. mit einem Hauptformular undd darin eingebetteten Unterformularen für z.B. die Ansprechpartner und weitergehende Infos sehr kompfortabel und übersichtlich gestalten. Die Ufos kommen auf Registerblätter. Wenn Hafo und Ufo über die Schlüsselfelder (Kundennummer) verknüpft sind, hast Du in einem Formular eine perfekte Übersicht zum Kunden. In diesem Formular kannst Du vorhandene Kunden suchen oder neue Kunden/Ansprechpartner/Infos anfügen. Dabei wird sogar das Schlüsselfeld automatisch in den abhängigen Tabellen gefüllt. Ohne eine einzige Zeile VBA. So einfach, wie Du es Dir im Moment gar nicht vorstellen kannst.
Wenn Du etwas zum Konzept der DB erklärst, mache ich Dir gern ein Beispiel. Heute Abend.
Du kannst auch mal Deine jetzige DB mit wenigen Datensätzen (anonymisiert) hier hochladen.
So wie ich das verstehe, geht es dem Frager weniger um Belehrungen zur Tabellenstruktur, sondern wie er Coderedundanz vermeiden kann.
Habe ich recht, wenn ich meine, daß Du in mehreren Formularen immer den gleichen Kopf hast und ihn mit einer zentralen Funktion füllen willst.
Du könntest das evtl. so machen (rudimentärer und abstrakter Code nur um das Prinzip darzustellen)
In den Formularen hast du eine Aufruffunktion
Private Sub auswahlKunde()
Dim intKunde as Integer
intKunde = 4711 'Wert z.B. aus der Kombobox
Dim aktForm As Form
Set aktForm = Me 'Objektreferenz auf das aktuelle Formular
Call Modul1.getKunde(intKunde, aktForm) 'Zentrale Routine im Modulpool benutzen
End Sub
Im Modul1 gibt es die folgende Routine:
Public Sub getKunde(byval intKunde as Integer, ByRef aktForm As Form)
MsgBox "getKunden wird von Formular " & aktForm.Name & " aufgerufen ", vbInformation
'Lokale Zwischenvariablen für die Werte aus der Datenbank
Dim strKundenname as string
Dim strPLZ as string
etc... pp.
'Hier kommt eine SQL-Abfrage per DAO oder ADO rein, die Dir die relevanten Daten zum Kunden einliest, DLOOKUP ist nicht so toll, außerdem benützt DLOOKUP sowieso intern SQL, es ist bloß eine Verkapselung von SQL
'Recordset öffnen
strKundenname = rs!Vorname & " " & rs!Nachname
strPLZ = rs!Postleitzahl
...etc...
'Recordset schliessen
'Jetzt kannst mit der Referenz zur aufrufenden Form (die Du als Übergabeparameter bekommen hast) das aufrufende Formular zurückrufen
Entweder du baust in die Formulare eine Funktion ein, mit der Du die Werte setzt oder Du setzt die Werte gleich direkt, dann müssen die entsprechen Steuerelemente aber unbedingt in allen Formularen gleich heissen.
aktForm.txtKundenname.Value = strKundenname
aktForm.txtPLZ.Value = strPLZ
...etc...
End Sub
Das geht schon ein bißchen in die objektorientierte Programmierung rein, aber ich meine, daß es gehen müßte.
Grüße
Johannes
Hallo Falke,
du musst unbedingt deine Einstellung zu Abfragen ändern ::)
Abfragen bzw SQL sind/ist wichtiger Bestandteil einer DB; SQL ist die Datenbanksprache.
Schon merkwürdig, wenn einer nicht mit den elementaren Werkzeug arbeiten will?
Klaus hat dir doch Tipps gegeben. Sicherlich geht es auch mit VBA - (siehe Johannes Code) aber der einfache Weg ist doch meistens der bessere ;D
Gruß Oma
Zitatdu musst unbedingt deine Einstellung zu Abfragen ändern
Abfragen bzw SQL sind/ist wichtiger Bestandteil einer DB; SQL ist die Datenbanksprache.
Schon merkwürdig, wenn einer nicht mit den elementaren Werkzeug arbeiten will?
Es ist ja nicht so dass ich damit nicht arbeiten will.
Ich tue mich nur schwer damit Abfragen zu erstellen wenn es in meinen Augen mit VBA vom programmieren her schneller geht :)
Und DLookUp oder Recordset sind zumindest wenn man der Microsoft Knowledge glauben schenkt VBA-SQL Befehle (weisen ja auch ziemlich die Syntax einer herkömmlichen SQL Abfrage auf :)
Mag ja sein dass mein DB-Aufbau völlig fürn Arsch ist aber naja glaube d agibt es etliche Varianten und jede hat ihre Vor und Nachteile und bisher laufen meine Datenbanken (wenn ich die Probleme löse) sehr zuverlässig
Greetz
Übrigens sperr eich mich nciht gegen wertvolle Tipps wie die von Klaus, die sicherlich hilfreich sind. Werd die DB jetzt erstmal zusammenkloppen (sitze ein wenig unter Zeitdruck, deswegen kann ich die nicht jetzt nochmal von Grund auf neu machen) und wenn sie dann im Betrieb ist mich daran machen sie vom Verständnis her "richtig" aufzubauen ;)
Zitat von: Falke22 am August 20, 2010, 14:26:45
Zitatdu musst unbedingt deine Einstellung zu Abfragen ändern
Und DLookUp oder Recordset sind zumindest wenn man der Microsoft Knowledge glauben schenkt VBA-SQL Befehle (weisen ja auch ziemlich die Syntax einer herkömmlichen SQL Abfrage auf :)
DLookUp ist SQL, natürlich. Aber wenn Du fünf mal hintereinander die gleiche Zeile in der gleichen Tabelle aufrufst, mußt Du fünf mal die Schwelle zur Datenquelle überqueren und das kein guter Programmierstil. Das ist, wie wenn Du fünf Sachen vom Supermarkt brauchst und für jede Sache extra hin- und zurück gehst. Kann sein, daß das nicht wirklich spürbar ist im konkreten Fall, aber das solltest Du überdenken.
Grüße
Johannes
Hallo,
ZitatIch tue mich nur schwer damit Abfragen zu erstellen wenn es in meinen Augen mit VBA vom programmieren her schneller
he, das ist doch überhaupt kein Argument, man muss anstreben, dass zu machen was am besten ist und nicht das , was man am besten kann. Du musst dich dann eben mit SQL so beschäftigen, dass du das genauso schnell programmieren kannst.
ZitatWerd die DB jetzt erstmal zusammenkloppen (sitze ein wenig unter Zeitdruck, deswegen kann ich die nicht jetzt nochmal von Grund auf neu machen) und wenn sie dann im Betrieb ist mich daran machen sie vom Verständnis her "richtig" aufzubauen
Das sind schon Sprüche ;D
Es gibt Untersuchungen, die aussagen, das das Verhältnis von Konzeptioneller Zeit zu ausführender Programmierzeit bis zu 1:10 geht.
D.h. für 1 Stunde konzeptioneller richtiger Überlegungen am Prinzip sind unter Umständen 10 Stunden Programmierarbeit gespart oder anders ausgedrückt:
1 Stunde mehr Grundsatzüberlegungen hätte 10 Std. Entwicklungszeit(Probieren, Teste, Änders usw.) gespart!
Also : erst zusammenkloppen und dann mal richtig aufbauen ist ein sehr "uneffektiver" Arbeitsstil!
Wir meinen es aber nur gut mit dir ;D
Gruß Oma
Einen SQL-Befehl per VBA zu schreiben ist doch nciht schlechter als wenn ich ne Abfrage dafür erstelle? Versthe ich nciht warum man so gegen VBA wettert?
ZitatEs gibt Untersuchungen, die aussagen, das das Verhältnis von Konzeptioneller Zeit zu ausführender Programmierzeit bis zu 1:10 geht.
D.h. für 1 Stunde konzeptioneller richtiger Überlegungen am Prinzip sind unter Umständen 10 Stunden Programmierarbeit gespart oder anders ausgedrückt:
1 Stunde mehr Grundsatzüberlegungen hätte 10 Std. Entwicklungszeit(Probieren, Teste, Änders usw.) gespart!
Oder (so hab ich es zumindest gelernt) man verbringt bei ordentlicher Programmierung 10 mal mehr Arbeit mit der Konzeptionierung als mit der eigentlichen Programmierung. :)
Es ist immer noch icht so dass ich kein SQL kann. ICH sehe nur keinen Unterschied zwischen Abfrage erstellen und VBA zu benutzen um die gleiche Abfrage zu realisieren :)
Hallo Falke,
ZitatOder (so hab ich es zumindest gelernt) man verbringt bei ordentlicher Programmierung 10 mal mehr Arbeit mit der Konzeptionierung als mit der eigentlichen Programmierung.
Haja, das wäre ja schlimm, aber 1 Stunde mehr an der Konzeption spart eben einige Stunden in der Programmierarbeit. Ich glaube, dass kann jeder erfahrenen Entwickler bestätigen auch wenn das Prinzip jedesmal bei jedem neuen Projekt wieder auftritt ;D
ZitatICH sehe nur keinen Unterschied zwischen Abfrage erstellen und VBA zu benutzen um die gleiche Abfrage zu realisieren
Vom Prinzip her ist es aber eigentlich so, dass eine deklarative Sprache einfacher und mächtiger ist als ein prozedurale Sprache.
Soll heißen,
eine Befehlszeile in SQL ersetzt oft ein paar Schleifen mit Bedingungen in VBA.
Das ist dann nicht nur einfacher zu schreiben, sondern oft ist die DB mit dem SQL scheller als mit dem Schleifen-Gedüdel ;D
Wir wollen es auch nicht übertreiben, denn der Unterschied ist oft nur gering, eigentlich eher eine prinzipielle Debatte
Gruß Oma