Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Datensätze verknüpfen

Begonnen von quereinsteiger, Oktober 18, 2016, 14:08:49

⏪ vorheriges - nächstes ⏩

quereinsteiger

Hallo Gemeinde,
trotz intensiver Suche konnte ich bisher leider keine Lösung für mein Problem finden und hoffe das ihr mir vielleicht weiter helfen könnt.

Ich habe ein Datenbank zur Auftragsverwaltung. In jedem Auftrag gibt es beliebig viele Artikel (gespeichert in der "tblArtikel"). Ein Artikel ist durch eine Artikelnummer [ElementNr] eindeutig gekennzeichnet. Um "Baugruppenstrukturen" erzeugen zu können kann ein Artikel einem anderen Artikel zugehören [ObjektNr]. Hier ein kurzes Beispiel:

[ElementNr]    [ObjektNr]    [Bezeichnung]   [t_kalk]
     1                     1               Tisch               
     2                     1               Tischplatte
     3                     1               Gestell             50
     4                     3               Tischbein         20
     5                     3               Strebe             20
     6                     3               Flansch            20
     7                     5               Rohr                10
     8                     5               Deckel             10

Der Tisch ([ElementNr]=1) besteht also aus einer Platte und einem Gestell (deshalb haben diese beiden [ObjektNr]=1). Das Gestell wiederum besteht aus den Elementen 4,5 und 6 und das Element 5 besteht aus den Elementen 7 und 8 . Auf diese Weise können unendlich viele Ebenen erzeugt werden.

Das Problem entsteht beim auswerten der Daten, die zu jedem Element erfasst werden - z.B kalkulierte Arbeitszeiten [t_kalk]:

Für die Strebe ([ElementNr]=5) benötige ich 20min (z.B. zum Schweißen) für die einzelnen Elemente (7 und 8 ) benötige ich jeweils 10 min (z.B. Sägen). Insgesamt benötige ich also für das Element 5: 40min.
Für das Gestell benötige ich 50min und die Zeit, die für die einzelnen Elemente anfallen:
     4                     3               Tischbein         20
     5                     3               Strebe             40   (20 +10 +10)
     6                     3               Flansch            20

Also insgesamt: 130 min.

Das Gruppieren über die [ObjektNr] ist ein erster Schritt, allerdings muss ich die kalkulierte Zeit für das übergeordnete Element noch mit dazu rechnen - und da scheitere ich momentan.
Hat jemand eine Idee, wie ich das in einer Abfrage realisieren kann?

(Ich habe dieses Beispiel etwas vereinfacht aber ich denke das Problem ist damit erfasst).
Ich freue mich auf eure Antworten, danke im Voraus!

MaggieMay

Hallo,

mir fällt dazu nur eine VBA-Lösung ein:
Option Compare Database
Option Explicit


Dim Zeitsumme As Long
   
Function get_KalkZeit(pObj)
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("Select * From tbl_Objekte Where ObjektNr=" & pObj)
    Do While Not rs.EOF
        Zeitsumme = Zeitsumme + rs!t_kalk
        If rs!ElementNr <> pObj Then Call get_KalkZeit(rs!ElementNr.Value)
        rs.MoveNext
    Loop
    rs.Close
    Debug.Print pObj, Zeitsumme
End Function

Sub testit()
    Zeitsumme = 0
    Call get_KalkZeit(1)
    MsgBox Zeitsumme
End Sub
Freundliche Grüße
MaggieMay

quereinsteiger

Hallo MaggieMay,

ich befürchte mittlerweile auch das ich um eine VBA-Programmierung nicht herumkomme.
Ich verfolge momentan noch einen anderen Ansatz, bei dem ich durch einen Selbstbezug (von ObjektNr zu ElementNr) die Baugruppenstruktur Ebene für Ebene aufschlüssele. Dann kann ich jedem Bauteil mittels einer Oder-Verknüpfung alle untergeordneten Bauteile zuordnen und die zugehörigen Datensätze (wie gesagt, in der Realität ist das Problem etwas komplexer) weiter verarbeiten (hptsl. Gruppieren und summieren).

