| | | PLM TechnologieForum Essen |
Autor
|
Thema: VB.NET - GetLocalVersionNo2 Method (IEdmFile12) (1051 / mal gelesen)
|
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006
|
erstellt am: 11. Nov. 2021 17:08 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich arbeite momentan an einem Makro mit Visual Studio Express 2017. Hierbei wird auch die Document Manager API verwendet, sprich ohne SolidWorks 2021. Über diese Document Manager API möchte ich Informationen aus unseren SW-Dateien auslesen. Hierzu müssen diese lokal in der aktuellen Version vorliegen. Dies ist aber nicht immer so gegeben. (siehe Beispielbild) Nun möchte ich die lokal ältere Datei mit der roten Kugel aus dem Tresor aktualisieren. Die neuere Datei mit der grünen Kugel muss so bleiben wie gehabt. Hierzu möchte ich den Befehl GetLocalVersionNo2 Method (IEdmFile12) verwenden. In der Hilfe hier: http://help.solidworks.com/2021/english/api/epdmapi/epdm.interop.epdm~epdm.interop.epdm.iedmfile12~getlocalversionno2.html?verRedirect=1 Einen ähnlichen Beitrag hatte ich schon mal hier behandelt. http://ww3.cad.de/foren/ubb/Forum466/HTML/000251.shtml Hier konnte ich aber die Funktion "immer mit der neuesten Version arbeiten" vom PDM verwenden, da beim öffnen mit SW die Datei automatisch aktualisiert wird. Dies funktioniert hier nicht, da ich ohne SW mit der Document Manager API arbeite. Nun wollte ich die Abfrage wie folgt verwenden. Ausschnitt aus dem Code:
Code:
Dim versionNo2 As Integer Dim pbLocalOverwrittenVersionObsolete As Boolean pbLocalOverwrittenVersionObsolete = True versionNo2 = oFile.GetLocalVersionNo2(oFile.GetLocalPath(oFolder.ID), pbLocalOverwrittenVersionObsolete) If versionNo2 = -1 And pbLocalOverwrittenVersionObsolete = True Then 'Wenn lokale Version älter als Tresorversion ist oFile.GetFileCopy(0) End If
Ich bekomme für die Variable versionNo2 sowohl bei neueren als auch bei älteren Dateien eine -1 zurück. Für die Variable pbLocalOverwrittenVersionObsolete erwarte ich bei älteren Dateien ein True. Zitat: Zitat: True if the file in the user's local cache is obsolete, false if it is valid (see Remarks)
Leider erhalte ich für pbLocalOverwrittenVersionObsolete in beiden Fällen ein False. Also sowohl für die älteren als auch neueren Dateien. (rote / grüne Kugel) Was läuft hier schief? Hat wer ähnliche Erfahrungen und evtl. eine Abhilfe für mein Problem? Habe auch schon folgendes Probiert, um nicht aus versehen mit falschen Rückgabewerten zu arbeiten. Hatte diesen Fall mal mit suppressed. Code:
Dim BoolInfo As Boolean BoolInfo = CBool(CInt(pbLocalOverwrittenVersionObsolete))
Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Maler Mitglied Konstrukteur / CAD-Admin / Mädchen für alles
Beiträge: 720 Registriert: 17.01.2007 SWX 2017 SP5 AutoCAD 2017 Win 8.1 pro 64 bit Intel Xeon 3,5GHz 16GB RAM Nvidia Quadro K2200 SWx EPDM AP+
|
erstellt am: 12. Nov. 2021 08:16 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Zitat: Original erstellt von Andi Beck: Hat wer ähnliche Erfahrungen und evtl. eine Abhilfe für mein Problem?
Nein (da noch nie benutzt) und vielleicht: Als Idee: Bei jeder Datei prüfen, ob sie ausgecheckt (oder schreibgeschützt) ist. Ohne Auschecken sollte ja keine Änderung gespeichert sein können, da die Datei sonst schreibgeschützt ist. Ergo kein grüner Ball. Gruß, Jens Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 12. Nov. 2021 08:45 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
GetLocalVersionNo2 liefert nur Versions-Nr. welche im Cache liegt, wenn die Datei denn im Cache ist. Sonst -1, wie Du schon erkannt hast. Ich glaube, was Du brauchst ist das hier: Code:
Function GetToCache(myVault As IEdmVault21, oFile As IEdmFile17, oFolderID As Integer, Handler As Integer) As Boolean Try Dim BatchGet As IEdmBatchGet = myVault.CreateUtility(EdmUtility.EdmUtil_BatchGet) BatchGet.AddSelectionEx(myVault, oFile.ID, oFolderID, oFile.CurrentVersion) BatchGet.CreateTree(Handler, EdmGetCmdFlags.Egcf_ForViewer) BatchGet.GetFiles(Handler) Return True Catch ex As Exception Return False End Try End Function
Die Funktion bringt Dir immer die aktuelle Version in den Cache. Vor Aufruf der Funktion würde ich mit islocked prüfen, ob die Datei ausgecheckt ist und nur dann aufrufen, wenn das nicht der Fall ist. Den Handler kannst Du mit Me.Handle.ToInt32() holen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006
|
erstellt am: 12. Nov. 2021 09:47 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von CAD-Maler:
Als Idee: Bei jeder Datei prüfen, ob sie ausgecheckt (oder schreibgeschützt) ist. Ohne Auschecken sollte ja keine Änderung gespeichert sein können, da die Datei sonst schreibgeschützt ist. Ergo kein grüner Ball.
Hallo Jens, danke schön für deine Anregungen. Auf den ersten Blick sah das ganz plausibel aus. Diese zusätzliche Abfrage macht aber nur Sinn, wenn nicht auch bei der roten Kugel ausgecheckt sein kann. Also habe ich das mit der roten Kugel versucht. Wenn ich auschecke, wird mir automatisch die lokale Version aktualisiert. Jetzt kann ich aber in SolidWorks einen älteren Speicherstand holen, und behalte dabei die Schreibrechte, also identisch mit der grünen Kugel, hmm. Bei diesem Vorgang ist mir eine fehlerhafte Darstellung im Explorer aufgefallen. (siehe Bild) Im Explorer wird mir der ältere Stand mit -/2 und einer grünen Kugel dargestellt. In SW wird es korrekt mit 1/2 und einer roten Kugel dargestellt. Ergo bekomme ich keine eindeutige Unterscheidung zwischen roter und grüner Kugel, was mir ja eigentlich pbLocalOverwrittenVersionObsolete liefern sollte. Grüße, Andi
------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-5.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2023-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 12. Nov. 2021 10:06 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von riesi:
Die Funktion bringt Dir immer die aktuelle Version in den Cache. Vor Aufruf der Funktion würde ich mit islocked prüfen, ob die Datei ausgecheckt ist und nur dann aufrufen, wenn das nicht der Fall ist. Den Handler kannst Du mit Me.Handle.ToInt32() holen.
Hallo Riesi, auch dir besten Dank für deinen Vorschlag. Also, wenn deine Routine auch die neuere grüne lokale Version überschreibt, dann wäre zwingend die zusätzliche Abfrage nach islocked notwendig. Dann habe ich aber das gleiche Problem mit den roten Kugeln, wie ich es oben für Jens beschrieben habe. Wenn diese Bedingung stimmen sollte, dann hat deine Routine keinen Vorteil zur bestehenden Funktion oFile.GetFileCopy(0). Es muss doch eine eindeutige Unterscheidung zwischen roter und grüner Kugel geben, verstehe da SolidWorks nicht. Grüße, Andi
------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 12. Nov. 2021 10:35 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Zitat:
Über diese Document Manager API möchte ich Informationen aus unseren SW-Dateien auslesen. Hierzu müssen diese lokal in der aktuellen Version vorliegen. .... Nun möchte ich die lokal ältere Datei mit der roten Kugel aus dem Tresor aktualisieren.
Hier nochmal Deine obige Aussage. Meine Funktion hilft Dir, die aktuelle Version in den Cache zu bekommen. Mit der Abfrage, ob ausgecheckt, bist Du auf der sicheren Seite. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006
|
erstellt am: 12. Nov. 2021 11:11 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von riesi:
Hier nochmal Deine obige Aussage. Meine Funktion hilft Dir, die aktuelle Version in den Cache zu bekommen. Mit der Abfrage, ob ausgecheckt, bist Du auf der sicheren Seite.
Wenn die rote Kugel schreibgeschützt ist, wird diese aktualisiert, richtig. Wenn die rote Kugel nicht schreibgeschützt ist, wird diese nicht aktualisiert, falsch. Wenn ich diesen Schreibschutz als Bedingung abfrage, aktualisiere ich mit oFile.GetFileCopy(0) ebenfalls. Deine Routine bringt hier keinen Vorteil, sorry. Momentan suche ich nach einer Alternative. Mit dem Befehl swDoc.LastSavedDate bekomme ich das letzte Speicherdatum. Wie bekomme ich das Datum für das zuletzt eingecheckt her? So könnte ich einen zuverlässigen Älter / Neuer vergleich anstellen. Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 12. Nov. 2021 12:07 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Die rote Kugel besagt, dass Du die Datei von einer alten Version ausgecheckt hast. Aus meiner Sicht wäre es besser, vorm ausschecken die Datei zu aktualisieren. So würdest Du den alten Versions-Stand hinter der neusten Version einspeichern. Klingt für mich nicht logisch. Wie gesagt, ausgecheckte Dateien würde ich eh' nicht anfassen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 12. Nov. 2021 12:29 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Hier ein Ausschnitt aus meinem Programm, ich brauche es für einen anderen Fall. Die Abfrage nach dem letzten Datum müsstest Du in die For Each-Schleife einbauen. Code:
Dim oFileHistory As IEdmHistory3 oFileHistory = oVault.CreateUtility(EdmUtility.EdmUtil_History) oFileHistory.AddFile(oFile.ID) Call oFileHistory.GetSortedHistory(aoHistItem, EdmHistoryType.Edmhist_FileRevision + EdmHistoryType.Edmhist_FileMove + EdmHistoryType.Edmhist_FileState + EdmHistoryType.Edmhist_FileVersion) Dim evDesc As String = "" For Each oHist As EdmHistoryItem In aoHistItem evDesc = oFileHistory.GetEventDescription(oHist, EdmLangCode.LanGerman).ToString dgvVersions.Rows.Add(evDesc, oHist.mlVersion.ToString, oHist.mbsUserName, oHist.moDate.ToString, oHist.mbsComment) Next
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006
|
erstellt am: 12. Nov. 2021 13:09 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von riesi:
Wie gesagt, ausgecheckte Dateien würde ich eh' nicht anfassen.
da hast du natürlich recht. Dieser rote Zustand ohne Schreibschutz ist sowieso ein seltener Ausnahmefall, aber er kann theoretisch vorkommen. Dieser lässt sich momentan von dem grünen Zustand nicht unterscheiden. Wenn ich jetzt meine Dateiauswertungen mache, beschreibe ich in der Exceltabelle diesen Zustand als unklar. Im Falle der roten Variante werte ich veraltete Informationen aus, also unklar. Im Falle der grünen Variante wären es die neuesten Informationen und eben nicht unklar. Hier könnte ich auf dieses Merkmal verzichten. Durch den Datumsabgleich müsste ich jetzt einen eindeutigen Zustand beschreiben können. Danke dir für den Codeschnipsel, werde ich am Montag doch gleich mal testen. (Zu Hause habe ich keinen Zugriff auf den Tresor) Wünsche euch ein erholsames Wochenende und Danke nochmals für die Hilfe. Grüße, Andi
------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Maler Mitglied Konstrukteur / CAD-Admin / Mädchen für alles
Beiträge: 720 Registriert: 17.01.2007 SWX 2017 SP5 AutoCAD 2017 Win 8.1 pro 64 bit Intel Xeon 3,5GHz 16GB RAM Nvidia Quadro K2200 SWx EPDM AP+
|
erstellt am: 12. Nov. 2021 14:11 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Zitat: Original erstellt von riesi: Die rote Kugel besagt, dass Du die Datei von einer alten Version ausgecheckt hast.
Kleiner Einspruch: Die rote Kugel besagt nur, daß es im Tresor eine neuere Version gibt, egal ob ausgecheckt oder nicht. --> Da bei uns hier auch Fälle vorkommen, bei denen eigentlich eingecheckte Dateien ohne Schreibschutz im lokalen Cache rumliegen, als auch, dass bei lokalen Dateien beim Auschecken der Schreibschutz nicht entfernt wird, ist die Abfrage von ebenjenem vielleicht doch nicht so sonderlich glücklich. Ich denke auch, mit IsLocked bist du da sicherer. Zur History gibts auch ein gutes Beispiel in der Hilfe. Ich habe aber schon festgestellt, dass nicht immer der letzte Eintrag ausgelesen wird, warum auch immer (liegt nicht an User, Pfad, Dateityp und auch nicht am Zurücksetzen oder Neueste Version überschreiben...). Gruß, Jens [Diese Nachricht wurde von CAD-Maler am 12. Nov. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006
|
erstellt am: 17. Nov. 2021 15:15 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Andi Beck:
Durch den Datumsabgleich müsste ich jetzt einen eindeutigen Zustand beschreiben können.
Hallo, da bin ich noch einmal. Es ist zum Mäusemelken, jetzt habe ich zweierlei Daten (Datum), aber leider nicht die richtige Kombination. :D Schaut euch die beiden Bilder an. Bild Zuletzt-gespeichert-1: Hier ist eine Zeichnung mit der grauen Kugel und der Version 1/1 in der Betrachtung: Datum der Änderung: 09.11.21 16:06:06 Verlauf Historie: 11.11.21 14:20:03 Eigenschaften Zuletzt eingecheckt: 09.11.21 16:06:06 Dateiinformation in SolidWorks: 09.11.21 16:06:07 ----------------------------------------------------------- Bild Zuletzt-gespeichert-2: Hier ist eine Baugruppe mit der grünen Kugel und der Version -/3 in der Betrachtung: Datum der Änderung: 11.11.21 14:52:24 Verlauf Historie: 11.11.21 14:51:18 Eigenschaften Zuletzt eingecheckt: 11.11.21 14:50:52 Dateiinformation in SolidWorks: 17.11.21 13:24:35 ----------------------------------------------------------- Wie ihr seht, gibt es 4 verschiedene Datumsangaben die zum Teil irreführend sein können. Per Code habe ich momentan 2 Datumsangaben. Mir fehlt ein drittes und viertes Datum. Datum der Änderung:
Code:
Dim dmDoc2 As SwDMDocument27 Dim LetztesSpeicherdatum As Date dmDoc2 = dmDocMgr.GetDocument(FoundPath, GetDocType(FoundPath), True, nRetVal) LetztesSpeicherdatum = dmDoc2.LastSavedDate
Verlauf Historie:
Code:
For Each oHist As EdmHistoryItem In aoHistItem evDesc = oFileHistory.GetEventDescription(oHist, EdmLangCode.LanGerman).ToString Eincheckdatum = oHist.moDate Next
Ursprünglich dachte ich, dass das Datum der Änderung und das Datum aus der Historie zueinander passen würde. Das stimmt aber nicht. Um die graue Kugel mit der Version 1/1 vergleichen zu können, brauche ich das Datum Eigenschaften Zuletzt eingecheckt. Um die grüne Kugel mit der Version /3 vergleichen zu können, brauche ich das Datum der Dateiinformation in SolidWorks. Wie komme ich an die zusätzlichen beiden Datums ran? Zur Erinnerung, kein SolidWorks auf, sondern mit der Dokument Manager API. Habt ihr eine Idee? Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) [Diese Nachricht wurde von Andi Beck am 17. Nov. 2021 editiert.] [Diese Nachricht wurde von Andi Beck am 18. Nov. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Maler Mitglied Konstrukteur / CAD-Admin / Mädchen für alles
Beiträge: 720 Registriert: 17.01.2007 SWX 2017 SP5 AutoCAD 2017 Win 8.1 pro 64 bit Intel Xeon 3,5GHz 16GB RAM Nvidia Quadro K2200 SWx EPDM AP+
|
erstellt am: 18. Nov. 2021 08:25 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
|
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 18. Nov. 2021 12:55 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Zitat: Original erstellt von Andi Beck:
Wie komme ich an die zusätzlichen beiden Datums ran? Zur Erinnerung, kein SolidWorks auf, sondern mit der Dokument Manager API.
Das ist einfach: Du legst eine Instanz zu ISwDMDocument an und fragst die beiden Properties CreationDate und LastSavedDate ab. Hab' dafür keinen Beispielcode, sollte aber nicht sehr schwer sein. Damit das klappt, muss die Datei im Cache sein. Edit: Obiges hast Du ja schon. Zur Version aus PDM: Ich glaube ich würde wie folgt vorgehen, ausgehend vom IEdmFile5-Object z.B. oFile:
Code:
DIM oEnumVer As IEdmEnumeratorVersion5 = DirectCast(ofile, IEdmFile5) DIM IEdmVersion5 As oVersion = oEnumVer.GetVersion({Versionsnummer}) DIM oCreateDate As DateTime = oVersion.VersionDate DIM oModifyDate As DateTime = oVersion.FileDate
Probiere es mal aus, habe ich selber noch nie genutzt. [Diese Nachricht wurde von riesi am 18. Nov. 2021 editiert.] [Diese Nachricht wurde von riesi am 18. Nov. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006
|
erstellt am: 18. Nov. 2021 13:35 <-- editieren / zitieren --> Unities abgeben:
Hallo Jens, danke schön für deine Beispiele. Erst war ich erfreut, aber dann auch ernüchtert. (Mein Bezugsbild anbei) Link 1: entspricht meinem Beispiel 2 von oben. Dort wird bereits Edmhist_FileVersion ausgewertet. Es liefert: Verlauf Historie: 11.11.21 14:51:18 Link 2 und 3: (GetLocalFileDate Method und GetLastWriteTime) Es liefert: Datum der Änderung: 11.11.21 14:52:24 Link 4 ist nicht zu gebrauchen, liefert den letzten Zugriff. Also bekomme ich Zeiten, welche ich bereits habe. Meine Wunschdaten von oben habe ich noch nicht. Zitat: Um die graue Kugel mit der Version 1/1 vergleichen zu können, brauche ich das Datum Eigenschaften Zuletzt eingecheckt.Um die grüne Kugel mit der Version /3 vergleichen zu können, brauche ich das Datum der Dateiinformation - Zuletzt gespeichert am: in SolidWorks.
Aber Danke schön für deine Mühen. Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 18. Nov. 2021 13:56 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Mit Datum kommst Du nicht weiter, wenn Du Dateien vergleichen willst. Ich würde mit md5sum die Dateien vergleichen, dass sollte zu 100%igen Ergebnissen führen. Bei NuGet gibt es auch passende Pakete. Dazu musst Du Dir die Datei vom PDM in ein temporäres Verzeichnis kopieren und von Deinen jeweiligen Dateien im Chache jeweils eine Checksumme ziehen. Diese kannst Du dann vergleichen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006
|
erstellt am: 18. Nov. 2021 16:22 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von riesi:
Edit: Obiges hast Du ja schon.
Hallo Riesi, auch dir besten Dank für deine Schnipsel. Den oberen Bereich hast du ja bereits als bekannt selber entdeckt. ;) Aber an deinem Schnipsel habe ich etwas basteln müssen (fehlende Deklarationen und Verdreher dabei) :D Mit folgendem Code habe ich Ergebnisse bekommen: Code:
Dim oEnumVer As IEdmEnumeratorVersion5 = DirectCast(oFile, IEdmFile5) Dim oCreateDate As DateTime 'Eincheckdatum in den Tresor: Historie / Verlauf 'Zeitangabe Sommerzeit?? Dim oModifyDate As DateTime 'Zuletzt eingecheckt: aus Eigenschaften 'Zeitangabe Sommerzeit?? Dim version As IEdmVersion7 Dim pos As IEdmPos5 pos = oEnumVer.GetFirstVersionPosition While Not pos.IsNull version = oEnumVer.GetNextVersion(pos) oCreateDate = version.VersionDate oModifyDate = version.FileDate End While
Und hier bin ich fündig geworden. Mit version.VersionDate bekomme ich eine bereits bekannte Zeit. Mit version.FileDate bekomme ich eine gesuchte Zeit, Klasse. Allerdings sind diese beiden Zeiten um eine Stunde früher als in den Bildern zu sehen ist. Hat das was mit Sommerzeit etc. zu tun??? Gibt es da eine Formatierung für, um das auf das gleiche Niveau zu setzen? Grüße, Andi Edit: Habe da was gefunden, womit es funktioniert, geht doch. :D
Code:
Dim localModifyDate As DateTime localModifyDate = oModifyDate.ToLocalTime()
------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) [Diese Nachricht wurde von Andi Beck am 18. Nov. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 19. Nov. 2021 07:40 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
|
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006
|
erstellt am: 25. Nov. 2021 09:48 <-- editieren / zitieren --> Unities abgeben:
Hallo, da bin ich nochmals, es hört nicht auf zu stocken. Jetzt habe ich noch ein Problem mit dem aktualisieren des lokalen Cache. Wie oben beschrieben, aktualisiere ich bisher mit folgendem Befehl. Code:
oFile.GetFileCopy(0)
Dieser Befehl funktioniert im Moment nur noch, wenn lokal noch kein Dokument gespeichert war. Habe ich aber ein Dokument mit dem Status rote Kugel und 1/2, dann bekomme ich eine Meldung, wie im Bild zu sehen ist. Auch diese beiden Varianten funktionieren nicht. Code:
oFile.GetFileCopy(0, "") 'bzw. oFile.GetFileCopy(0, 2)
Evtl. kennt jemand von euch eine Lösung. Wegen diesem Problem habe ich nun die Routine von Riesi von oben etwas modifiziert eingebaut. Code:
If GetToCache(vault1, FoundPath, oFile, Me.Handle.ToInt32()) = True Then Call MsgBox("lokale Version der Komponente ist älter als Tresorversion und ist nicht ausgechecked und wurde aktualisiert!", vbSystemModal, "Information") Else Call MsgBox("lokale Version der Komponente ist älter als Tresorversion und ist nicht ausgechecked und wurde nicht aktualisiert!", vbSystemModal, "Information") End If Function GetToCache(myVault As IEdmVault21, FileName As String, oFile As IEdmFile17, Handler As Integer) As Boolean Try Dim oFolderID As Integer Dim oFolder As IEdmFolder10 = Nothing 'Ordnernamen Dim aFile As IEdmFile17 aFile = CType(myVault.GetFileFromPath(FileName, oFolder), IEdmFile17) oFolderID = oFolder.ID Dim BatchGet As IEdmBatchGet = myVault.CreateUtility(EdmUtility.EdmUtil_BatchGet) BatchGet.AddSelectionEx(myVault, oFile.ID, oFolderID, oFile.CurrentVersion) BatchGet.CreateTree(Handler, EdmGetCmdFlags.Egcf_ForViewer) BatchGet.GetFiles(Handler) Return True Catch ex As Exception Return False End Try End Function
Aber auch diese aktualisiert den Cache nicht. In allen Variablen bekomme ich Werte zugewiesen und die Routine wird mit True abgeschlossen, dennoch keine Aktualisierung. Habt Ihr eine Idee, woran das liegen kann? Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Office Pre. 2020-Sp5
|
erstellt am: 25. Nov. 2021 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Des Rätsels Lösung kann eigentlich nur sein, dass die Datei gerade geöffnet ist und nicht aktualisiert werden kann. Gründe können sein: * In SolidWorks geöffnet (FileLock aufheben, dass kennst Du schon) * In Document-Manager-API noch geöffnet: ISwDMDocument ==> CloseDoc aufrufen * In PDM-API mit IEdmEnumeratorVariable geöffnet. ==> CloseFile aufrufen Edit: Sehe gerade das Bild, natürlich ist es so.
[Diese Nachricht wurde von riesi am 25. Nov. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006
|
erstellt am: 25. Nov. 2021 13:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Riesi, und du liegst mal wieder Gold richtig. Code:
dmDoc2.CloseDoc()
SolidWorks ist nicht auf und somit ist der Hinweis auf ISwDMDocument zutreffend. Und dieser Bereich ist ja völliges Neuland für mich. Dachte nicht, dass die Document Manager API wie eine Anwendung zu verstehen ist. Man lernt nie aus. Könnte eigentlich ne Standleitung zu dir gebrauchen. Jetzt habe ich nur noch ein kleines Problem zu lösen, und mein Makro dürfte erst mal fertig sein. (Beim Date-Vergleich muss ich eine Toleranzzeit von einer Sekunde einbauen) Besten Dank nochmals, Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-5.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2023-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 26. Nov. 2021 09:00 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Andi Beck:
(Beim Date-Vergleich muss ich eine Toleranzzeit von einer Sekunde einbauen)
Hallo, nur, falls das mal jemand gebrauchen kann, hier die Lösung. Code:
Dim DifferenzTime As Long DifferenzTime = DateDiff("s", LetztesCheckInDatum, LetztesSpeicherdatum) 'Differenzzeit der Dokumente in Sekunden (Lokal älter = negativer Wert) If DifferenzTime > 2 Then 'Wenn lokale Version neuer als Tresorversion ist, Call MsgBox("lokale Version der Komponente ist neuer als Tresorversion!", vbSystemModal, "Information") ElseIf DifferenzTime < -2 Then 'Wenn lokale Version älter als Tresorversion ist Call MsgBox("lokale Version der Komponente ist älter als Tresorversion!", vbSystemModal, "Information") oFile.GetFileCopy(0) 'hier Datei aktualisieren Else 'Wenn lokale Version und Tresorversion identisch sind, Call MsgBox("lokale Version der Komponente und Tresorversion sind identisch!", vbSystemModal, "Information") End If
Grüße und schönes WE, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Maler Mitglied Konstrukteur / CAD-Admin / Mädchen für alles
Beiträge: 720 Registriert: 17.01.2007 SWX 2017 SP5 AutoCAD 2017 Win 8.1 pro 64 bit Intel Xeon 3,5GHz 16GB RAM Nvidia Quadro K2200 SWx EPDM AP+
|
erstellt am: 26. Nov. 2021 14:42 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Zu langsam... Ich hätte dafür eine Lösung parat gehabt: Code: If CDate(Datum1) <= DateAdd("n", 15, CDate(Datum2)) Then
(Puffer von 15min zw Datum1 und Datum2) Und falls mal jemand die Differenz in Tagen, Minuten und Sekunden ausgeben muss: Code: vTage = Abs(DateDiff("n", Datum1, Datum2)) \ 1440 vStunden = (Abs(DateDiff("n", Datum1, Datum2)) Mod 1440) \ 60 vMinuten = (Abs(DateDiff("n", Datum1, Datum2)) Mod 1440) Mod 60
Gruß, Jens [Diese Nachricht wurde von CAD-Maler am 26. Nov. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|