MS-Office-Forum
Google
   

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access - Code Archiv
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads Der Renner, 11 Entwicklertools für Access, Tipps & Trick und offene Datenbanken zum einzigartigen Preis.
Themen-Optionen Ansicht
Alt 17.03.2013, 17:55   #1
ebs17
MOF Guru
MOF Guru
Standard Grundlagen - SQL ist leicht (1) - Hilfstabellen

Daten vervielfältigen mit Zahlen-Hilfstabelle

Öfters stellt sich die Aufgabe, dass Datensätze basierend auf gewissen Anfangsbedingungen erzeugt werden müssen. Wenn man sich in einer Datenbank bewegt, gibt es da gute Gründe, als Mittel dafür Hilfstabellen und SQL einzusetzen. Eine Hilfstabelle wäre in Vorbereitung einmalig zu erstellen und dann bei guter Planung oft und in vielfältigen Gestaltungen nutzbar.
In der Laufzeit wird dann eine Abfrage zur Datensatzerzeugung regelmäßig schneller sein als eine VBA-Schleife, und in vielen Fällen wird es ausreichend oder sogar besser sein, diese Datensätze in einer Abfrage vorzuhalten statt in einer Tabelle reale Datensätze zu erzeugen (und nachfolgend wieder entsorgen zu müssen).

In der beigefügten Anlage ist eine kleine Routine, in der einige DDL-Anweisungen zusammengefasst wurden, um eine Zahlentabelle mit einer laufenden Nummer von 0 bis gewähltem Endwert zu erzeugen. (Der interessierte Leser kann diese für sich selber analysieren.)
Der Standardaufruf CreateHelpTable CurrentDb erzeugt eine Tabelle "T999", mit der sich allerhand anfangen lässt. Dazu nachfolgend einige Beispiele:

Datensatzvervielfältigung durch pure Anwesenheit
Fall: Ein ausgewählter Datensatz zu einer Person soll vervielfältigt werden, um auf einfache Art Etiketten einer gewünschten Anzahl (z.B. 35) drucken zu können.
Code:

SELECT 
    Vorname, 
    Nachname, 
    Strasse, 
    PLZ, 
    Ort 
FROM 
    tblPerson, 
    (
        SELECT 
            I 
        FROM 
            T999 
        WHERE 
            I Between 1 AND 35 
    ) AS X 
WHERE 
    PersonID = 23
Alle einzelnen Tage eines Zeitraumes
Fall: In Datensätzen sind jeweils Beginn und Ende eines Zeitraumes als Angaben vorhanden. In einer Abfrage soll dieser Zeitraum in Tage aufgelöst werden:
Code:

SELECT 
    DateAdd('d', T.I, Z.Beginn) AS Tag, 
    Z.Anlass 
FROM 
    tblZeitraum AS Z, 
    T999 AS T 
WHERE 
    T.I Between 0 AND Z.Ende - Z.Beginn
Kalendertabelle füllen
Fall: Eine Kalendertabelle ist eine etwas spezialisiertere, aber ebenfalls häufig eingesetzte Hilfstabelle und bietet Vorteile in vielen Verwendungen. Wegen einer nachfolgenden Datenvermehrung ist es einerseits günstig, eine solche Tabelle übersichtlich klein zu halten. Andererseits muss der benötigte Wertebereich auch sicher vorgehalten werden. Da ist es hilfreich, wenn man für definierte Zeiträume die entsprechenden Tage ergänzen kann, im nachfolgenden Beispiel jeweils für ein Kalenderjahr:
Code:

PARAMETERS 
    ParamJahr INT 
; 
INSERT INTO 
    tblKalender(
        KalenderTag, 
        WochenTag 
    ) 
SELECT 
    DateAdd('d', T.I, DateSerial([ParamJahr], 1, 1)) AS KTag, 
    Weekday(KTag, 2) AS WTag
FROM 
    T999 AS T 
WHERE 
    T.I Between 0 AND DatePart('y', DateSerial([ParamJahr], 12, 31)) - 1
Das Zeigen dieser Beispiele soll nicht nur zum Kopieren und Nachahmen verleiten, sondern auch ein wenig eigene Kreativität befeuern, um zu zusätzlichen eigenen Varianten zu kommen und so Lösungen an sich sowie Performance generieren zu können. Viel Erfolg dabei.
Die folgende Abfrage, die ich abgeschrieben habe, zeigt eine erstaunliche Variante.
Monatsübersicht:
Code:

SELECT 
    Z.KW AS KW, 
    Max(IIf(Z.TW = 1, Z.TM)) AS MO, 
    Max(IIf(Z.TW = 2, Z.TM)) AS DI, 
    Max(IIf(Z.TW = 3, Z.TM)) AS MI, 
    Max(IIf(Z.TW = 4, Z.TM)) AS DO, 
    Max(IIf(Z.TW = 5, Z.TM)) AS FR, 
    Max(IIf(Z.TW = 6, Z.TM)) AS SA, 
    Max(IIf(Z.TW = 7, Z.TM)) AS SO 
FROM 
    (
        SELECT 
            DatePart("ww", Y.TJ, 2, 2) AS KW, 
            Day(Y.TJ) AS TM, 
            DatePart("w", Y.TJ, 2, 2) AS TW 
        FROM 
            (
                SELECT 
                    Date() - Day(Date()) + 1 + P.I AS TJ 
                FROM 
                    T999 AS P 
                WHERE 
                    P.I < 31 
                        AND 
                    Month(Date() - Day(Date()) + 1 + P.I) = Month(Date())
            ) AS Y) AS Z 
GROUP BY 
    Z.KW
Angehängte Dateien
Dateityp: txt modCreateHelp.txt (1,8 KB, 189x aufgerufen)

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende

Geändert von Arne Dieckmann (18.03.2013 um 19:22 Uhr). Grund: Korrektur auf Wunsch des Autors
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.06.2013, 00:45   #2
PP17
Neuer Benutzer
Neuer Benutzer
Standard

Hallo Eberhard,
vielen Dank für die Beispiele. Habe nur Schwierigkeiten dieses umzusetzen. Wie soll ich denn die Abfrage gestalten? Ich nehme die Tabelle mit den Abwesenheiten und dann ????????
Hättest Du evtl. eine Beispiel-Datei?
Peter
PP17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.06.2013, 09:12   #3
ebs17
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

"die Abfrage" ist was für eine?

Hinweis: Hier bist Du im Code-Archiv = Platz für allgemeine Beispiele und Lösungen zum Nachschlagen und Informieren.

Konkrete Fälle bespricht man besser in einem eigenen Thema im allgemeinen Access-Forum, und dort dann auch mit einer hinreichenden Darstellung der Situation und nicht nur mit einer Andeutung wie oben.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Copyright ©2000-2010 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günther Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.
Beachten Sie bitte auch unsere Nutzungsbedingungen.