Mapping Automation problem

May I know if my mapping is right?


Mapping

because when i ran this code it cause an error (Invoke Code Customize dtRawCo: Exception has been thrown by the target of an invocation.)

Dim indexRawCO As Int32
Dim columnRemoveList As New List(Of Int32)

Dim segmentName = If(segment.Contains(“RESIN”), “RESIN”,“NFM”)

For Each column As DataColumn In dtRawCO.Columns
Dim mapping As IEnumerable(Of DataRow) = dtExcelCOColumnMap.AsEnumerable.Where(
Function(rowColMap) CInt(rowColMap(segmentName+" Column Number")) = indexRawCO
)
If mapping.Count = 1 Then
column.ColumnName = mapping(0)(“Column Name”).ToString
Else
columnRemoveList.Add(indexRawCO)
End If
indexRawCO +=1
Next
columnRemoveList.Reverse
For Each colRemove As Int32 In columnRemoveList
dtRawCO.Columns.RemoveAt(colRemove)
Next

Dim coRowItems As IEnumerable(Of DataRow) = dtRawCO.AsEnumerable.Where(
Function(row) Int32.TryParse(row(“Item No”).ToString,Nothing) And
Not row.ItemArray.Skip(1).All(Function(item) String.IsNullOrEmpty(item.ToString)) And
Not row.ItemArray.Any(
Function(item) item.ToString.ToUpper.Contains(“FIXED”))
)

If coRowItems.Count > 0 Then
dtRawCO = coRowItems.CopyToDataTable
Else
dtRawCO = dtRawCO.Clone
End If

Try Below code I have made few changes for better stability

  • Initialize indexRawCO to 0.
  • Add () when calling Reverse.
  • Ensure TryParse is used correctly with the return value.
  • Add a check for valid column indices when removing columns from dtRawCO.
Dim indexRawCO As Int32 = 0
Dim columnRemoveList As New List(Of Int32)

Dim segmentName = If(segment.Contains("RESIN"), "RESIN", "NFM")

For Each column As DataColumn In dtRawCO.Columns
    Dim mapping As IEnumerable(Of DataRow) = dtExcelCOColumnMap.AsEnumerable.Where(
        Function(rowColMap) CInt(rowColMap(segmentName + " Column Number")) = indexRawCO
    )
    If mapping.Count = 1 Then
        column.ColumnName = mapping(0)("Column Name").ToString()
    Else
        columnRemoveList.Add(indexRawCO)
    End If
    indexRawCO += 1
Next

columnRemoveList.Reverse() ' Added parentheses
For Each colRemove As Int32 In columnRemoveList
    If colRemove >= 0 AndAlso colRemove < dtRawCO.Columns.Count Then ' Check bounds
        dtRawCO.Columns.RemoveAt(colRemove)
    End If
Next

Dim coRowItems As IEnumerable(Of DataRow) = dtRawCO.AsEnumerable.Where(
    Function(row)
        Dim itemNo As Integer
        Dim isValidItemNo As Boolean = Int32.TryParse(row("Item No").ToString(), itemNo)
        Return isValidItemNo AndAlso
               Not row.ItemArray.Skip(1).All(Function(item) String.IsNullOrEmpty(item.ToString())) AndAlso
               Not row.ItemArray.Any(Function(item) item.ToString().ToUpper().Contains("FIXED"))
    End Function
)

If coRowItems.Any() Then ' Used Any() instead of Count
    dtRawCO = coRowItems.CopyToDataTable()
Else
    dtRawCO = dtRawCO.Clone()
End If