List invalid table and fieldnames - Regular Expressions used

English version at the end - as usual

Hi,

ich musste heute testen, ob bzw. welche Feld- und Tabellennamen "ungültige" Zeichen (wie Leerzeichen etc.) enthalten.
Bei dieser Gelegenheit habe ich "Regular Expressions" eingesetzt.
Das Ergebnis habe ich in eine Access-Demo-Datenbank "gegossen".

Diese Demo-Datenbank ist in meinem Ondrive im Verzeichnis Accesss_DBs unter RegEx_ListAllFieldnames.accdb zu finden

Diese kleine Datenbank zeigt einige Dinge:
a) Einfache Verwendung "Regular Expressions" (regulärer Ausdrücke)
b) Auflistung aller Tabellen und Feldnamen in MSAccess
c) Auflistung aller Tabellen und Feldnamen in MSSQL Server (als View)
d) Wie kann man testen, ob Tabellen- und Feldnamen nicht "verbotene" Zeichen enthalten, insbesondere "Leerzeichen", "Bindestrich", "Schrägstrich" usw.? Die deutschen Umlaute sind zulässig und es werden korrigierte Feld- und Tabellennamen vorschlagen (ungültige Zeichen werden durch Unterstrich ersetzt)

---------------------------------------------------------------------

a) Regular Expressions: Solange das vollständige VBSCRIPT installiert ist, funktioniert dies, da RegEx Teil von VBSCRIPT ist
Das Modul "mdl_Regular_Expressions" enthält zwei funktionsbereite Funktionen die sowohl die Auswahl als auch die Ersetzung von Zeichenfolgen mit Regex zeigen.
Die Abfragen "... Invalid..names" zeigen, wie beide verwendet werden.

b) Das Modul mdl_ListAllAccFieldNames erstellt die Tabelle _tblTabFelder, die alle Tabellen- und Feldnamen von MSAccess-Tabellen enthält
 - und bei korrekter Verknüpfung auch die verknüpften Tabellen. Leider sind die vorhandenen MSAccess Meta-Daten nicht direkt als Abfrage verfügbar.

c) Das Modul INFO__SQL_VIEW___qry_All_Tables_Columns enthält eine MSSQL-View, in der alle Tabellen- und Feldnamen der MSSQL-Datenbank erstellt werden.

d) Die 4 "qry ... Invalid ... Names" Abfragen zeigen nur diejenigen Feldnamen, die "falsche" Werte besitzen, an. In der letzten Spalte wird eine "korrigierte Version" angezeigt.
Wie dies ausgeführt wird, wird im Modul mdl_Regular_Expressions angezeigt, da jede Abfrage beide Funktionen enthält.

 Makro Autoexec: Es ruft einfach automatisch die Funktion "TableInfo_AllTabs" des Moduls mdl_ListAllAccFieldNames auf
Es erstellt und füllt die Tabelle "_tblTabFelder", mit der Sie die beiden MSAccess-Abfragen ad hoc ausführen können.

 Die verknüpfte Tabelle "qry_All_Tables_Columns" funktioniert nicht direkt für Sie. Sie müssen zuerst die View auf dem MSSQL-Server erstellen und dann die View als Tabelle in MSAccess neu verknüpfen.

mfg Klaus

-------------------------------------------------------------------------------------------------------------------------------------

Hi,

Today I had to test whether or which field and table names contain "invalid" characters (such as spaces, etc.).
On this occasion I used "Regular Expressions".
I poured the result into an Access demo database.

This demo database can be found in my OneDrive in the Accesss_DBs directory under RegEx_ListAllFieldnames.accdb

This small Database will show several things:
a) Easy using of Regular Expressions
b) Listing of all Tables and Fieldnames in MSAccess
c) Listing of all Tables and Fieldnames in MSSQL Server (as View)
d) How to test table- and field-names to not contain "forbidden" characters, especially "blank", "hyphen", "slash" etc. The German umlauts are allowed
and suggest corrected field- and table-names (invalid chars are replaced by Underline)

---------------------------------------------------------------------

a) Regular Expressions: As Long as the complete VBSCRIPT is installed on the system, this will work, as RegEx is part of VBSCRIPT
The module "mdl_Regular_Expressions" contains two ready to use functions to select and replace strings with Regex
The queries "...Invalid..names" show how to use both functions.

b) The module mdl_ListAllAccFieldNames creates the table _tblTabFelder which containes all table- and field-names of MSAccess tables
- and if correctly linked - also the linked tables. Unfortunately, the existing MSAccess meta-data is not directly available as a query.

c) The INFO__SQL_VIEW___qry_All_Tables_Columns module containes an SQL Server View which creates all table- and field-names of the MSSQL database.

