From b32a21128a6f127fe6a9ff59b9b5df8ae1d22114 Mon Sep 17 00:00:00 2001 From: liqionghai <1> Date: Fri, 11 Jul 2025 16:33:08 +0800 Subject: [PATCH] 1 --- ...2eace544-8118-4fd3-b296-6b56b88f9889.vsidx | Bin 0 -> 107 bytes ...2f5f1c87-cec0-4b86-9ede-6946dd68c95d.vsidx | Bin 0 -> 15089 bytes ...50fd0f2f-3812-466e-8779-337a133a586e.vsidx | Bin 0 -> 107 bytes ...61effe16-861e-4d72-8f91-29eec2f9d611.vsidx | Bin 0 -> 107 bytes ...642a9d89-b645-443e-80d4-b95e833bb912.vsidx | Bin 0 -> 19291 bytes .vs/ZHIRONG.Report/v17/.suo | Bin 0 -> 36864 bytes .../v17/DocumentLayout.backup.json | 58 ++++++ .vs/ZHIRONG.Report/v17/DocumentLayout.json | 58 ++++++ ZHIRONG.Report.sln | 20 +++ .../ZHIRONG.Report.DevelopmentCostDetails.py | 165 ++++++++++++++++++ .../ZHIRONG.Report.DevelopmentCostSum.py | 133 ++++++++++++++ ZHIRONG.Report/ZHIRONG.Report.pyproj | 38 ++++ ZHIRONG.Report/调试.py | 43 +++++ 13 files changed, 515 insertions(+) create mode 100644 .vs/ZHIRONG.Report/FileContentIndex/2eace544-8118-4fd3-b296-6b56b88f9889.vsidx create mode 100644 .vs/ZHIRONG.Report/FileContentIndex/2f5f1c87-cec0-4b86-9ede-6946dd68c95d.vsidx create mode 100644 .vs/ZHIRONG.Report/FileContentIndex/50fd0f2f-3812-466e-8779-337a133a586e.vsidx create mode 100644 .vs/ZHIRONG.Report/FileContentIndex/61effe16-861e-4d72-8f91-29eec2f9d611.vsidx create mode 100644 .vs/ZHIRONG.Report/FileContentIndex/642a9d89-b645-443e-80d4-b95e833bb912.vsidx create mode 100644 .vs/ZHIRONG.Report/v17/.suo create mode 100644 .vs/ZHIRONG.Report/v17/DocumentLayout.backup.json create mode 100644 .vs/ZHIRONG.Report/v17/DocumentLayout.json create mode 100644 ZHIRONG.Report.sln create mode 100644 ZHIRONG.Report/ZHIRONG.Report.DevelopmentCostDetails.py create mode 100644 ZHIRONG.Report/ZHIRONG.Report.DevelopmentCostSum.py create mode 100644 ZHIRONG.Report/ZHIRONG.Report.pyproj create mode 100644 ZHIRONG.Report/调试.py diff --git a/.vs/ZHIRONG.Report/FileContentIndex/2eace544-8118-4fd3-b296-6b56b88f9889.vsidx b/.vs/ZHIRONG.Report/FileContentIndex/2eace544-8118-4fd3-b296-6b56b88f9889.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..70aef67a00f5a48bfb0d87044cf8f151e2685b5d GIT binary patch literal 107 wcmZ>EaTnxZU~p%E02V0C38Z0cW+XOHDO{Wlsuo0n)bd05(ok9*N*hCI0FV0t;Q#;t literal 0 HcmV?d00001 diff --git a/.vs/ZHIRONG.Report/FileContentIndex/2f5f1c87-cec0-4b86-9ede-6946dd68c95d.vsidx b/.vs/ZHIRONG.Report/FileContentIndex/2f5f1c87-cec0-4b86-9ede-6946dd68c95d.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..0cdefcaa722d513c975c53db3abd5aacc8e2b218 GIT binary patch literal 15089 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 R%W*XwKD=Zu3|c?){{Xthe}n)4 literal 0 HcmV?d00001 diff --git a/.vs/ZHIRONG.Report/FileContentIndex/50fd0f2f-3812-466e-8779-337a133a586e.vsidx b/.vs/ZHIRONG.Report/FileContentIndex/50fd0f2f-3812-466e-8779-337a133a586e.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..70aef67a00f5a48bfb0d87044cf8f151e2685b5d GIT binary patch literal 107 wcmZ>EaTnxZU~p%E02V0C38Z0cW+XOHDO{Wlsuo0n)bd05(ok9*N*hCI0FV0t;Q#;t literal 0 HcmV?d00001 diff --git a/.vs/ZHIRONG.Report/FileContentIndex/61effe16-861e-4d72-8f91-29eec2f9d611.vsidx b/.vs/ZHIRONG.Report/FileContentIndex/61effe16-861e-4d72-8f91-29eec2f9d611.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..70aef67a00f5a48bfb0d87044cf8f151e2685b5d GIT binary patch literal 107 wcmZ>EaTnxZU~p%E02V0C38Z0cW+XOHDO{Wlsuo0n)bd05(ok9*N*hCI0FV0t;Q#;t literal 0 HcmV?d00001 diff --git a/.vs/ZHIRONG.Report/FileContentIndex/642a9d89-b645-443e-80d4-b95e833bb912.vsidx b/.vs/ZHIRONG.Report/FileContentIndex/642a9d89-b645-443e-80d4-b95e833bb912.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..969aaf1a2a90f9a8f1fe166955439f7144d31220 GIT binary patch literal 19291 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 literal 0 HcmV?d00001 diff --git a/.vs/ZHIRONG.Report/v17/.suo b/.vs/ZHIRONG.Report/v17/.suo new file mode 100644 index 0000000000000000000000000000000000000000..862e806ed1730203ee61cf04a2225d1255e595f0 GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/.vs/ZHIRONG.Report/v17/DocumentLayout.backup.json b/.vs/ZHIRONG.Report/v17/DocumentLayout.backup.json new file mode 100644 index 0000000..cc2eb1c --- /dev/null +++ b/.vs/ZHIRONG.Report/v17/DocumentLayout.backup.json @@ -0,0 +1,58 @@ +{ + "Version": 1, + "WorkspaceRootPath": "D:\\source\\repos\\ZHIRONG.Report\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}|ZHIRONG.Report\\ZHIRONG.Report.pyproj|D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py||{8B382828-6202-11D1-8870-0000F87579D2}", + "RelativeMoniker": "D:0:0:{D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}|ZHIRONG.Report\\ZHIRONG.Report.pyproj|solutionrelative:ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py||{8B382828-6202-11D1-8870-0000F87579D2}" + }, + { + "AbsoluteMoniker": "D:0:0:{D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}|ZHIRONG.Report\\ZHIRONG.Report.pyproj|D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\\u8C03\u8BD5.py||{8B382828-6202-11D1-8870-0000F87579D2}", + "RelativeMoniker": "D:0:0:{D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}|ZHIRONG.Report\\ZHIRONG.Report.pyproj|solutionrelative:ZHIRONG.Report\\\u8C03\u8BD5.py||{8B382828-6202-11D1-8870-0000F87579D2}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 2, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "\u8C03\u8BD5.py", + "DocumentMoniker": "D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\\u8C03\u8BD5.py", + "RelativeDocumentMoniker": "ZHIRONG.Report\\\u8C03\u8BD5.py", + "ToolTip": "D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\\u8C03\u8BD5.py", + "RelativeToolTip": "ZHIRONG.Report\\\u8C03\u8BD5.py", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABYAAAAkAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.002457|", + "WhenOpened": "2025-06-27T03:57:50.149Z", + "IsPinned": true + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{5a4e9529-b6a0-46b5-be4f-0f0b239bc0eb}" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "ZHIRONG.Report.DevelopmentCostSum.py", + "DocumentMoniker": "D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py", + "RelativeDocumentMoniker": "ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py", + "ToolTip": "D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py", + "RelativeToolTip": "ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py", + "ViewState": "AgIAACwAAAAAAAAAAAAiwD8AAAAGAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.002457|", + "WhenOpened": "2025-07-04T10:02:13.723Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/ZHIRONG.Report/v17/DocumentLayout.json b/.vs/ZHIRONG.Report/v17/DocumentLayout.json new file mode 100644 index 0000000..cc2eb1c --- /dev/null +++ b/.vs/ZHIRONG.Report/v17/DocumentLayout.json @@ -0,0 +1,58 @@ +{ + "Version": 1, + "WorkspaceRootPath": "D:\\source\\repos\\ZHIRONG.Report\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}|ZHIRONG.Report\\ZHIRONG.Report.pyproj|D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py||{8B382828-6202-11D1-8870-0000F87579D2}", + "RelativeMoniker": "D:0:0:{D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}|ZHIRONG.Report\\ZHIRONG.Report.pyproj|solutionrelative:ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py||{8B382828-6202-11D1-8870-0000F87579D2}" + }, + { + "AbsoluteMoniker": "D:0:0:{D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}|ZHIRONG.Report\\ZHIRONG.Report.pyproj|D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\\u8C03\u8BD5.py||{8B382828-6202-11D1-8870-0000F87579D2}", + "RelativeMoniker": "D:0:0:{D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}|ZHIRONG.Report\\ZHIRONG.Report.pyproj|solutionrelative:ZHIRONG.Report\\\u8C03\u8BD5.py||{8B382828-6202-11D1-8870-0000F87579D2}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 2, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "\u8C03\u8BD5.py", + "DocumentMoniker": "D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\\u8C03\u8BD5.py", + "RelativeDocumentMoniker": "ZHIRONG.Report\\\u8C03\u8BD5.py", + "ToolTip": "D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\\u8C03\u8BD5.py", + "RelativeToolTip": "ZHIRONG.Report\\\u8C03\u8BD5.py", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABYAAAAkAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.002457|", + "WhenOpened": "2025-06-27T03:57:50.149Z", + "IsPinned": true + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{5a4e9529-b6a0-46b5-be4f-0f0b239bc0eb}" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "ZHIRONG.Report.DevelopmentCostSum.py", + "DocumentMoniker": "D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py", + "RelativeDocumentMoniker": "ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py", + "ToolTip": "D:\\source\\repos\\ZHIRONG.Report\\ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py", + "RelativeToolTip": "ZHIRONG.Report\\ZHIRONG.Report.DevelopmentCostSum.py", + "ViewState": "AgIAACwAAAAAAAAAAAAiwD8AAAAGAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.002457|", + "WhenOpened": "2025-07-04T10:02:13.723Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/ZHIRONG.Report.sln b/ZHIRONG.Report.sln new file mode 100644 index 0000000..0ed9c4a --- /dev/null +++ b/ZHIRONG.Report.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.12.35506.116 d17.12 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "ZHIRONG.Report", "ZHIRONG.Report\ZHIRONG.Report.pyproj", "{D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D1ABF5B5-E4AD-4D3C-B74D-3E2E4589B62B}.Release|Any CPU.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ZHIRONG.Report/ZHIRONG.Report.DevelopmentCostDetails.py b/ZHIRONG.Report/ZHIRONG.Report.DevelopmentCostDetails.py new file mode 100644 index 0000000..ca340fb --- /dev/null +++ b/ZHIRONG.Report/ZHIRONG.Report.DevelopmentCostDetails.py @@ -0,0 +1,165 @@ +#-*- encoding:utf-8 -*- + +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") +from Kingdee.BOS import * +from Kingdee.BOS.Contracts import * +from Kingdee.BOS.Contracts.Report import * +from Kingdee.BOS.Core import * +from Kingdee.BOS.Core.Metadata import * +from Kingdee.BOS.Core.Report import * +from Kingdee.BOS.Core.SqlBuilder import * +from Kingdee.BOS.App.Data import * +from Kingdee.BOS.Orm.DataEntity import * +from System import * +from System.ComponentModel import * +from System.Collections.Generic import * +from System.Text import * +from System.Threading.Tasks import * + +_sql = "" +FOrg = "" +FGroup = "" + +#³õʼ»¯ +def Initialize(): + this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL + this.IsCreateTempTableByPlugin = True + this.ReportProperty.IsGroupSummary = True + +#ÉèÖñêÌâ +def GetReportTitles(Filter): + reportTitles = ReportTitles() + customFiler = Filter.FilterParameter.CustomFilter + if customFiler: + FStartDate = customFiler["FStartDate"] + FEndDate = customFiler["FEndDate"] + global FGroup + reportTitles.AddTitle("FStartDate",str(FStartDate)) + reportTitles.AddTitle("FEndDate",str(FEndDate)) + reportTitles.AddTitle("FGroup",FGroup) + return reportTitles + +#»ñÈ¡»ù´¡×ÊÁÏ +def GetBaseDataNameValue(dyobj): + name = "" + #raise Exception(str(dir(dyobj)))#Å׳öÒì³£¼ì²éµ÷ÊÔ + if dyobj is None: + return name + elif dyobj and dyobj.DynamicObjectType.Properties.Contains("Name"): + name = dyobj["Name"].ToString() + else: + for dynbj in dyobj: + if dynbj and dynbj.DynamicObjectType.Properties.Contains("Name") == False: + dynbj2 = dynbj[2] + name = name + ",'" + dynbj2["Name"] + "'" + if name.Length > 0: + name = name.Substring(1,name.Length - 1) + return name + +#»ñÈ¡¸¨Öú×ÊÁÏ +def GetAssitantDataNameValue(dyobj): + name = "" + #raise Exception(str(dir(dyobj)))#Å׳öÒì³£¼ì²éµ÷ÊÔ + if dyobj is None: + return name + elif dyobj and dyobj.DynamicObjectType.Properties.Contains("DataValue"): + name = dyobj["DataValue"].ToString() + else: + for dynbj in dyobj: + if dynbj and dynbj.DynamicObjectType.Properties.Contains("DataValue") == False: + dynbj2 = dynbj[2] + name = name + ",'" + dynbj2["DataValue"] + "'" + if name.Length > 0: + name = name.Substring(1,name.Length - 1) + return name + +#ÉèÖõ¥¾ÝÁÐ +def GetReportHeaders(Filter): + header = ReportHeader() + # headerch = ReportHeader() + global _sql + sql = """/*dialect*/SELECT name AS ColumnName FROM sys.dm_exec_describe_first_result_set(N'{0}', NULL, NULL)""".format(_sql) + res = DBUtils.ExecuteDynamicObject(this.Context, sql) + + tempsql = """/*dialect*/SELECT TOP 1 [×éÖ¯],[¿ÆÄ¿·ÖÀà] FROM T_ReportDataSourceDetail""" + data = DBUtils.ExecuteDynamicObject(this.Context, tempsql) + global FOrg + global FGroup + if data.Count>0: + FOrg = data[0]["×éÖ¯"].ToString() + FGroup = data[0]["¿ÆÄ¿·ÖÀà"].ToString() + # FGroup = String.join(",",set(map(lambda x:str(x["¿ÆÄ¿·ÖÀà"].ToString()),data))) + for row in res: + ColumnName = row["ColumnName"].ToString().Replace("&","") + if ColumnName in ["ÈÕÆÚ","ƾ֤ºÅ","ÕªÒª","¿ÆÄ¿","¿ÆÄ¿·ÖÀà"]: + header.AddChild(row["ColumnName"],LocaleValue("µ¥Î»Ãû³Æ£º"+FOrg+"&"+ColumnName,this.Context.UserLocale.LCID),SqlStorageType.Sqlvarchar) + continue + if ColumnName in ["ƾ֤½ð¶î"]: + header.AddChild(row["ColumnName"],LocaleValue(row["ColumnName"],this.Context.UserLocale.LCID),SqlStorageType.Sqlvarchar) + continue + if(ColumnName.IndexOf("qazxsw/")!=-1 and ColumnName!="qazxsw/"): + headerch = header.AddChild(row["ColumnName"],LocaleValue(ColumnName.Substring(0,ColumnName.IndexOf("qazxsw/")),this.Context.UserLocale.LCID),SqlStorageType.Sqlvarchar) + headerch.AddChild(row["ColumnName"],LocaleValue(ColumnName.Substring(ColumnName.IndexOf("qazxsw/")+7),this.Context.UserLocale.LCID),SqlStorageType.Sqlvarchar) + + return header + +#´´½¨ÁÙʱ±¨±í +def BuilderReportSqlAndTempTable(Filter,tableName): + # strFilter = GetFilterWhere(Filter) + strFilter = "" + seqFld = String.format(this.KSQL_SEQ,OrderColumn(Filter)) + + customFiler = Filter.FilterParameter.CustomFilter + FGroupID = "" if customFiler["FGroup"] == None else str(customFiler["FGroup"]["Id"]) + DBUtils.Execute(this.Context, "EXEC P_ReportDataSourceDetail '{0}','{2}',{1},'{3}'".format(str(customFiler["FStartDate"].ToString("yyyy-MM-dd")),str(customFiler["FOrg"]["Id"]),str(customFiler["FEndDate"].ToString("yyyy-MM-dd")),FGroupID)) + global _sql + _sql = """SELECT * FROM T_ReportDataSourceDetail""" + sql = String.format("""/*dialect*/ +SELECT t1.*,{0} + INTO {1} +FROM ( + {3} + {2} +) t1 + + """,seqFld,tableName,strFilter,_sql) + DBUtils.ExecuteDynamicObject(this.Context, sql) + +#»ñÈ¡¹ýÂËÌõ¼þ +def GetFilterWhere(Filter): + customFiler = Filter.FilterParameter.CustomFilter + strwhere = StringBuilder() + strwhere.AppendLine("WHERE 1 = 1 ") + + FYEAR = customFiler["FYear"] + strFilterFYEAR = String.format(" AND T2.FYEAR = '{0}' ",FYEAR) if not String.IsNullOrWhiteSpace(FYEAR) else " " + strwhere.AppendLine(strFilterFYEAR) + + return strwhere.ToString() + +# #ÉèÖûã×ÜÐÅÏ¢ +# def GetSummaryColumnInfo(Filter): +# lstfield = List[SummaryField]() +# sField = SummaryField("±¾Î»±Ò½ð¶î",Core.Enums.BOSEnums.Enu_SummaryType.SUM) +# lstfield.Add(sField) +# return lstfield + +#ÅÅÐò +def OrderColumn(Filter): + OrderBy = "" + datasort = Filter.FilterParameter.SortString.ToString() + if datasort != "": + OrderBy = datasort + else: + OrderBy = " ¿ÆÄ¿ " + return OrderBy + +#¹Ø±ÕÇå¿ÕÁÙʱ±í +def CloseReport(): + this.DropTempTable() \ No newline at end of file diff --git a/ZHIRONG.Report/ZHIRONG.Report.DevelopmentCostSum.py b/ZHIRONG.Report/ZHIRONG.Report.DevelopmentCostSum.py new file mode 100644 index 0000000..c5eea79 --- /dev/null +++ b/ZHIRONG.Report/ZHIRONG.Report.DevelopmentCostSum.py @@ -0,0 +1,133 @@ +#-*- encoding:utf-8 -*- +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") +from Kingdee.BOS import * +from Kingdee.BOS.Contracts import * +from Kingdee.BOS.Contracts.Report import * +from Kingdee.BOS.Core import * +from Kingdee.BOS.Core.Metadata import * +from Kingdee.BOS.Core.Report import * +from Kingdee.BOS.Core.SqlBuilder import * +from Kingdee.BOS.App.Data import * +from Kingdee.BOS.Orm.DataEntity import * +from System import * +from System.ComponentModel import * +from System.Collections.Generic import * +from System.Text import * +from System.Threading.Tasks import * + +_sql = "" + +#³õʼ»¯ +def Initialize(): + this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL + this.IsCreateTempTableByPlugin = True + this.ReportProperty.IsGroupSummary = True + +#ÉèÖñêÌâ +def GetReportTitles(Filter): + reportTitles = ReportTitles() + customFiler = Filter.FilterParameter.CustomFilter + if customFiler: + FStartDate = customFiler["FStartDate"] + FEndDate = customFiler["FEndDate"] + FUnit = customFiler["FUnit"] + FOrg = GetBaseDataNameValue(customFiler["FOrg"]) + reportTitles.AddTitle("FStartDate",str(FStartDate)) + reportTitles.AddTitle("FEndDate",str(FEndDate)) + reportTitles.AddTitle("FUnit",FUnit) + reportTitles.AddTitle("FOrg",FOrg) + return reportTitles + +#»ñÈ¡»ù´¡×ÊÁÏ +def GetBaseDataNameValue(dyobj): + name = "" + #raise Exception(str(dir(dyobj)))#Å׳öÒì³£¼ì²éµ÷ÊÔ + if dyobj is None: + return name + elif dyobj and dyobj.DynamicObjectType.Properties.Contains("Name"): + name = dyobj["Name"].ToString() + else: + for dynbj in dyobj: + if dynbj and dynbj.DynamicObjectType.Properties.Contains("Name") == False: + dynbj2 = dynbj[2] + name = name + ",'" + dynbj2["Name"] + "'" + if name.Length > 0: + name = name.Substring(1,name.Length - 1) + return name + +#ÉèÖõ¥¾ÝÁÐ +def GetReportHeaders(Filter): + header = ReportHeader() + # headerch = ReportHeader() + global _sql + sql = """/*dialect*/SELECT name AS ColumnName FROM sys.dm_exec_describe_first_result_set(N'{0}', NULL, NULL)""".format(_sql) + res = DBUtils.ExecuteDynamicObject(this.Context, sql) + for row in res: + ColumnName = row["ColumnName"].ToString() + if(ColumnName.IndexOf("qazxsw/")!=-1 and ColumnName!="qazxsw/"): + headerch = header.AddChild(ColumnName,LocaleValue(ColumnName.Substring(0,ColumnName.IndexOf("qazxsw/")),this.Context.UserLocale.LCID),SqlStorageType.Sqlvarchar) + headerch.AddChild(ColumnName,LocaleValue(ColumnName.Substring(ColumnName.IndexOf("qazxsw/")+7),this.Context.UserLocale.LCID),SqlStorageType.Sqlvarchar) + continue + header.AddChild(row["ColumnName"].ToString(),LocaleValue(row["ColumnName"].ToString().Replace("qazxsw/",""),this.Context.UserLocale.LCID),SqlStorageType.Sqlvarchar) + + return header + +#´´½¨ÁÙʱ±¨±í +def BuilderReportSqlAndTempTable(Filter,tableName): + # strFilter = GetFilterWhere(Filter) + strFilter = "" + seqFld = String.format(this.KSQL_SEQ,OrderColumn(Filter)) + + customFiler = Filter.FilterParameter.CustomFilter + DBUtils.Execute(this.Context, "EXEC P_ReportDataSource '{0}','{2}',{1},{3}".format(str(customFiler["FStartDate"].ToString("yyyy-MM-dd")),str(customFiler["FOrg"]["Id"]),str(customFiler["FEndDate"].ToString("yyyy-MM-dd")),customFiler["FUnit"])) + global _sql + _sql = """SELECT * FROM T_ReportDataSource""" + sql = String.format("""/*dialect*/ +SELECT t1.*,{0} + INTO {1} +FROM ( + {3} + {2} +) t1 + + """,seqFld,tableName,strFilter,_sql) + DBUtils.ExecuteDynamicObject(this.Context, sql) + +#»ñÈ¡¹ýÂËÌõ¼þ +def GetFilterWhere(Filter): + customFiler = Filter.FilterParameter.CustomFilter + strwhere = StringBuilder() + strwhere.AppendLine("WHERE 1 = 1 ") + + FYEAR = customFiler["FYear"] + strFilterFYEAR = String.format(" AND T2.FYEAR = '{0}' ",FYEAR) if not String.IsNullOrWhiteSpace(FYEAR) else " " + strwhere.AppendLine(strFilterFYEAR) + + return strwhere.ToString() + +# #ÉèÖûã×ÜÐÅÏ¢ +# def GetSummaryColumnInfo(Filter): +# lstfield = List[SummaryField]() +# sField = SummaryField("±¾Î»±Ò½ð¶î",Core.Enums.BOSEnums.Enu_SummaryType.SUM) +# lstfield.Add(sField) +# return lstfield + +#ÅÅÐò +def OrderColumn(Filter): + OrderBy = "" + datasort = Filter.FilterParameter.SortString.ToString() + if datasort != "": + OrderBy = datasort + else: + OrderBy = " ¿ÆÄ¿ " + return OrderBy + +#¹Ø±ÕÇå¿ÕÁÙʱ±í +def CloseReport(): + this.DropTempTable() \ No newline at end of file diff --git a/ZHIRONG.Report/ZHIRONG.Report.pyproj b/ZHIRONG.Report/ZHIRONG.Report.pyproj new file mode 100644 index 0000000..fa7cdc0 --- /dev/null +++ b/ZHIRONG.Report/ZHIRONG.Report.pyproj @@ -0,0 +1,38 @@ + + + Debug + 2.0 + d1abf5b5-e4ad-4d3c-b74d-3e2e4589b62b + . + ZHIRONG.Report.DevelopmentCostDetails.py + + + D:\source\repos\ZHIRONG.Report\ZHIRONG.Report\ZHIRONG.Report.py + . + ZHIRONG.Report + ZHIRONG.Report + False + + + true + false + + + true + false + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ZHIRONG.Report/调试.py b/ZHIRONG.Report/调试.py new file mode 100644 index 0000000..e275f05 --- /dev/null +++ b/ZHIRONG.Report/调试.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +import sys +sys.setdefaultencoding('utf-8') +clr.AddReference('IronPython') +from IronPython.Hosting import Python + +def wrap_d(f): + func_name = f.__name__ + del f + def wrapper(e): + engine = Python.CreateEngine({'Debug': True}) + scope = engine.CreateScope() + scope.SetVariable('this', this) + engine.CreateScriptSourceFromFile(r'D:\source\repos\ZHIRONG.Report\ZHIRONG.Report\ZHIRONG.Report.DevelopmentCostDetails.py').Execute(scope) + return getattr(scope, func_name)(e) + return wrapper + +def wrap_a(f): + func_name = f.__name__ + del f + def wrapper(e,a): + engine = Python.CreateEngine({'Debug': True}) + scope = engine.CreateScope() + scope.SetVariable('this', this) + engine.CreateScriptSourceFromFile(r'D:\source\repos\ZHIRONG.Report\ZHIRONG.Report\ZHIRONG.Report.DevelopmentCostDetails.py').Execute(scope) + return getattr(scope, func_name)(e,a) + return wrapper + + +@wrap_a +def BuilderReportSqlAndTempTable(e,a): + pass + +@wrap_d +def GetReportHeaders(e): + pass + +@wrap_d +def GetReportTitles(e): + pass + + +