Freitag, 21. November 2014

TM-SmartString: InStr

Das Klassenmodul TM-SmartString ermöglicht mit seinen Eigenschaften schon ein komfortables Programmieren. Bei der Erstellung der Klasse TM-SmartSqlString ist mir aufgefallen, dass eine wichtige Methode noch fehlt: Instr. Natürlich ist es jetzt ein Leichtes, diese Methode zu implementieren. Ich möchte jedoch noch etwas mehr Komfort

Samstag, 15. November 2014

TM-DatenKlassenGenerator: Verbesserung bei Gültigkeitsmeldungen

Gestern erreichte mich eine E-Mail. Darin wurde der DatenKlassenGenerator gelobt. Dieses Lob kam zusammen mit einer kleinen Anregung, die ich natürlich gerne umgesetzt habe. Es geht um die Fehlermeldung bei der Verletzung einer Gültigkeitsregel.

Mittwoch, 29. Oktober 2014

TM-SmartSqlString: So wird die Klasse eingesetzt

Mit der Klasse TM-SmartSqlString besteht die Möglichkeit, einen SQL-String in einer eigenen Klasse zu verwalten. Die Klasse bietet dabei Möglichkeiten, die speziell auf ein SQL-Statement zugeschnitten sind. So wird bei Zuweisung eines SQL-Statements dieses in seine Bestandteile zerlegt.

Samstag, 25. Oktober 2014

TM-SmartSqlString: Grundlegende Implementierung

Mit der Klasse TM-SmartString hat sich gezeigt, wie einfach es ist, einen eigenen Datentyp zu erstellen und mit Leben zu füllen. Auf der Konferenz Access Day im Herbst 2013 stellte Armin Stein ein Modul mit dem Namen JStreetSQLTools vor. Dieses Modul enthält Methoden, um die Where-Klausel, die Having-Klausel oder die OrderBy-Klausel eines SQL-String zu ersetzen oder anzupassen.

Mittwoch, 8. Oktober 2014

TM-SmartTypes: Geänderte Versionsnummern

Die Klasse TM-SmartString entwickelt sich ständig weiter. Mit jeder Weiterentwicklung wurde eine neue Versions-Nummer vergeben. Bisher war es so, dass die Klasse TM-SmartString die einzige Klasse im Projekt TM-SmartTypes ist. Daher musste ich bisher auch nicht über die Versions-Nummern nachdenken. Die Versions-Nummer der Klasse

Sonntag, 5. Oktober 2014

TM-SmartString: IsLike

In diesem Beitrag wird das Klassenmodul TM-SmartString um eine Eigenschaft erweitert, die es erlaubt, einen String einem (einfachen) Mustervergleich zu unterziehen, ohne das dazu eine externe Bibliothek für Regular Expressions eingebunden werden muss: IsLike.

Sonntag, 29. Juni 2014

Like: Der vergessene Befehl?

Bei der Recherche rund um das Thema Regular Expressions bin ich auf den Befehl Like in VBA gestoßen. Dieser Befehl ermöglicht einfache Vergleiche mit Suchmustern, ohne das es notwendig ist, eine Bibliothek für Regular Expressions einzubinden.

Wenn man an LIKE denkt, fällt einem sicherlich (als erstes) der Operator in Abfragen ein. Dieser Operator ermöglicht einfache Suchabfragen unter Verwendung von Wildcards. So steht das Zeichen "*" für ein oder mehrere beliebige Zeichen.
Was in SQL-Abfragen geht, ist aber auch direkt in VBA möglich. Eine Dokumentation findet man in der Online-Hilfe oder in der MSDN.

Jetzt stellt sich natürlich die Frage, was man mit diesem Befehl anstellen kann, was nicht mit anderen Befehlen auch gelöst werden kann.
Wenn man z.B. wissen möchte, ob ein Text in einem anderen Text enthalten ist, kann man das mit Like lösen:
1:  str = "Brave new world"  
2:  If (str Like "*new*") Then  
Man kann für diese Aufgabe alternativ den Befehl InStr verwenden:
1:  str = "Brave new world"  
2:  If (InStr(str, "new") > 0) Then  