d) The 4 "qry...Invalid...names" Queries show only incorrect names, and the last column shows the "corrected version"
how its done is showed in the module mdl_Regular_Expressions, as each query contains both functions.

Macro Autoexec: It just automatically calls the function "TableInfo_AllTabs" of module mdl_ListAllAccFieldNames
The table "_tblTabFelder" is created and filled, so that you can run the two MSAccess queries ad hoc ...

The linked table "qry_All_Tables_Columns" will not work for you directly, you first have to create the view on the server and then relink the view as table in MSAccess.

best regards Klaus

Automatic Reconnect from Sql Server BE to MSAccess

------ english version at the end ------------

Hi,

automatisches Reconnect von Access zum SQL Server

Idee dahinter: Ein automatischer Reconnect wird nur durchgeführt, wenn die als Test-Tabelle definierte Tabelle nicht richtig verbunden ist.

Der Name der Testtabelle wird in "PropInhalt" von _tblProperty als Text mit dem PropName "prp_SQLCheckTabelle" gespeichert

Diese Demo zeigt, wie man sich nach der korrekten Einrichtung einfach von sql Server wieder verbindet:
Diese Demo enthält:

- ReadMe Auto Relink to SQLServer.txt (diese Datei)

- TestConnect_SQL.mdb acc2000 Beispiel-MDB-Datei (gespeichert von 32 Bit 2013 Access accdb)

- crea_TestConnect.sql.txt Ein automatisch erstelltes SQL-Skript zum Erstellen einer Beispiel-Backend-MDF-Datei

WICHTIG: Bitte bearbeiten die

