Copy array data in a dataset using Range

SupportCommunity Automation and VBA Copy array data in a dataset using Range

Ansicht von 5 Beiträgen - 1 bis 5 (von insgesamt 5)
  • Autor
    Beiträge
  • #12382

    I’ve been trying to get data from a simple test array in a dataset using the Range command. Using the ‘Transferring Large Data Sets Section by Section’ example as a guide I made the following procedure:

    
    Private Sub CommandButton2_Click()
      Dim TmpArr(1 To 3) As Single
       
      TmpArr(1) = 2
      TmpArr(2) = 3
      TmpArr(3) = 4
     
      With ActiveDatabase.RootFolder.Add("Signal", fpObjectTypeDataSet)
          .DataStructure = fpDataStructureDataSeries
          .DataType(fpDataComponentAll) = fpDataTypeFloat32
          .NumberOfRows = 3
          .FillColumns "(NumberOfRows(i), FloatingPoint32 0, FloatingPoint32 0)", fpDataComponentAll
          .Update
      End With
      
      ActiveDatabase.RootFolder.Object("Signal").Range(fpDataComponentAll).Value = TmpArr
      
    End Sub
    

    This routing crashes at the Range statement with an ‘Invalid procedure or argument’ error. What am I doing wrong?

    Also, if this is all working, I would like to transfer data from a multidimensional array (50 columns) in 50 individual datasets. Is it possible to do this using the Range statement. In other words, how do I select 1 column in the array?

    #8065

    I’ve been trying to get data from a simple test array in a dataset using the Range command. Using the ‘Transferring Large Data Sets Section by Section’ example as a guide I made the following procedure:

    
    Private Sub CommandButton2_Click()
      Dim TmpArr(1 To 3) As Single
       
      TmpArr(1) = 2
      TmpArr(2) = 3
      TmpArr(3) = 4
     
      With ActiveDatabase.RootFolder.Add("Signal", fpObjectTypeDataSet)
          .DataStructure = fpDataStructureDataSeries
          .DataType(fpDataComponentAll) = fpDataTypeFloat32
          .NumberOfRows = 3
          .FillColumns "(NumberOfRows(i), FloatingPoint32 0, FloatingPoint32 0)", fpDataComponentAll
          .Update
      End With
      
      ActiveDatabase.RootFolder.Object("Signal").Range(fpDataComponentAll).Value = TmpArr
      
    End Sub
    

    This routing crashes at the Range statement with an ‘Invalid procedure or argument’ error. What am I doing wrong?

    Also, if this is all working, I would like to transfer data from a multidimensional array (50 columns) in 50 individual datasets. Is it possible to do this using the Range statement. In other words, how do I select 1 column in the array?

    #8587
    Bernhard KantzBernhard Kantz
    Moderator

    1) At the moment the range method only works if all arguments are defined.
    Example:

    
      Dim TmpArr(1 To 3) As Single
       
      TmpArr(1) = 2
      TmpArr(2) = 3
      TmpArr(3) = 4
     
      With ActiveDatabase.RootFolder.Add("Signal", fpObjectTypeDataSet)
          .DataStructure = fpDataStructureDataSeries
          .DataType(fpDataComponentAll) = fpDataTypeFloat32
          .NumberOfRows = 3
          .Range(fpDataComponentY, 1, 1, .NumberOfColumns, .NumberOfRows).Value = TmpArr
          .Update
      End With
    

    2) Create a FPScript formula for each dataset and use the index operator.

    
    Sub MatrixToDataSeries()
    
        Dim oMatrix As DataSet
        Set oMatrix = ThisDatabase.RootFolder.Object("Matrix", fpObjectTypeDataSet)
        Dim oFml As Formula
        For i = 1 To oMatrix.NumberOfColumns
            Set oFml = ThisDatabase.RootFolder.Add("Dataset" & CStr(i), fpObjectTypeFormula)
            With oFml
                .Formula = "Matrix[" & i - 1 & "]"
                .Update
                .Evaluate
            End With
        Next i
    End Sub
    

    support@weisang.com

    #8588

    Thank you for the quick reply.
    I wasn’t aware that all components of the Range method had to be specified. Flexpro help (Version 7) has these specified as optional, so I left them out. However, the routine is working fine now, thanks for that.

    Regarding the second question:
    I didn’t specify this very clear, but the multidimensional matrix is a VBA matrix, not a Flexpro matrix. I am struggling to select individual columns in the VBA matrix.
    I can now copy the whole matrix from VBA to a Flexpro DataMatrix (using Range) and then split them into individual datasets. However, I would prefer to copy the data columns straight from the VBA matrix to the Flexpro datasets.

    #8589
    Bernhard KantzBernhard Kantz
    Moderator

    Alternatively you have to copy the column values into a new variable.
    Example:

    
      Dim TmpArr(1 To 3, 1 To 2) As Single
       
      TmpArr(1, 1) = 1
      TmpArr(2, 1) = 2
      TmpArr(3, 1) = 3
      TmpArr(1, 2) = 4
      TmpArr(2, 2) = 5
      TmpArr(3, 2) = 6
     
    
      ReDim TmpArr2(LBound(TmpArr, 2) To UBound(TmpArr, 2)) As Single
      
      For i = LBound(TmpArr) To UBound(TmpArr)
        For j = LBound(TmpArr2) To UBound(TmpArr2)
            TmpArr2(j) = TmpArr(i, j)
        Next j
        
        ' Create DataSet
        
      Next i
    

    support@weisang.com

Ansicht von 5 Beiträgen - 1 bis 5 (von insgesamt 5)
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.