Meine VBA-Fähigkeiten sind momentan noch sehr beschränkt. Ich meine zwar verstanden zu haben was dein Code tun soll, weis allerdings nicht einmal wie ich ihn konkret testen kann...?
Trotzdem erstmal vielen Dank für deine Mühe - ich werde es mir nochmal in Ruhe anschauen. Ich befürchte das mich das Problem noch eine Weile beschäftigen wird... (die Komplexität wird einem erst bewusst, wenn man nicht mal mehr konkrete Fragen stellen kann ;D )

Vielleicht finden sich hier ja auch noch andere Ideen oder (alte) Lösungsansätze wenn jemand schonmal ein ähnliches Problem hatte...

Josef P.

Hallo!

Wegen "Baugruppenstruktur":
Wie schreibst du in dein aktuelles Datenmodell, wenn eine Schraube in mehreren Baugruppen verwendet wird?
Meiner Meinung nach fehlt eine n:m-Tabelle.

Beispiel:
tblArtikel
- idArtikel
- ...
- t_kalk

tblArtikel_Bauteile
- fiBaugruppe (idArtikel der Baugruppe)
- fiBauteil (idArtikel des Bauteils)
- Menge
- ...

Ein Tipp für ein relativ schnelles Auflösen aller Bauteile einer Stückliste:
Die Bauteile der Baugruppen nicht rekursiv auflösen sondern mittels Hilfstabelle "in Ebenen".

Prinzip (kein echter Code, sondern nur eine Ablaufskizze!):
Ebene 0 = die oberste Baugruppe:
insert into Hilfstabelle (ArtikelID, Menge, Ebene)
Values (1, 1, 0)

E = 0 ' Ebenenzähler auf 0 setzen

' Die folgende Insert-Anweisung so lange wiederholen, bis nichts mehr angefügt wird:
Do While AngefuegteDS > 0

   insert into Hilfstabelle (ArtikelID, Menge, Ebene)
   select B.fiBauteil, H.Menge * B.Menge, Ebene + 1   
   from Hilfstabelle H inner join tblArtikel_Bauteile B where B.fiBaugruppe = H.ArtikelID
   where H.Ebene = E

   AngefuegteDS  = RecordCountDerAktionsabfrage
   
   E = E + 1

Loop


Anschließend noch ein Select mit Join auf die Artikeltabelle um die Werte für t_kalk usw. zu erhalten:
select
   A.idArtikel,
   Sum(H.Menge) AS ArtikelMenge,
   A.t_Kalk as ArtikelZeit,
   Sum(H.Menge) * A.t_kalk as ArtikelZeitSumme
from
   Hilfstabelle H
   inner join
   tblArtikel A ON A.idArtikel = H.ArtikelID
group by
   A.idArtikel, A.t_kalk


mfg
Josef

MaggieMay

Hallo,
Zitatweis allerdings nicht einmal wie ich ihn konkret testen kann...?
ganz einfach indem du eine Tabelle mit dem von mir gewählten Namen und den von dir genannten Datenfeldern anlegst und mit deinen hier gezeigten Beispieldaten füllst. Dann kannst du den von mir gezeigten Code in ein allgemeines Modul kopieren und per Aufruf der Sub "testit" zur Ausführung bringen.

Dies nur als praktischer Hinweis zur Beantwortung deiner Frage nach den Testmöglichkeiten.
Der Lösungsansatz von Josef ist hier aber sicher der interessantere.
Freundliche Grüße
MaggieMay

quereinsteiger

Hallo MaggieMay und Josef P. ,

vielen Dank nochmals für eure Hilfe - ich war die letzten Wochen anderweitig eingespannt und war mit meinem Lösungsansatz anscheinend auch auf dem Holzweg.

Ich habe mittlerweile Josef's Variante umgesetzt - inkl. der n:m-Tabelle um Bauteile auch wieder verwenden zu können.

Die Hilfstabelle ist wirklich ein super Tip - ich habe anfangs blos nicht verstanden wo VBA aufhört und SQL anfängt -.-

Also euch beiden nocheinmal herzlichen dank   :D