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.Core.Metadata.EntityElement import * from Kingdee.BOS.Orm.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 str(e.Field.Key).upper() == "FDate": if DoDetection(): stockDirectObj = this.View.Model.GetValue("FStockDirect") stockDirectVal = "" if stockDirectObj == None else stockDirectObj if stockDirectVal == "GENERAL": details = this.View.BusinessInfo.GetEntity("FEntity") if details != None: entrys = this.View.Model.GetEntityDataObject(details) if entrys != None and entrys.Count > 0: dateValue = "" if e.NewValue == None else e.NewValue if dateValue == "": return; tableSqlL = List[str](); for entry in entrys: rowIndex = this.View.Model.GetRowIndex(details, entry) materialObjValue = entry["MaterialId_Id"]; materialValue = 0 if materialObjValue == None else materialObjValue tableSqlL.Add(" SELECT {0} AS 'FMATERIALID',{1} rowIdx ".format(materialValue,rowIndex)) if tableSqlL.Count() > 0: GetPrdLot(dateValue, " UNION ".join(tableSqlL)) return; if str(e.Field.Key).upper() == "FMATERIALID": dateObj = this.View.Model.GetValue("FDate") dateValue = "" if dateObj == None else str(dateObj) materialId = int(e.NewValue) if materialId > 0 and dateValue != "": GetPrdLot(dateValue," SELECT {0} AS 'FMATERIALID',{1} rowIdx ".format(materialId,e.Row)) def DoDetection(): orgObj = this.View.Model.GetValue("FStockOrgId") if orgObj["Id"] == 1: return True return False # return True def GetPrdLot(dateTime,tableSql): sqlL = """/*dialect*/ DECLARE @date datetime SET @date = '{0}' ;WITH #基础数据 AS ( {1} ) SELECT tt.*,t1.* FROM #基础数据 tt INNER JOIN T_BD_MATERIALSTOCK t0s on tt.FMATERIALID = t0s.FMATERIALID AND t0s.FISBATCHMANAGE = 1 CROSS APPLY ( SELECT TOP 1 tt.FBILLNO,tt.FMATERIALID,tt.FREALQTY,tt.FLOT,tt.FLOT_TEXT,tt.Seq,ROW_NUMBER()OVER (ORDER BY tt.FREALQTY DESC,tt.FCREATEDATE DESC) RN FROM ( SELECT TOP 10 t0.FBILLNO,t0e.FMATERIALID,t0e.FREALQTY,t0e.FLOT,t1.FBILLNO FLOT_TEXT,0 Seq,t0.FCREATEDATE FROM T_PRD_INSTOCK t0 INNER JOIN T_PRD_INSTOCKENTRY t0e on t0.FID = t0e.FID INNER JOIN T_PRD_INSTOCKENTRY_LK t0e_lk on t0e_lk.FENTRYID = t0e.FENTRYID AND t0e_lk.FSTABLENAME = 'T_PRD_MOENTRY' INNER JOIN T_PRD_MO t1 on t1.FID = t0e_lk.FSBILLID INNER JOIN T_BD_MATERIALBASE t1b on t1b.FMATERIALID = t0e.FMATERIALID AND t1b.FERPCLSID = '2' WHERE 1=1 AND t0e.FLOT != 0 AND t0e.FMATERIALID = tt.FMATERIALID AND t0.FCREATEDATE <= @date ORDER BY t0.FCREATEDATE DESC UNION ALL SELECT TOP 10 t0.FBILLNO,t0e.FMATERIALID,t0e.FREALQTY,t0e.FLOT,t2.FBILLNO,0 Seq,t0.FCREATEDATE FROM T_STK_INSTOCK t0 INNER JOIN T_STK_INSTOCKENTRY t0e on t0.FID = t0e.FID INNER JOIN T_STK_INSTOCKENTRY_LK t0e_lk on t0e_lk.FENTRYID = t0e.FENTRYID AND t0e_lk.FSTABLENAME = 't_PUR_POOrderEntry' INNER JOIN T_PUR_POORDERENTRY_LK t1e_lk on t1e_lk.FENTRYID = t0e_lk.FSID AND t1e_lk.FSTABLENAME = 'T_SUB_REQORDERENTRY' INNER JOIN T_SUB_REQORDER t2 on t2.FID = t1e_lk.FSBILLID INNER JOIN T_BD_MATERIALBASE t1b on t1b.FMATERIALID = t0e.FMATERIALID AND t1b.FERPCLSID = '3' WHERE 1=1 AND t0.FBUSINESSTYPE = 'WW' AND t0e.FLOT != 0 AND t0e.FMATERIALID = tt.FMATERIALID AND t0.FCREATEDATE <= @date ORDER BY t0.FCREATEDATE DESC UNION ALL SELECT '',0,0,0,RIGHT(CONVERT(varchar(100),CONVERT(int, CONVERT(VARCHAR(6),@date,112)) * 100 + DATEPART(ISO_WEEK, @date)),6),1 Seq,@date ) tt --ORDER BY tt.FREALQTY DESC,tt.Seq ASC ) t1 """.format(dateTime,tableSql) res = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlL); if res != None and res.Count > 0: field = this.View.Model.BillBusinessInfo.GetField("FLOT") for item in res: # if field.InputModel == LotField.Enum_InputModel.OnlySelect: # this.View.Model.SetValue("FLOT", item["FLOT"], item["rowIdx"]) # else: this.View.Model.SetValue("FLOT", item["FLOT_TEXT"], item["rowIdx"])