Juli 14, 2020, 22:14:27

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


mehrere Tabellen mit * ansprechen

Begonnen von mad, Mai 25, 2020, 20:02:01

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

ich habe nachfolgende Tabellen-Struktur. (Bild: Beziehungen.png)
Vorab: Ich habe ein HF mit diversen Unterformularen die im UFPruefungen immer in Abhängigkeit des Feldes ,,frm_rptNr" und der ,,InventarNr" ein entsprechendes/anderes Formular (insgesamt 21 verschiedene Formulare/Tabellen) anzeigt. Dort werden dann für die jeweilige InventarNr die entsprechenden Prüfungen bewertet. Mindestens einmal pro Jahr eine Prüfung pro InventarNr.
Welches Formular eingeblendet wird, wird über folgenden Code gesteuert: (nicht von mir)
'Diese Funktion ermittelt, welches Formular (Unterformular) eingeblendet wird, wenn eine Prüfpflicht besteht.
'In der Tabelle tblTypen muss im Feld frm_rptNr die entsprechende Nummer vorhanden sein.
'Ist dort keine Nummer eingetragen, wird automatisch das leere Formular frm_leer verwendet.

'Die frm_rptNr ist 3-stellig (als Vorschlag von mir, kann auch geändert werden):
'   1xx für Kategorie Fahrzeuge
'   2xx für Kategorie Geräte
'   3xx für Kategorie Material

'Die Formulare müssen die übereinstimmende Nummer tragen, mit einem vorangestellten "frm",
'also z.B. frm102

'Besteht eine Prüfpflicht (Haken gesetzt), wird dem Steuerelement UFPruefungen im Formular UFPruefpflicht
'das entsprechende Formular als SourceObject zugewiesen.

'Besteht keine Prüfpflicht, oder ist keine frm_rptNr vorhanden, wird das leere Formular
'frm_leer als SourceObject zugewiesen.

'Diese Funktion wird aufgerufen bei den Ereignissen
'       Pruefpflicht_AfterUpdate
'       Form_Current

'Die frm_rptNr kann in ähnlicher Weise auch für den Druck eines Berichtes bzw. Unterberichtes
'verwendet werden.

'29.01.2006/Köbi


Private Function Prueffrm()
'On Error GoTo Errorhandler
On Error Resume Next

Dim frmNr As Long

'********geändert 05.08.2006*************
    'Datenherkunft des Formular frmArtikel ergänzt mit einem INNER JOIN auf frm_rptNr der Tabelle Typen
    'Neues Feld frm_rptNr im Formular erstellt (kann unsichtbar gestellt werden wenn nötig)
    'Variable frmNr bezieht sich nun nicht mehr auf das Feld im übergeordneten Formular (Me.Parent),
    'sondern direkt auf das Feld in diesem Formular.

'frmNr = Me.Parent.frm_rptNr
frmNr = Me.frm_rptNr

'**************************************************************

    If Me.InventarNr <> 0 Then
   
        If frmNr > 0 Then
            Me.UFPruefpflicht.Form.UFPruefungen.SourceObject = "frm" & frmNr
        Else
            Me.UFPruefpflicht.Form.UFPruefungen.SourceObject = "frm_leer"
        End If
       
    Else
   
        Me.UFPruefpflicht.Form.UFPruefungen.SourceObject = "frm_leer"

    End If

Exit_Errorhandler:
    Exit Function

Errorhandler:
    MsgBox "Fehler Nr. " & Err.Number & vbCrLf & Err.Description
    Resume Exit_Errorhandler

End Function