( NAME = N'TestConnect', FILENAME = N'C:\SQL_2017_Ex\Data\TestConnect.mdf' , SIZE = 73728KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'TestConnect_log', FILENAME = N'C:\SQL_2017_Ex\Data\TestConnect_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO

Zeilen des Scripts passend zu der bei Ihnen verwendeten Systemkonfiguration.

Ich habe kein Backup verwendet, da mein System SQL Server Express 2017 ist und eine Wiederherstellung nicht abwärtskompatibel ist (soweit ich weiß)
aber dieses Skript sollte in fast jedem SQL Server ab 5 arbeiten ??

--------

Die folgenden Dinge müssen im Voraus festgelegt werden:

Erstellen Sie das Test-Back-End mit dem Skript.

MS Access:
Öffnen Sie zum ersten Mal die mdb mit Shift, oder Sie erhalten alle möglichen unangenehmen Fehlermeldungen.

Verbindungszeichenfolge
Für eine einfache Handhabung (sobald es eingerichtet ist) wird die verwendete Verbindungszeichenfolge gesplittet gespeichert.
Der Hauptteil ist in der Tabelle "Acc_SQL_Server" gespeichert
ACHTUNG - Es ist sehr wichtig, dass das letzte Zeichen immer ein ";" ist, wie dort gezeigt ...

Da ich die private Funktion atcnames (1) <Benutzername> oder atcnames (2) <pcname> aus Modul mdlVerbindeSQL verwende, kann ich "meinen eigenen" Server finden, der im Feld "Server_OBD" gespeichert ist, ansonsten wird der Kundenserver, Feld "Server_Kunde" verwendet.
Feld "Server" ist ein Ausgabefeld, in dem der tatsächlich verwendete Server automatisch gespeichert wird.

Ein App_Name wird in VBA über APPName erstellt
fAppName = "APP =" & atCNames (1) & "\" & atCNames (2) & "\" & Nz (DAOARRAY1 (5, 0)) <wobei 5 = das Feld Appname>
Loginname wird von diesem neu geschrieben
App_Name kann im SQL Server mittels "SELECT App_Name ()" verwendet werden

Last but not least: "ConnectionstringT1", die den ersten Teil der Verbindungszeichenfolge enthält

ODBC;Driver={SQL Server Native Client 11.0};Trusted_Connection=Yes;

Natürlich muss man diesen mit dem von Ihnen verwendeten Teil ersetzen ...

Der letzte Teil der Verbindungszeichenfolge ist der Datenbankname und die zu verbindende Tabelle.

Sie finden sie in der Tabelle "Acc_SQL_tblVerknüpfungstabellen"

Um eine Verbindung von verschiedenen SQL-Datenbank-Backends herstellen zu können, wird der Datenbankname in dieser Tabelle gespeichert.

Aus praktischen Gründen wird die Eigenschaft "prp_Standard_DBName" in der Tabelle _tblProperty in "PropInhalt" gespeichert.
Es enthält den Namen der Haupt-Back-End-Datenbank.
Dies wird verwendet für die

Funktion GetConnectionstring ()

Das finden Sie im Modul "mdlSonstiges4" Es bringt Ihnen den kompletten Verbindungsstrang unabhängig von einer verwendeten Tabelle.
 (aber deshalb vielleicht in einigen Fällen fehlerhaft). Ich persönlich benutze diese Funktion ziemlich oft.

Die Tabelle "Acc_SQL_tblVerknüpfungstabellen"

Um MS zu zitieren: >>> You can use CREATE INDEX to create a pseudo index on a linked table in an ODBC data source, such as Microsoft® SQL Server™, that does not already have an index. You do not need permission or access to the remote server to create a pseudo index, and the remote database is unaware of and unaffected by the pseudo index. You use the same syntax for both linked and native tables. Creating a pseudo-index on a table that would ordinarily be read-only can be especially useful. <<<

tblName - Name wie in MSAccess angezeigt
tblName_Org - Ursprünglicher Name, der im SQL Server (Tabelle oder View) verwendet wird
jn - Wenn nicht Ja angekreuzt ist, wird die Tabelle überhaupt nicht verknüpft
Indexfkt - Indexanweisung (wie oben erwähnt) - Beispiel:
CREATE UNIQUE INDEX A_Detail_Prim ON qry_A_Details (DE_ID)
ID - automatisch erstellte ID-Nummer als PK
IDSort - Reihenfolge, in der die Verbindung erstellt wird (optional, wenn 0, dann wird ID verwendet)
Bemerkungen - Bemerkungen (optional / nicht verwendet)
DBName - DBName der Backend-Datenbank, in der die Tabelle gespeichert ist -
Wichtig: Der String >DATABASE = <name>; muss mit einem ";" enden, da als Teil von Connectionstring verwendet

Die Tabelle tbl_Connectionstring enthält als ID 1 nur den erzeugten ConnectionString (wie in GetConnectionString())
Und wird bei jedem Reconnect erstellt (wenn Tabellen geändert wurden oder das Makro Reconnect_BE (SQL)_Tables verwendet wurde)

Wenn alle Einstellungen korrekt sind, schließen und öffnen Sie die Datenbank erneut.

Das Autoexec-Makro führt nur die Funktion aus dem Modul mdl_Autoexec aus

Funktion f_Autoexec ()
checkconnectSQL
MsgBox "Tabellen sind korrekt verbunden"
Ende Funktion

Mit dem Makro "Reconnect_BE (SQL) _Tables" erzwingen Sie eine erneute Verbindung (auch wenn alles in Ordnung zu sein scheint)
zum Beispiel, wenn Sie die BE-Tabellen geändert haben ...

Es führt die Funktion =DatenMDBWechselSQL() im mdlVerbindeSQL-Modul aus.

All das "Heavy Lifting" erfolgt im mdlVerbindeSQL-Modul, mdlSonstiges4 und mdlSonstigesJasNein enthalten lediglich mehrere Helferfunktionen.
Ich verwende meistens die Funktion ArrFill_DAO_Acc, die eine Tabelle (Recordset / SQL String) in ein Array einfügt.
Kopieren Sie einfach die Kommentarzeilen am Anfang der Funktion (Dim ArrFill ... bis End If) in den eigentlichen Code und entfernen Sie dort die Kommentarzeichen ...

Das vollständige Beispiel finden Sie hier im Unterverzeichnis >SQL_Server Auto Relink tables queries to ACCESS<

-------------------------------------------------------------------------------------------------------------------------

Hi,

Automatic Reconnect from Sql Server BE to MSAccess

Idea: Only reconnect again, if one >test table< is not connected properly (unsuccessful open test)
The name of the test table is stored in "PropInhalt" of _tblProperty as Property with the PropName "prp_SQLCheckTabelle"

This demo will show how to easily reconnect from sql server, once set up properly:
This demo contains:

- ReadMe Auto Relink to SQLServer.txt (this file)

- TestConnect_SQL.mdb acc2000 Sample mdb file (saved from 32 bit 2013 Access accdb)

- crea_TestConnect.sql.txt An auto-created SQL script for creating a sample backend mdf-file

IMPORTANT: Pls edit the
( NAME = N'TestConnect', FILENAME = N'C:\SQL_2017_Ex\Data\TestConnect.mdf' , SIZE = 73728KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'TestConnect_log', FILENAME = N'C:\SQL_2017_Ex\Data\TestConnect_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
lines according to your system

I didn't use a backup, because my system is SQL Server Express 2017 and a restore is not backwards compatible (as far as i know)
but this script should work on nearly each mdf starting from 8a ??

--------

The following things have to be set up in advance:

Create the Test Backend with the script.

MS-Access:
First time open the mdb with shift, or you'll get all sorts of nasty errormessages.

Connection string
For easy handling (once it is set up) the used connection-string is split stored.
The main part is stored within the table "Acc_SQL_Server"
PAY ATTENTION - It is most important that the last char always is a ";" as shown there ...

As i use the private function atcnames(1) <username> or atcnames(2) <pcname> from module mdlVerbindeSQL i can detect "my own" server which is stored in field "Server_OBD" otherwise the customer server, field "Server_Kunde" is used.
Field Server is an output field, it stores the actual used server automatically.

An App_Name is created in VBA via APPName
fAppName = "APP=" & atCNames(1) & "\" & atCNames(2) & "\" & Nz(DAOARRAY1(5, 0)) <where 5 = the field Appname>
Loginname is rewritten from that
App_Name can be used in SQLServer "SELECT App_Name()"

Last but not least "ConnectionstringT1" which contains the first part of the connectionstring

ODBC;Driver={SQL Server Native Client 11.0};Trusted_Connection=Yes;

Of course you have to replace it whith the connectionstring-part you use ...

The last part of the connection-string is the database-name and the table to connect.

You'll find them in table "Acc_SQL_tblVerknuepfungstabellen"

For beeing able to connect from varius SQL database backends, the database-name is stored within that table.

For convenience the Property "prp_Standard_DBName" of the table _tblProperty is stored in "PropInhalt"
It contains the Main Backend Database name.
This is used for

function GetConnectionstring()

Which you'll find in modul "mdlSonstiges4" It brings you the complete connectionstring independant of a used table.
(but therefore maybe incorrect in some cases). I personally use that function quite often.

The table "Acc_SQL_tblVerknuepfungstabellen"

To quote MS: >>> You can use CREATE INDEX to create a pseudo index on a linked table in an ODBC data source, such as Microsoft® SQL Server™, that does not already have an index. You do not need permission or access to the remote server to create a pseudo index, and the remote database is unaware of and unaffected by the pseudo index. You use the same syntax for both linked and native tables. Creating a pseudo-index on a table that would ordinarily be read-only can be especially useful. <<<

tblName - Name as shown in MSAccess
tblName_Org - Original name, used in SQL Server (table or view)
jn - If not Yes, table is not linked at all
Indexfkt - Index statement (as mentioned above) - Sample:
CREATE UNIQUE INDEX A_Detail_Prim ON qry_A_Details (DE_ID)
ID - autocreated ID number as PK
IDSort - order in which the connection is created (optional, if 0, then ID is used)
Bemerkungen - remarks (optional / not used)
DBName - DBName of the backend database where the table is stored -
Important: String >DATABASE = <name>;< Ending with ; - as used as part of Connectionstring

The table tbl_Connectionstring as ID 1 just contains the the created ConnectionString (as in GetConnectionString() )
And is created on each connect (when tables changed)

If all settings are correct close and reopen the database.

The Autoexec Macro just execs the function

Function f_Autoexec()
checkconnectSQL
MsgBox "Tables are connected correctly"
End Function

found in Module mdl_Autoexec

You force a reconnect (even if everything seems OK) with macro "Reconnect_BE (SQL)_Tables"
for example if you changed the BE-tables ...

It execs the function =DatenMDBWechselSQL() found in mdlVerbindeSQL module

All the "heavy lifting" is done in mdlVerbindeSQL module, mdlSonstiges4 and mdlSonstigesJasNein just contain several helper funktions.
I mostly use the function ArrFill_DAO_Acc which puts a table (recordset / SQL String) into an array.
Just copy the comment lines at the beginning of the function (Dim ArrFill... to End If) in your actual code and uncomment them there...

You'll find the complete sample here in Subdirectory >SQL_Server Auto Relink tables queries to ACCESS<

NEW VERSION Create and Delete Temporal Tables

------- NEUE VERSION ---------------

Hallo,

Europäische Datenschutz-Grundverordnung und Temporal Tables

Die europäische Datenschutzgrundverordnung ist ein guter Grund, einen Kunden davon zu überzeugen, zu SQL Server 2017 Express zu wechseln.
Dort können Sie die TemporalTables als automatisch generierte Protokollierung für persönliche Daten verwenden.
(Zwei meiner Kunden haben sich nur deshalb auf den SQL Server 2017 Express als Backend gewechselt)

Ab 2016 können Sie sogenannte temporale Tabellen verwenden. (= Automatische Historie für die Datensätze)
Bei Verwendung in SQL 2017 oder später wird automatisch ein Aufbewahrungszeitraum festgelegt

Neue Version - erweitert um Ideen von Uwe Ricken

das Meiste ist jetzt parametrisierbar. (Im Text der Stored Proc beschrieben)

Laut "meines Standards" ist das
a) Die Verlaufstabelle hat den Namen: "<tablename>_History" und wird in demselben Schema wie die "ursprüngliche" Tabelle erstellt.
b) HistTbl_ValidFrom und HistTbl_ValidTo sind die Namen der zwei versteckten obligatorischen Datumsfelder
c) Nur SQL 2017: Der Aufbewahrungszeitraum wird im Proc auf 24 Monate festgelegt

