Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  Inventor VBA
  Kosten summieren in iam

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
  
NVIDIA GTC Paris und ISC High Performance-Konferenz 2025, eine Pressemitteilung
Autor Thema:  Kosten summieren in iam (418 / mal gelesen)
Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



Sehen Sie sich das Profil von Roland Schröder an!   Senden Sie eine Private Message an Roland Schröder  Schreiben Sie einen Gästebucheintrag für Roland Schröder

Beiträge: 13597
Registriert: 02.04.2004

Inventor 2025.2.1
Windows 11

erstellt am: 04. Nov. 2024 15:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Moin!

Es gab vor Jahren mal eine Initiative von Lothar, die Kosten aller Komponenten einer Baugruppe zu summieren und in das entsprechende Feld der iam einzutragen, was Inventor, anders als beim Gewicht, offenbar nicht von selber tut. Der damals gepostete Code bzw. der Link dazu ist allerdings tot.

Gibt es für diese Aufgabe noch irgendwo Code, der auch weitergegeben werden darf?

------------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

rkauskh
Moderator
Dipl.-Ing. (FH) Versorgungstechnik




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2846
Registriert: 15.11.2006

Windows 10 x64, AIP 2020-2025

erstellt am: 05. Nov. 2024 10:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Roland Schröder 10 Unities + Antwort hilfreich

Moin

Ich kenne den vorherigen Code nicht und welchen Funktionsumfang der hatte. Ich kann dir nur etwas mal eben neu geschriebenes anbieten. Wird die Stücklistenoption "Bauteilnummernzeilen zusammenführen" für verschiedene Teile mit gleicher Bauteilnummer und unterschiedlichen Kosten verwendet, kommen teilweise unerwartete Ergebnisse heraus. Dafür konnte ich so schnell auch keine zufriedenstellende Lösung finden.
Es werden nur die Kosten addiert und optional in das iProp der Baugruppe geschrieben.

Code:

Option Explicit

Private Sub AssemblyCosts()

Dim oApp As Inventor.Application
Set oApp = ThisApplication

If Not oApp.ActiveDocumentType = kAssemblyDocumentObject Then Exit Sub

Dim oAssDoc As AssemblyDocument
Set oAssDoc = oApp.ActiveDocument

Dim oBom As BOM
Set oBom = oAssDoc.ComponentDefinition.BOM

oBom.StructuredViewEnabled = True
oBom.StructuredViewFirstLevelOnly = False

Dim oBomview As BOMView
Set oBomview = oBom.BOMViews(2)

Dim dCost As Currency
Dim iTotalQty As Integer
iTotalQty = 1

dCost = ProcessBomRows(oBomview.BOMRows, iTotalQty, dCost)

If MsgBox("Gesamtkosten: " & dCost & vbCrLf & "Speichern in iProperty geschätzte Kosten?", vbYesNo) = vbYes Then
    oAssDoc.PropertySets(3).Item(21).Value = dCost
End If

End Sub

Private Function ProcessBomRows(ByVal oBomRows As BOMRowsEnumerator, ByVal iTotalQty As Integer, ByVal dCost As Double) As Currency
    Dim oBomRow As BOMRow
    For Each oBomRow In oBomRows
        If Not oBomRow.ChildRows Is Nothing Then
            dCost = ProcessBomRows(oBomRow.ChildRows, iTotalQty * oBomRow.ItemQuantity, dCost)
        End If
       
        Dim oCompDef As ComponentDefinition
        For Each oCompDef In oBomRow.ComponentDefinitions
            Dim oDoc As Document
            Set oDoc = oCompDef.Document
           
            Dim dItemCost As Currency
            dItemCost = oDoc.PropertySets(3).Item(21).Value
           
            If Not dItemCost = 0 Then
                dCost = dCost + oBomRow.ItemQuantity * iTotalQty * dItemCost
            End If
        Next
    Next
   
    ProcessBomRows = dCost
   
End Function



------------------
MfG
Ralf

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



Sehen Sie sich das Profil von Roland Schröder an!   Senden Sie eine Private Message an Roland Schröder  Schreiben Sie einen Gästebucheintrag für Roland Schröder

Beiträge: 13597
Registriert: 02.04.2004

Inventor 2025.2.1
Windows 11

erstellt am: 05. Nov. 2024 11:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Oh, Danke schön!

Verschiedene Teile mit gleicher Bauteilnummer und unterschiedlichen Kosten
ist zwar möglich, aber, wie ich glaube, nicht von realer Bedeutung.

Testen kann ich erst später.

------------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



Sehen Sie sich das Profil von Roland Schröder an!   Senden Sie eine Private Message an Roland Schröder  Schreiben Sie einen Gästebucheintrag für Roland Schröder

