** Edited **
I edited some of my previous comment and added this. I took a look and in SO_CommonEntryDetail_bus (inherited by SO_SalesOrderDetail_bus) it does a GetRecord / READ DATA combo that should make prodLine$ available to you. I tried it with a button in S/O Entry just now and it seems to work for the item I'm sitting on in the row. If it doesn't work for you tell me where you are firing it off from exactly (Post-Val of ItemCode ?)
ProdLine = """" : PLDesc = """"
retVal = oLines.GetValue(""item.ProductLine$"", ProdLine)
retMsg = oSession.AsObject(oSession.UI).MessageBox("""", ""Prod Line = "" & ProdLine)
retVal = oLines.GetValue(""prodLine.ProductLineDesc$"", PLDesc)
retMsg = oSession.AsObject(oSession.UI).MessageBox("""", ""PLDesc = "" & PLDesc)
---------------------------
Will look at the source code for the SO Detail and PO Detail business objects when I get a chance. If you have access yourself you're looking for the line pairs where 1st one uses GetRecord() function from a table like CI_Item or IM_ProductLine and second uses READ DATA.
itemSvc'GetRecord(itemRec$, itemIOL$)
READ DATA FROM itemRec$, REC=item$ TO IOL=itemIOL$
This stuffs all the data from each field in the table for the current record into itemRec$ prefixed by item$ and now item$ is available to you in scripting.