VBA Przypisywanie instancji EDMVAULT5 za pomocą techniki "Late Binding" (późne wiązanie)

@yves-marie.freyssinet 

OK... Ale gdybyś zamiast po prostu drwić ze społeczności, mógł podzielić się z nimi swoim rozwiązaniem, aby pomóc im tak, jak oni pomagają tobie, byłoby to hojne z twojej strony.

1 polubienie

Z nikogo nie drwię! Nie skończyłem jeszcze makro.... Ale wszystko jest dobre i funkcjonalne:)  Cieszę się więc, że mogę podzielić się tym, co znalazłam i mam nadzieję, że czas spędzony na poszukiwaniach będzie korzystny dla innych!  

Oto makro, które udało mi się zrobić, wykonując późne zaślepienie, jak wyjaśnia binoyte, służy ono do wyodrębniania pliku za pomocą skryptu PDM: 

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

**Nie zapomnij zamienić znaku "NOM_COFFRE_PDM" na nazwę skarbca pdm :) 

1 polubienie

Przepraszam za pomyłkę, ale tego rodzaju odpowiedzi są tak często w sieci...

Brawo za makro i dzięki za udostępnienie ;)

1 polubienie

Dziękuję. Więc  co sprawia, że to działa?

Niepokoi Cię leczenie swoich ścieżek. Należy użyć biblioteki Scripting.FileSystemObject

' Chargement de l'objet Système de Fichiers 
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")

sInputFile = "<Filepath>"

Poszukaj w eksploratorze obiektów innych metod w tej bibliotece i ogólnie w jej rodzicu, Skrypty. To całkiem praktyczne!

1 polubienie

Z tego co wyczytałem i udało mi się znaleźć jako informacje, kiedyś stworzyłem następujący obiekt: 

Dim Vault As Object
Set Vault = CreateObject("ConisioLib.EdmVault")

wystarczy zadeklarować np  . "Folder As Object" zamiast "Folder As IEdmFolder5" i działa, tak samo dla innych instrukcji tego samego typu :) 

Bardzo dziękuję za informacje na temat przetwarzania ścieżek do plików, przyjrzę się im bliżej!! Nie jestem jeszcze ekspertem od makr VBA ahah i cieszę się, że mam jakieś rady :) 

Nie mogę się doczekać, aby podzielić się kolejnymi wskazówkami! 

Ach, kiedy otwieram oczy, lepiej rozumiem, dlaczego to działa dla ciebie, a nie dla mnie!

Używasz metody:

Vault.GetFolderFromPath()

 

co zresztą nigdy nie stanowiło dla mnie problemu, ale w moim przypadku używam metody:

Vault.GetFileFromPath()

 

A tam to nie działa. Więc mój problem pozostaje.

Oto mój minimalny przykład:

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

 

Otrzymuję błąd wykonania 13: niezgodność typu dla wiersza:

Set eFile = eVault.GetFileFromPath(sFichier)

 

Jednak odlewanie wydaje się być wykonywane automatycznie. Kiedy patrzymy na okno szpiegowskie VBA (patrz załączony zrzut ekranu),  możemy zobaczyć obiekty IEdmVault5. Ponadto metoda  eVault.LoginAuto() zależy od obiektu IEdmVault5.

Dlaczego więc utknął w eVault.GetFileFromPath()?


1659427953.screenshot.png

Witam

Brakuje jednego argumentu:

Set eFile = eVault.GetFileFromPath(sFichier, eFolder)

 

Witam

Czy to nie powinno być opcjonalne?

 

EDIT: z wyrzutów sumienia, przetestowałem tak jak wskazałeś, ten sam błąd!

Nie wydaje mi się, z wyjątkiem wstawienia 0

Witam

Nie ma problemu ze mną z argumentem eFolder, w przeciwnym razie ten sam błąd przez posiadanie tylko sFile

Co się stanie, jeśli spróbujesz użyć następującej instrukcji zamiast "Set eFile = eVault.GetFileFromPath(sFile)"?

Dim efolder As Object
Dim sFichier As Object

Set eFile = efolder.GetFile(sFichier)

Czy to działa, czy nie?

Strona dokumentu: Metoda GetFileFromPath (IEdmVault5)

Jest to opcjonalne i próbowałem również z 0.

Dziękuję za odpowiedź, ale... cholera! Zastanawiam się, czy powinienem rzucić okiem na nagranie dll z regsrv32.

Myślę o tym, ponieważ próbowałem utworzyć obiekt EdmFile bezpośrednio:

Set eFile = CreateObject("ConisioLib.EdmFile")

i otrzymuję błąd w czasie wykonywania 429: składnik activeX nie może utworzyć obiektu.

1 polubienie

Przyznam, że może to trochę przerastać moje umiejętności ahaha, ale nadal jestem dostępny, jeśli uda Ci się odblokować lub ruszyć do przodu :) 

Cóż, mój minimalny przykład wpadł w grę!

Tak więc drugi argument nie jest opcjonalny .

Set eFile = eVault.GetFileFromPath(sFichier, eFolder)

 

Jedyną inną manipulacją, którą wykonałem, było

regsrv32 "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS PDM\EdmInterface.dll"

 

co mogło przywrócić porządek w rekordzie DLL. EdmInterface.dll koniecznie został załadowany, w przeciwnym razie miałbym wiele innych wiadomości... Dopiero się okaże,  jak zachowa się w zadaniu ePDM!

Nie lubię kończyć bez zrozumienia wszystkiego, ale hej BARDZO DZIĘKUJĘ za pomoc!

2 polubienia

Być może dokumentacja API PDM jest również fałszywa. Nawet bez wykonywania "Late Binding" zawsze umieszczam argument po ścieżce do pliku pamięci.

Duplikat, nie mogę usunąć

1 polubienie

Myślę, że dokumentacja pokazuje intencje programistów, ale implementacja w funkcji jest błędna.

Drugi argument jest przekazywany do funkcji przez odwołanie, co pozwala jej uzyskać do niego  dostęp przez zapis. Żeby było jasne, ten argument nie określa katalogu, w którym należy szukać pliku. Po prostu pozwala odzyskać obiekt katalogu, w którym znaleziono plik. Ale gdy szukamy pliku po jego ścieżce, znamy już katalog nadrzędny. Ten drugi argument absolutnie nie jest istotny. Być może w niektórych przypadkach uda nam się zdobyć kilka linijek kodu.

Z drugiej strony należy zachować ostrożność, jeśli plik nie istnieje, funkcja umieści Null w drugim argumencie. W moim minimalnym przykładzie getFileFromPath może opróżnić eFolder, przypisując go do Null, i zawiesić resztę. Cóż, to był tylko przykład.