Beiträge: 13597
Registriert: 02.04.2004

Inventor 2025.2.1
Windows 11

erstellt am: 03. Jun. 2025 20:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Moin!

Ja, "später"... Heute endlich habe ich den Code mal importiert und ausprobiert, und er funktioniert (natürlich   )!

Aber: Ein jeder Wunsch, wenn er erfüllt, kriegt augenblicklich Junge! (Wilhelm Busch)

Also: Gibt es die Möglichkeit, dass das automatisch auch durch alle Unterbaugruppen läuft?

PS: Es ist aber doch noch irgendwas falsch mit dem Code. Die ermittelten Summen werden bei mehrfacher Anwendung immer größer, und die Behandlung von Komponenten auf Referenz erscheint mir auch noch komisch.

--------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

[Diese Nachricht wurde von Roland Schröder am 03. Jun. 2025 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

rkauskh
Moderator
Dipl.-Ing. (FH) Versorgungstechnik




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2846
Registriert: 15.11.2006

Windows 10 x64, AIP 2020-2025

erstellt am: 04. Jun. 2025 15:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Roland Schröder 10 Unities + Antwort hilfreich

Moin

Ich sagte ja damals, ich war schnell. Schnell und gut klappt leider selten gleichzeitig. 
Probiere mal diese Version. Die sollte in jede Unterbaugruppe die jeweiligen Kosten in das iProp der Baugruppe schreiben. Ich glaube auch das Vergrößern der Werte bei jedem Durchlauf ist behoben. Referenzbaugruppen und -bauteile werden nicht berücksichtigt. Manuelle Mengenüberschreibungen in der Stückliste werden berücksichtigt. Zeilenzusammenführung bei gleicher Bauteilnummer behindert nicht mehr die Kostenberechnung.

Code:

Option Explicit

Private dTotalCost As Currency

Private Sub AssemblyCosts()

Dim oApp As Inventor.Application
Set oApp = ThisApplication

If Not oApp.ActiveDocumentType = kAssemblyDocumentObject Then Exit Sub

Dim oAssDoc As AssemblyDocument
Set oAssDoc = oApp.ActiveDocument

Dim oBom As BOM
Set oBom = oAssDoc.ComponentDefinition.BOM

Dim oBomview As BOMView
Set oBomview = oBom.BOMViews(1)

Dim iTotalQty As Integer
iTotalQty = 1

dTotalCost = ProcessBomRows(oBomview.BOMRows, iTotalQty, dTotalCost)

If MsgBox("Gesamtkosten: " & dTotalCost & vbCrLf & "Speichern in iProperty geschätzte Kosten?", vbYesNo) = vbYes Then
    oAssDoc.PropertySets(3).Item(21).Value = dTotalCost
End If

End Sub

Private Function ProcessBomRows(ByVal oBomRows As BOMRowsEnumerator, ByVal iTotalQty As Integer, ByVal dTotalCost As Double) As Currency
    Dim oBomRow As BOMRow
    Dim dCost As Currency
    Dim dItemCost As Currency
    Dim dSubCost As Currency
    Dim oCompDef As ComponentDefinition
    Dim oDoc As Document
               
    For Each oBomRow In oBomRows
        If Not oBomRow.BOMStructure = kReferenceBOMStructure Then
            If Not oBomRow.ChildRows Is Nothing Then
                dSubCost = ProcessBomRows(oBomRow.ChildRows, iTotalQty * oBomRow.ItemQuantity, dTotalCost)
               
                Set oCompDef = oBomRow.ComponentDefinitions(1)
                Set oDoc = oCompDef.Document
                oDoc.PropertySets(3).Item(21).Value = dSubCost
               
                dCost = dCost + dSubCost
            Else
                dItemCost = 0
                If oBomRow.Merged = True Then
                    Dim oOcc As ComponentOccurrence
                    For Each oOcc In oBomRow.ComponentOccurrences
                        Set oDoc = oOcc.Definition.Document
                        dItemCost = dItemCost + oDoc.PropertySets(3).Item(21).Value
                    Next
                    dCost = dCost + dItemCost
                Else
                    Set oCompDef = oBomRow.ComponentDefinitions(1)
                    Set oDoc = oCompDef.Document
                    dItemCost = oDoc.PropertySets(3).Item(21).Value
                           
                    If oBomRow.TotalQuantityOverridden = True Then
                        dCost = dCost + CInt(oBomRow.TotalQuantity) * iTotalQty * dItemCost
                    Else
                        dCost = dCost + oBomRow.ItemQuantity * iTotalQty * dItemCost
                    End If
                End If
            End If
        End If
    Next
   
    dTotalCost = dTotalCost + dCost
   
    ProcessBomRows = dCost
 
End Function




------------------
MfG
Ralf

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Roland Schröder
Ehrenmitglied V.I.P. h.c.
Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen



Sehen Sie sich das Profil von Roland Schröder an!   Senden Sie eine Private Message an Roland Schröder  Schreiben Sie einen Gästebucheintrag für Roland Schröder

Beiträge: 13597
Registriert: 02.04.2004

Inventor 2025.2.1
Windows 11

erstellt am: 04. Jun. 2025 16:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Oh, supi! Was bin ich schuldig? 

Mein Verdacht ist, dass das Vergrößern der Werte in der gestern getesteten Version daher rührt, dass schon in den Unterbaugruppen eingetragene Summen mit gerechnet wurden, aber jetzt teste ich erstmal die heutige Version und versuche, sie zu verstehen.

Ich arbeite meist mit der Ansicht "nur Bauteile", ist das BOMViews(1)?

In dieser Ansicht trage ich dann die Preise aller Einzelteile bzw. unteilbaren Komponenten* ein. Das ist ein volatiles Geschäft, weil viele
Preise erst geschätzt und/oder nach (neuen) Angeboten und Verhandlungen wieder geändert werden müssen.

(* möglicherweise problematisch)

Interessant ist dann sowohl der Gesamtpreis, als auch der Preis von Unterbaugruppen, die als Option entfallen oder auch mehrfach gewünscht sein können. Daher der Wunsch, immer auch die Unterbaugruppen zu summieren.

Und daher wäre es auch gut, analog zu dem in der Ansicht "nur Bauteile" im Standard vorhandenen Button "Masseeigenschaften aktualisieren" gleich dort auch ein Button "Preise aktualisieren" zu haben. Aber ich fürchte, dass diese Reihe Buttons nicht so leicht zugänglich ist. Geht ja auch anders.

Aber noch eine Frage zum Einbinden in mein System: Ich konnte das Makro erst in der Liste für die User-Commands sehen, nachdem ich das "Private" vor "Sub" im Code gelöscht habe. Ist das der richtige Weg? Oder war es wieder mal nur mein ungeeigneter Name für das Modul, den ich gleichzeitig geändert habe (was man ja nicht tun soll)?

Und Du hast ein PM!

------------------
Roland  
www.Das-Entwicklungsbuero.de

It's not the hammer - it's the way you hit!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

rkauskh
Moderator
Dipl.-Ing. (FH) Versorgungstechnik




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2846
Registriert: 15.11.2006

Windows 10 x64, AIP 2020-2025

erstellt am: 04. Jun. 2025 17:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Roland Schröder 10 Unities + Antwort hilfreich

Moin

BOMView Nr. 1 ist die Modelldatenansicht, 2 ist strukturiert und 3 nur Bauteile. Das gilt aber nur wenn alle Ansichten aktiviert sind. Ist strukturiert nicht aktiviert, ist plötzlich Nr. 2 nur Bauteile. Unglücklicherweise hat Autodesk hier auch keine internen Namen vorgesehen, die unveränderlich sind und der Anzeigename der Ansichten ist lokalisiert. Wenn man eine bestimmte Ansicht braucht, muss man sie sich selbst herausfischen.

Wenn man in der nur Bauteile Ansicht die Preise pflegt, tauchen die in den anderen Ansichten ebenso auf. Das sind ja immer die gleichen Felder, die nur unterschiedlich sortiert und gefiltert angezeigt werden.

Unteilbare und gekaufte Teile werden in der letzten Version wie normale behandelt. Bei Bauteilen spielt es keine Rolle. Bei Baugruppen könnte man tricksen, in dem man einem der enthaltenen Teile den Kaufpreis gibt. Das ist aber Pfusch und später versteht das niemand. Da musste ich noch was einbauen. Jetzt ist der Preis der unteilbaren oder gekauften Baugruppe der maßgebende. Das ist auch der, der in der nur Bauteile Ansicht gezeigt wird und dort auch eingetragen/aktualisiert werden kann. Alle innerhalb der Baugruppe stehenden Preise werden in der Kostensumme der unteilbaren/gekauften Baugruppe ignoriert. Kommt das gleiche Teil aber woanders in einer normalen Baugruppe vor, wird der Preis berücksichtigt. Das könnte z.B. ein einzeln erhältliches Ersatzteil einer gekauften Baugruppe sein. Das hat ja einen Einzelpreis, der aber wenn ich die ganze Baugruppe kaufe, für die Kostensumme irrelevant ist. Andernfalls bräuchte man 2 Bauteile, nur wegen hat einen Preis vs. hat keinen Preis. Auch Pfusch.

An den Stücklistendialog (eigentlich an alle Dialoge im Inventor) kommt man nicht heran. Die Dialoge sind unveränderlich. Man kann aber das Makro bei geöffneter Stückliste ausführen. Die Summen werden auch berechnet und eingetragen, aber in der Ansicht Modelldaten wird erstmal keine der Summen angezeigt. Dazu muss die Stückliste geschlossen und wieder geöffnet werden. Für eine schnelle Kontrolle bisschen doof. Alternativ kann man die Stückliste aber automatisiert schließen, aktualisieren und wieder öffnen. Ich hab es mal eingebaut.

Das Private schreib ich aus Gewohnheit hin. Damit man das Makro in die Benutzerbefehle im Ribbon einfügen kann, muss man es löschen oder ein Public draus machen. Beides ist möglich und richtig.

Code:

Option Explicit

Private dTotalCost As Currency

Public Sub AssemblyCosts()

Dim oApp As Inventor.Application
Set oApp = ThisApplication

If Not oApp.ActiveDocumentType = kAssemblyDocumentObject Then Exit Sub

' die folgenden Zeilen schließen eine geöffnete Stückliste, ggf. löschen wenn nicht benötigt
' Start
Dim bReopen As Boolean
bReopen = False

If oApp.CommandManager.ActiveCommand = "AssemblyBillOfMaterialsCmd" Then
    oApp.CommandManager.StopActiveCommand
    bReopen = True
End If
' Ende

Dim oAssDoc As AssemblyDocument
Set oAssDoc = oApp.ActiveDocument

Dim oBom As BOM
Set oBom = oAssDoc.ComponentDefinition.BOM

Dim oBomview As BOMView
Set oBomview = oBom.BOMViews(1)

Dim iTotalQty As Integer
iTotalQty = 1

dTotalCost = ProcessBomRows(oBomview.BOMRows, iTotalQty, dTotalCost)

If MsgBox("Gesamtkosten: " & dTotalCost & vbCrLf & "Speichern in iProperty geschätzte Kosten?", vbYesNo) = vbYes Then
    oAssDoc.PropertySets(3).Item(21).Value = dTotalCost
End If

' die folgenden Zeilen öffnen die vorher geschlossene Stückliste erneut, ggf. löschen wenn nicht benötigt
' Start
If bReopen = True Then
    oApp.CommandManager.ControlDefinitions.Item("AssemblyBillOfMaterialsCmd").Execute
End If
'Ende

End Sub

Private Function ProcessBomRows(ByVal oBomRows As BOMRowsEnumerator, ByVal iTotalQty As Integer, ByVal dTotalCost As Double) As Currency
    Dim oBomRow As BOMRow
    Dim dCost As Currency
    Dim dItemCost As Currency
    Dim dSubCost As Currency
    Dim oCompDef As ComponentDefinition
    Dim oDoc As Document
               
    For Each oBomRow In oBomRows
        If Not oBomRow.BOMStructure = kReferenceBOMStructure Then
            If Not oBomRow.ChildRows Is Nothing And Not oBomRow.BOMStructure = kInseparableBOMStructure And Not oBomRow.BOMStructure = kPurchasedBOMStructure Then
                dSubCost = ProcessBomRows(oBomRow.ChildRows, iTotalQty * oBomRow.ItemQuantity, dTotalCost)
               
                Set oCompDef = oBomRow.ComponentDefinitions(1)
                Set oDoc = oCompDef.Document
                oDoc.PropertySets(3).Item(21).Value = dSubCost
               
                dCost = dCost + dSubCost
            Else
                dItemCost = 0
                If oBomRow.Merged = True Then
                    Dim oOcc As ComponentOccurrence
                    For Each oOcc In oBomRow.ComponentOccurrences
                        Set oDoc = oOcc.Definition.Document
                        dItemCost = dItemCost + oDoc.PropertySets(3).Item(21).Value
                    Next
                    dCost = dCost + dItemCost
                Else
                    Set oCompDef = oBomRow.ComponentDefinitions(1)
                    Set oDoc = oCompDef.Document
                    dItemCost = oDoc.PropertySets(3).Item(21).Value
                           
                    If oBomRow.TotalQuantityOverridden = True Then
                        dCost = dCost + CInt(oBomRow.TotalQuantity) * iTotalQty * dItemCost
                    Else
                        dCost = dCost + oBomRow.ItemQuantity * iTotalQty * dItemCost
                    End If
                End If
            End If
        End If
    Next
   
    dTotalCost = dTotalCost + dCost
   
    ProcessBomRows = dCost
 
End Function


------------------
MfG
Ralf

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz