Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Optiplex am Dezember 25, 2010, 15:36:10

Titel: Abfragestring erstellen
Beitrag von: Optiplex am Dezember 25, 2010, 15:36:10
Hallo zusammen

Ich möcht für meine Turnier-Datenbank eine Abfrage für ein Unterformular erstellen in dem alle Spiele die gerade gespielt und diejeniegen die man spielen könnte angezeigt werden. Die Turnieren sind in einzelnen Tabellen T1..Tn enthalten. Die Turniertabellen werden während des Events mittels VBA erzeugt, daher kann ich nicht sagen wieviele einzelne Turniere es geben wird. Die aktuelle Anzahl kann ich allerdings ermitteln da es eine Tabelle (TGes) gibt in welcher alle Tuniere die es gibt erfasst sind, und in dieser Tabelle interessieren auch nur die Turniere welche den Status gestartet haben.

Aufbau  Tabelle TGes
Feldname Nr -> Long  (fortlaufende Nr der Turniere ) mit "T" = Tabellenname des Turniers
Feldname TStatus -> Long (1=Turnier ist gestartet)

Aufbau  Tabelle T1..Tn
Feldname: Spiel  -> long  inhalt (1..n)
Feldname:Status -> long ( 1= Partie ist vollstandig und kann gespielt werden; 2= Partie wird gerade  gespielt)
Feldname:Spieler1Status (1= spieler kann spielen 2=Spieler spielt gerade eine Partie in einem andern Tunier)
Feldname:Spieler2Status (1= spieler kann spielen 2=Spieler spielt gerade eine Partie in einem andern Tunier)


Eine Partie kann nur gespielt werden wenn der Status 1 ist und Spielerstatus 1+2 ebenfalls 1 ist

Wie erstelle ich nun die Abfrage? Ich kenne mich nicht so gut mit SQL aus. Wie muss ich den SQL string erstellen, dass alle Turniertabellen abgefragt werden und die Datensätze so gefiltert werden, dass nur wie oben beschrieben die Spiele mit dem Status 2 und Status 1 mit der Einschränkung dass auch hier die Spielerstatus jeweils 1 ist angezeigt werden. Wenn es geht sollte noch die Turniernummer in einem Alias Feld mit ausgegeben weden.
Geht sowas überhaupt?

Frohe Weihnachten und ich hoffe mir kann einer von euch weiterhelfen.

Gruß Dieter

Titel: Re: Abfragestring erstellen
Beitrag von: database am Dezember 25, 2010, 16:09:36
Hallo Dieter,

wir hatten doch dieses Thema schon mal durchgekaut ...
http://www.access-o-mania.de/forum/index.php?topic=13379.msg75396#msg75396 (http://www.access-o-mania.de/forum/index.php?topic=13379.msg75396#msg75396)

In deiner Turnierdatenbank stimmt das Datenmodell nicht!

Das ist auch ein Grund warum die Abfragerei nicht auf einfache Weise lösbar sein wird.
M.E. wird für dich das Thema UNION-Abfrage zum Tragen kommen.



Titel: Re: Abfragestring erstellen
Beitrag von: Optiplex am Dezember 27, 2010, 16:42:09
Hallo Database,
So hatten wir das noch nicht, dass du mit meinem Datenmodel nicht einverstanden bist hast du schon mehrmals gesagt. Aber glaube mir du kannst keine Regeln von einem Turnier in einem Datenmodel 100% abbilden, da erstens die Datenbank nach gewissen Regeln arbeitet und diese Regeln kannst du nicht einfach übergehen und zweitens bei einem Turnierablauf gibt es viele Ausnahmefälle die dann wieder anderst behandelt werden müssen als der Standardablauf und drittens muss ein gewisser Ablauf bei der Turniererstellung eingehalten werden. Dazu kommen noch die Verschiedenen Turniersysteme KO; DoppelOK; TrippelOK; Jeder gegen jeden usw. Da muss man immer Kompromisse machen,das ist eben keine einfache Mitgliederdatenbank mit Gebustrstag oder hat das Mitglied seinen Beitrag gezahlt. Ich habe mit schon echt Gedanken gemacht wie ich das Datenmodel aufbaue und zwar so, dass ich alle Turniersysteme integrieren kann und dass ich auch alle Sonderfälle nach den Regeln behandeln kann.

Danke für den Tip mit Union, das muss ich mir mal näher ansehen.

Gruß
Dieter

