version=1.2.2 vdate= 15.08.2017 fname=temptabledef.cls ns=%NAMESPACE% fpath=/vba/classes ====== [VBA][Access] TempTableDef ====== //Eine Klasse um mit TempTables zu arbeiten// ==Version %%version%% %%vdate%%== >//Das Modul hat versteckte Attribute. Damit diese aktiv übernommen werden reicht es nicht aus, den Code in ein neues Modul zu kopieren. Man muss das Modul aus der Datei nach VBA importieren.// >{{popup>:vba:vba_importfile.png|Bild zum Import}} {{%%fname%%|Download %%fname%% (V-%%version%%)}} Die Klasse erstellt eine Tabelle und verwaltet sie selbständig. Die Tabellen können Userabhängig sein, sich nur halten während die Klasseninstanz existiert. Müssen aber nicht. Zudem muss man sich nicht um den Namen kümmern. DieKlasse kann SQLs parsen um den Namen zu ersetzen. Wichtig! Bevor man diese oder eine ähnliche Klasse/Methode einsetzt sollte man sich Gedanken machen, ob man das wirklich braucht. Wenn nicht wirklich ein Sonderspezialfall vorliegt, dann hat man in seinem Datenbankmodel einen Fehler wenn man Temporäre Tabellen braucht.... Hier mal schnell ein kleines Beispiel Public Sub temp() Dim tmp As TempTableDef 'Die TempTable anlegen, der name ist t_1 Set tmp = TempTableDef("t_1").createBySqlSelect("select * from ADDON_SEQUENZ where start_nr = 1") 'Den wirklichen Namen anzeigen '-> #TMP_Yaslaw_t_1 Debug.Print tmp.tempName 'Einen Update auf die TempTable absetzen tmp.execute "update t_1 set seq_name = 'N/A' where seq_name = ''" 'Ein Select absetzen und anzeigen 'http://wiki.yaslaw.info/doku.php/vba/access/functions/printrs printRs tmp.openRecordset("select t.* from [t_1] t inner join [dual] d on t.start_nr = d.id") 'Die Tabelle #TMP_Yaslaw_t_1 wird automatisch gelöscht, weil hier die Instanz abgebaut wird und ttdScopeClass gesetzt ist 'Es wird nicht nachgefragt End Sub #TMP_Yaslaw_t_1 SEQ_NAME | START_NR | LAST_NR | LAST_TIMESTAMP -----------|----------|---------|-------------------- N/A | 1 | 4 | 15.03.2017 14:13:48 e | 1 | 3 | 15.01.2016 08:50:45 test | 1 | 4 | 01.07.2016 09:55:38 Test 1 | 1 | 3 | 01.03.2016 10:11:00 ===== Definitionen ===== > Für die Ausgabe der Resultate verwendete ich die Funktion [[:vba:functions:print_r:|print_r() bzw. d()]] und [[vba:access:functions:printrs|printRs()]]. ==== Enums ==== ^ Enum ^ Beschreibung ^ | [[#TempTableDefEnum]] | Settings zur TempTableDef | ==== Creatoren ==== Es gibt verschiedene Möglichkeiten eine TempTableDef zu initialisieren ^ Methode ^ Rückgabetyp ^ Beschreibung ^ | [[#instance]] | %%TempTableDef%% | Erstellt eine neue Instance | | [[#construct]] | %%TempTableDef%% | Initialisiert ein bestehendes Objekt neu | ==== Auslöser ==== Die folgenden Funktion werden verwendet um eine Tabelle anzulegen ^ Methode ^ Rückgabetyp ^ Beschreibung ^ | [[#create]] | %%TempTableDef%% | Erstellt eine Tabelle aus dem Resultat eines SQLs | ==== Public Methodes ==== ^ Methode ^ Rückgabetyp ^ Beschreibung ^ | [[#execute]] |Long | Führt ein execute() durch und parst dabei den Tabellenname | | [[#openRecordset]] | %%DAO.Recordset%% | öffnet ein Recordset auf die TempTable | | [[#queryDef]] | QueryDef | Gibt ein QueryDef zurück | | [[#showQuery]] | | öffnet und zeigt ein SQL als Abfrage | | [[#convertSql]] | | Konvertiert in einem SQL den Name durch den tatsächlichen Tabellennamen | | [[#drop]] | | Löscht die physiche Tabelle | | [[#dropAllTempTables]] | | Löscht alle physiche Temp-Tabellen | ==== Public Properties ==== ^ Property ^ Rückgabetyp ^ Getter/Setter ^ Beschreibung ^ | [[#exists]] | Boolean | Get | Prüft ob die physische Tabelle exisitiert | | [[#tempName]] | String | Get | Der physiche Name der Tabelle, wie sie in der DB angelegt wird | | [[#tempNameSql]] | String | Get | Dito zu %%tempName%% aber mit [] umgeben um in einem SQL zu verwenden | | [[#tableDef]] | TableDef | Get | TableDef Objekt auf die temporäre Tabelle | [[#name]] | String | Get & Let | Name der TempTable | | [[#user]] | String | Get & Let | Name des Anwenders für Userabhängige TempTables | | [[#db]] | DAO.Database | Get & Set | Datenbank, auf der sich die TempTable befindet | | [[#paramter]] | Variant | Get & Let | Setzt eine SQL-Paramter | | [[#paramters]] | Dictionary | Get & Set | Setzt eine SQL-Paramters | | [[#settings]] | TempTableDefEnum | Get & Let | Alle Settings auf einmal setzen | | [[#forceDrop]] | Boolean | Get & Let | Setting: Beim löschen nicht nachfragen | | [[#scopeUser]] | Boolean | Get & Let | Setting: Dem physischen Tabellenname wird der User angehängt. Somit ist die TempTable Userabhängig | | [[#scopeClass]] | Boolean | Get & Let | Setting: Die TempTable wird nur solange gehalten, solange die Klasse exisitiert | ===== Beispiele ===== Für die Beispiele verwende ich die folgenden 3 Tabellen TBL_DEMO_TMPTBL_USER UID | VORNAME | NACHNAME | CODE ----|---------|----------|----- 1 | Hans | Müller | BQ 2 | Doris | Andres | HG 3 | Fränzi | Muster | BQ TBL_DEMO_TMPTBL_EVENT EID | ENAME ----|-------------------- 1 | Bierfestival Zürich 2 | brasserie publique 3 | Wortspiele TBL_DEMO_TMPTBL_LINK UID | EID ----|---- 1 | 2 1 | 3 2 | 1 3 | 1 3 | 2 3 | 3 Fortsetzung folgt....