Hier 3 Prozeduren zum a) Erstellen oder b) Aktivieren und Deaktivieren (verwendet ggf. Erstellen) oder c) Löschen der temporalen Tabellen

Gerade getestet in 2017 Express Edition: Wenn die temporäre Tabelle erstellt wird, wird automatisch ein PK hinzugefügt, so dass
Die * neue * SQL 2017 Funktionalität "History Retention" einfach funktioniert.
Diese Proc ist auf eine feste Aufbewahrungszeit von 24 Monaten eingestellt, aber Sie können dies leicht in proc ändern.
Proc: "History_Retention_Period = 24 Months"

Mit diesen 3 Procs ist die Verwendung von Temporal Tables "ein Kinderspiel"

Permanentes Löschen: Da Sie die beiden Standard-Constrains für HistTbl_ValidFrom und HistTbl_ValidTo löschen müssen, bevor Sie die Felder selbst löschen können,
funktioniert die Lösch-Proc nur, wenn die Default-Constrains mit dem Create-Proc erstellt werden, ansonsten können/werden die Constrain-Namen unterschiedlich sein.

PS: In SSMS ändert sich das Kontextmenü der rechten Maustaste drastisch, wenn eine Tabelle "System-Versioned" ist, wie MS es nennt.
Tipp: Wenn Sie den Baum der Tabelle öffnen, ist der erste Eintrag die History-Tabelle. (Wenn nicht: Aktualisieren)
Da diese Tabelle NICHT "System-Versioned" ist, hat sie fast das "normale" Kontextmenü der rechten Maustaste mit mindestens den Select-Skripten
Wenn Sie das Select-Skript verwenden und Sie einfach den Text "_History" in FROM löschen, dann haben Sie die Auswahl für die eigentlich gewünsche "Haupt-Tabelle"

