// This example shows how to obtain a data type of all OPC XML-DA items under a branch.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in Object Pascal (Delphi) on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-OP .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.
class procedure GetMultiplePropertyValues.DataTypeXml;
var
  Arguments: OleVariant;
  BrowseParameters: _DABrowseParameters;
  Client: OpcLabs_EasyOpcClassic_TLB._EasyDAClient;
  Count: Cardinal;
  Element: OleVariant;
  I: Cardinal;
  PropertyArguments: _DAPropertyArguments;
  ServerDescriptor: _ServerDescriptor;
  NodeDescriptor: _DANodeDescriptor;
//  NodeDescriptorArray: Array of DANodeDescriptor;
  NodeElement: _DANodeElement;
  NodeElementCollection: _DANodeElementCollection;
  NodeElementEnumerator: IEnumVariant;
  ValueResult: _ValueResult;
  ValueResultArray: OleVariant;
  VarType: _VarType;
begin
  ServerDescriptor := CoServerDescriptor.Create;
  ServerDescriptor.UrlString := 'http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx';
  NodeDescriptor := CoDANodeDescriptor.Create;
  NodeDescriptor.ItemId := 'Static/Analog Types';
  BrowseParameters := CoDABrowseParameters.Create;
  BrowseParameters.BrowseFilter := DABrowseFilter_Leaves;
  // Instantiate the client object
  Client := CoEasyDAClient.Create;
  // Browse for all leaves under the "Static/Analog Types" branch
  NodeElementCollection := Client.BrowseNodes(
      ServerDescriptor,
      NodeDescriptor,
      BrowseParameters);
  // Create list of node descriptors, one for aeach leaf obtained
  I := 0;
  Arguments := VarArrayCreate([0, NodeElementCollection.Count - 1], varVariant);
  NodeElementEnumerator := NodeElementCollection.GetEnumerator;
  while (NodeElementEnumerator.Next(1, Element, Count) = S_OK) do
  begin
    NodeElement := IUnknown(Element) as _DANodeElement;
    // filter out hint leafs that do not represent real OPC XML-DA items (rare)
    if Not NodeElement.IsHint then
    begin
      PropertyArguments := CoDAPropertyArguments.Create;
      PropertyArguments.ServerDescriptor := ServerDescriptor;
      PropertyArguments.NodeDescriptor := NodeElement.ToDANodeDescriptor;
      PropertyArguments.PropertyDescriptor.PropertyId.InternalValue := DAPropertyIds_DataType;
      Arguments[I] := PropertyArguments;
      I := I + 1;
    end;
  end;
//  SetLength(Arguments, I);
  // Get the value of DataType property; it is a 16-bit signed integer
  TVarData(ValueResultArray).VType := varArray or varVariant;
  TVarData(ValueResultArray).VArray := PVarArray(
    Client.GetMultiplePropertyValues(Arguments));
  // Display results
  for I := VarArrayLowBound(ValueResultArray, 1) to VarArrayHighBound(ValueResultArray, 1) do
  begin
      ValueResult := IInterface(ValueResultArray[I]) as _ValueResult;
      // Check if there has been an error getting the property value
      if ValueResult.Exception <> nil then
      begin
        WriteLn(Format('s *** Failures', [Arguments[I].NodeDescriptor.NodeId, ValueResult.Exception.Message]));
        Continue;
      end;
      // Convert the data type to VarType
      VarType := CoVarType.Create;
      VarType.InternalValue := ValueResult.Value;
      // Display the obtained data type
      WriteLn(Format(' s', [Arguments[I].NodeDescriptor.NodeId, VarType.ToString]));
  end;
  VarClear(ValueResultArray);
  VarClear(Arguments);
end;
	 
	
		// This example shows how to obtain a data type of all OPC XML-DA items under a branch.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in PHP on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-PHP .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.