Ähnlich verhält es sich, wenn man prüfen möchte, ob ein Text mit einer Zeichenfolge beginnt oder endet. Mit dem Befehl Like sieht der Code wie folgt aus:
1:  str = "Hello world"  
2:  If (str Like "Hello*") Then  
3:  ...  
4:  If (str Like "*World") Then  
Die meisten Programmierer werden diese Aufgabe wahrscheinlich mit Hilfe der Befehle Left$ und Right$ lösen:
1:  str = "Hello world"  
2:  If (Left$(str, 5) = "Hello") Then  
3:  ...  
4:  If (Right$(str, 5) = "World") Then  

Ich habe die konkrete Aufgabe, eine eingegebene Kunden-Nr. auf Gültigkeit hin zu überprüfen. Ein Kriterium ist, dass die Kunden-Nr. nur aus Ziffern besteht. Die Kunden-Nr. kann dabei beliebig viele Stellen haben. Eine Prüfung mit einer Schleife, Zeichen für Zeichen, wollte ich ausschließen, da die Funktion später auch in Abfragen zur Prüfung des kompletten Datenbestands eingesetzt werden soll.
Schnell kam ich auf die Idee, die Eingabe mit der Funktion IsNumeric zu prüfen:
1:  strInput = "1234"  
2:  If (IsNumeric(strInput) = False) Then  
Auf den ersten Blick sieht diese Lösung gut aus. Die Nachteile offenbaren sich erst später. So akzeptiert die Funktion nicht nur Ziffern für die Eingabe. Es werden auch der Punkt und das Komma als Tausender- bzw. als Dezimaltrennzeichen akzeptiert:
 ? IsNumeric("-1.234,2")  
 Wahr  

Hier schlägt jetzt die Stunde des Like-Befehls. Sicher könnte man die von der Funktion IsNumeric akzeptierten Zeichen, die keine Ziffer sind, mit Hilfe des InStr-Befehls herausfinden. Der Code wird dann aber schnell lang und unübersichtlich. Einfacher geht es mit dem richtige Suchmuster beim Like-Befehl.

Mit dem Like-Befehl kann man prüfen, ob ein Zeichen in einer Werteliste vorkommt. Für Ziffern ist die Werteliste 0 bis 9:
 ? "1" Like "[0-9]"  
 Wahr  
Man kann die Prüfung auch umkehren und prüfen, ob ein Zeichen gefunden wird, dass nicht in der Werteliste vorkommt:
 ? "1" Like "[!0-9]"  
 Falsch
Wenn man diese Prüfung jetzt noch auf jedes Zeichen der Eingabe anwendet, ist das Ziel erreicht:
1:  Dim strInput As String  
2:  strInput = "-1.234,5"  
3:  If strInput Like "*[!0-9]*" Then  
4:    MsgBox "Unzulässiges Zeichen!"  
5:  End If  
Mit dem Like-Befehl wird jetzt geprüft, ob es irgendwo in der Eingabe ein Zeichen gibt, das nicht in der Werteliste [0-9] enthalten ist. Mit diesem einfachen Befehl habe ich mein Ziel erreicht.


Es scheint, als ob der Befehl Like unter VBA nicht die notwendige Aufmerksamkeit erhält, die er verdient. Mit diesem Befehl kann man Prüfungen, die man sonst mit Left$, Right$ und InStr vornimmt, auf einfache Art durchführen. Außerdem sind Vergleiche mit komplexeren Suchmustern möglich. Ein Beispiel habe ich in diesem Beitrag aufgezeigt.
Der Befehl Like kann mehr, als man im ersten Moment denkt. Es lohnt sich auf jeden Fall, sich mit den Möglichkeiten zu beschäftigen.

Donnerstag, 19. Juni 2014

TM-SmartString: SubStr, SubString

In diesem Beitrag wird das Klassenmodul TM-SmartString um zwei Eigenschaften erweitert, die jeweils einen Teil der Zeichenkette zurückgeben: SubStr und SubString.

Montag, 9. Juni 2014

TM-SmartString: IsNull

Eine der lästigen Dinge, auf die man beim Programmieren achten muss, ist die Verwendung von Null. Schnell kommt es zu einem Laufzeitfehler, wenn man nicht explizit Vorkehrungen für die Behandlung von Null in seinem Code getroffen hat. Mit diesem Beitrag wird die Klasse TM-SmartString für den Umgang mit Null optimiert. Außerdem kommt eine weitere Property hinzu: IsNull.