Nun würde ich gerne eine Abfrage erstellen die folgendes kann:
In Abhängigkeit von tblTypen.frm_rptNr, tblArtikel.InventarNr = tblPruefpflicht.InventNr möchte ich nur die entsprechende Tabelle heranziehen und dann das Feld/Zeilen das mit ...Text endet angezeigt bekommen. Jede der oben genannten 21 verschiedenen Formulare/Tabellen hat ein Feld das mit ...Text endet. Aber alle haben eine andere Struktur. Die Dateinamen dieser 21 Tabellen haben die Namensstruktur das sie mit tbl beginnen und dann eine fünfstellige Zahl folgt (z.B. tbl14811).
Diese Abfrage soll dann die Basis für einen Bericht sein den ich aus dem HF per Button öffne und mir somit alle ...Textzeilen für die InventarNr angezeigt werden.

Das ganze ist etwas schwierig zu erklären, ich hoffe es ist trotzdem einigermasen Verständlich.
Ist das überhaupt machbar?

Gruss
mad


markus888

Also ich sehe da kein Problem, außer dich natürlich  ;D

Wenn du eine Abfrage für einen Report brauchst, dann sollten immer alle Felder in der Abfrage gleich heißen.

Du solltest also für alles was dynamisch ist, einen Alias verwenden -> Tabelle und Feldnamen.
Du musst dann immer per VBA den SQL Text dynamisch zusammenstellen und speichern.
Voraussetzung wäre der sichere Umgang mit Objekten und die Beherrschung der Grundlagen in VBA.

Erstelle also erstmal eine Abfrage und den Report dazu.
Der Rest ist dann nicht so dramatisch, falls du die Basics beherrscht.
10 Jahre Access

mad

Hallo,
verstehe ich das so richtig, daß die Feldnamen in meinen 21 Tabellen immer die selben Bezeichnungen haben sollten? Gilt das nur für meine gesuchten Felder ...Text, oder für alle Felder? Oder nur in der Abfrage: so wie z.B.: Info: [...Text]?

Gruß
mad

markus888

Zitat von: mad am Mai 26, 2020, 18:19:12
verstehe ich das so richtig, daß die Feldnamen in meinen 21 Tabellen immer die selben Bezeichnungen haben sollten?


Die Namen in den Tabellen spielen keine Rolle.
Deine Frage lässt vermuten, dass du noch nicht weißt, was ein Alias ist.

Der Philipp hat da einen wunderbaren Artikel geschrieben.
Lies es dir durch, damit du das verstehst.
https://codekabinett.com/rdumps.php?Lang=1&targetDoc=sql-as-alias

Erstelle also eine Abfrage und verwende entsprechende Aliase und poste das Ergebnis.
Dann können wir uns um den dynamischen Teil kümmern.


10 Jahre Access

mad

Hallo,
habe mich den Aliasen angenommen, muß gestehen das ich das öfter durchlesen mußte und immerwieder ausprobiert habe. Ich glaube ich habe es bis dahin in den Grundzügen etwas verstanden.

Ich habe mal meine Test1_Abfrage-DB mit angehängt. Habe zum besseren Verständnis die anzahl der Tabellen reduziert.
Ich habe eine erste/einfachere Abfrage "abf_test1" erstellt. -->es wird was angezeigt.
Anschliessend habe ich noch die beiden anderen Tabellen (tbl14923 u. tbl50014) versucht mit in die "abf_test2" zu integrieren. Die Abfrage bringt zwar keinen Fehler, aber angezeigt wird auch nichts. Jetzt kommt vermutlich der Dynamische Teil?

SQL-Code "abf_test1"
SELECT p1.InventNr, t1.FLText
FROM tblPruefpflicht AS p1 INNER JOIN tbl14406 AS t1 ON p1.PruefID = t1.PruefID;


SQL-Code "abf_test2"
SELECT p1.InventNr, t1.FLText, t2.GurtText, t3.ExLampeText
FROM ((tblPruefpflicht AS p1 INNER JOIN tbl50014 AS t3 ON p1.PruefID = t3.PruefID) INNER JOIN tbl14923 AS t2 ON p1.PruefID = t2.PruefID) INNER JOIN tbl14406 AS t1 ON p1.PruefID = t1.PruefID;


Ich hoffe ich bin hierhin richtig unterwegs!

Gruss
mad

DF6GL

