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") clr.AddReference("ExtensionMethods") 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.Orm.Metadata.DataEntity import* from Kingdee.BOS.Core.DynamicForm.PlugIn import * from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import * from System import * from System.ComponentModel import* from System.Collections.Generic import* from System.Text import* from Kingdee.BOS.ServiceHelper import * from ExtensionMethods import BooleanExtension as boolObjEx from ExtensionMethods import DateTimeExtension as dateObjEx from ExtensionMethods import ObjectExtension as objEx from ExtensionMethods import StringExtension as strObjEx def ButtonClick(e): if e.Key.EndsWith("FToAnalyzeBtn", StringComparison.OrdinalIgnoreCase): proEntity = this.View.Model.BusinessInfo.GetEntryEntity("FAnalyzeProEntity") proRows = this.View.Model.GetEntityDataObject(proEntity) # 开启编辑状态 this.View.Model.BeginIniti() if proRows != None and proRows.Count > 0: sDate = this.View.Model.GetValue("FBillSDate") eDate = this.View.Model.GetValue("FBillEDate") proStrList = List[str](); for row in proRows: proStrList.Add("SELECT {0} AS 'MATERIALID' ,{1} needNum".format(row["FAnalyzeProId"]["Id"],row["FAnalyzeProQty"])) sql = """/*dialect*/ DECLARE @needNum DECIMAL(23,6) ,@sDate varchar(100) ,@eDate varchar(100) SET @needNum = 20 SET @sDate = '{1}' SET @eDate = '{2}' SELECT tt.MATERIALID,SUM(tt.needNum) needNum INTO #TMPMATERIALNUM FROM ({0}) tt GROUP BY tt.MATERIALID SELECT t0.FMASTERID ,t0.FMATERIALID ,t0.FNUMBER ,t0.FUSEORGID ,t1.needNum AS 'ProMaterialQty' INTO #ProMaterial FROM T_BD_MATERIAL t0 INNER JOIN #TMPMATERIALNUM t1 on t0.FMATERIALID = t1.MATERIALID WHERE t0.FDOCUMENTSTATUS = 'C' CREATE TABLE #MATERIAL_LACKANALYE( FIDENTITYID INT NOT NULL DEFAULT 0 ,MATERIALID INT NOT NULL DEFAULT 0 ,BomId int ,物料代码 varchar(100) DEFAULT '' ,物料名称 varchar(100) DEFAULT '' ,物料_分析需求数 decimal(23,6) default 0 ,物料_可用库存数 decimal(23,6) DEFAULT 0 ,物料_实际需求数 decimal(23,6) DEFAULT 0 ,BOMLEVEL int ,IsProduct int ,物料个数分组合计 int ) SELECT t0.FMATERIALID ,ISNULL(t3.sumQTY,0) AS 即时库存 ,ISNULL(t4.sumBASENOPICKEDQTY,0) AS 未发数 ,ISNULL(t5.sumNoStockInQty,0) AS 在制数 ,CASE WHEN CHARINDEX('TC',t0.FNUMBER) = 1 THEN 0 WHEN CHARINDEX('TC',t0.FNUMBER) = 1 THEN 0 ELSE ISNULL(t1.数量 - t1.未发数量,0) END AS '受订量' ,ISNULL(t2.数量 - t2.入库数量,0) AS '在途量' ,(ISNULL(t3.sumQTY,0) - ISNULL(t4.sumBASENOPICKEDQTY,0) + ISNULL(t5.sumNoStockInQty,0) - ISNULL(t1.数量 - t1.未发数量,0) + ISNULL(t2.数量 - t2.入库数量,0)) AS '可用库存' ,ISNULL(t6.进检量,0) AS '进检量' INTO #Material_Stock_Statu FROM T_BD_MATERIAL t0 LEFT JOIN ( SELECT t0e.FMATERIALID,SUM(t0e.FQTY) AS '数量' ,SUM((t0e_r.FBASEREMAINOUTQTY + t0e_r.FBASERETURNQTY)) AS '未发数量' FROM T_SAL_ORDER t0 INNER JOIN T_SAL_ORDERENTRY t0e on t0.FID = t0e.FID INNER JOIN T_SAL_ORDERENTRY_R t0e_r on t0e.FID = t0e_r.FID AND t0e_r.FENTRYID = t0e.FENTRYID WHERE t0.FDOCUMENTSTATUS = 'C' AND t0.FCANCELSTATUS = 'A' AND t0.FCLOSESTATUS = 'A' AND t0.FDATE between @sDate AND @eDate GROUP BY t0e.FMATERIALID ) t1 on t1.FMATERIALID = t0.FMATERIALID LEFT JOIN ( SELECT t0e.FMATERIALID,SUM(t0e.FQTY) AS '数量' ,SUM(t0e_r.FREMAINSTOCKINQTY) AS '剩余入库数量' ,SUM(t0e_r.FBASESTOCKINQTY) AS '入库数量' FROM T_PUR_POORDER t0 INNER JOIN T_PUR_POORDERENTRY t0e on t0.FID = t0e.FID AND t0.FBUSINESSTYPE != 'ZCCG' AND t0.FBUSINESSTYPE != 'FYCG' INNER JOIN T_PUR_POORDERENTRY_R t0e_r on t0e.FID = t0e_r.FID AND t0e_r.FENTRYID = t0e.FENTRYID WHERE t0.FDOCUMENTSTATUS = 'C' AND t0.FCANCELSTATUS = 'A' AND t0.FCLOSESTATUS = 'A' AND t0.FDATE BETWEEN @sDate AND @eDate GROUP BY t0e.FMATERIALID ) t2 on t2.FMATERIALID = t0.FMATERIALID LEFT JOIN ( SELECT tt0.FMATERIALID,tt0.FSTOCKORGID,SUM(tt0.FBASEQTY) AS sumQTY FROM T_STK_INVENTORY tt0 GROUP BY tt0.FMATERIALID,tt0.FSTOCKORGID ) t3 on t3.FMATERIALID = t0.FMASTERID AND t3.FSTOCKORGID = t0.FUSEORGID LEFT JOIN ( SELECT t0e.FMATERIALID,SUM(t0e_q.FNOPICKEDQTY) sumBASENOPICKEDQTY FROM T_PRD_PPBOMENTRY t0e INNER JOIN T_PRD_PPBOMENTRY_Q t0e_q on t0e.FENTRYID = t0e_q.FENTRYID INNER JOIN T_PRD_MOENTRY_A t0e_a on t0e_a.FENTRYID = t0e.FMOENTRYID WHERE t0e_a.FSTATUS = 4 GROUP BY t0e.FMATERIALID ) t4 on t4.FMATERIALID = t0.FMATERIALID LEFT JOIN ( SELECT t0e.FMATERIALID,SUM(t0e_q.FNOSTOCKINQTY) AS sumNoStockInQty FROM T_PRD_MOENTRY t0e INNER JOIN T_PRD_MOENTRY_Q t0e_q on t0e.FENTRYID = t0e_q.FENTRYID INNER JOIN T_PRD_MOENTRY_A t0e_a on t0e_a.FENTRYID = t0e.FENTRYID WHERE t0e_a.FSTATUS = 4 GROUP BY t0e.FMATERIALID ) t5 on t5.FMATERIALID = t0.FMATERIALID LEFT JOIN ( SELECT t0e.FMATERIALID,SUM(FBASEUNITQTY-FINSTOCKBASEQTY + FRETURNBASEQTY) AS '进检量' FROM T_PUR_RECEIVE t0 INNER JOIN T_PUR_RECEIVEENTRY t0e on t0.FID = t0e.FID INNER JOIN T_PUR_RECEIVEENTRY_R t0e_r on t0e.FID = t0e_r.FID AND t0e.FENTRYID = t0e_r.FENTRYID INNER JOIN T_PUR_RECEIVEENTRY_S t0e_s on t0e.FID = t0e_s.FID AND t0e.FENTRYID = t0e_s.FENTRYID WHERE t0.FDOCUMENTSTATUS = 'C' AND t0.FCANCELSTATUS = 'A' AND t0.FCLOSESTATUS = 'A' AND t0.FDATE BETWEEN @sDate AND @eDate GROUP BY t0e.FMATERIALID ) t6 on t6.FMATERIALID = t0.FMATERIALID WHERE t0.FDOCUMENTSTATUS = 'C' AND t0.FFORBIDSTATUS = 'A' UPDATE #Material_Stock_Statu SET 可用库存 = 即时库存 - 未发数 - 受订量 + 在制数 + 在途量 INSERT INTO #MATERIAL_LACKANALYE SELECT ROW_NUMBER() OVER (ORDER BY t0.FMATERIALID) ,t0.FMATERIALID ,t1.FID ,t2.FNUMBER ,t2_l.FNAME ,t0.ProMaterialQty ,t3.可用库存 ,(CASE CHARINDEX('TC',t0.FNUMBER) WHEN 1 THEN 0 - t0.ProMaterialQty ELSE (CASE WHEN t3.可用库存 > t0.ProMaterialQty THEN 0 ELSE t3.可用库存 - t0.ProMaterialQty END) END) ,0 ,1 ,1 FROM #ProMaterial t0 INNER JOIN ( SELECT tt.FID,tt.FMATERIALID,ROW_NUMBER() OVER (PARTITION BY tt.FMATERIALID ORDER BY tt.FID DESC) AS 'rn' FROM T_ENG_BOM tt WHERE 1 = 1 AND tt.FDOCUMENTSTATUS = 'C' AND tt.FFORBIDSTATUS = 'A' ) t1 on t0.FMATERIALID = t1.FMATERIALID AND t1.rn = 1 --AND t0.FUSEORGID = t1.FUSEORGID INNER JOIN T_BD_MATERIAL t2 on t2.FMATERIALID = t1.FMATERIALID INNER JOIN T_BD_MATERIAL_L t2_l on t2_l.FMATERIALID = t1.FMATERIALID AND t2_l.FLOCALEID = 2052 LEFT JOIN #Material_Stock_Statu t3 on t1.FMATERIALID = t3.FMATERIALID WHERE 1 = 1 ORDER BY t0.FNUMBER DECLARE @num INT,@level int,@LoopCount int SET @num = 1 SET @level =0 SET @LoopCount = 0; WHILE (@num <> 0 AND @LoopCount < 10) BEGIN INSERT INTO #MATERIAL_LACKANALYE(MaterialId,BomId,物料_分析需求数 ,物料_可用库存数,物料_实际需求数 ,BOMLEVEL,物料个数分组合计,IsProduct) SELECT tt.FMATERIALID ,ISNULL(t2.FID,0) AS BomId ,ABS(tt.汇总_分析需求数) ,t3.可用库存 ,(CASE WHEN t3.可用库存 > (ABS(tt.汇总_分析需求数) + ISNULL(t4.上级_实际需求数,0)) THEN 0 ELSE t3.可用库存 - (ABS(tt.汇总_分析需求数) + ISNULL(t4.上级_实际需求数,0)) END) AS '实际需求数' ,@level + 1 ,tt.co ,0 FROM ( SELECT t1.FMATERIALID,count(1) co ,SUM(t0.物料_实际需求数 * (t1.FNUMERATOR / t1.FDENOMINATOR)) AS '汇总_分析需求数' FROM #MATERIAL_LACKANALYE t0 INNER JOIN T_ENG_BOMCHILD t1 on t0.BomId = t1.FID WHERE 1 = 1 AND t0.BOMLEVEL = @level GROUP BY t1.FMATERIALID ) tt OUTER APPLY ( SELECT TOP 1 tt3.FID,tt3.FNUMBER,tt3.FMATERIALID FROM T_ENG_BOM tt3 WHERE 1 = 1 AND tt3.FDOCUMENTSTATUS = 'C' AND tt3.FFORBIDSTATUS = 'A' AND tt.FMATERIALID = tt3.FMATERIALID ORDER BY tt3.FID DESC ) t2 LEFT JOIN #Material_Stock_Statu t3 on t3.FMATERIALID = tt.FMATERIALID OUTER APPLY ( SELECT tt4.MaterialId ,ABS(SUM(tt4.物料_实际需求数)) AS '上级_实际需求数' FROM #MATERIAL_LACKANALYE tt4 WHERE tt4.MaterialId = tt.FMATERIALID GROUP BY tt4.MaterialId ) t4 SET @num = @@ROWCOUNT SET @level += 1 SET @LoopCount += 1 END SELECT t0.MATERIALID,t0.物料_分析需求数,t0.物料_实际需求数,t0.IsProduct,t1.FNUMBER,t1_l.FNAME ,ROW_NUMBER() OVER (ORDER BY t0.BOMLEVEL,t1.FNumber) 'FIDENTITYID' ,t2.即时库存 AS '物料_即时库存',t2.未发数 AS '物料_未发数',t2.在制数 AS '物料_在制数' ,t2.受订量 AS '物料_受订量',t2.在途量 AS '物料_在途量',t2.可用库存 AS '物料_可用库存数',t2.进检量 AS '物料_进检量' FROM ( SELECT t0.MATERIALID ,SUM(t0.物料_实际需求数) AS '物料_实际需求数' ,SUM(t0.物料_分析需求数) AS '物料_分析需求数' ,MAX(t0.BOMLEVEL) AS 'BOMLEVEL' ,MAX(t0.IsProduct) AS 'IsProduct' FROM #MATERIAL_LACKANALYE t0 GROUP BY t0.MATERIALID ) t0 INNER JOIN T_BD_MATERIAL t1 on t0.MaterialId = t1.FMATERIALID INNER JOIN T_BD_MATERIAL_L t1_l on t0.MaterialId = t1_l.FMATERIALID AND t1_l.FLOCALEID = 2052 INNER JOIN #Material_Stock_Statu t2 on t2.FMATERIALID = t0.MATERIALID DROP TABLE #ProMaterial DROP TABLE #TMPMATERIALNUM DROP TABLE #MATERIAL_LACKANALYE DROP TABLE #Material_Stock_Statu """.format(" union all ".join(proStrList),sDate,eDate) proRows.Clear() # this.View.UpdateView("FAnalyzeProEntity"); materialEntity = this.View.Model.BillBusinessInfo.GetEntryEntity("FAnalyzeMaterialEntity") materialRows = this.View.Model.GetEntityDataObject(materialEntity) materialRows.Clear() res = DBServiceHelper.ExecuteDynamicObject(this.Context,sql) if res != None and res.Count > 0: for item in res: # 根据单据体的类型创建行信息 row = DynamicObject(materialEntity.DynamicObjectType) isPro = item["IsProduct"] matId = item["MaterialId"] matFld = this.View.BillBusinessInfo.GetField("FAnalyzeMaterialId");#物料字段元素元数据,使用字段标识 matObj = BusinessDataServiceHelper.LoadSingle(this.Context, matId, matFld.RefFormDynamicObjectType) row["FAnalyzeMaterialId_Id"] = matId row["FAnalyzeMaterialId"] = matObj row["FAnalyzeMQty"] = item["物料_分析需求数"] row["FStkQty"] = item["物料_即时库存"] row["FNotIssueQty"] = item["物料_未发数"] row["FInMakingQty"] = item["物料_在制数"] row["FOrderMQty"] = item["物料_受订量"] row["FInTransitQty"] = item["物料_在途量"] row["FAvailableQty"] = item["物料_可用库存数"] row["FActualQty"] = item["物料_实际需求数"] row["FDetectionQty"] = item["物料_进检量"] row["FIsAnalyzeMaterial"] = False if isPro == 1 else True # 把行数据添加到行集中 materialRows.Add(row) if isPro == 1: proRow = DynamicObject(proEntity.DynamicObjectType) proRow["FAnalyzeProId_Id"] = matId proRow["FAnalyzeProId"] = matObj proRow["FAnalyzeProQty"] = item["物料_分析需求数"] proRow["FProStkQty"] = item["物料_即时库存"] proRow["FProNotIssueQty"] = item["物料_未发数"] proRow["FProInMakingQty"] = item["物料_在制数"] proRow["FProOrderQty"] = item["物料_受订量"] proRow["FProInTransitQty"] = item["物料_在途量"] proRow["FProAvailableQty"] = item["物料_可用库存数"] proRow["FProActualQty"] = item["物料_实际需求数"] proRows.Add(proRow); # 添加完行数据后需要执行更新信息 this.View.UpdateView("FAnalyzeProEntity") this.View.UpdateView("FAnalyzeMaterialEntity") # 结束编辑状态 this.View.Model.EndIniti();