AnsweredAssumed Answered

How to get latest version of file in task

Question asked by Stefan Jaekel on Feb 15, 2021
Latest reply on Mar 5, 2021 by Stefan Jaekel

Hello,

once more I need your help.

I wrote a Task Add-In in VB.Net.

The task should do the following:

  •    Get the select file (SW drawing)
  •    Read the specified named BOM of the drawing.
  •    Get all data from the BOM.
  •    Copy a excelfile-template to a specific folder.
  •    Put the data from the drawing BOM into the excelfile
  •    Check in the excelfile.

So far not a real challenge. But:

When running the task on the computer designated for the task, the task fails.

I figured out, that happen because the file is not present in the local cache of the task-computer.

When first doing the "Get latest Version", the task runs without error.

 

I put the source code down below.

I know, the code is not perfect.

And every comment to improve the code is welcome.

I just ask you to be kind . Sorry for the comments in German language in the source code.

 

Perhaps someone here can give me a hint how to solve my problem.

 

Thank you so much and stay healhy.

 

Private Sub OnTaskRun(ByRef poCmd As EdmCmd, ByRef ppoData As System.Array)
Dim poVault1 As EdmLib.IEdmVault5
poVault1 = poCmd.mpoVault

'Get the property interface used to access the framework
Dim inst As IEdmTaskInstance
inst = poCmd.mpoExtra

On Error GoTo ErrHand
'Inform the framework that the task has started
inst.SetStatus(EdmTaskStatus.EdmTaskStat_Running)

'Format a message to be displayed in the task list
Dim msg As String
msg = "ET-Listenerstellung läuft:"

Dim vault2 As IEdmVault7 = Nothing

vault2 = DirectCast(poVault1, IEdmVault7)

'Dim AffectedFile As EdmCmdData
'AffectedFile = ppoData(0)
Dim ArSize As Integer
Dim k As Integer
Dim FFile As EdmCmdData
Dim AffectedFileName As String = Nothing
Dim StepFileName As String = Nothing
ArSize = ppoData.Length

k = 0
Dim rawRefs As IEdmRawReferenceMgr
Dim refs() As EdmRawReference = Nothing

While k < ArSize
FFile = ppoData(k)
AffectedFileName = FFile.mbsStrData1 'Hier den Dateinamen auslesen

'Schauen wir erstmal nach, ob es eine Baugruppe zur Zeichnung gibt, die auch eine Montagebaugruppe ist
rawRefs = poVault1.CreateUtility(EdmUtility.EdmUtil_RawReferenceMgr) 'Die Referenzen auslesen
Dim fileRefsSupported As Boolean
Dim arrSize1 As Integer
fileRefsSupported = rawRefs.Open(AffectedFileName) 'Checken, ob die Datei überhaupt die Referenzen unterstütz

'Wenn keine Referenzen unterstützt werden, dann gehe zum nächsten Schritt
If Not fileRefsSupported Then
k = k + 1
Continue While
End If

rawRefs.GetReferences(refs) 'Lese die Referenzen aus.
arrSize1 = refs.Length 'Wie viele Referenzen gibt es

'Wenn es keine Refernzen gibt, dann gehe zum nächsten Schritt
If arrSize1 = 0 Then
k = k + 1
Continue While
End If

Dim Baugruppe As IEdmFile7

Baugruppe = poVault1.GetFileFromPath(refs(0).mbsIncludePath) 'hier die Baugruppe zur Zeichnung einlesen

rawRefs.Close()

'Jetzt die Informationen vom Datensatz der Zeichnung holen
Zeichnung = poVault1.GetFileFromPath(AffectedFileName)

Dim Folder_pos As IEdmPos5 = Zeichnung.GetFirstFolderPosition
Dim Folder_Drw As IEdmFolder5 = Zeichnung.GetNextFolder(Folder_pos)
Dim DrawingFolder As String = Folder_Drw.LocalPath
Dim CardVar = Zeichnung.GetEnumeratorVariable
Dim ZNummer As String = Nothing
Dim Title_DE As String = Nothing
Dim Title_EN As String = Nothing
Dim BGArtikelnr As String = Nothing
Dim ZKonfig As String = Nothing
Dim Revision As String = Nothing
CardVar.GetVar("Number", "@", ZNummer)
CardVar.GetVar("Konfiguration", "@", ZKonfig)
CardVar.GetVar("Title", "@", Title_DE)
CardVar.GetVar("Title_EN", "@", Title_EN)
CardVar.GetVar("ItemNumber", "@", BGArtikelnr)
CardVar.GetVar("Revision", "@", Revision)
Dim BGName As String = Title_DE & vbLf & Title_EN
If Revision = Nothing Then Revision = "00"
If ZKonfig = Nothing Then ZKonfig = "Standard"