Hallo,

ich denke, dass das Thema "Aliase" hier nicht relevant ist.

M. E. stimmt da etwas Grundsätzliches nicht am Tabellenaufbau/-konzept.


Welche Bedeutung haben denn die Ziffern/Zahlen im Namen der n-Tabellen  (tbl14406, tbl14923,... ) ?

Es handelt sich m. M. nach um Prüflings-Kategorien, bzw. irgendwelche Module, die geprüft werden sollen.  Damit wäre dies eine Eigenschaft eines Objektes und darf (sollte) nicht als eigenständige Tabelle dargestellt werden.

Die Abfrage "abf_test2" zeigt nur die DS in den N-Tabellen an, bei denen die PrüfID in allen n-Tabellen mit dem Primärschlüssel aus tblPrüfpflicht übereinstimmt. Wenn die Verknüpfungsart zu "Alle DS aus P1 und nur die aus ...." geändert wird, werden DS angezeigt. Wie sinnvoll (für weitere Verwendung) das ist, kann ich nicht sagen.



Auch der Name "tblPrüfpflicht" ist mir suspekt. Offensichtlich handelt es sich hier um eine Sammlung von "Inventar"-Gegenständen, somit wäre "tblPrüflinge" passender.

mad

Hallo,

ZitatWelche Bedeutung haben denn die Ziffern/Zahlen im Namen der n-Tabellen  (tbl14406, tbl14923,... ) ?
Die Ziffer im Tabellennamen geben eine DIN, Prüfvorschrift wieder. So habe ich einen besseren überblickt.

ZitatDamit wäre dies eine Eigenschaft eines Objektes und darf (sollte) nicht als eigenständige Tabelle dargestellt werden.

Da es sich um verschiedene Prüfungen in Art und Anzahl je DIN/Prüfvorschrift handelt, möchte ich das gerne beibehalten.

ZitatAuch der Name "tblPrüfpflicht" ist mir suspekt. Offensichtlich handelt es sich hier um eine Sammlung von "Inventar"-Gegenständen, somit wäre "tblPrüflinge" passender.

Die "tblPruefpflicht" sammelt die Daten aus der Vorgelagerten "tblArtikel" und der nachgelagerten "tbl14406, tbl14923,...". Desweiteren werden hier nur Daten gesammelt die Prüfpflichtig sind und div. weitere Infos.

Gruss
mad

DF6GL

Hallo,


ich halte das Konzept für falsch und will jetzt nicht weiter auf die Datenzusammenhänge eingehen, wenn " möchte ich das gerne beibehalten." weiterhin gelten soll.

Zitat
So habe ich einen besseren Überblick.


Wozu brauchst Du einen Überblick?  Die einzelnen Tabelle gehören in eine Tabelle "tblNormen"  (bzw. tblPrüfvorschriften) die an eine Detailtabelle gebunden ist, die die einzelnen Prüfschritte und die daran angebundenen Prüfmethoden und Messergebnisse definiert. Diese "Grunddaten" könnten dann bei Durchführung einer Prüfung in eine Verlaufstabelle kopiert (als Struktur übernommen) und die sich ergebenden Messergebnisse erfasst werden.

Was machst Du in Deinem Konzept, wenn eine neue Messmethode oder Norm hinzukommt? Änderst/erweiterst Du jedes Mal das FE und das BE?

Das Ganze ist  etwas komplexer und nicht mit einer 1:n- Beziehung an mehrere verschiedene Tabelle abgetan.

mad

Mai 27, 2020, 19:32:30 #8 Letzte Bearbeitung: Mai 27, 2020, 19:38:33 von mad
Ja das mit einer neuen Norm ist ein Problem mit einigem Aufwand.
Gibt es ein Musterbespiel für sowas, wo ich mir das mal ansehen könnte?
Ich bin ja lernwillig.

Gruss
mad

mad

Könnte so einen Datenstruktur funktionieren?