const DABrowseFilter_Leaves = 3;
const DAPropertyIds_DataType = 1;
$ServerDescriptor = new COM("OpcLabs.EasyOpc.ServerDescriptor");
$ServerDescriptor->UrlString = "http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx";
$NodeDescriptor = new COM("OpcLabs.EasyOpc.DataAccess.DANodeDescriptor");
$NodeDescriptor->ItemID = "Static/Analog Types";
$BrowseParameters = new COM("OpcLabs.EasyOpc.DataAccess.DABrowseParameters");
$BrowseParameters->BrowseFilter = DABrowseFilter_Leaves;
$Client = new COM("OpcLabs.EasyOpc.DataAccess.EasyDAClient");
// Browse for all leaves under the "Static/Analog Types" branch
$NodeElementCollection = $Client->BrowseNodes($ServerDescriptor, $NodeDescriptor, $BrowseParameters)->ToList();
$PropertyArgumentArray = array();
for ($i = 0; $i < $NodeElementCollection->Count(); $i++)
{
    if (!($NodeElementCollection[$i]->IsHint)) // filter out hint leafs that do not represent real OPC items (rare)
    {
        $PropertyArguments = new COM("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments");
        $PropertyArguments->ServerDescriptor = $ServerDescriptor;
        $PropertyArguments->NodeDescriptor = $NodeElementCollection[$i]->ToDANodeDescriptor();
        $PropertyArguments->PropertyDescriptor->PropertyId->InternalValue = DAPropertyIds_DataType;
        $PropertyArgumentArray[] = $PropertyArguments;
    }
}
// Get the value of DataType property; it is a 16-bit signed integer
$valueResultArray = $Client->GetMultiplePropertyValues($PropertyArgumentArray);
for ($i = 0; $i < count($valueResultArray); $i++)
{
    // Check if there has been an error getting the property value
    $valueResult = $valueResultArray[$i];
    if (!is_null($valueResult->Exception))
    {
        printf("[s]: *** Failures\n", $PropertyArgumentArray[$i]->NodeDescriptor->NodeId, $valueResults->Exception->Message);
        continue;
    }
    // Convert the data type to VarType
    $VarType = new COM("OpcLabs.BaseLib.ComInterop.VarType");
    $VarType->InternalValue = $valueResult->Value;
    // Display the obtained data type
    printf("[s]s\n", $PropertyArgumentArray[$i]->NodeDescriptor->NodeId, $VarType);
}
	 
	
		Rem This example shows how to obtain a data type of all OPC XML-DA items under a branch.
Rem
REM Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
REM OPC client and subscriber examples in Visual Basic on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VB .
REM Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
REM a commercial license in order to use Online Forums, and we reply to every post.
Private Sub GetMultiplePropertyValues_DataTypeXml_Command_Click()
    OutputText = ""
    
    Dim serverDescriptor As New serverDescriptor
    serverDescriptor.UrlString = "http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx"
    Dim NodeDescriptor As New DANodeDescriptor
    NodeDescriptor.ItemId = "Static/Analog Types"
    
    Dim BrowseParameters As New DABrowseParameters
    BrowseParameters.BrowseFilter = DABrowseFilter_Leaves
    
    ' Instantiate the client object
    Dim client As New EasyDAClient
    ' Browse for all leaves under the "Static/Analog Types" branch
    Dim NodeElementCollection As DANodeElementCollection
    Set NodeElementCollection = client.BrowseNodes(serverDescriptor, NodeDescriptor, BrowseParameters)
    
    ' Create list of node descriptors, one for each leaf obtained
    Dim arguments()
    ReDim arguments(NodeElementCollection.Count)
    Dim i: i = 0
    Dim NodeElement: For Each NodeElement In NodeElementCollection
        ' filter out hint leafs that do not represent real OPC XML-DA items (rare)
        If Not NodeElement.IsHint Then
            Dim PropertyArguments As New DAPropertyArguments
            Set PropertyArguments.serverDescriptor = serverDescriptor
            Set PropertyArguments.NodeDescriptor = NodeElement.ToDANodeDescriptor
            PropertyArguments.PropertyDescriptor.PropertyId.NumericalValue = DAPropertyIds_DataType
            Set arguments(i) = PropertyArguments
            Set PropertyArguments = Nothing
            i = i + 1
        End If
    Next
    Dim propertyArgumentArray()
    ReDim propertyArgumentArray(i - 1)
    Dim j: For j = 0 To i - 1
        Set propertyArgumentArray(j) = arguments(j)
    Next
    ' Get the value of DataType property; it is a 16-bit signed integer
    Dim valueResultArray() As Variant
    valueResultArray = client.GetMultiplePropertyValues(propertyArgumentArray)
    ' Display results
    For j = 0 To i - 1
        Dim NodeDescriptor2 As DANodeDescriptor
        Set NodeDescriptor2 = propertyArgumentArray(j).NodeDescriptor
                
        Dim ValueResult As ValueResult: Set ValueResult = valueResultArray(j)
        ' Check if there has been an error getting the property value
        If Not ValueResult.Exception Is Nothing Then
            OutputText = OutputText & NodeDescriptor2.NodeId & " *** Failure: " & ValueResult.Exception.Message & vbCrLf
        Else
          ' Display the obtained data type
          Dim VarType As New VarType
          VarType.InternalValue = ValueResult.value
          OutputText = OutputText & NodeDescriptor2.NodeId & ": " & VarType & vbCrLf
        End If
    Next