Titel: Re: Abfragestring erstellen
Beitrag von: database am Dezember 28, 2010, 08:39:23
Hallo Dieter,

es geht nicht darum REGELN eines Turnieres in einem Datenmodell abzubilden - ich fürchte fast, dass du mich da nicht richtig verstanden hast.
Das Datenmodell, der Tabellenaufbau und das Zusammenspiel der Schlüssel gewährleisten eine sichere und effizienete Datenspeicherung und
ermöglichen bei Bedarf gespeicherte Daten strukturiert aus diesen Tabllen auszulesen.

Regeln, die bestimmen welche Daten in diese Tabellenstruktur zu schreiben sind, sind funktionsgebunden und sollten auch auf Formularebene abgehandelt werden.
Damit meine ich die Systeme, die du angesprochen hast.

Das Problem liegt mehr daran, dass du immer wieder eine unterschiedliche Anzahl von Tabellen haben wirst - wenn ich das richtig verstanden habe.
In dem Fall wird es problematisch bis unmöglich sein Abfragen zu erstellen und diese zu speichern - da sie möglicherweise zu Fehlerquellen werden.
Das gilt auch für die von mir angesprochene UNION-Abfrage - die müsstest du dann auch immer wieder neu generieren, wenn du heute 5 und morgen 7 Tabellen abfragen willst.

Titel: Re: Abfragestring erstellen
Beitrag von: Optiplex am Dezember 28, 2010, 17:14:33
Hallo Database,
Zitat
Das Problem liegt mehr daran, dass du immer wieder eine unterschiedliche Anzahl von Tabellen haben wirst - wenn ich das richtig verstanden habe.
Genau so ist es. Mit ist schon klar dass ich diese Abfrage immer wieder neu erstellen muss wenn ich das Formular öffne. Ich will diese Abfrage auch nicht speichern. Es geht darum was in den Einzelnen Turnieren gerade los ist, Welche Partie ist am laufen welche könnte gestartet werden. welches Spielfeld ist gerade frei? Nun die Abfrage mit den Spielfeldern ist in einem eigenen UFO und relativ leicht, nur mit der Abfrage der Partien tue ich mich schwer. Ich möchte aber auch keine größeren Einschränkungen machen. Ich hatte eigendlich gehofft dass mir hier jemand einen Tip geben könnte, wie ich diese Abfrage hinbekomme?

"Select T1.*, T2.*...."

Ich bin scheinbar dazu nicht in der lage da was vernüftiges rauszubekommen

Gruß Dieter
Titel: Re: Abfragestring erstellen
Beitrag von: DF6GL am Dezember 28, 2010, 17:19:30
Hallo,

es führt immer wieder auf das Grundübel zurück:   Dein Tabellenaufbau ist unbrauchbar.  Da beißt die Maus den Faden nicht ab...


Eine Union-Abfrage gestaltet sich etwa so:


Select Feld1 as A, Feld2 as B, Feld3 as C from Tab1
Union select FeldX as A, FeldY as B, FeldZ as C from Tab2
Union select FeldA as A, FeldB as B, FeldC as C from Tab3






Titel: Re: Abfragestring erstellen
Beitrag von: Optiplex am Dezember 30, 2010, 17:25:13
Hallo DF6GL,

Die Feldnamen sind in jeder Turniertabelle T1..Tn gleich

Aufbau  Tabelle T1..Tn
Feldname: Spiel  -> long  inhalt (1..n)
Feldname:Status -> long ( 1= Partie ist vollstandig und kann gespielt werden; 2= Partie wird gerade  gespielt)
Feldname:Spieler1Status (1= spieler kann spielen 2=Spieler spielt gerade eine Partie in einem andern Tunier)
Feldname:Spieler2Status (1= spieler kann spielen 2=Spieler spielt gerade eine Partie in einem andern Tunier)

Eine Partie kann nur gespielt werden wenn der Status 1 ist und Spielerstatus 1+2 ebenfalls 1 ist

Zitat
Select Feld1 as A, Feld2 as B, Feld3 as C from Tab1
Union select FeldX as A, FeldY as B, FeldZ as C from Tab2
Union select FeldA as A, FeldB as B, FeldC as C from Tab3

Warum verwendest du "as" kann man hier nicht die Feldnamen direkt verwenden und wo setzt du die Where Klausel ein ? nach jedem "from" oder zum Schluß für alle Tabellen

... where (status=2) or ((status=1) and (Spieler1Status=1) and (Spieler2Status=1))

so sollte die Where Klausel eingentlich funktionieren.