'Jetzt checken, ob die Baugruppe eine Monatgebaugrupppe ist
Baugruppe = poVault1.GetFileFromPath(refs(0).mbsIncludePath) 'hier die Baugruppe zur Zeichnung einlesen
Dim Montagebaugruppe As String = Nothing
Dim BGCardVar = Baugruppe.GetEnumeratorVariable
BGCardVar.GetVar("Fertigungsart", ZKonfig, Montagebaugruppe)

'Wenn es keine Montagebaugruppe ist, gehe zum nächsten Schritt
If Montagebaugruppe <> "Montagebaugruppe" Then
k = k + 1
Continue While
End If

Dim derivedBOMs() As EdmBomInfo = Nothing
Zeichnung.GetDerivedBOMs(derivedBOMs)

Dim arrSizeI As Integer
Dim arrSize As Integer
Dim ppoVersions() As EdmBomVersion = Nothing
Dim i As Integer = 0
Dim ii As Integer = 0
Dim j As Integer = 0
Dim id As Integer
Dim str As String = ""
Dim verstr As String = ""
arrSizeI = derivedBOMs.Length
Dim NamedBOM As String = Nothing
NamedBOM = Zeichnung.Name + ": Stückliste" 'Dies ist der Name der Stückliste die gesucht wird.

'Zuerst nach der richtigen Stückliste suchen. Hierbei wird das Array der Stücklisten rückwärts durchlaufen.
'Da die richtige Stückliste sehr wahrscheinlich am Ende des Arrays zu finden ist.
ii = arrSizeI
'Wenn es gar keine Stückliste auf der Zeichnung gibt dann gehe zum nächsten gefundenen Datensatz.
If arrSizeI = 0 Then Continue While 'Wenn der Array = 0 ist, dann existiert keine Stückliste auf der Zeichnung. Gehe zum nächsten Datensatz

While ii > 0
ii = ii - 1
id = derivedBOMs(ii).mlBomID
If derivedBOMs(ii).mbsBomName = NamedBOM Then Exit While 'Wurde die Stückliste gefunden, dann nichts wie raus hier....
End While
bom = vault2.GetObject(EdmObjectType.EdmObject_BOM, id) 'Hier wird die Stückliste anhand der ID geholt

'Wenn der Name der "bom" nicht dem gewünschten Format (Stückliste) entspricht dann gehe zum nächsten Datensatz
If bom.Name <> NamedBOM Then
k = k + 1
Continue While
End If

'Nun sollte alles da sein, was nötig ist um die Stücklisten zu erstellen.
'- Es gibt eine Referenz zur Zeichnung
'- Es handelt sich um eine Montagebaugruppe
'- Es gibt eine Stückliste auf der Zeichnung
'- Die Stückliste mit dem Namen "Stückliste" befindet sich auf der Zeichnung.

CopyETListe(DrawingFolder, ZNummer, Revision, poVault1) 'Hier wird die Stücklistenvorlage in das passende Verzeichnis kopiert

bomView = bom.GetView(0)
Dim ppoRows1() As Object = Nothing
Dim ppoRow1 As IEdmBomCell
bomView.GetRows(ppoRows1)
i = 0
arrSize = ppoRows1.Length
str = ""

'FetchVarIDs() 'V7.0 Keine IDs suchen. Die werden fest vergeben.

Dim ListenArray(arrSize - 1, 4) As String

Dim ParentFolder As IEdmFolder5 = Nothing
'Dim File As IEdmFile5 'V8.0 auskommentiert
'Dim varEnum As IEdmEnumeratorVariable8 'V8.0 auskommentiert
Dim poComputedValue As Object = Nothing
Dim pbsConfiguration As String = "@"
Dim pbReadOnly As Boolean

Dim poPos As Object = Nothing 'Die Positionsnummer der Stückliste
Dim poMenge As Object = Nothing 'Die Menge der Position
Dim poNr As Object = Nothing 'Die Nummer der Position
Dim poUnit As Object = Nothing 'Die Einheit der Zeile
Dim poDescription_DE As Object = Nothing 'Die deutsche Beschreibung der Zeile
Dim poDescription_EN As Object = Nothing 'Die englische Beschreibung der Zeile
Dim Description As String = Nothing 'Die deutsche und englische Beschriebung zusammen

