Trouble Writing to A UDF on SO Lines from a Button Script

This script runs from a button on Sales Order DMAIN.  The purpose is to update UDF values in SO Detail based on changes made in CI Item.
I have tested the script with message boxes (not shown here) to verify that expected keys, line and Item Master values are pulled and it all looks good.  The UDFs are numeric, the user running the script as full rights, external access is enabled.
The piece that I can't figure out is updating the values on SO line.  Each of these lines returns "1" but the UDF values do not change even after a grid reload.  I also tried updating the line Comment but that would not work either.


        vEditKey = oSOLines.GetEditKey(vLineKey)   
        retVal = oSOLines.EditLine(vEditKey)
        retVal = oSOLines.SetValue("UDF_DSPRICE", DSP1)
        retVal = oSOLines.SetValue("UDF_DSPRICE2", DSP2)
        retVal = oSOLines.Write()

Any suggestions are appreciated.

The full code is here:

If oSession.CompanyCode = "TST" Then 'Test for Company

Dim vSONo, vitemcode, DSP1, DSP2, vItemType, vLineKey, vret, vEditKey
vitemcode = ""
DSP1 = 0
DSP2 = 0
vSONo = ""
vItemType = ""
vLineKey = ""
vret = 0
vEditKey = ""


If Not (IsObject(oSOHeader)) Then
    Set oSOHeader = oSession.AsObject(oSession.GetObject("SO_SalesOrder_bus"))
End If

vSONo = SO_SalesOrder_bus_SalesOrderNo
retVal = oSOHeader.SetKey(vSONo)


If Not (IsObject(oSOLines)) Then
    Set oSOLines = oSession.AsObject(oSOHeader.Lines)
End If

retVal = oSOLines.movefirst()

Do Until oSOLines.EOF 'look at each line in the object
    retVal = oSOLines.GetValue("ItemType$", vItemType) 'get item code
If vItemType = "1" Then 'Check only regular inventory items

    retVal = oSOLines.GetValue("SalesOrderNo$", vSONo) 'get item code
    retVal = oSOLines.GetValue("ItemCode$", vitemcode) 'get item code
    retVal = oSOLines.GetValue("LineKey$", vLineKey) 'get line key


If Not (IsObject(oCI_ItemOb)) Then
    Set oCI_ItemOb = oSOLines.AsObject(oSOLines.GetChildHandle("ItemCode"))
End If

retVal = oCI_ItemOb.GetValue("UDF_DSPRICE", DSP1)
retVal = oCI_ItemOb.GetValue("UDF_DSPRICE2", DSP2)

        vEditKey = oSOLines.GetEditKey(vLineKey)
        retVal = oSOLines.EditLine(vEditKey)
        retVal = oSOLines.SetValue("UDF_DSPRICE", DSP1)
        retVal = oSOLines.SetValue("UDF_DSPRICE2", DSP2)
        retVal = oSOLines.Write()

End If 'Check only regular inventory items
retVal = oSOLines.movenext()

Loop 'look at each line in the object

retVal = oBusObj.PriceRecalculation()
oScript.LinesAdded = 1
myretVal = oScript.LoadGrid("GD_Lines")
myretVal = oUIObj.HandleScriptUI()

End If 'Test for Company