| |  | 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

 Beiträge: 13597 Registriert: 02.04.2004 Inventor 2025.2.1 Windows 11
|
erstellt am: 04. Nov. 2024 15:33 <-- editieren / zitieren --> Unities abgeben:         
|
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
      

 Beiträge: 2846 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 05. Nov. 2024 10:34 <-- editieren / zitieren --> Unities abgeben:          Nur für Roland Schröder
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 ExplicitPrivate 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

 Beiträge: 13597 Registriert: 02.04.2004 Inventor 2025.2.1 Windows 11
|
erstellt am: 05. Nov. 2024 11:33 <-- editieren / zitieren --> Unities abgeben:         
|
Roland Schröder Ehrenmitglied V.I.P. h.c. Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen

 Beiträge: 13597 Registriert: 02.04.2004 Inventor 2025.2.1 Windows 11
|
erstellt am: 03. Jun. 2025 20:58 <-- editieren / zitieren --> Unities abgeben:         
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
      

 Beiträge: 2846 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 04. Jun. 2025 15:51 <-- editieren / zitieren --> Unities abgeben:          Nur für Roland Schröder
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 ExplicitPrivate 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

 Beiträge: 13597 Registriert: 02.04.2004 Inventor 2025.2.1 Windows 11
|
erstellt am: 04. Jun. 2025 16:54 <-- editieren / zitieren --> Unities abgeben:         
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
      

 Beiträge: 2846 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 04. Jun. 2025 17:50 <-- editieren / zitieren --> Unities abgeben:          Nur für Roland Schröder
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 ExplicitPrivate 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 >>)
 |