VBA


.Net-Snippets

Unter .Net-Snippets findet man recht gute Lösungen. Sollte man immer mal besuchen, wenn man vor einem Problemchen steht.

Außerdem gibt es noch ein nettes Firefox-Search-Plugin zur schnellen Suche.

.Net-Snippets

Den VBA-Code (VisualBasic-for-Applications-Code) kann man durch die Erzeugung einer MDE-Datei schuetzen, da dann so etwas wie ein Bytecode erstellt wird, fuer den ich bisher keinen Decompiler finden konnte. (Menue: Tools->Database Utilities->Make MDE-File). Aber Achtung die orginale MDB-Datei sollte immer gesichert werden!
Der integrierte Passwortschutz fuer eigene Projekte ist uebrigens unsicher und leicht zu umgehen.

Die SQL Server Integration Services erlauben das Zusammenfuehren von Daten aus heterogenen Datenquellen. Um den Ueberblick zu behalten wird der gesamte Datenfluss grafisch dargestellt und modelliert.

Das finde ich klasse, denn gerade wenn man ein Projekt an eine weitere Person uebergeben muss oder selbst an mehreren Projekten arbeitet, behaelt man durch diese kleine Hilfe den Ueberblick besser.

SQL Server Integration Services

An manchen Stellen wird es trotzdem notwendig sein, Programmierfaehigkeiten mitzubringen. Dazu kann dann die Scriptkomponente benutzt werden. Mit folgendem Script kann man auf die Datenquellen in seinem Projekt zugreifen. Aber Achtung es muss eine OLEDB-Verbindung definiert werden!


' initialize connection
Me.myConnection = DirectCast(Dts.Connections("SERVER.Database.root.ADO").AcquireConnection(Dts.Transaction), SqlClient.SqlConnection)
' -- open connection to database --
Try
If Not (myConnection.State.Open = ConnectionState.Open) Then
myConnection.Open()
End If
Catch ex As Exception
MsgBox("Could not open connection to DataBase: " & ex.Message.ToString)
End Try
' -- define data tables --
Dim tblTabelle As New Data.DataTable
' -- define SQL-commands --
Dim cmdSQLTblTabelle As New SqlClient.SqlCommand
cmdSQLTblTabelle.CommandText = "SELECT * FROM tblTabelle;"
cmdSQLTblTabelle.Connection() = myConnection
' -- define DataAdapters --
Dim myDATblTabelle As SqlClient.SqlDataAdapter(cmdSQLTblTabelle)
' -- get data from tables --
myDATblTabelle.FillSchema(tblTabelle, SchemaType.Mapped)
myDATblTabelle.Fill(tblTabelle)
' generate InsertCommand automatically with Commandbuilder
Dim myCommandBuilder As New SqlClient.SqlCommandBuilder(myDATblTabelle)
' show rows of query
msgbox("rows: " & tblTabelle.Rows.Count)

In MS Access verwendet man in den Benutzerschnittstellen gern Listen mit Multiselect-Funktion, um dem Anwender flexiblere Auswahlmöglichkeiten zu bieten.

In Queries ist es jedoch etwas schwierig diese Optionen abzufragen. Folgende VBA-Funktion schafft da Abhilfe:

Function InMultiSelect(frms, ctrl As String, col As Integer, data As Variant, ParamArray OtherArgs()) As Boolean
'Checks whether a Variant (data or OtherArgs) is included in the specified column (col) of a ListBox (ctrl)
'in a certain Form (frms)
On Error GoTo Error_InMultiSelect
Dim varItm As Variant
Dim index As Integer
Dim ctl As Control
Dim frm As Form
Set frm = Forms(frms)
Set ctl = frm.Controls(ctrl)
InMultiSelect = False
For Each varItm In ctl.ItemsSelected
If InMultiSelect = True Then Exit For
If CStr(data) = CStr(ctl.Column(col, varItm)) Then InMultiSelect = True
For index = LBound(OtherArgs) To UBound(OtherArgs)
If InMultiSelect = True Then Exit For
If CStr(OtherArgs(index)) = CStr(ctl.Column(col, varItm)) Then InMultiSelect = True
Next index
Next varItm
Exit Function
Error_InMultiSelect:
InMultiSelect = False
Exit Function
End Function

In den Abfragen (Queries) selbst wird diese Funktion dann beispielsweise so aufgerufen:


SELECT *
FROM [tblTabelle]
WHERE InMultiSelect("[frmFormMitMultiSelectAuswahl]","[lstListeMitMultiSelectAuswahl]",0,[tblTabelle].[Spalte]))<>False);

Leider ist es in MS Access nicht ohne weiteres möglich das Vorhandensein einer Tabelle abzufragen.

Dies wird gerade wenn man mit temporären Tabellen arbeitet zum Problem.

Eine Abhilfe liefert folgende VBA-Funktion:

' check if a table exists
Function tableExists(tableName As String) As Boolean
On Error GoTo Error_tableExists
Dim strTableName
' assign tableName to String
strTableName = CurrentDb.TableDefs(tableName)
' if no error occurs then set tableExists to true
tableExists = True
Exit_tableExists:
On Error Resume Next
Exit Function
Error_tableExists:
Select Case Err.Number
Case 3265 'Item not found in this collection
tableExists = False
Resume Exit_tableExists
Case Else
MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical
Resume Exit_tableExists
End Select
End Function