While i < arrSize
ppoRow1 = ppoRows1(i)
'File = poVault1.GetFileFromPath(ppoRow1.GetPathName, ParentFolder) 'V8.0 auskommentiert
'varEnum = File.GetEnumeratorVariable 'V8.0 auskommentiert
ppoRow1.GetVar(0, 26, poPos, poComputedValue, pbsConfiguration, pbReadOnly) 'Die Position auslesen
ppoRow1.GetVar(60, 0, poNr, poComputedValue, pbsConfiguration, pbReadOnly) 'Die Artikelnummer auslesen
If poNr = "" Then 'Wenn die Artikelnummer leer ist dann..
ppoRow1.GetVar(52, 0, poNr, poComputedValue, pbsConfiguration, pbReadOnly) 'nehme die Zeichnungsnummer
End If
ppoRow1.GetVar(0, 11, poMenge, poComputedValue, pbsConfiguration, pbReadOnly) 'Die Anzahl auslesen
ppoRow1.GetVar(58, 0, poUnit, poComputedValue, pbsConfiguration, pbReadOnly) 'Die Einheit auslesen
ppoRow1.GetVar(56, 0, poDescription_DE, poComputedValue, pbsConfiguration, pbReadOnly) 'Die deutsche Beschreibung auslesen
ppoRow1.GetVar(113, 0, poDescription_EN, poComputedValue, pbsConfiguration, pbReadOnly) 'Die englische Beschreibung auslesen
Description = poDescription_DE & vbLf & poDescription_EN 'Und hier die beiden Beschriebungen zusammenführen
'Nun das Array basteln um die Daten späten in die Liste schreiben zu lassen
ListenArray(i, 0) = poPos
ListenArray(i, 1) = poNr
ListenArray(i, 2) = poMenge
ListenArray(i, 3) = poUnit
ListenArray(i, 4) = Description
'Hier eine Auflistung der gefundenen Informationen
str = "BOM Row " & i & ": " & vbLf & _
"Item ID: " & ppoRow1.GetItemID & vbLf & _
"Path name: " & ppoRow1.GetPathName & vbLf & _
"Tree level: " & ppoRow1.GetTreeLevel & vbLf & _
" Is locked? " & ppoRow1.IsLocked & vbLf & _
"Pos: " & poPos & vbLf & _
"Nummer: " & poNr & vbLf & _
"Einheit: " & poUnit & vbLf & _
"Beschreibung: " & Description
' MessageBox.Show(str)
i = i + 1
'varEnum.CloseFile(True) 'V8.0 auskommetiert
End While

'So: hier wird die Exceldatei geöffnet und mit Werten gefüllt.
'Dazu gilt es ein Vorher Array mit den nötgien Informationen aufzubauen und dieses Array an die Sub zu übergeben.

Dim DesName As String = DrawingFolder + "\Ersatzteillisten\" + ZNummer + "-" + Revision + "_Ersatzteilliste.xlsx"

InsertData(DesName, ListenArray, poVault1, ZNummer, BGName, BGArtikelnr)

Aufgaben = Aufgaben + ZNummer + vbCrLf
'Nun den Excelprozess beenden
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
k = k + 1

End While
'Die bearbeiteten Zeichnungen in die Details Page eintragen
Dim insta As IEdmTaskInstance
insta = poCmd.mpoExtra
insta.SetValEx("MyLaunchVar", Aufgaben)

'Inform the framework that the task has successfully completed
inst.SetStatus(EdmTaskStatus.EdmTaskStat_DoneOK)
Exit Sub

ErrHand:
'Return errors to the framework by failing the task
inst.SetStatus(EdmTaskStatus.EdmTaskStat_DoneFailed, Err.Number, "The test task failed!")
End Sub

Public Sub InsertData(FileName As String, DatenArray As Array, vault1 As IEdmVault5, BGNummer As String, BGName As String, BGArtikelnr As String)
Dim xlApp As Microsoft.Office.Interop.Excel.Application
Dim xlWorkBook As Microsoft.Office.Interop.Excel.Workbook = Nothing
Dim xlWorkSheet As Microsoft.Office.Interop.Excel.Worksheet
Dim SizeArr As Integer
SizeArr = DatenArray.GetUpperBound(0)
Dim i As Integer = 0
Dim SpaltePos As Integer = 1
Dim SpalteNr As Integer = 2
Dim SpalteMenge As Integer = 3
Dim SpalteEinheit As Integer = 4
Dim SpalteDescription As Integer = 5
Dim StartZeile As Integer = 6
Dim ETFile As IEdmFile5 = Nothing
Dim parentFolder As IEdmFolder5 = Nothing
Dim Variablen As IEdmEnumeratorVariable8
Dim aFileName As String = Nothing

