import clr clr.AddReference("System") clr.AddReference("Kingdee.BOS") clr.AddReference("Kingdee.BOS.Core") clr.AddReference("Kingdee.BOS.DataEntity") clr.AddReference("Kingdee.BOS.App") clr.AddReference("Kingdee.BOS.Contracts") clr.AddReference("Kingdee.BOS.ServiceHelper") from Kingdee.BOS import* from Kingdee.BOS.Core import * from Kingdee.BOS.Orm.DataEntity import* from Kingdee.BOS.Orm.Metadata.DataEntity import* from Kingdee.BOS.Core.DynamicForm.PlugIn import * from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import * from Kingdee.BOS.Util import * from System import * from System.ComponentModel import* from System.Collections.Generic import* from System.Text import* from Kingdee.BOS.ServiceHelper import * def DataChanged(e): if e.Field.Key == "FMaterialId": if DoCheckConditions(): if e.NewValue != None and e.NewValue != 0: hasQRCost = this.View.Model.GetValue("FHasQRCost") idlist = [{ "materialId" : e.NewValue , "inRow" : e.Row}] GetcContractAnnualCost(idlist,hasQRCost) else: this.View.Model.SetValue("FTAXPRICE", 0, e.Row) this.View.Model.SetValue("FTAXRATE", 0, e.Row) this.View.InvokeFieldUpdateService("FTAXPRICE" ,e.Row) if e.Field.Key == "FHasQRCost": if DoCheckConditions(): hasQRCost = e.NewValue entity = this.View.BusinessInfo.GetEntity("FEntity") entrys = this.View.Model.GetEntityDataObject(entity) idlist = list(filter(lambda x:x["materialId"] > 0,map(lambda x:{ "materialId":x["MaterialId_Id"] ,"inRow": x["Seq"] - 1} ,entrys))) GetcContractAnnualCost(idlist,hasQRCost) def GetcContractAnnualCost(idList,hasQRCost): # whereSql = " AND t0e.F_QNV_BASE1 IN ({0}) ".format(",".join(idList)) intoSqlList = List[str]() if idList != None and idList.Count > 0: # for idObj in idList: # intoSqlList.Add("SELECT {0} AS 'MATERIALID' ,{1} inRow".format(str(idObj["materialId"]),str(idObj["inRow"]))); # whereSql = " union ".join(intoSqlList); for x in idList: intoSqlList.Add(str(x["materialId"]) +','+ str(x["inRow"])) whereSql = ";".join(intoSqlList); sql = """/*dialect*/ SELECT rowSet2.[1] AS 'MaterialId' ,rowSet2.[2] AS 'inRow' INTO #TMPMATERIALNUM FROM ( SELECT 1 ID,CAST(''+ REPLACE('{0}',';','') + '' AS XML) AS xmlVal ) AS valSet OUTER APPLY ( SELECT ROW_NUMBER() OVER (ORDER BY valSet.ID) RN ,CAST(''+ REPLACE(T.C.value('.','varchar(100)'),',','') + '' AS XML) xmlVal FROM valSet.xmlVal.nodes('/v') AS T(C) ) rowSet OUTER APPLY ( SELECT * FROM ( SELECT T.C.value('.','varchar(100)') AS xmlVal ,ROW_NUMBER() OVER (ORDER BY rowSet.RN) RowNo FROM rowSet.xmlVal.nodes('/v') AS T(C) ) TT PIVOT ( MAX(TT.xmlVal) FOR TT.RowNo IN ([1],[2])) TT2 ) rowSet2 SELECT CONVERT(int,tt0.inRow) AS inRow ,ISNULL(tt2.物料内码,0) AS '物料内码' ,ISNULL(tt2.含税单价,0) AS '含税单价' ,ISNULL(tt2.综合单价,0) AS '综合单价' ,ISNULL(tt2.默认税率,0) AS '默认税率' ,tt2.FBILLNO FROM #TMPMATERIALNUM tt0 OUTER APPLY ( SELECT TOP 1 t0e.FID ,t0e.FENTRYID ,t0.FBILLNO ,t0.F_QNV_TEXT2 ,t0e.F_QNV_BASE1 AS '物料内码' ,t0e.F_QNV_DECIMAL1 AS '含税单价' ,t0e.F_QNV_DECIMAL3 AS '综合单价' ,t0e.F_QNV_DATE2 AS '单价生效日期' ,t0e.F_QNV_DATE3 AS '单价失效日期' ,t1.FTAXRATE AS '默认税率' FROM QNV_t_Cust_Entry100003 t0 INNER JOIN QNV_t_Cust_Entry100004 t0e on t0.FID = t0e.FID INNER JOIN T_BD_TAXRATE t1 on t1.FID = t0e.F_QNV_BASE3 CROSS APPLY ( SELECT t3.FMATERIALID FROM T_BD_MATERIAL t2 INNER JOIN T_BD_MATERIAL t3 on t2.FMASTERID = t3.FMASTERID WHERE t2.FMATERIALID = tt0.MATERIALID AND t3.FMATERIALID = t0e.F_QNV_BASE1 ) tt1 WHERE 1 = 1 AND t0.FDOCUMENTSTATUS ='C' AND GETDATE() BETWEEN t0e.F_QNV_DATE2 AND t0e.F_QNV_DATE3 ORDER BY t0e.F_QNV_DATE2 DESC ) tt2 WHERE 1 = 1 """.format(whereSql) result = DBServiceHelper.ExecuteDynamicObject(this.Context, sql) if result != None and result.Count > 0: priceKey = "综合单价" if hasQRCost else "含税单价" for row in result: rowIndex = row["inRow"] this.View.Model.SetValue("FTAXPRICE", row[priceKey], rowIndex) this.View.Model.SetValue("FTAXRATE", row["默认税率"], rowIndex) this.View.InvokeFieldUpdateService("FTAXPRICE" ,rowIndex) def DoCheckConditions(): orgObj = this.View.Model.GetValue("FApplicationOrgId") if orgObj["Id"] == 101542: return True return False # --alter table T_STK_MISDELIVERYENTRY alter column FReferPrice decimal(23,10) not null # --UPDATE T_STK_MISDELIVERYENTRY SET FReferPrice = 0 # --WHERE FReferPrice = '' OR FReferPrice is null # alter table T_STK_MISDELIVERYENTRY alter column FReferAmount decimal(23,10) not null # UPDATE T_STK_MISDELIVERYENTRY SET FReferAmount = 0 # WHERE FReferAmount = '' OR FReferAmount is null