OK... Maar als je, in plaats van alleen de gemeenschap te beschimpen, je oplossing met hen zou kunnen delen om hen te helpen zoals zij jou helpen, zou het genereus van je zijn.
Ik daag niemand uit! Ik was nog niet klaar met mijn macro .... Maar alles is goed en functioneel:) Dus ik ben blij om te delen wat ik heb gevonden en ik hoop dat de tijd die ik heb besteed aan het zoeken zal nuttig zijn voor anderen!
Hier is de macro die ik heb weten te maken door late blindering uit te voeren, zoals Binoyte uitlegt, het wordt gebruikt om een bestand uit te pakken via het PDM-script:
Sub main()
Dim Vault As Object
Set Vault = CreateObject("ConisioLib.EdmVault")
Vault.LoginAuto "NOM_COFFRE_PDM", 0
modelPath = "<Filepath>"
If Vault.IsLoggedIn Then
Dim folder As Object
Dim folderPath As String
Dim FolderPath1 As String
folderPath = modelPath
j = InStrRev(folderPath, "\")
FolderPath1 = Left(folderPath, j)
Set folder = Vault.GetFolderFromPath(FolderPath1)
i = Len(modelPath)
j = InStrRev(modelPath, "\")
FileName = Right(modelPath, i - j)
Dim file As Object
Dim oNull As Object
Set file = folder.GetFile(FileName)
If file Is Nothing Then
MsgBox "File not found."
End If
file.LockFile folder.ID, 0
CheckOutFile = "Successful"
Else
Err.Raise vbError, "User is not logged in to the vault"
End If
End Sub
**Vergeet niet de 'NOM_COFFRE_PDM' te vervangen door de naam van je pdm-kluis:)
Sorry voor de fout, maar dit soort antwoorden is zo terugkerend op het net...
Bravo voor de macro en bedankt voor het delen;)
Bedankt. Dus wat zorgt ervoor dat het werkt?
Je wordt lastiggevallen met de behandeling van je paden. U moet de bibliotheek Scripting.FileSystemObject gebruiken
' Chargement de l'objet Système de Fichiers
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")
sInputFile = "<Filepath>"
Zoek in de objectverkenner naar andere methoden in deze bibliotheek en de bovenliggende bibliotheek, Scripting, in het algemeen. Het is best praktisch!
Van wat ik las en kon vinden als info, heb ik ooit het volgende object gemaakt:
Dim Vault As Object
Set Vault = CreateObject("ConisioLib.EdmVault")
declareer bijvoorbeeld gewoon "Map als object" in plaats van "Map als IEdmFolder5" en het werkt, hetzelfde geldt voor andere instructies van hetzelfde type:)
Heel erg bedankt voor de info over de verwerking van bestandspaden, ik zal er eens goed naar kijken!! Ik ben nog geen expert op het gebied van VBA-macro ahah en ik ben blij dat ik wat advies heb:)
Ik kijk ernaar uit om meer tips te delen!
Ah, als ik mijn ogen open, begrijp ik beter waarom het voor jou werkt en niet voor mij!
Je gebruikt de werkwijze:
Vault.GetFolderFromPath()
wat voor mij overigens nooit een probleem is geweest, maar in mijn geval gebruik ik de methode:
Vault.GetFileFromPath()
En daar werkt het niet. Dus mijn probleem blijft.
Hier is mijn minimale voorbeeld:
Sub ajoutfich()
Dim eVault, eFile, eFolder As Object
Dim iStatus As Integer
Dim sFichier, sDestination, sSource As String
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")
sDestination = "D:\ePDM\…\dossier\"
sSource = "E:\FICHIER.EXT"
sFichier = oFS.buildpath(sDestination, oFS.GetFileName(sSource))
Set eVault = CreateObject("ConisioLib.EdmVault")
If Not eVault.IsLoggedIn Then
eVault.LoginAuto "MON_COFFRE_PDM", 0
End If
Set eFolder = eVault.GetFolderFromPath(sDestination)
Set eFile = eVault.GetFileFromPath(sFichier)
If Not eFile Is Nothing Then
'à complèter
End If
iStatus = eFolder.AddFile(0, sSource)
End Sub
Ik krijg runtime-fout 13: type komt niet overeen voor rij:
Set eFile = eVault.GetFileFromPath(sFichier)
Het gieten lijkt echter automatisch te gebeuren. Als we naar het VBA-spionagevenster kijken (zie bijgevoegde schermafbeelding), kunnen we IEdmVault5-objecten zien. Ook is de methode eVault.LoginAuto() afhankelijk van de IEdmVault5.
Dus waarom zit het vast op eVault.GetFileFromPath()?
1659427953.screenshot.png
Hallo
Eén argument ontbreekt:
Set eFile = eVault.GetFileFromPath(sFichier, eFolder)
Hallo
Is het niet de bedoeling dat het optioneel is?
EDIT: uit geweten, ik heb getest zoals je aangaf, dezelfde fout!
Het lijkt mij niet, behalve om 0 te zetten
Hallo
Geen probleem met mij met de eFolder argument, anders dezelfde fout door alleen sFile
Wat moet u doen als u de volgende instructie probeert te gebruiken in plaats van de "Set eFile = eVault.GetFileFromPath(sFile)"?
Dim efolder As Object
Dim sFichier As Object
Set eFile = efolder.GetFile(sFichier)
Werkt het of niet?
De doc-pagina: GetFileFromPath-methode (IEdmVault5)
Het is optioneel, en ik had het ook met 0 geprobeerd.
Bedankt voor je antwoord, maar ... verdomme! Ik vraag me af of ik een kijkje moet nemen naar de dll-opname met regsrv32.
Ik denk hieraan omdat ik heb geprobeerd om direct een EdmFile object te maken:
Set eFile = CreateObject("ConisioLib.EdmFile")
en ik krijg een runtime-fout 429: een activeX-component kan geen object maken.
Ik geef toe dat dit misschien een beetje buiten mijn vaardigheden ligt, ahaha, maar ik ben nog steeds beschikbaar als het je lukt om te deblokkeren of vooruit te gaan:)
Nou, mijn minimale voorbeeld is in het spel gevallen!
Het tweede argument is dus inderdaad niet optioneel.
Set eFile = eVault.GetFileFromPath(sFichier, eFolder)
De enige andere manipulatie die ik uitvoerde was een
regsrv32 "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS PDM\EdmInterface.dll"
wat het DLL-record mogelijk weer op orde heeft gebracht. EdmInterface.dll was noodzakelijkerwijs geladen, anders had ik veel andere berichten gehad... Het valt nog te bezien hoe het zich gedraagt in een ePDM-taak!
Ik hou er niet van om af te sluiten zonder alles begrepen te hebben, maar hey HEEL ERG BEDANKT voor je hulp!
Misschien is de PDM API-documentatie ook nep. Zelfs zonder "Late Binding" te doen, plaats ik altijd een argument na het pad van het geheugenbestand.
Dupliceren, ik kan niet verwijderen
Ik denk dat de documentatie de intentie van de ontwikkelaars laat zien, maar de implementatie in de functie is verkeerd.
Het tweede argument wordt door verwijzing aan de functie doorgegeven, waardoor deze er schriftelijk toegang toe heeft. Voor alle duidelijkheid: dit argument geeft niet aan in welke map naar het bestand moet worden gezocht. Het stelt u eenvoudig in staat om het directory-object te herstellen waarin het bestand is gevonden. Maar als we op zoek zijn naar een bestand via het pad, kennen we de bovenliggende map al. Dit tweede argument is absoluut niet essentieel. Misschien kunnen we in sommige gevallen een paar regels code krijgen.
Aan de andere kant, wees voorzichtig als het bestand niet bestaat, de functie zal Null in het tweede argument plaatsen. In mijn minimale voorbeeld kan getFileFromPath de eFolder leegmaken door deze toe te wijzen aan Null en de rest laten crashen. Nou, dat was maar een voorbeeld.