Und wie bekomme ich die Turniernummer von der Tabelle TGes zu der jeweiligen Turniertablle, ich möchte eigentlich nur zwei Spalten Ausgeben
TurnierNr und SpielNr den status zeige ich durch Farben bei der SpieleNr an. Es könnte auch zwei UFOs sein in dem einen zeige ich die laufenden Spiele, im anderen die die gespielt werden könnten an.

Aufbau  Tabelle TGes
Feldname Nr -> Long  (fortlaufende Nr der Turniere ) mit "T" = Tabellenname des Turniers
Feldname TStatus -> Long (1=Turnier ist gestartet)

Ich weis, dass das eine schwere Abfrage ist. Ich will hier der Turnierleitung die Möglichkeit geben einen Überblick über alles was gerage läuft und was laufen könnte zu bekommen. Gebt mir doch mal ein Beispiel mit 3 Turniertabellen und wie ich die TGes mit der jeweiligen Nr zu den einzelnen Turniertabellen bekomme. Wie muss diese Abfrage Syntaxmaßig aussehen. Das zusammensetzen werde ich dann schon irgendwie hinbekommen.

Danke und Gruß
Dieter

Titel: Re: Abfragestring erstellen
Beitrag von: Stapi am Dezember 30, 2010, 17:51:05
Hallo Dieter

Eine Union Abfrage ist eine unter einander Reihen von eizelnen Abfragen die mit dem Wort UNION verbunden werden, nur die letzte Abfrage darf mit dem Zeichen (;) Enden.

Du kannst nun eine Abfrage erstellen und sie testen, den SQL Text nehmen und in deine Unionsabfrage eingügen.
Nur ist es wichtig wie Franz schon beschrieben die Feld Anzahl muß in allen Abfragen gleich sein und die erste Abfrage gibt die Names gebung in der Abfrage vor. Mit (as ) kannst du einen neuen Feldnamen in der ersten Abfrage vergeben z.b T1 as Superspieler, dann wird aus deinem Feldnamen t1 dann Superspieler in der Abfrage und für weitere Anwendungen die sich auf diese Abfrage beziehen.

Gruß Stefan
Titel: Re: Abfragestring erstellen
Beitrag von: database am Dezember 30, 2010, 18:25:08
Hallo,

ZitatUnd wie bekomme ich die Turniernummer von der Tabelle TGes zu der jeweiligen Turniertablle
In der Regel so, dass zwischen TGes und einer Turniertabelle eine Beziehung hergestellt wird.
Also der PK der TGes als FK in der Turniertabelle mitgeschrieben wird.

...und wenn ich mir das dann grob überschlage müsstest du mit einer einzigen Turniertabelle auskommen.
Warum? Wenn das Turnier in der TGes angelegt wird und diese Tabelle 1:n mit einer Tabelle Turnier verbunden ist ...

TGes:
Nr, TStatus

TTurnier:
FK_Nr, Spiel, Status, StatusSp1, StatusSp2

Und wenn dann über ein intelligentes Formular die Werte in diese Tabellen erfasst werden KÖNNTEST du im Anschluß mittels ...


SELECT TGes.Nr, TTurnier.Spiel, TTurnier.StatusSp1, TTurnier.StatusSp2, TGes.TStatus
FROM TGes INNER JOIN TTurnier ON TGes.Nr = TTurnier.FK_Nr
WHERE TTurnier.StatusSp1=1 AND TTurnier.StatusSp2=1 AND TGes.TStatus=1;

...ermitteln welche Partien welches Turniers gespielt werden können - oder sollte ich da so weit daneben liegen?
Titel: Re: Abfragestring erstellen
Beitrag von: Gaensi am Dezember 30, 2010, 18:32:40
Hallo,

warum bastelst Du Dir nicht eine temporäre Tabelle die Du mit Anfügeabfragen per Button immer wieder neu füllst ?


Gruß Gaensi
Titel: Re: Abfragestring erstellen
Beitrag von: database am Dezember 30, 2010, 18:50:45
Hi,

@Gaensi

m.E. ist das nicht notwendig, die Infos lassen sich mit einer 'normalen' Abfrage auslesen.
(Wenn der Tabellenaufbau stimmt)
Titel: Re: Abfragestring erstellen
Beitrag von: Optiplex am Dezember 31, 2010, 15:19:56
Hallo zusammen,
da sich database mal wieder auf meinen Tabellenaufbau versteift und ich bis jetzt gar keinen Grund sehe meinen Aufbau umzuwerfen den die Turniere laufen bis jetzt einwandfrei durch, möchte ich auf die Idee von Gaensi mal zurückkommen.