End Sub
	 
	
		Rem This example shows how to obtain a data type of all OPC XML-DA items under a branch.
Rem
Rem Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
Rem OPC client and subscriber examples in VBScript on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBScript .
Rem Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
Rem a commercial license in order to use Online Forums, and we reply to every post.
Option Explicit
Const DABrowseFilter_Leaves = 3
Const DAPropertyIds_DataType = 1
Dim ServerDescriptor: Set ServerDescriptor = CreateObject("OpcLabs.EasyOpc.ServerDescriptor")
ServerDescriptor.UrlString = "http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx"
Dim NodeDescriptor: Set NodeDescriptor = CreateObject("OpcLabs.EasyOpc.DataAccess.DANodeDescriptor")
NodeDescriptor.ItemID = "Static/Analog Types"
Dim BrowseParameters: Set BrowseParameters = CreateObject("OpcLabs.EasyOpc.DataAccess.DABrowseParameters")
BrowseParameters.BrowseFilter = DABrowseFilter_Leaves
Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.DataAccess.EasyDAClient")
' Browse for all leaves under the "Static/Analog Types" branch
Dim NodeElementCollection: Set NodeElementCollection = client.BrowseNodes(serverDescriptor, nodeDescriptor, browseParameters)
' Create list of node descriptors, one for each leaf obtained
Dim arguments()
Redim arguments(nodeElementCollection.Count)
Dim i: i = 0
Dim NodeElement: For Each NodeElement In NodeElementCollection
    ' filter out hint leafs that do not represent real OPC XML-DA items (rare)
    If Not NodeElement.IsHint Then
    Dim PropertyArguments: Set PropertyArguments = CreateObject("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments")
    PropertyArguments.ServerDescriptor = ServerDescriptor
    PropertyArguments.NodeDescriptor = NodeElement.ToDANodeDescriptor
        PropertyArguments.PropertyDescriptor.PropertyId.InternalValue = DAPropertyIds_DataType
    Set arguments(i) = PropertyArguments
    i = i + 1
    End If    
Next
Dim propertyArgumentArray()
ReDim propertyArgumentArray(i - 1)
Dim j: For j = 0 To i - 1
    Set propertyArgumentArray(j) = arguments(j)
Next
' Get the value of DataType property; it is a 16-bit signed integer
Dim valueResultArray: valueResultArray = client.GetMultiplePropertyValues(propertyArgumentArray)
For j = 0 To i - 1
    Dim NodeDescriptor2: Set NodeDescriptor2 = propertyArgumentArray(j).NodeDescriptor
    ' Check if there has been an error getting the property value
    If Not (valueResultArray(j).Exception Is Nothing) Then
        WScript.Echo NodeDescriptor2.NodeId & " *** Failure: " & valueResultArray(j).Exception.Message
    Else
        ' Display the obtained data type
        Dim VarType: Set VarType = CreateObject("OpcLabs.BaseLib.ComInterop.VarType")
        VarType.InternalValue = valueResultArray(j).Value
        WScript.Echo nodeDescriptor2.NodeId & ": " & VarType
    End If
Next