tblInventar  1-----n   inventarNr/Norm  n-----1  tblNormen  1-----n Norm/Pruefung  n------1 tblPrüfungen


Gruss
mad

markus888

Zitat von: mad am Mai 27, 2020, 19:32:30
Ja das mit einer neuen Norm ist ein Problem mit einigem Aufwand.
Gibt es ein Musterbespiel für sowas, wo ich mir das mal ansehen könnte?


Es gibt kein Beispiel für jeden Anlassfall.
Es gibt Grundlagen die man kennen sollte und auf denen ein Datenmodell basiert.
Das Problem dabei: Es gibt die Theorie und dann die Realität.
Datenmodelle sollen die Realität abbilden, und die tatsächlichen Arbeitsabläufe berücksichtigen.

Kennst du die Grundlagen der Datennormalisierung?
Hast du überhaupt welche Grundlagen studiert - sprich verstehst du sie und kannst du sie anwenden?
Das wäre nun mal die Grundvoraussetzung für ein produktives Arbeiten.

Wenn nein, dann solltest du erstmal die Grundlagen lernen.
10 Jahre Access

mad

Hallo,

ZitatWenn nein, dann solltest du erstmal die Grundlagen lernen.


Ich bin bestrebt soviel wie möglich in/über Access zu lernen. Habe auch schon einige Anregungen umgesetzt. Allerdings mache ich das nicht Beruflich sondern rein in meiner Freizeit für unsere Feuerwehr. Die DB wird auch nur Ehrenamtlich genutzt und nicht kommerziell. Ich werde nie der Access-Profi werden. Drum benötige auch die Hilfe des Forums.

Also ein Abfrageergebnis zu meiner aktuellen Struktur habe ich nun gefunden (mit Alias), dies ist erstmal ausreichend. Sh. Code. Das Thema Alias ist echt Interessant.
SELECT p1.InventNr, t1.FLText, t2.GurtText, t3.ExLampeText
FROM ((tblPruefpflicht AS p1 LEFT JOIN tbl50014 AS t3 ON p1.PruefID = t3.PruefID) LEFT JOIN tbl14923 AS t2 ON p1.PruefID = t2.PruefID) LEFT JOIN tbl14406 AS t1 ON p1.PruefID = t1.PruefID
WHERE (((p1.InventNr)=[Formulare]![TM2_Personal]![InventNr]) AND ((t1.FLText) Is Not Null)) OR (((p1.InventNr)=[Formulare]![TM2_Personal]![InventNr]) AND ((t2.GurtText) Is Not Null)) OR (((p1.InventNr)=[Formulare]![TM2_Personal]![InventNr]) AND ((t3.ExLampeText) Is Not Null));

Aber ich würde auch gerne die neue Anregung von DF6GL aufgreifen.
Derzeit habe ich nachfolgende Datenstruktur (aktuell nur eine Test-DB im Anhang), siehe Beziehungen.
Es gibt eine Tabelle ,,tblArtikel" und eine ,,tblNormen". Eine ,,InventarNr" kann nur eine Norm haben. Dies wird in der ,,tbl_reg_InvNorm" mit einer 1:1-Beziehung zusammengefahren.
Weiter gibt es eine ,,tblPruefungen" die in der ,,tbl_reg_NormPruef" mit den Normen zusammengefahren wird. Ein Norm kann mehrere Pruefungen (1:n) haben.
Ich hoffe dieser Ansatz ist erstmal richtig.
Nun soll aber eine InventarNr (un-/regelmäßig) einer Prüfung unterzogen werden. Dies soll in der ,,tblPruefen" registriert werden. Im prinzip möchte ich das in einem HF mit UFs wie im Bild ,,HF_UFs.jpg" dargestellt umsetzen.
Im UF ,,Pruefungen" sollen nur die Pruefungen aus der ,,tblPruefungen" angezeigt werden die über die ,,tbl_reg_NormPruef" der ,,InventarNr" zugeordnet sind. Leider weis ich nicht wo die ,,tblPruefen" eingehängt werden soll und ob ich noch eine zusätzlich TAB benötige? (in der"tblPruefen" fehlen dann natürlich noch die entsprechenden Felder für Beziehungen).
Irgenwie bräuchte ich noch Felder in denen ich die Pruefungen ,,abhaken" oder ähnliches kann, wenn die Pruefung i.O. ist. Da habe ich auch noch keine Idee wie ich das umsetzen soll.

