TreeView: Bug durch falsche Einheiten

Wenn man das TreeView-Steuerelement professioneller nutzt, programmiert man unter anderem Ereignisse, die durch das Anklicken von Elementen ausgelöst werden. Damit kann man Ereignisprozeduren auslösen, die beispielsweise Daten zum angeklickten Element in einem Unterformular anzeigen oder man blendet ein Kontextmenü zum jeweils angeklickten Element mit weiteren Optionen ein. Dazu ist es notwendig, zu identifizieren, auf welches Element der Benutzer geklickt hat. Die notwendigen Informationen liefern die Parameter der Prozeduren, das Ermitteln des angeklickten Elements erledigt man mit einer bestimmten Funktion. Seit Kurzem erreichen uns allerdings Meldungen von Lesern, bei denen dies nicht mehr zuverlässig funktioniert: Es werden keine Kontextmenüs mehr angezeigt und auch das Anklicken gelingt nicht mehr wie gewünscht. Interessanterweise tritt das Problem nur bei Verwendung von Office 365 auf. Wir schauen uns in diesem Beitrag an, woher das Problem rührt und wie Sie es lösen können.

Weiterlesen

Abfragen in der SQL-Ansicht öffnen

Seit vielen Jahren wünschen sich Access-Nutzer sehr kleine Veränderungen von Microsoft, die den Programmieralltag stark erleichtern könnten. Eine davon ist, Abfragen direkt in der SQL-Ansicht zu öffnen. Ja, es gibt Entwickler, die nicht ausschließlich in der Entwurfsansicht arbeiten – und manche Abfragetypen wie beispielsweise die UNION-Abfrage können nur in der SQL-Ansicht angezeigt werden. Bis vor kurzem musste man zur SQL-Ansicht einen Umweg über die Entwurfsansicht gehen. Wie dieser aussah und welche Möglichkeiten wir nun haben, zeigen wir in diesem Beitrag.

Weiterlesen

Abfragen direkt in der SQL-Ansicht erstellen

Microsoft hat neuerdings einen Befehl zum direkten Anzeigen von Abfragen in der SQL-Ansicht. Damit können wir eine Abfrage direkt in der SQL-Ansicht öffnen statt den Umweg über den Abfrageentwurf zu wählen. Leider hat Microsoft keine entsprechende Funktion für das Erstellen von Abfragen hinzugefügt – also eine Schaltfläche im Ribbon, mit der wir eine neue SQL-Abfrage direkt in der SQL-Ansicht öffnen können. Das ist allerdings gar nicht schlimm, denn wir rüsten diese Funktion einfach selbst nach. Zunächst schauen wir uns an, welche Befehle dazu notwendig sind, danach erstellen wir ein COM-Add-In, das die Funktion in der Benutzeroberfläche verankert – gleich neben den Schaltflächen für den Abfrageassistenten und das Anlegen von neuen Abfragen über die Entwurfsansicht.

Weiterlesen

COM-Add-Ins und -DLLs installieren oder registrieren

Wenn man eine COM-DLL oder ein COM-Add-In mit VB6 oder twinBASIC erstellt hat, muss dieses registriert werden muss, damit es in einer der Office-Anwendungen angezeigt wird oder unter VBA zur Verfügung steht. Die Informationen für die Registrierung werden in der Regel direkt in die jeweilige .dll-Datei integriert, sodass man die Registrierung nur noch von außen initialisieren muss. Dafür gibt es verschiedene Wege, die sich je nach Zweck (COM-DLL oder COM-Add-In) unterscheiden. Einer davon ist das Erstellen eines Setups mit Inno Setup. Dieses braucht der Anwender nur auszuführen und muss keine Verrenkungen machen, um die neuen Funktionen auf seinem Rechner nutzen zu können. Es gibt aber auch noch alternative Methoden, die wir ebenfalls in diesem Beitrag vorstellen.

Weiterlesen

Assistent für Domänenfunktionen

Domänenfunktionen wie DomWert (DLookup), DomMax (DMax) oder DomAnzahl (DCount) sind praktische Helfer, wenn es um das schnelle Zugreifen auf verschiedene Informationen einer Datenbank geht. Wir können damit den Wert eines oder mehrerer Felder aus einem Datensatz mit einem bestimmten Kriterium ermitteln, die Gesamtanzahl von Datensätzen einer Tabelle mit oder ohne Kriterium oder auch Minimal- oder Maximalwerte. Der Assistent, den wir in diesem Beitrag vorstellen, hilft dabei auf verschiedene Arten. Die erste ist, dass Sie ihn einfach aufrufen können, um schnell die Werte für eine Domänenfunktion einzutippen und das Ergebnis auszulesen. Aber der Assistent kann noch mehr: Sie können ihn auch von Eigenschaftsfeldern heraus aufrufen, um die gewählte Domänenfunktion direkt dort einzutragen.