Freitag, 30. Mai 2014

TM-SmartString: Split

In diesem Beitrag wird das Klassenmodul TM-SmartString um eine Eigenschaft erweitert, die es erlaubt, einen String an einem bestimmten Zeichen zu trennen und die einzelnen Werte als Array zurückzugeben: Split.

Donnerstag, 29. Mai 2014

TM-SmartString: PadLeft, PadRight

In diesem Beitrag wird das Klassenmodul TM-SmartString um zwei Eigenschaften erweitert, die es erlauben, den String mit einem Zeichen oder einer Zeichenfolge aufzufüllen: PadLeft und PadRight.

Samstag, 24. Mai 2014

Zeichenfolge vervielfachen

Es gibt verschiedene Wege, um eine Zeichen oder eine Zeichenfolge zu vervielfachen. Benötigt wird dies zum Beispiel dann, wenn es darum geht, eine bestehende Zeichenfolge mit einem Zeichen oder einer Zeichenfolge aufzufüllen. Dieser Beitrag zeigt verschiedene Wege auf, um dieses Ziel zu erreichen.

Dienstag, 22. April 2014

SP1 für Access 2013 Runtime verfügbar

Seit heute steht das SP1 für die Runtimeversion für Access 2013 zur Verfügung.

Samstag, 19. April 2014

Fehlermeldung beim Start von Access 2013

Seit einigen Tagen habe ich Office 2013 auf meinem Rechner installiert. Beim Start von MS Access erscheint jetzt eine Fehlermeldung mit dem Text "Fehler beim Laden der benutzer-definierten Benutzeroberfläche von XML". Die Lösung dieses Problems ist in den COM- Add-Ins zu suchen.

Mittwoch, 16. April 2014

TM-SmartString: ToProperCase verbessert

Vor kurzem las ich in einem Newsletter über die Unzulänglichkeiten der Funktion ToProperCase. Die Funktion liefert grundsätzlich richtige Ergebnisse. Problematisch wird es allerdings, wenn ein zusammengesetztes Wort wie z.B. "Baden-Württemberg" richtig umgewandelt werden soll.

Sonntag, 16. Februar 2014

TM-RebuildDatabase: Umgang mit Verweisen optimiert

Das schöne an Community ist, dass es immer und überall Feedback gibt. So bekam ich neulich eine Nachricht von "Charlie", der mich auf ein Phänomen in TM-RebuildData-base hinwies. Es ging um die Verweise.

Samstag, 15. Februar 2014

TM-DatenKlassenGenerator: Abfragen als Datenbasis

Der TM-DatenKlassenGenerator erstellt auf Basis einer ausgewählten Tabelle die zugehörigen Klassenmodule, um klassenbasiert auf die Daten in der Tabelle zugreifen zu können. Auf meiner Release-Liste steht schon lange der Wunsch, endlich auch Abfragen als Datenquelle verfügbar zu machen. Dies ist mit dem letzten Release endlich geschehen.

Sonntag, 12. Januar 2014

TM-SmartString: ToUpperCase, ToLowerCase, ToProperCase

Ein Vorteil bei der Verwendung einer eigenen Klasse ist, dass man die Namen der Eigenschaften und Methoden an die eigenen Wünsche anpassen kann. So braucht sich künftig keiner mehr mit den eher kryptischen Befehlen UCase oder LCase abmühen. Statt dessen stellt die Klassen TM-SmartString künftig die Eigenschaften ToUpperCase und ToLowerCase bereit. Im Rahmen dieser Erweiterung wurde dann auch gleich die

Montag, 6. Januar 2014

TM-SmartString: Append, Concat

Einen Text mit einem anderen zusammenzufügen, ist keine große Aufgabe. Spannend wird es erst, wenn der zu ergänzende Text aus einer Datenbankvariable kommt und den Wert Null annehmen könnte. In diesem Fall ist extra Arbeit erforderlich.
Wir spendieren unserer Klasse zwei weitere Eigenschaften, die diese Arbeit übernehmen. Eigentlich ist es nur eine Eigenschaft. Diese wurde unter zwei Namen