vbscript - attempt to automate updating upgrade table at compile time gives error object required

605 Views Asked by At

I am trying to automate a process to update a wise for windows package at compile time to update the productcode, package code, productversion, and the update table versionmax values.

I can successfully update the property table and the summary information for the Package Code. However, the update table is giving me problems. There are several entries in this table.

I can enumerate the existing entries, but I cannot update the existing entries. Each time I attempt to I get an error "Exception: Object required 'project.WTables(...).WRows.Row(...)'

The syntax I am using is identical to the preceding calls to update the ProductCode, ProductVersion, and Package Code.

I am using vbscript.

I am passing in the product version and full path to the wise wsi project file. In the UpdateUpgradeTable function aUpgradeGuids populate correctly with a collection of upgrade codes as I expect. All I want to do now is to change the VersionMax value for each of these codes to the current wiseProductVersion. However, vbscript seems to have some problem with the object WRows.Row(a(i)), which is an actual GUID.

I have looked at other sample scripts in the automation section of help and it does support the use of variables, and it does not look like the variables require quotes like straight text does. I am not even sure what it means, object required. Project is definitely an object. I have confirmed that. I have even tried this by inserting straight text inside the function but it still fails. I have tried it with tblProperty.WRows.Row(...) but it fails the same way. I have tried calling it with a good Upgrade Code outside of the For loop right after Set tblProperty = ... and it still fails. This type of structure works in all previous tables. It has me puzzled. Any ideas? I think this may transcend just Wise for Windows and is perhaps generic to msi as well so I am going to post under MSI too.

I have a sub main that looks like this:

Dim wiseInstallDir: wiseInstallDir = WScript.Arguments(0)
Dim wiseProductVersion: wiseProductVersion = WScript.Arguments(1)

Sub main()
    Set wise = CreateObject("WfWi.Document")
    Dim nResult
    nResult = wise.Open (wiseInstallDir)
    UpdateProductVersion wise
    ... 'other functions 
    UpdateUpgradeTable wise
    wise.Save wiseInstallDir
End Sub


'This function works properly 
Sub UpdateProductVersion(project)
    Set tblProperty = project.WTables("Property")
    tblProperty.WRows.Row("ProductVersion").WColumns("Value").Data=wiseProductVersion

End Sub  

Sub UpdateUpgradeTable(project)
    Set tblProperty = project.WTables("Upgrade")
    Dim tmpRow,count: count = 0
    Dim aUpgradeGuids: Set aUpgradeGuids = CreateObject("Scripting.Dictionary")
    Const UPGRADECODE = 0

   For Each tmpRow In tblProperty.WRows
       Dim tRow: tRow=tmpRow.Key
       Dim values: values=Split(tRow, ",")
       aUpgradeGuids.Add count,values(0) 
       count=count + 1
   Next
   a = aUpgradeGuids.Items
   For i = 0 To aUpgradeGuids.Count - 1
       project.WTables("Upgrade")._
       WRows.Row(a(i)).WColumns("VersionMax").Data=wiseProductVersion
   Next

End Sub

main

EDIT: 'updated UpdateUpgradeTable

Sub UpdateUpgradeTable(project)
    Set tblProperty = project.WTables("Upgrade")
    Dim tmpRow  
    'Get the UpgradeCode for each current record and change the VersionMax value for that record. 
    For Each tmpRow In tblProperty.WRows
        Dim tRow: tRow=tmpRow.Key
        Dim values: values=Split(tRow, ",")
        tblProperty.WRows.Row(values(0)).WColumns("VersionMax").Data=wiseProductVersion
    Next


End Sub
1

There are 1 best solutions below

1
On

I think I know the answer. I still do not have it working 100% but I found additional documentation for the Row method stating for tables with multiple key columns, commas separate key values. I have inserted the value(0), value(1), ... but I am now getting a different error. I will update once I get this working.

The upgrade table has 5 primary key values.

<!-- language: lang-vbs -->

    Set rows = tblProperty.WRows
    Set row = tblProperty.WRows.Row(values(UPGRADECODE), values(VERSIONMIN), values(VERSIONMAX), values(LANGUAGE), values(ATTRIBUTES))
    tblProperty.WRows.Row(values(UPGRADECODE),values(VERSIONMIN),values(VERSIONMAX),values(LANGUAGE),values(ATTRIBUTES)).WColumns("VersionMax").Data=wiseProductVersion

Note that the first Set rows=... returns a valid object with its corresponding methods. The second line fails with the message:

Exception: Wrong number of arguments or invalid property assignment: 'tblProperty.WRows.Row'

Below are the 5 primary keys for the upgrade table.

  1. values (UPGRADECODE)

  2. values (VERSIONMIN)

  3. values (VERSIONMAX)

  4. values (LANGUAGE)

  5. values (ATTRIBUTES)

Is there another way to update the upgrade table? Is there something I am missing?

According to documentation the WRows object is a child of WTable. And it is returning a valid object for me. It has the following method:

WRow Row(BSTR strKeyValue): returns a WRow given its key value. For tables with multiple key columns, commas separate key values.
Row() is the default method.

However, my comma separated key values construct above is failing and I am not sure where to turn now. Has anyone ever worked with this before and had it working?