ETFile = vault1.GetFileFromPath(FileName, parentFolder)
'Auschecken
If Not ETFile.IsLocked Then
ETFile.LockFile(parentFolder.ID, 0, CInt(EdmLockFlag.EdmLock_Simple))
End If
xlApp = New Microsoft.Office.Interop.Excel.Application

If IO.File.Exists(FileName) Then xlWorkBook = xlApp.Workbooks.Open(FileName)
xlApp.DisplayAlerts = False
xlApp.Visible = False
xlWorkSheet = xlWorkBook.Worksheets("Stückliste")
Dim SourceR As Microsoft.Office.Interop.Excel.Range
Dim TargetR As Microsoft.Office.Interop.Excel.Range
xlWorkSheet.Cells(4, 1) = BGArtikelnr
xlWorkSheet.Cells(4, 3) = BGName
xlWorkSheet.Cells(4, 6) = BGNummer
'Wenn die Anzahl der Positionen zu groß ist, dann muss die Tabelle erweitert werden.
If SizeArr > 28 - StartZeile Then
For ii = 0 To SizeArr - 28 + StartZeile
SourceR = xlWorkSheet.Rows(25) 'Die Zeile 25 merken als Quelle
TargetR = xlWorkSheet.Rows(26) 'Die Zeile 26 merken als Ziel
SourceR.Copy() 'Quelle kopieren
TargetR.Insert() 'im Ziel einfügen
Next
End If
While i < SizeArr + 1
xlWorkSheet.Cells(StartZeile + i, SpaltePos) = DatenArray(i, 0)
xlWorkSheet.Cells(StartZeile + i, SpalteNr) = DatenArray(i, 1)
xlWorkSheet.Cells(StartZeile + i, SpalteMenge) = DatenArray(i, 2)
xlWorkSheet.Cells(StartZeile + i, SpalteEinheit) = DatenArray(i, 3)
xlWorkSheet.Cells(StartZeile + i, SpalteDescription) = DatenArray(i, 4)
i = i + 1
End While
xlWorkBook.Close(SaveChanges:=True)
xlApp.Workbooks.Close()
xlApp.Quit()

xlWorkSheet = Nothing
xlWorkBook = Nothing
xlApp = Nothing

Variablen = ETFile.GetEnumeratorVariable(aFileName)
Variablen.SetVar("Title", "", "Ersatzteilliste")
Variablen.SetVar("DocumentType", "", "Ersatzteilliste")
Variablen.SetVar("ET-NummerBG", "", BGNummer)
Variablen.SetVar("Number", "", BGNummer)
Variablen.SetVar("ET-RevisionBG", "", Zeichnung.CurrentRevision)
Variablen.CloseFile(True)

ETFile.UnlockFile(0, "Insert data")
End Sub

Public Sub CopyETListe(DrwFolder As String, DestName As String, Revision As String, vault1 As IEdmVault5)
Dim SRCxlsx As IEdmFile5
Dim SRCFolder As IEdmFolder5 = Nothing
Dim SRCFolderStr As String = vault1.RootFolderPath & "\Systemdaten\Stücklisten-Vorlagen\Ersatzteilliste.xlsx"
SRCxlsx = vault1.GetFileFromPath(SRCFolderStr, SRCFolder)

Dim DelFile As IEdmFile5 = Nothing
Dim DelFolder As IEdmFolder5 = Nothing
Dim DelFolderStr As String
Dim ETOrdner As IEdmFolder5

DelFolderStr = DrwFolder & "\Ersatzteillisten\" & DestName & "-" & Revision & "_Ersatzteilliste.xlsx"
DelFile = vault1.GetFileFromPath(DelFolderStr, DelFolder)
ETOrdner = vault1.GetFolderFromPath(DrwFolder)

If DelFile Is Nothing Then

If vault1.GetFolderFromPath(DrwFolder & "\Ersatzteillisten\") Is Nothing Then 'Wenn es den Ordner Ersatzteillisten nicht gibt dann
Dim data As EdmFolderData
data = New EdmFolderData
Dim folder As IEdmFolder5
folder = ETOrdner.AddFolder(0, "Ersatzteillisten", data)
End If


Dim DestFolder As IEdmFolder5 = Nothing
DestFolder = vault1.GetFolderFromPath(DrwFolder & "\Ersatzteillisten")

DestFolder.AddFile(0, SRCFolderStr, DestName & "-" & Revision & "_Ersatzteilliste.xlsx", 128)

End If
End Sub

Outcomes