Hier wäre wieder euer Fachwissen gefragt.

PS.: Die Kombifelder in den Tabellen werde ich später wieder auflösen und über die Formulare umsetzen. Sind jetzt nur zu Testzwecken.

Gruss
mad

DF6GL

Hallo,

vergiss erst mal Formulare und Abfragen und konzentriere Dich nur auf das Beziehungsfenster. Dort werden alle Tabellen sichtbar hinzugefügt und die Beziehungen definiert. 

Erst wenn die Tabellen und Beziehungen sinnvoll und durchgängig erscheinen und man den Ablauf logisch nachvollziehen kann, kann man sich um Formulare kümmern.

1:1-Beziehungen sind in den meisten Fällen überflüssig, bzw. falsch. Die Felder können in einer Tabelle zusammengefasst werden.


Im Anhang ein Bild der Tabellen und -beziehungen, wie ich sie mir im Grundsatz vorstellen kann. Die tblArtikel ist sicherlich weiter normalisierbar. Zudem sollten Felder mit eindeutigen Index versehen werden, die keine doppelten Werte aufweisen dürfen, z. B. "InventarNr", falls eine bestimmte Inventarnummer einem bestimmten Artikel zugeordnet ist.





mad

Fragen an DF6GL,

zum besseren Verständnis für mich:
In der "tblNormPruef" weise ich die Prüftexte "NP_Text" den jeweiligen Normen "NP_NormID" zu?
Was ich jetzt noch nicht so ganz verstehe wie einer "ArtikelID" über die "NormID" die verschiedenen "NPID" (NP_Texte) zuordne?
Was verstehst Du unter einem "NP_Sollwert", eine Wert wie 40N und unter "Pruef_Istwert" dann den erreichten Wert z.B. 30N? Könnte das auch ein Ja/Nein-Feld sein?
Was verstehst unter "NP_PrufAufbau? - z.B. eine Prüfablaufbeschreibung?

Ich hoffe das macht jetzt nicht zuviel Umstände, aber ich muß es erst richtig verstehen bevor ich eventuell weiter mache.

Zitatvergiss erst mal Formulare und Abfragen ...

Ich brauche das um es mir besser Vorstellen zu können, ist leichter für mich.

Gruss
mad


DF6GL

Hallo,

die Texte aus tblNormPrüf  werden in tblPrüfungen  (zugeordnet). Dort ist der Text erforderlich, nicht beim Artikel. Hier wird nur die Norm angegeben, die für den Artikel Anwendung findet. (Und lt. Deiner Vorgabe gibt es nur eine Norm pro Artikel)

ZitatWas verstehst Du unter einem "NP_Sollwert"


Jede Norm hat doch bei den einzelnen Vorgaben irgendwelche Grenzwerte, bzw. Vergleichswerte, an denen sich das Prüfergebnis messen lassen muss. Das ist der Sollwert, der Istwert  das Messergebnis selber.  Das Ergebnis einer Prüfung kann natürlich auch eine Ja/Nein-Angabe sein, wenn die Messwerte selber irrelevant sind ( Was ich aber so nicht gutheißen möchte) . Die Ja/Nein-Entscheidung ohne harte Messwerte ist eine subjektive Entscheidung, die allenfalls bei Sichtprüfungen akzeptabel ist .

Mach mal ein paar Beispiele zu diesen Normen und den Prüfungen, damit man sich die Normen-Anwendungen vorstellen kann  (Maschinenrichtlinie, Störfestigkeit, EMV-Verträglichkeit , etc.).