Die drei Scripte sowie einige Grund-Views, (ebenfalls neuere Version, die 3 Scripts sind darin enthalten) die ich extrem prakisch finde, sind hier in Onedrive im Ordner TemporalTables zu finden:

 

---------------------- english version --------------

Hallo,

European GDPR and TemporalTables

The European GDPR is a good reason to convince a customer to change to SQL Server Express.
There you can use the TemporalTables as an automatic generated Logging for personal data.
(Two of my customers only because of that changed to SQL Server 2017 Express)

Beginning with 2016 you can use so called temporal tables. (= Automatic History for the records)
When used in 2017 or later, then automatic a Retention Period is set

New Version available

Most things can be parametrisized. (Look into the text of the SP)

According to "my default" which is
a) History Table is named: <tablenamne>_History and is created in same schema than "original" table.
b) HistTbl_ValidFrom and HistTbl_ValidTo are the names of the two hidden mandatory date-fields
c) SQL 2017 only: Retention Period is set in proc to 24 month

Here 3 Procedures to a) Create or b) Enable and Disable or c) Delete permanent the temporal tables

Just tested in 2017 Express Edition: When the temporal table is created, automatically a PK is added so that
the *new* SQL 2017 functionality "History Retention" just works.
This proc is set to a fixed 24 month retention time, but you can change that easily in proc.
Proc: "History_Retention_Period = 24 MONTHs"

With this 3 Procs, the use of Temporal Tables is "a snap"

Permanent deletion: As you need to delete the two default-constrains for HistTbl_ValidFrom and HistTbl_ValidTo before you can delete the fields itself,
the delete Proc only works, if the default-constrains are created with the Create proc, otherwise the constrain-names may be different.

PS: In SSMS the right mouse context menu changes drastically, if a table is "System-Versioned" as they call it.
Hint: If you open the tree of the table, the first entry is the History table. (If not: Refresh)
As this table is NOT "System-Versioned" it has nearly the "normal" right mouse context menu with at least the Select Scripts
If you use that Select scripts and you just delete the "_History" in FROM then you have the Select for the "Main-Table"

The three scripts and some basic views (also newer version - including the 3 scripts) which I find extremely practical, can be found here in Onedrive in Subdirectory TemporalTables:

Tastatur-Umbelegung / Erweiterung der AltGr Tasten Funktionen

-------- english part at the end - as usual  ------------------------

Hallo,