@ Gaensi
Wie meinst du das mit der  temporären Tabelle, hast du ein Beispiel dafür?

Gruß
Dieter
Titel: Re: Abfragestring erstellen
Beitrag von: Gaensi am Dezember 31, 2010, 21:28:56
Hallo Dieter,

generell muss ich Franz und Peter recht geben, aber gemaess meiner Signatur.....

... nur als Codebeispiel

Public Function AllTables()

   Dim obj As AccessObject, dbs As Object
   Set dbs = Application.CurrentData
   ' Search for open AccessObject objects in AllTables collection.
   
   sql = "Delete * from temporaere_Tabelle"
   DoCmd.RunSQL (sql)
   
   For Each obj In dbs.AllTables
       If Left(obj.Name, 2) = "TB" Then
           ' Print name of obj.
           Debug.Print obj.Name
           'in dieser Schleife musst Du Deine anfügeabfrage generieren
           'z.B.:
           sql = "insert into temporaere_Tabelle (Spiel, Status, Spieler1Status, Spieler2Status) " & _
                 "Select Spiel, Status, Spieler1Status, Spieler2Status FROM " & obj.Name & _
                 "WHERE Status = 1 AND Spieler1Status = 1 AND Spieler2Status = 1"
           DoCmd.RunSQL (sql)
       End If
           
   Next obj
End Function



Somit haettest Du alle spielbaren Partien in einer Tabelle, die Du per Button aktualisieren kannst   .

Gruß Gaensi        


@Franz und Peter
 ;) eine Function zur Übergabe eventuell unterschiedlicher Feldnamen ginge mir hier in der Kürze der Zeit zu weit ;) ;D
Titel: Re: Abfragestring erstellen
Beitrag von: database am Januar 01, 2011, 15:47:06
Hallo,

Zitat... da sich database mal wieder auf meinen Tabellenaufbau versteift und ich bis jetzt gar keinen Grund sehe meinen Aufbau umzuwerfen ...
... wird sich dieser 2011 aus der weiteren Diskussion 'raushalten  ;)
Titel: Re: Abfragestring erstellen
Beitrag von: Optiplex am Januar 01, 2011, 18:14:54
Hallo zusammen,

Erstmal ein frohes neues Jahr 2011, ich hoffe ihr seit alle gut reingekommen.

@Database,
Ich wusste gar nicht, dass du ein sollches Sensibelchen bist, ich wollte dich mit meiner Antwort nicht verkraulen oder dir auf die Füße treten, wenn das so rübergekommen ist tut es mir leid. ;) Was mich aber auch ein bischen gestört hat, war dass du die Antwort von Gaensi, gleich wieder mit dem verweis auf den Tabellenaufbau abgewürkt hast. ;) ;D
Zitat
Hi,

@Gaensi

m.E. ist das nicht notwendig, die Infos lassen sich mit einer 'normalen' Abfrage auslesen.
(Wenn der Tabellenaufbau stimmt)

Ich habe inzwischen wieder viel probiert, bin aber zu keinem zufriedenstellenden Ergebnis gekommen. ??? In einer Sache muss ich dir allerdings recht geben, die Turniernummer aus TGes  muss in die einzelnen Turniere T1..Tn mit rein, das sollte auch keine große Abänderung sein, ich will nämlich an den Tabellen so wenig wie möglich noch ändern, da die Turniere sehr gut durchlaufen und es bis jetzt noch keine Fehler mehr gab, obwohl schon ein paar Leute aus meinen Verein die Datenbank durchtesten.

@ Gaensi
Danke erstmal für den Code, ich werde mal probieren, ob ich damit hinkomme. Zur info die Feldnamen sind in jeder Turniertabelle gleich.

Gruß und lasst es euch gut gehen in 2011

Dieter
Titel: Re: Abfragestring erstellen
Beitrag von: database am Januar 01, 2011, 18:35:52
Hallo,

das hat NICHTS mit Sensibilität zu tun und habe auch NIEMANDEN abgewürgt, auch fühle ich mich NICHT schlippsgetreten oder sonst was in der Richtung, davon kannst du getrost ausgehen  ;)

Titel: Re: Abfragestring erstellen
Beitrag von: Optiplex am Januar 02, 2011, 14:46:59
Hallo Peter,
na dann bin ich ja beruhigt.

Gruß
Dieter