04-18-2016 02:34 AM - edited 04-18-2016 02:35 AM
Hello!
After the end of my second day of try error, i have to bring this quesiton to the table:
I am using ArraytoChannels function to store ADO recordsets as channels. What is strange is that for the first recordset, it works; but for the next time in the loop, it always fails with the error message "Cannot append, because the target channels are not all the same length".
I confirmed that:
the sizes of the RowData and the ChannelNames are equal,
both pass the isarray =true test,
i change the order of the ChannelNames,
i reconnected/disconnected from/to the oConnection each time, nothing changed.
I am apparently missing something -but going crazy to figure out what! - if anybody can share his/her opinion I will so much appriciate. Here is my code:
oTables=Array("WellStates","ChokeData","WellParameters", "FlowData","PumpData","SensorsData", "ModelCalculatedData")
Call OpenSQLConnection
Set oRecordset = CreateObject("ADODB.Recordset")
Call SelectWell
Call GetWellStateIDs
Data.Root.Clear
for j=0 to ubound(oTables,1)
sSQLSting = "select * from [" & oTables(j) & "] where [WellStateID] between " & WellStateIDFirst & " and " & WellStateIDLast
oRecordset.Open sSQLSting, oConnection
Dim oFieldNames : Array : ReDim oFieldNames(orecordset.Fields.count-1)
for i=0 to orecordset.Fields.count-1
oFieldNames(i)=orecordset.Fields.item(i).name
next
oArray=oRecordset.GetRows(-1,0,oFieldNames)
Set oGroup=Data.Root.ChannelGroups.Add(oTables(j))
arraytochannels oArray, oFieldNames
oRecordset.close
oConnection.Close
next
sub GetWellStateIDs
sSQLSting = "select * from [WellStates] where [wellid]=" & WellID
oRecordset.Open sSQLSting, oConnection
oArray=oRecordset.GetRows()
WellStateIDFirst=oArray(0,0)
WellStateIDLast=oArray(0,ubound(oArray,2))
oRecordset.close
end sub
sub OpenSQLConnection
Set WshNetwork = CreateObject("WScript.Network")
oComputerName = WshNetwork.ComputerName
oDB="MX2.Player.DB"
Set oConnection = CreateObject("ADODB.Connection")
oProvider = "Provider=SQLOLEDB.1;Integrated Security =SSPI;PeoExecuteist Security Info=True;Data Source="
oProvider = oProvider & oComputerName & "\MX;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID="
oProvider = oProvider & oComputerName & ";Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog="
oProvider = oProvider & oDB
oConnection.ConnectionString = oProvider
oConnection.Open
end sub
Solved! Go to Solution.
04-19-2016 12:53 AM - edited 04-19-2016 01:16 AM
The ArrayToChannels method behaves a little currious.
It just takes the channel name into acount not taking looking for group or anything else.
i used an ugly woraround by appending a string at the end of each channel name and removing it at the end.
oTables=Array("WellStates","ChokeData","WellParameters", "FlowData","PumpData","SensorsData", "ModelCalculatedData")
Dim MyArray(1,10000), MyChannels(1), I
For I = 0 to 10000
MyArray(0,I)=2*Pi*I/10000
MyArray(1,I)=Sin(2*Pi*I/10000)
Next
MyChannels(0)="X Channel"
MyChannels(1)="Sin Channel"
const uniqueStr = "______"
Data.Root.Clear
for j=0 to ubound(oTables,1)
Set oGroup=Data.Root.ChannelGroups.Add(oTables(j))
ogroup.Activate
dim chList : chList = ArrayToChannels(MyArray, MyChannels)
dim chRef : for each chRef in chList
dim chObj : set chObj = data.GetChannels(chRef).Item(1)
chObj.name = chObj.Name & uniqueStr
Next
next
dim grpObj : for each grpObj in data.Root.ChannelGroups
dim chOb : for each chOb in grpObj.Channels
chOb.Name = left(chOb.Name, len(chOb.Name) - len(uniqueStr))
Next
Next
The newly created group also has to be marked as active to be used as target.
Hope you can use this example.
04-19-2016 01:31 AM
Another hint. If you check the DIAdem help for
Microsoft Windows Script Debugger
you are able to install the debugger in DIAdem.
It would potentially have shown you that the command is not working like expected.
Sorry for the inconveniance
Andreas
04-19-2016 01:44 AM
Found a better solution. It is possible to put the group names into the names field as channel reference.
So if you just replace
Set oGroup=Data.Root.ChannelGroups.Add(oTables(j)) arraytochannels oArray, oFieldNames
by
Set oGroup=Data.Root.ChannelGroups.Add(oTables(j))
dim newChNames : newChNames = Array()
redim newChNames(UBound(oFieldNames))
dim nI : for nI = 0 to Ubound(oFieldNames)
newChNames(nI) = oGroup.Name & "/" & oFieldNames(nI)
Next
arraytochannels oArray, newChNames
it should work.
I just append the running example:
oTables=Array("WellStates","ChokeData","WellParameters", "FlowData","PumpData","SensorsData", "ModelCalculatedData")
Dim oArray(1,10000), oFieldNames(1), I
For I = 0 to 10000
oArray(0,I)=2*Pi*I/10000
oArray(1,I)=Sin(2*Pi*I/10000)
Next
oFieldNames(0)="X Channel"
oFieldNames(1)="Sin Channel"
Data.Root.Clear
for j=0 to ubound(oTables,1)
Set oGroup=Data.Root.ChannelGroups.Add(oTables(j))
dim newChNames : newChNames = Array()
redim newChNames(UBound(oFieldNames))
dim nI : for nI = 0 to Ubound(oFieldNames)
newChNames(nI) = oGroup.Name & "/" & oFieldNames(nI)
Next
arraytochannels oArray, newChNames
next
04-19-2016 09:10 AM
Hi Andreas,
Many thanks for the prompt and detailed explanation - i will try this now and hopefully this time will make it work.
Cheers! 🙂
04-20-2016 10:05 AM
it worked!
thanks again!
03-28-2024 07:15 PM
I came here fighting the same error due to a channel I was trying to create in two different groups with the same name. This solution (adding group names) worked perfectly. Just what I needed!