nachdem ich von dem an sich sehr guten Tastastatur- / Maus-Set 5050 von MS - nur und ausschliesslich wg. der im deutschen Tastaturlayout viel zu kleinen linken Shift-Taste (eine Unverschämtheit, sowas so zu designen ...) genug hatte, weil bei mir jedes zweite großgeschriebene >Wort >So >Aussah - habe ich mich kurzentschlossen zu einer Radikal-Lösung entschieden:

Beim MS Shop telefonisch das gleiche 5050 Tastatur-Set - aber mit US-Layout - bestellt (was gar nicht so einfach war). Paralell dazu im Internet fertige Tastaturaufkleber QWERTZ (12 * 12) sowie einen Blanko Satz (ohne Aufdruck) sowie einen 0,8 mm Lackschreiber weiss, wasserfest bestellt.
Danach per Klebetasten und Software meine eigene Tastatur gebastelt. Das Ergebnis ist perfekt.

Nachträglich betrachtet (der Tipp es MVP Kollegen erreichte mich zu spät) hätte ich mir die Geldausgabe für eine neue Tastatur auch sparen können, da für das 5050 auch folgende Lösung funktioniert hätte: < Taste als Shift-Taste umfunktioniert, die nachfolgend beschriebene Tastatur erzeugt und nur die 3 fehlenden Zeichen auf der Tastatur mit Lackstift nachgezeichnet...

Da das Finden und Erzeugen der optimalen Lösung relativ zeitaufwändig war (die meiste Zeit hat das Suchen und Testen beansprucht), dachte ich, ein "HowTo" würde vielleicht auch andere interessieren.

Hier das Ergebnis:

1.) Mann muss ein eigenes Tastatur-Layout (eine eigene Tastatur im System) erstellen und aktivieren
2.) Danach kann man auch für dieses neue Layout nachträglich die unsägliche Caps-Lock-Taste deaktivieren
3.) Nach der Inbetriebnahme der Tastatur muss man die Hardware per Tastaturaufkleber anpassen.
4.) Das (häufig genannte) SharpKeys.exe half mir an dieser Stelle nicht sonderlich.

Habe nach längerem Probieren festgestellt, dass man zusätzliche AltGR-Tasten nur mittels des älteren Programms von MS: Keyboard Layout Creator 1.4 erstellen kann (Systemnahe hardcore Programmier-Freaks ausgenommen); aber mit diesem Programm geht es bestechend einfach und schnell:
Download derzeit: https://www.microsoft.com/en-us/download/details.aspx?id=22339

Nachteile des Programms: Seperater Numlock-Block nicht editierbar - Caps-Lock nicht editierbar.
Aber diese Dinge benötigt man hier alle nicht.