Weiterlesen

Formular an Mausposition öffnen

Verschiedene Anwendungszwecke machen es erforderlich, dass man ein Formular an einer bestimmten Position öffnet. Und selbst wenn es an sich nicht erforderlich ist, steigert es doch die Ergonomie, wenn zum Beispiel ein Popup-Formular an der Stelle erscheint, an der man den Befehl zum Öffnen betätigt hat – beispielsweise durch einen Klick auf eine Schaltfläche oder auf ein anderes Steuerelement. In diesem Beitrag schauen wir uns an, wie wir unabhängig von anderen Elementen ein Formular öffnen und an der Position des Mauszeiters positionieren können. Dazu benötigen wir nichts außer ein paar Ereignisprozeduren und API-Funktionen.

Weiterlesen

Modale Dialoge nach Wunsch gestalten

Modale Dialoge, also Formulare, die mit dem Befehl DoCmd.OpenForm mit dem Parameter WindowMode:=acDialog geöffnet wurden, sind in vielen Fällen hilfreich: Wir können den aufrufenden Code anhalten, bis das Formular geschlossen oder ausgeblendet wird und so gegebenenfalls auszulesende Werte ermitteln. Oder wir sorgen so dafür, dass der Benutzer nicht an anderen Formularen arbeiten kann, bevor er nicht die Eingabe in dieses Formular abgeschlossen hat. Einen Nachteil haben modale Dialog allerdings: Wir können ihre Rahmenart nicht so einstellen, wie wir es von normal geöffneten Formularen gewohnt sind. Wollen wir also einen modalen Dialog einmal ohne Titelleiste anzeigen, weil er zum Beispiel einfach als Erweiterung neben einem anderen Steuerelement geöffnet werden soll, können wir das so nicht machen. Es gibt allerdings einen Workaround, den wir hier vorstellen.

Weiterlesen

Standardwerte für Fremdschlüsselfelder pflegen

Für Felder in Tabellen kann man jeweils einen Standardwert im Tabellenentwurf festlegen, der beim Anlegen eines neuen Datensatzes in dieser Tabelle vorbelegt wird. Etwas anspruchsvoller ist es, wenn wir Standardwerte durch den Benutzer festlegen wollen. Noch einen Schritt weiter gehen wir, wenn der Standardwert für ein Fremdschlüsselfeld verwendet werden soll – also zur Auswahl eines Datensatzes aus einer verknüpften Tabelle. Einfache Beispiele sind Anreden, Zahlungsmethoden, Prioritäten oder Kategorien. Hier können wir jeweils einen Eintrag anwendungsweit festlegen. Es geht aber auch noch anspruchsvoller: Wenn wir beispielsweise Adressen für Kunden in einer eigenen Tabelle speichern, wo mehrere Adressen je Kunde angelegt werden können und nur eine als Standard verwendet werden soll. Spätestens hier müssen wir auch beim Datenmodell umdenken. In diesem Beitrag schauen wir uns erst einmal an, wie wir Standardwerte für Nachschlagefelder komfortabel auswählen können.

Weiterlesen

Rechnungsverwaltung: Kundenadressen ausgliedern

In der bisherigen Version der Rechnungsverwaltung haben wir nur eine Kundenadresse gespeichert, die in der Tabelle „tblKunden“ gespeichert war. Im Bestreben, diese Rechnungsverwaltung flexibler zu gestalten, wollen wir in diesem Beitrag zwei Dinge durchführen: Das Aufteilen der Kundentabelle in eine Tabelle mit den Basisdaten des Kunden und mehrere weitere Tabellen zum Speichern der Adressen dieses Kunden sowie das Anpassen des Formulars „frmKundenDetails“ an diese Änderung des Datenmodells. Dies soll die Grundlage bilden, mehrere Adressen je Kunde zu speichern und diese dann nach Bedarf in Bestellungen, Lieferungen, Rechnungen und weitere Vorgänge zu übernehmen.

Weiterlesen

Datenmodelle für die Rechnungsverwaltung, Teil 2

Im ersten Teil dieser Beitragsreihe haben wir die grundlegenden Ideen vorgestellt, die wir zum Thema Bestellungen/Rechnungen/Lieferungen haben. Uns ist jedoch noch eine Feinheit entgangen, die wir in diesem Beitrag noch nachreichen wollen. Dabei geht es darum, eventuelle Inkonsistenzen beim Erstellen von Rechnungspositionen auf Basis von Bestellpositionen zu vermeiden. Normalerweise sollte mit dem aktuellen Datenmodell nichts schiefgehen, aber das Datenmodell sollte so viele Probleme wie möglich bereits durch die enthaltenen Restriktionen in Form von Beziehungen verhindern.

Weiterlesen