Wenn man die Sache richtig durchdenkt, muss man ja "nur" die fehlende <>| Taste kompensieren, alles andere erledigt das deutsche Layout automatisch.
Daher habe ich diese drei Buchtaben wie folgt verteilt:
"<" auf AltGr y ">" auf AltGr x und "|" auf AltGr rechts neben der ß (s-Zet) Taste (die Taste mit ´und `) (Dann sind die gesamten "US"-Zeichen in einer AltGr-Reihe versammelt)
Aber "C" oder jede andere freie, belegbare Taste hätte es auch getan.

Sinnvoll vorher: Notepad geöffnet und mit <linke Alt-Taste>: 0060 das "<" erzeugt dann zwei Zeilen tiefer
mit Alt 0062 das ">" und mit Alt 0124 das "|" Zeichen (notwenig, da ich temporär mit einem "falschen" Layout arbeitete).

Nach der Installation und dem ersten Aufruf des Programms lädt man sich das deutsche Standard-Tastatur-Layout herunter

(File / Load existing Keyboard)
Deutsch

Man sieht dann das Standard-Deutsche-Layout. Dann schaltet man links das Häkchen "Alt+Ctrl(AltGr)" an. Somit sieht man nur die Ebene Altgr. Dann klickt man auf jeweils auf den Buchstabenkasten, für den man das Zeichen erzeugen will und gibt das jeweilige Zeichen dort ein (Hier ist ggf. Cut & Paste aus der Text-Datei hilfreich).

Das war's eigentlich schon mit der Erstellung, da die sog. Scanwerte für die restlichen Tasten (egal welche Sprache) alle identisch und die restlichen Tasten "deutsch Standard" sind...
Um die leidige CapsLock-Taste kümmern wir uns später, an dieser Stelle ist hier keine Aktion sinnvoll.

So jetzt kommt der zweite Teil:

Hinweis zum Estellen der eigenen Tastatur: Da man sich - wenn man nicht sorgfältig plant - durch diesen Schritt leicht das System mit "Schrott-Tastaturen" vollmüllen kann und diese nicht ganz leicht wieder zu entfernen sind, sollte man die Tastatur vorher SEHR gründlich prüfen, ob sie das macht, was sie soll und möglichst sollte der "erste Versuch" sitzen.

Project / "Test Keyboard Layout" - Damit kann man das neue Keyboard solange testen bis es passt. OK, bei 3 Tasten nicht all zu viel Arbeit, aber dennoch ...

WICHTIG: Unter Project / "Validate Layout" -
GANZ WICHTIG dabei: Die nachfolgende Frage, ob der Speichertext und -Ort nochmals überprüft werden solle auf JEDEN FALL BEJAHEN.
Dann öffnet sich eine Maske, in der man den Tastaturschlüssel (max. 8 Zeichen - systemweit unique) sowie die Beschreibung (ebenfalls systemweit unique) - wird später als Anzeigenamen der Tastatur im System verwendet - eingeben kann.
Ein weiteres Problem dabei ist, dass man ein Projekt mit einem vorhandenen Schlüssel / Beschreibungspaar nur EINMAL erzeugen kann. MS überschreibt ein bestehendes Projekt nicht, sondern schliesst mit einer Fehlermeldung !!!!!!!!!!!

Nachdem man "sein Tastaturlayout" verifiziert und getestet hat, kommt der nächste Schitt: Project / "Build DLL and Setup Package". Unter dem "Current working Directoty" wird bei erfolgreichem Build ein Subdirectrory mit dem Tastaturschlüssel als Namen erzeugt und das Setup darin abgelegt.

Der nächste Schritt ist das "Deployen" des Setups auf dem eigenen Rechner: Setup ausführen. Dann wird eine neue Standard-Tastatur mit den o.a. Namen als Beschreibung im System angelegt.

Der nächste schritt ist dann im System unter "Sprache" Sprachoptionen / Tastaturen die eigene Tastatur hinzuzufügen und die "alte" Tastatur zu entfernen. Danach bootet man das System und verwendet dadurch die "neue" Tastatur.

Eine Lösung für das verd** CapsLock-Problem erfährt man hier;

https://www.howtogeek.com/howto/windows-vista/disable-caps-lock-key-in-windows-vista/

Einfach die vorhandenen Dateien (Link am Ende des Artikels) downloaden, einen davon installieren.

Nach einem erneuten Reboot des System war dann - zumindest bei mir - Tastaturtechnisch alles so konfiguriert, wie ich es mir vorgestellt habe.

Nachdem die Tastatur software-technisch fertig war, habe ich die neue Tastatur dann noch mit den fertigen Aufklebern (deutsch) beklebt und die fehlenden Zeichen mittels Stift nachgezeichnet.

Ein Hinweis noch - ziemlich speziell für das 5050-Keyboard und ähnliche neuere MS Tastaturen mit viel Sondertasten:

Das kostenfreie Programm "Microsoft Maus und Keyboard Center"
DL derzeit: https://www.microsoft.com/accessories/de-de/downloads/mouse-keyboard-center
ermöglicht es einem, die vielen Sondertasten nach eigenen Wünschen zu belegen. Zudem kann man dort auch -
ohne den oben gennanten Trick - einfach die "Festelltaste" deaktivieren.

Das beim Suchen häufiger aufgetauchte/genannte Programm "SharpKeys" hat bei mir - ausser für die CapsLock (Festelltaste) - nicht funktioniert und ich habe es letztendlich überhaupt nicht benötigt.

-----------  english part ---------------

after nearly abundonning the very good keyboard / mouse set 5050 of MS - only and exclusively because of the "Shift key" in the German keyboard layout was too small (an impudence to design something like that ...), because every >Second >Word in >Caps looked like this - I decided on a radical solution:

Called the MS Shop by phone and ordered the same 5050 keyboard set but with US layout (which was not so easy over here in Germany). Parallel to this, i ordered.QWERTZ keyboard stickers (12 * 12) as well as a blank set (without imprint) as well as a 0.8 mm white ink pen, waterproof.
Then I made my own keyboard by means of adhesive keys and software. The result is perfect for me.

Looking back, I could have saved myself the money for a new keyboard: For the 5050 following solution would have worked: "<" button converted as a Shift button, a new keyboard layout as described below and only painted the 3 missing characters on the keyboard with pen scripted by hand. (but that hint arrived too late...)..

Since finding and creating the optimal solution was relatively time-consuming (most of the time it took up searching and testing), I thought an "HowTo" could interest others too.

Here is the result:

1.) You have to create and activate your own keyboard layout (your own keyboard in the system)
2.) Afterwards you can also disable the unspeakable Caps Lock button for this new layout
3.) After putting the keyboard into operation, you have to adjust the hardware with keyboard stickers.
4.) SharpKeys.exe does NOT help here (though always talked about).

After a long trial, I found out that you can only create additional AltGR keys using the older program of MS: Keyboard Layout Creator 1.4 (except for system-oriented hardcore programming freaks); but with this program it is very easy and fast:
Download currently: https://www.microsoft.com/en-us/download/details.aspx?id=22339

Disadvantages of the program: Separate Numlock-Block not editable - Caps-Lock not editable.
But you do not need those things for this task anyway.

If you think through the things properly, you have "only" to compensate the missing keys "<" ">" and "|", everything else does the German layout automatically for you.
Therefore, I have these three keys distributed as follows:
"<" on AltGr y ">" on AltGr x and "|" on AltGr to the right of the ß (s-Zet) key (the key with 'and `).
(Then all the "US" characters are in an AltGr series)

Meaningful before: Notepad open and with <left Alt key>: 0060 the "<" then generates two lines lower
with Alt 0062 the ">" and with Alt 0124 the "|" Characters (needed only because of working temporarily with a "wrong" layout).

After the installation and the first call of the program you load the German standard keyboard layout

(File / "Load existing Keyboard")
German

You then see the standard German layout. Then turn on the check mark "Alt + Ctrl (AltGr)" on the left. Thus one sees only the level Altgr. Then you click on the letter box for which you want to create the character and enter the respective character there (here is possibly cut & paste from the text file helpful).

That's it with the creation itself, since the so-called Scans for the remaining keys (no matter what language) are all identical and the remaining keys are "German standard" ...
We'll take care of the annoying CapsLock button later on, at this point no action makes sense.

So now comes the second part:

Project / "Test Keyboard Layout"

Setting up your own keyboard. Since one can easily mop the system with "scrap keyboards" by this step, if not planned carefully in beforehand, and these are not easy to remove, one should VERY thoroughly check the keyboard before doing the "final" creation step.

IMPORTANT: Under Project / Vaidate Layout -
VERY IMPORTANT: The following question, whether the memory text and location should be checked again, in any case AGREED
Then a form opens in which you can enter the keyboard key name(up to 8 characters - system-wide unique) and the description (also system-wide unique)
Another problem is that you can only generate a project with an existing key / description pair ONCE. MS does not overwrite an existing project, but closes with an error message !!!!!!!!!!!

After verifying and testing "your keyboard layout", the next step is: "Build DLL and Setup Package". Under the "Current working Directoty", a subdirectory is generated with the keyboard key as name and the setup is stored - if build was successful.

The next step is "Deploying" the setup on your own computer: Run Setup. Then a new standard keyboard with the above mentioned name (as description in system) is created.

The next step is to add your new keyboard and remove the "old" keyboard in the system under "Language" Language Options / Keyboards.

Then boot the system and use the "new" keyboard.

A solution for the sh** CapsLock problem can be found here;

https://www.howtogeek.com/howto/windows-vista/disable-caps-lock-key-in-windows-vista/

The easiest solution is to download the existing maps (link at the end of the article) and install one of them.

After a (last) reboot of the system - at least for me - it was complete and perfect for me. The keyboard is exactly configured as I have imagined.

After the keyboard was software-technically finished, I then stuck the new keyboard with the finished stickers (German) and wrote the missing characters with a pen.

A hint still - quite specific for the 5050 keyboard and similar newer MS keyboards with a lot of special keys:

The free program "Microsoft Mouse and Keyboard Center"
DL currently: https://www.microsoft.com/accessories/de-de/downloads/mouse-keyboard-center
makes it possible to prove the many special keys according to your own wishes. In addition, you can also -
without the trick mentioned above - simply deactivate the "CapsLock key".

The frequently mentioned program "SharpKeys" did not work for me except for the CapsLock button and I did not need it at all.

mfg Klaus

Access / OleDB / ODBC - New seperate driver for SQL 2017 necessary

Hi,

i was asked why an old OLEDB Connection string, which worked for SQL Server 2014 didn't work for SQL Server 2017.

My answer was: I'm sure that a new driver - installed seperately - is necessary. It has to be installed on the Server AND on each Client

these links should help here

 https://blogs.msdn.microsoft.com/sqlnativeclient/2017/10/06/announcing-the-new-release-of-ole-db-driver-for-sql-server/

 https://blogs.msdn.microsoft.com/sqlnativeclient/2018/03/30/released-microsoft-ole-db-driver-for-sql-server/

 Download - OLE DB Driver SQL Server 2017  (As of August 2018)

Download - ODBC Driver SQL 2017  (As of August 2018)

 De Soto Blog entry - OLE and ODBC driver summary

 

mfg Klaus