rislai
2024-07-09 bc0a06655cb1cc8f661c7ad869ebab70ecc561bb
Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev
已重命名1个文件
已添加47个文件
已修改25个文件
已删除6个文件
1509 ■■■■ 文件已修改
_Main/BL/Relations/Relation_FinancialWeeklyColumn_FinancialWeeklyCell_FinancialWeeklyCell_Finan.qbl 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_FinancialWeeklyReport_FinancialWeeklyColumn_FinancialWeeklyColumn_F.qbl 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_FinancialWeeklyReport_FinancialWeeklyRow_FinancialWeeklyRow_Financi.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_FinancialWeeklyReport_MacroPlan_MacroPlan_FinancialWeeklyReport.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_FinancialWeeklyRow_FinancialWeeklyCell_FinancialWeeklyCell_Financia.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_InventorySummaryCell_ProductInStockingPointInPeriod_ProductInStocki.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialProductionCell/Attribute_PlanValue.qbl 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialProductionCell/Function_CalcPlanValue.qbl 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultCCUnit.qbl 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultDLUnit.qbl 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialSalesReport/Method_GetRow.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialSalesRow/Method_InitializeCell.qbl 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialSalesSource/StaticMethod_Initialize.qbl 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyCell/Attribute_Value.qbl 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyCell/DefaultValue_Value.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyCell/_ROOT_Type_FinancialWeeklyCell.qbl 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyColumn/Attribute_Index.qbl 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyColumn/Attribute_Name.qbl 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyColumn/Attribute_Period.qbl 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyColumn/DefaultValue_Name.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyColumn/Function_CalcIndex.qbl 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyColumn/_ROOT_Type_FinancialWeeklyColumn.qbl 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/Attribute_ID.qbl 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/Attribute_IsShow.qbl 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/Attribute_Name.qbl 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/DefaultValue_ID.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/DefaultValue_Name.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/Method_GenerateColumn.qbl 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_Download.qbl 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultAllUnit.qbl 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultCCUnit.qbl 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultDLUnit.qbl 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultName.qbl 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_Initialize.qbl 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyReport/_ROOT_Type_FinancialWeeklyReport.qbl 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyRow/Attribute_Name.qbl 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyRow/Attribute_RowNr.qbl 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyRow/DefaultValue_Name.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_FinancialWeeklyRow/_ROOT_Type_FinancialWeeklyRow.qbl 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryCell/Function_CalcAverageInventory.qbl 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryCell/Function_CalcEndingInventory.qbl 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryCell/Function_CalcMaximumInventory.qbl 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryCell/Function_CalcMinimumInventory.qbl 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryColumn/Attribute_TimeUnit.qbl 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryColumn/Method_GenerateCell.qbl 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryReport/Method_Clear.qbl 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryReport/Method_Generate.qbl 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryReport/Method_GenerateColumn.qbl 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultCCUnit.qbl 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultDLUnit.qbl 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl 110 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventroySummaryRow/Method_Initialize#0.qbl 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventroySummaryRow/Method_Initialize.qbl 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventroySummaryRow/Method_InitializeCell.qbl 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventroySummaryRow/Method_SetCellValue#0.qbl 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_InventroySummaryRow/Method_SetCellValue0.qbl 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonFinancialWeeklyReport_OnCli.def 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_OnCreated.def 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelUnit_715_ddslUnit_OnCreated.def 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_MatrixEditorTable.def 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_PanelHeader.def 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_PanelTable.def 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_matrixEditorActionBarPageTable.def 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_matrixeditorContextMenuTable.def 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Response_OnCreated.def 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Response_PanelHeader_ButtonExport_OnClick.def 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/_ROOT_Component_FormFinancialWeeklyReport.def 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelPeriod.def 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelCategory_RadioButtonGroupUseForPlanning_OnCreated.def 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorEnd_OnChanged.def 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorStart_OnChanged.def 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelUnit_ddslUnit_OnCreated.def 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Views/Financial_weekly_report_view.vw 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_FinancialWeeklyColumn_FinancialWeeklyCell_FinancialWeeklyCell_Finan.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
Quintiq file version 2.0
#parent: #root
Relation FinancialWeeklyColumn_FinancialWeeklyCell_FinancialWeeklyCell_FinancialWeeklyColumn
{
  #keys: '1[415136.0.880724166]'
  ProceduralSequenceRelationStrategy
  {
    #keys: '13[0.0.0][415136.0.880724185][415136.0.880724179][415136.0.880724186][415136.0.880724180][415136.0.880724187][415136.0.880724181][415136.0.880724188][415136.0.880724182][415136.0.880724189][415136.0.880724183][415136.0.880724190][415136.0.880724184]'
    SequenceElementSuffix: 'CellInColumn'
    SequenceSuffix: 'CellInColumn'
  }
  RelationSide.LeftSide FinancialWeeklyCell
  {
    #keys: '3[415136.0.880724168][415136.0.880724167][415136.0.880724169]'
    Cardinality: '1toN'
    ObjectDefinition: FinancialWeeklyColumn
    OwningSide: 'Owned'
  }
  RelationSide.RightSide FinancialWeeklyColumn
  {
    #keys: '3[415136.0.880724171][415136.0.880724170][415136.0.880724172]'
    Cardinality: '0to1'
    ObjectDefinition: FinancialWeeklyCell
    OwningSide: 'Reference'
  }
}
_Main/BL/Relations/Relation_FinancialWeeklyReport_FinancialWeeklyColumn_FinancialWeeklyColumn_F.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
Quintiq file version 2.0
#parent: #root
Relation FinancialWeeklyReport_FinancialWeeklyColumn_FinancialWeeklyColumn_FinancialWeeklyReport
{
  #keys: '1[415136.0.880724207]'
  ProceduralSequenceRelationStrategy
  {
    #keys: '13[0.0.0][415136.0.880724228][415136.0.880724222][415136.0.880724229][415136.0.880724223][415136.0.880724230][415136.0.880724224][415136.0.880724231][415136.0.880724225][415136.0.880724232][415136.0.880724226][415136.0.880724233][415136.0.880724227]'
    SequenceElementSuffix: 'Column'
    SequenceSuffix: 'Column'
  }
  RelationSide.LeftSide FinancialWeeklyColumn
  {
    #keys: '3[415136.0.880724209][415136.0.880724208][415136.0.880724210]'
    Cardinality: '1toN'
    ObjectDefinition: FinancialWeeklyReport
    OwningSide: 'Owned'
  }
  RelationSide.RightSide FinancialWeeklyReport
  {
    #keys: '3[415136.0.880724212][415136.0.880724211][415136.0.880724213]'
    Cardinality: '0to1'
    ObjectDefinition: FinancialWeeklyColumn
    OwningSide: 'Reference'
  }
}
_Main/BL/Relations/Relation_FinancialWeeklyReport_FinancialWeeklyRow_FinancialWeeklyRow_Financi.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation FinancialWeeklyReport_FinancialWeeklyRow_FinancialWeeklyRow_FinancialWeeklyReport
{
  #keys: '1[415136.0.880724123]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide FinancialWeeklyRow
  {
    #keys: '3[415136.0.880724125][415136.0.880724124][415136.0.880724126]'
    Cardinality: '1toN'
    ObjectDefinition: FinancialWeeklyReport
    OwningSide: 'Owned'
  }
  RelationSide.RightSide FinancialWeeklyReport
  {
    #keys: '3[415136.0.880724128][415136.0.880724127][415136.0.880724129]'
    Cardinality: '0to1'
    ObjectDefinition: FinancialWeeklyRow
    OwningSide: 'Reference'
  }
}
_Main/BL/Relations/Relation_FinancialWeeklyReport_MacroPlan_MacroPlan_FinancialWeeklyReport.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation FinancialWeeklyReport_MacroPlan_MacroPlan_FinancialWeeklyReport
{
  #keys: '1[415136.0.880700289]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MacroPlan
  {
    #keys: '3[415136.0.880700291][415136.0.880700290][415136.0.880700292]'
    Cardinality: '0to1'
    ObjectDefinition: FinancialWeeklyReport
    OwningSide: 'Reference'
  }
  RelationSide.RightSide FinancialWeeklyReport
  {
    #keys: '3[415136.0.880700294][415136.0.880700293][415136.0.880700295]'
    Cardinality: '0to1'
    ObjectDefinition: MacroPlan
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_FinancialWeeklyRow_FinancialWeeklyCell_FinancialWeeklyCell_Financia.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation FinancialWeeklyRow_FinancialWeeklyCell_FinancialWeeklyCell_FinancialWeeklyRow
{
  #keys: '1[415136.0.880700305]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide FinancialWeeklyCell
  {
    #keys: '3[415136.0.880700307][415136.0.880700306][415136.0.880700308]'
    Cardinality: '1toN'
    ObjectDefinition: FinancialWeeklyRow
    OwningSide: 'Reference'
  }
  RelationSide.RightSide FinancialWeeklyRow
  {
    #keys: '3[415136.0.880700310][415136.0.880700309][415136.0.880700311]'
    Cardinality: '0to1'
    ObjectDefinition: FinancialWeeklyCell
    OwningSide: 'Reference'
  }
}
_Main/BL/Relations/Relation_InventorySummaryCell_ProductInStockingPointInPeriod_ProductInStocki.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_FinancialProductionCell/Attribute_PlanValue.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
Quintiq file version 2.0
#parent: #root
Attribute PlanValue
{
  #keys: '3[415136.0.880970239][415136.0.880970238][415136.0.880970240]'
  Description: '计划值'
  ValueType: Real
}
_Main/BL/Type_FinancialProductionCell/Function_CalcPlanValue.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
Quintiq file version 2.0
#parent: #root
Function CalcPlanValue
{
  TextBody:
  [*
    // ç”„兰鸽 Jul-5-2024 (created)
    value := ifexpr( this.FinancialProductionColumn().FinancialProductionReport().FinancialProductionSource().MacroPlan().StartOfPlanning().StartOfMonth().Date() <= this.FinancialProductionColumn().Period(), [Real]this.Value(), 0 );
    this.PlanValue( value );
  *]
}
_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultCCUnit.qbl
@@ -6,5 +6,6 @@
  [*
    // ç”„兰鸽 Jun-25-2024 (created)
    return '长春';
    //return 'Assembly Plant (France)';
  *]
}
_Main/BL/Type_FinancialProductionReport/StaticMethod_GetDefaultDLUnit.qbl
@@ -6,5 +6,6 @@
  [*
    // ç”„兰鸽 Jun-25-2024 (created)
    return '大连';
    //return 'Assembly Plant (Spain)';
  *]
}
_Main/BL/Type_FinancialSalesReport/Method_GetRow.qbl
@@ -2,9 +2,7 @@
#parent: #root
Method GetRow (
  String salessegment,
  String product,
  DateTime startdate,
  DateTime enddate
  String product
) as FinancialSalesRow
{
  TextBody:
@@ -15,7 +13,7 @@
    if( isnull( row ) ){
      row := this.FinancialSalesRow( relnew, Name := product, Unit := salessegment );
      //初始化单元格
      row.InitializeCell( this, startdate, enddate );
      row.InitializeCell( this );
    }
    
    return row;
_Main/BL/Type_FinancialSalesRow/Method_InitializeCell.qbl
@@ -1,19 +1,13 @@
Quintiq file version 2.0
#parent: #root
Method InitializeCell (
  FinancialSalesReport table,
  DateTime startdate,
  DateTime enddate
  FinancialSalesReport table
)
{
  TextBody:
  [*
    // ç”„兰鸽 Jun-28-2024 (created)
    for( start := startdate; start < enddate; start := start.StartOfNextMonth() ){
      periodtime := start.Date();
      periodname := periodtime.Format( "M2/D2/Y" );
      column := selectobject( table, FinancialSalesColumn, column, column.Name() = periodname and column.Period() = periodtime );
    traverse( table, FinancialSalesColumn, column ){
      this.Initialize( column, this.Unit() );
    }
  *]
_Main/BL/Type_FinancialSalesSource/StaticMethod_Initialize.qbl
@@ -23,7 +23,7 @@
    table                     := source.FinancialSalesReport( relnew, ID := source.Name(), Name := source.Name(), IsImport := false );
    showtable                 := source.FinancialSalesReport( relnew, ID := source.Name() + 'Show', Name := source.Name(), IsImport := false, IsShow := true );
    startofplanning           := owner.StartOfPlanning();
    startofyear               := startofplanning.StartOfYear();
    //startofyear               := startofplanning.StartOfYear();
    startofnextyear           := startofplanning.StartOfNextYear();
    
    search                    := source.FinancialSalesSearch( relnew, Unit := allsalessegment, Generation := allsalessegment, MqbMlb := allsalessegment, Power := allsalessegment );
@@ -34,7 +34,7 @@
    traverse( owner, SalesDemand.astype( Forecast ), forecast, forecast.StartDate() < startofnextyear.Date() and ( ( forecast.SalesSegmentName() = ccsalessegment and forecast.Product_MP().MQBMLB() = 'MLB' ) 
              or forecast.SalesSegmentName() = tjsalessegment or forecast.SalesSegmentName() = fssalessegment ) ){
      product    := forecast.Product_MP();
      allrow     := table.GetRow( allsalessegment, product.ID(), startofyear, startofnextyear );
      allrow     := table.GetRow( allsalessegment, product.ID() );
      periodtime := forecast.StartDate().StartOfMonth();
      periodname := periodtime.Format( "M2/D2/Y" );
      
@@ -47,13 +47,13 @@
      //Forecast的Sales Segment为长春,识别出MLB的所有产品汇总
      if( forecast.SalesSegmentName() = ccsalessegment and product.MQBMLB() = 'MLB' ){
    //    info( '------------------------', column.Name() );
        ccrow := table.GetRow( ccsalessegment, product.ID(), startofyear, startofnextyear );
        ccrow := table.GetRow( ccsalessegment, product.ID() );
    //    info( '------------------------', ccrow.FinancialSalesCell( relsize ), column.FinancialSalesCell( relsize ) );
        ccrow.Initialize( column, forecast.Quantity() );
      }else if( forecast.SalesSegmentName() = tjsalessegment or forecast.SalesSegmentName() = fssalessegment ){
        //大连财务销量:首先在forecast界面查找Sales Segment是天津和佛山的所有需求,每个产品按月汇总需求数量
    //    info( '------------------------', column.Name() );
        dlrow := table.GetRow( dlsalessegment, product.ID(), startofyear, startofnextyear );
        dlrow := table.GetRow( dlsalessegment, product.ID() );
    //    info( '------------------------', dlrow.FinancialSalesCell( relsize ), column.FinancialSalesCell( relsize ) );
        dlrow.Initialize( column, forecast.Quantity() );
      }
@@ -67,10 +67,10 @@
          periodtime := pispip.Start().StartOfMonth().Date();
          periodname := periodtime.Format( "M2/D2/Y" );
          column    := selectobject( table, FinancialSalesColumn, column, column.Name() = periodname and column.Period() = periodtime );
          ccrow := table.GetRow( ccsalessegment, product.ID(), startofyear, startofnextyear );
          ccrow := table.GetRow( ccsalessegment, product.ID() );
          ccrow.Initialize( column, pispip.DependentDemandAndSalesDemandQuantity() );//取Total Demand字段按月汇总需求数量
          
          allrow     := table.GetRow( allsalessegment, product.ID(), startofyear, startofnextyear );
          allrow     := table.GetRow( allsalessegment, product.ID() );
          allrow.Initialize( column, pispip.DependentDemandAndSalesDemandQuantity() );
        }
      }
@@ -84,10 +84,10 @@
        
        column    := selectobject( table, FinancialSalesColumn, column, column.Name() = periodname and column.Period() = periodtime );
        traverse( trip, ProductInTrip, pit ){
          dlrow      := table.GetRow( dlsalessegment, pit.ProductID(), startofyear, startofnextyear );
          dlrow      := table.GetRow( dlsalessegment, pit.ProductID() );
          dlrow.Initialize( column, pit.Quantity() );//取Total Demand字段按月汇总需求数量
          
          allrow     := table.GetRow( allsalessegment, pit.ProductID(), startofyear, startofnextyear );
          allrow     := table.GetRow( allsalessegment, pit.ProductID() );
          allrow.Initialize( column, pit.Quantity() );
        }
      }
_Main/BL/Type_FinancialWeeklyCell/Attribute_Value.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
Quintiq file version 2.0
#parent: #root
Attribute Value
{
  #keys: '3[415136.0.880700281][415136.0.880700280][415136.0.880700282]'
  ValueType: String
}
_Main/BL/Type_FinancialWeeklyCell/DefaultValue_Value.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#parent: #root
DefaultValue
{
  TargetAttribute: Value
}
_Main/BL/Type_FinancialWeeklyCell/_ROOT_Type_FinancialWeeklyCell.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
Type FinancialWeeklyCell
{
  #keys: '5[415136.0.880700278][415136.0.880700276][0.0.0][415136.0.880700277][415136.0.880700279]'
  BaseType: Object
  Description: '财务周报报表单元格'
  StructuredName: 'FinancialWeeklyCells'
}
_Main/BL/Type_FinancialWeeklyColumn/Attribute_Index.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
Quintiq file version 2.0
#parent: #root
Attribute Index
{
  #keys: '3[415136.0.880700264][415136.0.880700263][415136.0.880700265]'
  ValueType: Number
}
_Main/BL/Type_FinancialWeeklyColumn/Attribute_Name.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
Quintiq file version 2.0
#parent: #root
Attribute Name
{
  #keys: '3[415136.0.880700267][415136.0.880700266][415136.0.880700268]'
  ValueType: String
}
_Main/BL/Type_FinancialWeeklyColumn/Attribute_Period.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
Quintiq file version 2.0
#parent: #root
Attribute Period
{
  #keys: '3[415136.0.880700270][415136.0.880700269][415136.0.880700271]'
  ValueType: Date
}
_Main/BL/Type_FinancialWeeklyColumn/DefaultValue_Name.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#parent: #root
DefaultValue
{
  TargetAttribute: Name
}
_Main/BL/Type_FinancialWeeklyColumn/Function_CalcIndex.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
Quintiq file version 2.0
#parent: #root
Function CalcIndex
{
  TextBody:
  [*
    // ç”„兰鸽 Jun-21-2024 (created)1
    value := ifexpr( isnull( this.PreviousColumn() ), 0, this.PreviousColumn().Index() + 1 );
    this.Index( value );
  *]
}
_Main/BL/Type_FinancialWeeklyColumn/_ROOT_Type_FinancialWeeklyColumn.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
Type FinancialWeeklyColumn
{
  #keys: '5[415136.0.880700261][415136.0.880700259][0.0.0][415136.0.880700260][415136.0.880700262]'
  BaseType: Object
  Description: '财务周报列'
  StructuredName: 'FinancialWeeklyColumns'
}
_Main/BL/Type_FinancialWeeklyReport/Attribute_ID.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
Quintiq file version 2.0
#parent: #root
Attribute ID
{
  #keys: '3[415136.0.880700226][415136.0.880700225][415136.0.880700227]'
  IsReadOnly: true
  ValueType: String
}
_Main/BL/Type_FinancialWeeklyReport/Attribute_IsShow.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
Quintiq file version 2.0
#parent: #root
Attribute IsShow
{
  #keys: '3[415136.0.880700229][415136.0.880700228][415136.0.880700230]'
  ValueType: Boolean
}
_Main/BL/Type_FinancialWeeklyReport/Attribute_Name.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
Quintiq file version 2.0
#parent: #root
Attribute Name
{
  #keys: '3[415136.0.880700232][415136.0.880700231][415136.0.880700233]'
  Description: '名称'
  ValueType: String
}
_Main/BL/Type_FinancialWeeklyReport/DefaultValue_ID.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#parent: #root
DefaultValue
{
  TargetAttribute: ID
}
_Main/BL/Type_FinancialWeeklyReport/DefaultValue_Name.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#parent: #root
DefaultValue
{
  TargetAttribute: Name
}
_Main/BL/Type_FinancialWeeklyReport/Method_GenerateColumn.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
Quintiq file version 2.0
#parent: #root
Method GenerateColumn (
  MacroPlan owner
)
{
  TextBody:
  [*
    // ç”„兰鸽 Jun-25-2024 (created)
    startofplanning           := owner.StartOfPlanning();
    startofyear               := startofplanning.StartOfYear();
    startofnextyear           := startofplanning.StartOfNextYear();
    for( start := startofyear; start < startofnextyear; start := start.StartOfNextMonth() ){
      periodtime := start.Date();
      periodname := periodtime.Format( "M2/D2/Y" );
      this.FinancialWeeklyColumn( relnew, Name := periodname, Period := periodtime );
    }
  *]
}
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_Download.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
Quintiq file version 2.0
#parent: #root
StaticMethod Download (
  MacroPlan macroPlan
) as BinaryValue
{
  Description: '下载财务报表数据'
  TextBody:
  [*
    table := macroPlan.FinancialWeeklyReport();
    xmlDOMI := XMLDOMImplementation::Create();
    xmlDOM  := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + table.Name() + '</name></table>' );
    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
    //行名
    rowcolumnelement := xmlDOM.CreateElement( "column" );
    rownameelement   := xmlDOM.CreateElement( "name" );
    rowtypeelement   := xmlDOM.CreateElement( "type" );
    rownameelement.TextContent( '' );
    rowtypeelement.TextContent( "String" );
    rowcolumnelement.AppendChild( rownameelement );
    rowcolumnelement.AppendChild( rowtypeelement );
    tableElement.AppendChild( rowcolumnelement );
    traverse ( table, FinancialWeeklyColumn, column ) {
      columnelement := xmlDOM.CreateElement( "column" );
      nameelement   := xmlDOM.CreateElement( "name" );
      typeelement   := xmlDOM.CreateElement( "type" );
      nameelement.TextContent( column.Name() );
      typeelement.TextContent( "String" );
      columnelement.AppendChild( nameelement );
      columnelement.AppendChild( typeelement );
      cells := selectsortedset( column, FinancialWeeklyCell, cell, cell.FinancialWeeklyRow().RowNr() );
      traverse ( cells, Elements, c ) {
        if( column.Index() = 0 ){
          row := c.FinancialWeeklyRow();
          //行名
          rowcellElement := xmlDOM.CreateElement( "cell" );
          rowcellElement.SetAttribute( "value", row.Name() );
          rowcolumnelement.AppendChild( rowcellElement );
        }
        cellElement := xmlDOM.CreateElement( "cell" );
        cellElement.SetAttribute( "value", c.Value() );
        columnelement.AppendChild( cellElement );
      }
      tableElement.AppendChild( columnelement );
    }
    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM );
    //info( xmlString );
    tableGroupHandle := TableGroupHandle::Create( FinancialWeeklyReport::GetDefaultName() );
    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
    tableGroupHandle.Add( tableHandle );
    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
    return binaryData.AsBinaryValue();
  *]
}
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultAllUnit.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
Quintiq file version 2.0
#parent: #root
StaticMethod GetDefaultAllUnit () const as String
{
  TextBody:
  [*
    // ç”„兰鸽 Jun-28-2024 (created)
    return '<All>';
  *]
}
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultCCUnit.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
Quintiq file version 2.0
#parent: #root
StaticMethod GetDefaultCCUnit () const as String
{
  TextBody:
  [*
    // ç”„兰鸽 Jun-28-2024 (created)
    return '长春';
    //return 'Assembly Plant (France)';
  *]
}
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultDLUnit.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
Quintiq file version 2.0
#parent: #root
StaticMethod GetDefaultDLUnit () const as String
{
  TextBody:
  [*
    // ç”„兰鸽 Jun-28-2024 (created)
    return '大连';
    //return 'Assembly Plant (Spain)';
  *]
}
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_GetDefaultName.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
Quintiq file version 2.0
#parent: #root
StaticMethod GetDefaultName () const as String
{
  TextBody:
  [*
    // ç”„兰鸽 Jun-25-2024 (created)
    return 'Financial weekly';
  *]
}
_Main/BL/Type_FinancialWeeklyReport/StaticMethod_Initialize.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,173 @@
Quintiq file version 2.0
#parent: #root
StaticMethod Initialize (
  MacroPlan owner
)
{
  Description: '初始化'
  TextBody:
  [*
    // ç”„兰鸽 Jul-4-2024 (created)
    owner.FinancialWeeklyReport( relflush );
    ccunit                    := FinancialWeeklyReport::GetDefaultCCUnit();
    dlunit                    := FinancialWeeklyReport::GetDefaultDLUnit();
    allunit                   := FinancialWeeklyReport::GetDefaultAllUnit();
    defaultname               := FinancialWeeklyReport::GetDefaultName();
    startofplanning           := owner.StartOfPlanning();
    table                     := owner.FinancialWeeklyReport( relnew, ID := defaultname, Name := defaultname );
    //产量报表
    productiontable           := selectobject( owner, FinancialProductionSource.FinancialProductionReport, report, not report.IsImport() and not report.IsShow() );
    //销量报表
    salestable                := selectobject( owner, FinancialSalesSource.FinancialSalesReport, report, not report.IsImport() and not report.IsShow() );
    table.GenerateColumn( owner );
    totalproduction           := table.FinancialWeeklyRow( relnew, Name := '总产量', RowNr := 1 );
    dlproduction              := table.FinancialWeeklyRow( relnew, Name := 'DL产量', RowNr := 2 );
    ccproduction              := table.FinancialWeeklyRow( relnew, Name := 'CC产量', RowNr := 3 );
    totalsales                := table.FinancialWeeklyRow( relnew, Name := '总销量', RowNr := 4 );
    dlsales                   := table.FinancialWeeklyRow( relnew, Name := 'DL销量', RowNr := 5 );
    ccsales                   := table.FinancialWeeklyRow( relnew, Name := 'CC销量', RowNr := 6 );
    //SUM
    totalpvaluesum            := [Real]0;
    dlpvaluesum               := [Real]0;
    ccpvaluesum               := [Real]0;
    totalsvaluesum            := [Real]0;
    dlsvaluesum               := [Real]0;
    ccsvaluesum               := [Real]0;
    //累计量
    totalpvaluecumulant       := [Real]0;
    dlpvaluecumulant          := [Real]0;
    ccpvaluecumulant          := [Real]0;
    totalsvaluecumulant       := [Real]0;
    dlsvaluecumulant          := [Real]0;
    ccsvaluecumulant          := [Real]0;
    traverse( table, FinancialWeeklyColumn, column ){
      productioncolumn      := selectobject( productiontable, FinancialProductionColumn, pcolumn, pcolumn.Name() = column.Name() and pcolumn.Period() = column.Period() );
      salescolumn           := selectobject( salestable, FinancialSalesColumn, scolumn, scolumn.Name() = column.Name() and scolumn.Period() = column.Period() );
      //产量汇总
      totalpvalue           := [Real]0;
      dlpvalue              := [Real]0;
      ccpvalue              := [Real]0;
      traverse( productioncolumn, FinancialProductionCell, cell, [Real]cell.Value() > 0 ){
        unit                := cell.FinancialProductionRow().Unit();
        if( unit = allunit ){
          totalpvalue       := totalpvalue + [Real]cell.Value();
          if( column.Period() = startofplanning.StartOfMonth().Date() ){
            totalpvaluecumulant := totalpvaluecumulant - cell.PlanValue();
          }
        }else if( unit = dlunit ){
          dlpvalue          := dlpvalue + [Real]cell.Value();
          if( column.Period() = startofplanning.StartOfMonth().Date() ){
            dlpvaluecumulant := dlpvaluecumulant - cell.PlanValue();
          }
        }else if( unit = ccunit ){
          ccpvalue          := ccpvalue + [Real]cell.Value();
          if( column.Period() = startofplanning.StartOfMonth().Date() ){
            ccpvaluecumulant := ccpvaluecumulant - cell.PlanValue();
          }
        }
      }
      totalpcell            := column.FinancialWeeklyCell( relnew, Value := [String]totalpvalue );
      totalproduction.FinancialWeeklyCell( relinsert, totalpcell );
      dlpcell               := column.FinancialWeeklyCell( relnew, Value := [String]dlpvalue );
      dlproduction.FinancialWeeklyCell( relinsert, dlpcell );
      ccpcell               := column.FinancialWeeklyCell( relnew, Value := [String]ccpvalue );
      ccproduction.FinancialWeeklyCell( relinsert, ccpcell );
      //销量汇总
      totalsvalue           := [Real]0;
      dlsvalue              := [Real]0;
      ccsvalue              := [Real]0;
      traverse( salescolumn, FinancialSalesCell, cell, [Real]cell.Value() > 0 ){
        unit                := cell.FinancialSalesRow().Unit();
        if( unit = allunit ){
          totalsvalue       := totalsvalue + [Real]cell.Value();
        }else if( unit = dlunit ){
          dlsvalue          := dlsvalue + [Real]cell.Value();
        }else if( unit = ccunit ){
          ccsvalue          := ccsvalue + [Real]cell.Value();
        }
      }
      totalscell            := column.FinancialWeeklyCell( relnew, Value := [String]totalsvalue );
      totalsales.FinancialWeeklyCell( relinsert, totalscell );
      dlscell               := column.FinancialWeeklyCell( relnew, Value := [String]dlsvalue );
      dlsales.FinancialWeeklyCell( relinsert, dlscell );
      ccscell               := column.FinancialWeeklyCell( relnew, Value := [String]ccsvalue );
      ccsales.FinancialWeeklyCell( relinsert, ccscell );
      if( column.Period() < startofplanning.StartOfMonth().Date() ){
        totalpvaluecumulant := totalpvaluecumulant + totalpvalue;
        dlpvaluecumulant    := dlpvaluecumulant + dlpvalue;
        ccpvaluecumulant    := ccpvaluecumulant + ccpvalue;
        totalsvaluecumulant := totalsvaluecumulant + totalsvalue;
        dlsvaluecumulant    := dlsvaluecumulant + dlsvalue;
        ccsvaluecumulant    := ccsvaluecumulant + ccsvalue;
      }
      totalpvaluesum        := totalpvaluesum + totalpvalue;
      dlpvaluesum           := dlpvaluesum + dlpvalue;
      ccpvaluesum           := ccpvaluesum + ccpvalue;
      totalsvaluesum        := totalsvaluesum + totalsvalue;
      dlsvaluesum           := dlsvaluesum + dlsvalue;
      ccsvaluesum           := ccsvaluesum + ccsvalue;
    }
    sumcolumn                 := table.FinancialWeeklyColumn( relnew, Name := 'SUM' );
    cumulantcolumn            := table.FinancialWeeklyColumn( relnew, Name := '累计量' );
    proportioncolumn          := table.FinancialWeeklyColumn( relnew, Name := '占比' );
    //SUM
    totalpcellsum           := sumcolumn.FinancialWeeklyCell( relnew, Value := [String]totalpvaluesum );
    totalproduction.FinancialWeeklyCell( relinsert, totalpcellsum );
    dlpcellsum              := sumcolumn.FinancialWeeklyCell( relnew, Value := [String]dlpvaluesum );
    dlproduction.FinancialWeeklyCell( relinsert, dlpcellsum );
    ccpcellsum              := sumcolumn.FinancialWeeklyCell( relnew, Value := [String]ccpvaluesum );
    ccproduction.FinancialWeeklyCell( relinsert, ccpcellsum );
    totalscellsum           := sumcolumn.FinancialWeeklyCell( relnew, Value := [String]totalsvaluesum );
    totalsales.FinancialWeeklyCell( relinsert, totalscellsum );
    dlscellsum              := sumcolumn.FinancialWeeklyCell( relnew, Value := [String]dlsvaluesum );
    dlsales.FinancialWeeklyCell( relinsert, dlscellsum );
    ccscellsum              := sumcolumn.FinancialWeeklyCell( relnew, Value := [String]ccsvaluesum );
    ccsales.FinancialWeeklyCell( relinsert, ccscellsum );
    //累计量
    totalpcellcumulant      := cumulantcolumn.FinancialWeeklyCell( relnew, Value := [String]totalpvaluecumulant );
    totalproduction.FinancialWeeklyCell( relinsert, totalpcellcumulant );
    dlpcellcumulant         := cumulantcolumn.FinancialWeeklyCell( relnew, Value := [String]dlpvaluecumulant );
    dlproduction.FinancialWeeklyCell( relinsert, dlpcellcumulant );
    ccpcellcumulant         := cumulantcolumn.FinancialWeeklyCell( relnew, Value := [String]ccpvaluecumulant );
    ccproduction.FinancialWeeklyCell( relinsert, ccpcellcumulant );
    totalscellcumulant      := cumulantcolumn.FinancialWeeklyCell( relnew, Value := [String]totalsvaluecumulant );
    totalsales.FinancialWeeklyCell( relinsert, totalscellcumulant );
    dlscellcumulant         := cumulantcolumn.FinancialWeeklyCell( relnew, Value := [String]dlsvaluecumulant );
    dlsales.FinancialWeeklyCell( relinsert, dlscellcumulant );
    ccscellcumulant         := cumulantcolumn.FinancialWeeklyCell( relnew, Value := [String]ccsvaluecumulant );
    ccsales.FinancialWeeklyCell( relinsert, ccscellcumulant );
    //占比
    totalpvalueproportion   := guard( ( totalpvaluecumulant / totalpvaluesum ).Format( 'N(Dec(2))' ), '0.00' );
    totalpcellproportion    := proportioncolumn.FinancialWeeklyCell( relnew, Value := totalpvalueproportion );
    totalproduction.FinancialWeeklyCell( relinsert, totalpcellproportion );
    dlpvalueproportion      := guard( ( dlpvaluecumulant / dlpvaluesum ).Format( 'N(Dec(2))' ), '0.00' );
    dlpcellproportion       := proportioncolumn.FinancialWeeklyCell( relnew, Value := dlpvalueproportion );
    dlproduction.FinancialWeeklyCell( relinsert, dlpcellproportion );
    ccpvalueproportion      := guard( ( ccpvaluecumulant / ccpvaluesum ).Format( 'N(Dec(2))' ), '0.00' );
    ccpcellproportion       := proportioncolumn.FinancialWeeklyCell( relnew, Value := ccpvalueproportion );
    ccproduction.FinancialWeeklyCell( relinsert, ccpcellproportion );
    totalsvalueproportion   := guard( ( totalsvaluecumulant / totalsvaluesum ).Format( 'N(Dec(2))' ), '0.00' );
    totalscellproportion    := proportioncolumn.FinancialWeeklyCell( relnew, Value := totalsvalueproportion );
    totalsales.FinancialWeeklyCell( relinsert, totalscellproportion );
    dlsvalueproportion      := guard( ( dlsvaluecumulant / dlsvaluesum ).Format( 'N(Dec(2))' ), '0.00' );
    dlscellproportion       := proportioncolumn.FinancialWeeklyCell( relnew, Value := dlsvalueproportion );
    dlsales.FinancialWeeklyCell( relinsert, dlscellproportion );
    ccsvalueproportion      := guard( ( ccsvaluecumulant / ccsvaluesum ).Format( 'N(Dec(2))' ), '0.00' );
    ccscellproportion       := proportioncolumn.FinancialWeeklyCell( relnew, Value := ccsvalueproportion );
    ccsales.FinancialWeeklyCell( relinsert, ccscellproportion );
    info( sumcolumn.FinancialWeeklyCell( relsize ), cumulantcolumn.FinancialWeeklyCell( relsize ), proportioncolumn.FinancialWeeklyCell( relsize ) );
  *]
}
_Main/BL/Type_FinancialWeeklyReport/_ROOT_Type_FinancialWeeklyReport.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
Type FinancialWeeklyReport
{
  #keys: '5[415136.0.880700223][415136.0.880700221][0.0.0][415136.0.880700222][415136.0.880700224]'
  BaseType: Object
  Description: '财务周报报表'
  StructuredName: 'FinancialWeeklyReports'
}
_Main/BL/Type_FinancialWeeklyRow/Attribute_Name.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
Quintiq file version 2.0
#parent: #root
Attribute Name
{
  #keys: '3[415136.0.880700246][415136.0.880700245][415136.0.880700247]'
  ValueType: String
}
_Main/BL/Type_FinancialWeeklyRow/Attribute_RowNr.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
Quintiq file version 2.0
#parent: #root
Attribute RowNr
{
  #keys: '3[415136.0.880700249][415136.0.880700248][415136.0.880700250]'
  ValueType: Number
}
_Main/BL/Type_FinancialWeeklyRow/DefaultValue_Name.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#parent: #root
DefaultValue
{
  TargetAttribute: Name
}
_Main/BL/Type_FinancialWeeklyRow/_ROOT_Type_FinancialWeeklyRow.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
Type FinancialWeeklyRow
{
  #keys: '5[415136.0.880700240][415136.0.880700238][0.0.0][415136.0.880700239][415136.0.880700241]'
  BaseType: Object
  Description: '财务周报行'
  StructuredName: 'FinancialWeeklyRows'
}
_Main/BL/Type_InventorySummaryCell/Function_CalcAverageInventory.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_InventorySummaryCell/Function_CalcEndingInventory.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_InventorySummaryCell/Function_CalcMaximumInventory.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_InventorySummaryCell/Function_CalcMinimumInventory.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_InventorySummaryColumn/Attribute_TimeUnit.qbl
ÎļþÃû´Ó _Main/BL/Type_InventorySummaryColumn/Attribute_Category.qbl ÐÞ¸Ä
@@ -1,6 +1,6 @@
Quintiq file version 2.0
#parent: #root
Attribute Category
Attribute TimeUnit
{
  #keys: '3[415136.0.865101993][415136.0.865101992][415136.0.865101994]'
  Description: 'day;week;month'
_Main/BL/Type_InventorySummaryColumn/Method_GenerateCell.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
Quintiq file version 2.0
#parent: #root
Method GenerateCell (
  InventoryPointSelections selections,
  Strings ccstockingpointids,
  Strings dlstockingpointids,
  InventorySummaryReport table,
  Date start,
  Date end,
  String productid,
  String allunit,
  String ccunit,
  String dlunit
)
{
  TextBody:
  [*
    // ç”„兰鸽 Jul-3-2024 (created)
    //All
    alldetails := selectset( selections, Elements.InventoryInterfaceDataDetail, detail, detail.PartNumber() = productid and detail.Date() >= start and detail.Date() <= end );
    if( alldetails.Size() > 0 ){
      allrow     := table.GetRow( allunit, productid );
      allvalue := sum( alldetails, Elements, e, e.Quantity() );
      allrow.SetCellValue( this, allvalue );
      //长春
      ccdetails := selectset( alldetails, Elements, detail, ccstockingpointids.Find( detail.InventoryPointSelection().StockpoingPoint() ) >= 0 );
      if( ccdetails.Size() > 0 ){
        ccrow := table.GetRow( ccunit, productid );
        value := sum( ccdetails, Elements, e, e.Quantity() );
        ccrow.SetCellValue( this, value );
      }
      //大连
      dldetails := selectset( alldetails, Elements, detail, dlstockingpointids.Find( detail.InventoryPointSelection().StockpoingPoint() ) >= 0 );
      if( dldetails.Size() > 0 ){
        dlrow := table.GetRow( dlunit, productid );
        value := sum( dldetails, Elements, e, e.Quantity() );
        dlrow.SetCellValue( this, value );
      }
    }
  *]
}
_Main/BL/Type_InventorySummaryReport/Method_Clear.qbl
@@ -1,6 +1,10 @@
Quintiq file version 2.0
#parent: #root
Method Clear
Method Clear (
  String timeunit,
  DateTime starttime,
  DateTime endtime
)
{
  TextBody:
  [*
@@ -8,6 +12,6 @@
    this.InventorySummaryColumn( relflush );
    this.InventroySummaryRow( relflush );
    
    this.GenerateColumn( this.InventorySummarySource().MacroPlan() );
    this.GenerateColumn( this.InventorySummarySource().MacroPlan(), timeunit, starttime, endtime );
  *]
}
_Main/BL/Type_InventorySummaryReport/Method_Generate.qbl
@@ -8,35 +8,40 @@
  TextBody:
  [*
    // ç”„兰鸽 Jun-25-2024 (created)
    table      := selectobject( this, InventorySummarySource.InventorySummaryReport, report, not report.IsShow() );
    allunit    := '<All>';
    //清空之前存储的显示数据
    this.Clear();
    //过滤后的产品id
    productids := selectuniquevalues( products, Elements, product, ( search.Generation() = allunit or product.Generation() = search.Generation() )
                                      and ( search.MqbMlb() = allunit or product.MQBMLB() = search.MqbMlb() )
                                      and ( search.Power() = allunit or product.Power() = search.Power() ), product.ID() );
    sumrow     := this.InventroySummaryRow( relnew, Name := 'SUM', Unit := search.Unit(), RowNr := table.InventroySummaryRow( relsize ) );
    traverse( table, InventroySummaryRow, row, row.Unit() = search.Unit() ){
      productid  := construct( Strings );
      productid.Add( row.Name() );
      if( productids.ContainsAll( productid ) ){
        showrow := this.InventroySummaryRow( relnew, Name := row.Name(), Unit := row.Unit(), RowNr := row.RowNr() );
    startofplanning           := search.InventorySummarySource().MacroPlan().StartOfPlanning();
    startofyear               := startofplanning.StartOfYear();
    startofendyear            := startofplanning.StartOfNextYear() - Duration::Days( 1 );
    //查询日期返回需要在计划日期之内
    if( search.StartDate().DateTime() < startofendyear and search.EndDate().DateTime() > startofyear ){
      table      := selectobject( this, InventorySummarySource.InventorySummaryReport, report, not report.IsShow() );
      allunit    := '<All>';
      //清空之前存储的显示数据
      this.Clear( search.Category(), search.StartDate().DateTime(), search.EndDate().DateTime() );
      //过滤后的产品id
      productids := selectuniquevalues( products, Elements, product, ( search.Generation() = allunit or product.Generation() = search.Generation() )
                                        and ( search.MqbMlb() = allunit or product.MQBMLB() = search.MqbMlb() )
                                        and ( search.Power() = allunit or product.Power() = search.Power() ), product.ID() );
      sumrow     := this.InventroySummaryRow( relnew, Name := 'SUM', Unit := search.Unit(), RowNr := table.InventroySummaryRow( relsize ) );
      sumrow.InitializeCell( this );
      traverse( table, InventroySummaryRow, row, row.Unit() = search.Unit() ){
        productid  := construct( Strings );
        productid.Add( row.Name() );
        
        traverse( row, InventorySummaryCell, cell ){
    //      column   := selectobject( this, InventorySummaryColumn, column, column.Name() = cell.InventorySummaryColumn().Name() );
    //
    //      sumcell  := selectobject( column, InventorySummaryCell, c, c.InventroySummaryRow() = sumrow );
    //      if( isnull( sumcell ) ){
    //        sumcell := column.InventorySummaryCell( relnew, Value := '0' );
    //        sumrow.InventorySummaryCell( relinsert, sumcell );
    //      }
    //
    //      showcell := column.InventorySummaryCell( relnew, Value := cell.Value() );
    //      showrow.InventorySummaryCell( relinsert, showcell );
    //      value := [Real]cell.Value() + [Real]sumcell.Value();
    //      sumcell.Value( [String]value );
        if( productids.ContainsAll( productid ) ){
          showrow := this.InventroySummaryRow( relnew, Name := row.Name(), Unit := row.Unit(), RowNr := row.RowNr() );
          traverse( row, InventorySummaryCell, cell, cell.InventorySummaryColumn().TimeUnit() = search.Category() ){
            column   := selectobject( this, InventorySummaryColumn, column, column.Name() = cell.InventorySummaryColumn().Name() );
            sumcell  := selectobject( column, InventorySummaryCell, c, c.InventroySummaryRow() = sumrow );
            showcell := column.InventorySummaryCell( relnew, EndingInventory := cell.EndingInventory(), MinimumInventory := cell.MinimumInventory(), MaximumInventory := cell.MaximumInventory(), AverageInventory := cell.AverageInventory() );
            showrow.InventorySummaryCell( relinsert, showcell );
            sumcell.EndingInventory( sumcell.EndingInventory() + cell.EndingInventory() );
            sumcell.MinimumInventory( sumcell.MinimumInventory() + cell.MinimumInventory() );
            sumcell.MaximumInventory( sumcell.MaximumInventory() + cell.MaximumInventory() );
            sumcell.AverageInventory( sumcell.AverageInventory() + cell.AverageInventory() );
          }
        }
      }
    }
_Main/BL/Type_InventorySummaryReport/Method_GenerateColumn.qbl
@@ -1,7 +1,10 @@
Quintiq file version 2.0
#parent: #root
Method GenerateColumn (
  MacroPlan owner
  MacroPlan owner,
  String timeunit,
  DateTime starttime,
  DateTime endtime
)
{
  TextBody:
@@ -9,12 +12,37 @@
    // ç”„兰鸽 Jun-25-2024 (created)
    startofplanning           := owner.StartOfPlanning();
    startofyear               := startofplanning.StartOfYear();
    startofnextyear           := startofplanning.StartOfNextYear();
    for( start := startofyear; start < startofnextyear; start := start.StartOfNextMonth() ){
    startofendyear            := startofplanning.StartOfNextYear() - Duration::Days( 1 );
    //查询日期返回需要在计划日期之内
    if( starttime < startofendyear and endtime > startofyear ){
      if( starttime < startofyear ){
        starttime := startofyear;
      }
      if( endtime > startofendyear ){
        endtime := startofendyear;
      }
    for( start := starttime; start <= endtime; start := start.StartOfNextDay() ){
      periodtime := start.Date();
      periodname := periodtime.Format( "M2/D2/Y" );
      this.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime );
      if( timeunit = 'All' or timeunit = Translations::MP_GlobalParameters_Day() ){
        this.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime, TimeUnit := Translations::MP_GlobalParameters_Day() );
      }
      if( timeunit = 'All' or timeunit = Translations::MP_GlobalParameters_Week() ){
        weekend := ( start.StartOfNextWeek() - Duration::Days( 1 ) ).Date();
        if( periodtime = weekend ){
          this.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime, TimeUnit := Translations::MP_GlobalParameters_Week() );
        }
      }
      if( timeunit = 'All' or timeunit = Translations::MP_GlobalParameters_Month() ){
        monthend := ( start.StartOfNextMonth() - Duration::Days( 1 ) ).Date();
        if( periodtime = monthend ){
          this.InventorySummaryColumn( relnew, Name := periodname, Period := periodtime, TimeUnit := Translations::MP_GlobalParameters_Month() );
        }
      }
    }
    }
  *]
}
_Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl
@@ -2,9 +2,7 @@
#parent: #root
Method GetRow (
  String unit,
  String product,
  DateTime startdate,
  DateTime enddate
  String product
) as InventroySummaryRow
{
  TextBody:
@@ -15,7 +13,7 @@
    if( isnull( row ) ){
      row := this.InventroySummaryRow( relnew, Name := product, Unit := unit );
      //初始化单元格
      row.InitializeCell( this, startdate, enddate );
      row.InitializeCell( this );
    }
    
    return row;
_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultCCUnit.qbl
@@ -6,6 +6,6 @@
  [*
    // ç”„兰鸽 Jun-28-2024 (created)
    return '长春';
    //return 'China';
    //return 'Assembly Plant (France)';
  *]
}
_Main/BL/Type_InventorySummaryReport/StaticMethod_GetDefaultDLUnit.qbl
@@ -6,6 +6,6 @@
  [*
    // ç”„兰鸽 Jun-28-2024 (created)
    return '大连';
    //return 'Foregin';
    //return 'Assembly Plant (Spain)';
  *]
}
_Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl
@@ -8,7 +8,7 @@
  TextBody:
  [*
    
    table := selectobject( macroPlan, FinancialSalesSource.FinancialSalesReport, table, not table.IsImport() and table.IsShow() );
    table := selectobject( macroPlan, InventorySummarySource.InventorySummaryReport, table, table.IsShow() );
    
    xmlDOMI := XMLDOMImplementation::Create();
    xmlDOM  := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + table.Name() + '</name></table>' );
@@ -30,10 +30,19 @@
    unittypeelement.TextContent( "String" );
    unitcolumnelement.AppendChild( unitnameelement );
    unitcolumnelement.AppendChild( unittypeelement );
    //Attribute
    attricolumnelement := xmlDOM.CreateElement( "column" );
    attrinameelement   := xmlDOM.CreateElement( "name" );
    attritypeelement   := xmlDOM.CreateElement( "type" );
    attrinameelement.TextContent( 'Attribute' );
    attritypeelement.TextContent( "String" );
    attricolumnelement.AppendChild( attrinameelement );
    attricolumnelement.AppendChild( attritypeelement );
    
    tableElement.AppendChild( productcolumnelement ); 
    tableElement.AppendChild( unitcolumnelement ); 
    traverse ( table, FinancialSalesColumn, column ) {
    tableElement.AppendChild( attricolumnelement );
    traverse ( table, InventorySummaryColumn, column ) {
      columnelement := xmlDOM.CreateElement( "column" );
      nameelement   := xmlDOM.CreateElement( "name" );
      typeelement   := xmlDOM.CreateElement( "type" );
@@ -42,23 +51,71 @@
      columnelement.AppendChild( nameelement );
      columnelement.AppendChild( typeelement );
      
      cells := selectsortedset( column, FinancialSalesCell, cell, cell.FinancialSalesRow().RowNr() );
      cells := selectsortedset( column, InventorySummaryCell, cell, cell.InventroySummaryRow().RowNr() );
    
      traverse ( cells, Elements, c ) {
        if( column.Index() = 0 ){
          row := c.FinancialSalesRow();
          row := c.InventroySummaryRow();
          //Product
          productcellElement := xmlDOM.CreateElement( "cell" );
          productcellElement.SetAttribute( "value", row.Name() );
          productcolumnelement.AppendChild( productcellElement );
          productcellElement1 := xmlDOM.CreateElement( "cell" );
          productcellElement1.SetAttribute( "value", row.Name() );
          productcolumnelement.AppendChild( productcellElement1 );
          productcellElement2 := xmlDOM.CreateElement( "cell" );
          productcellElement2.SetAttribute( "value", row.Name() );
          productcolumnelement.AppendChild( productcellElement2 );
          productcellElement3 := xmlDOM.CreateElement( "cell" );
          productcellElement3.SetAttribute( "value", row.Name() );
          productcolumnelement.AppendChild( productcellElement3 );
          productcellElement4 := xmlDOM.CreateElement( "cell" );
          productcellElement4.SetAttribute( "value", row.Name() );
          productcolumnelement.AppendChild( productcellElement4 );
          //Unit
          unitcellElement := xmlDOM.CreateElement( "cell" );
          unitcellElement.SetAttribute( "value", row.Unit() );
          unitcolumnelement.AppendChild( unitcellElement );
          unitcellElement1 := xmlDOM.CreateElement( "cell" );
          unitcellElement1.SetAttribute( "value", row.Unit() );
          unitcolumnelement.AppendChild( unitcellElement1 );
          unitcellElement2 := xmlDOM.CreateElement( "cell" );
          unitcellElement2.SetAttribute( "value", row.Unit() );
          unitcolumnelement.AppendChild( unitcellElement2 );
          unitcellElement3 := xmlDOM.CreateElement( "cell" );
          unitcellElement3.SetAttribute( "value", row.Unit() );
          unitcolumnelement.AppendChild( unitcellElement3 );
          unitcellElement4 := xmlDOM.CreateElement( "cell" );
          unitcellElement4.SetAttribute( "value", row.Unit() );
          unitcolumnelement.AppendChild( unitcellElement4 );
          //Attribute
          //期末库存
          endcellElement := xmlDOM.CreateElement( "cell" );
          endcellElement.SetAttribute( "value", 'EndingInventory' );
          attricolumnelement.AppendChild( endcellElement );
          //最小库存
          mincellElement := xmlDOM.CreateElement( "cell" );
          mincellElement.SetAttribute( "value", 'MinimumInventory' );
          attricolumnelement.AppendChild( mincellElement );
          //最大库存
          maxcellElement := xmlDOM.CreateElement( "cell" );
          maxcellElement.SetAttribute( "value", 'MaximumInventory' );
          attricolumnelement.AppendChild( maxcellElement );
          //平均库存
          avecellElement := xmlDOM.CreateElement( "cell" );
          avecellElement.SetAttribute( "value", 'AverageInventory' );
          attricolumnelement.AppendChild( avecellElement );
        }
        cellElement := xmlDOM.CreateElement( "cell" );
        cellElement.SetAttribute( "value", c.Value() );
        columnelement.AppendChild( cellElement );
        //期末库存
        endcellElement := xmlDOM.CreateElement( "cell" );
        endcellElement.SetAttribute( "value", [String]c.EndingInventory() );
        columnelement.AppendChild( endcellElement );
        //最小库存
        mincellElement := xmlDOM.CreateElement( "cell" );
        mincellElement.SetAttribute( "value", [String]c.MinimumInventory() );
        columnelement.AppendChild( mincellElement );
        //最大库存
        maxcellElement := xmlDOM.CreateElement( "cell" );
        maxcellElement.SetAttribute( "value", [String]c.MaximumInventory() );
        columnelement.AppendChild( maxcellElement );
        //平均库存
        avecellElement := xmlDOM.CreateElement( "cell" );
        avecellElement.SetAttribute( "value", [String]c.AverageInventory() );
        columnelement.AppendChild( avecellElement );
      }
      tableElement.AppendChild( columnelement );  
    }
@@ -67,7 +124,7 @@
    
    //info( xmlString );
    
    tableGroupHandle := TableGroupHandle::Create( FinancialSalesReport::GetDefaultName() );
    tableGroupHandle := TableGroupHandle::Create( InventorySummaryReport::GetDefaultName() );
    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
    tableGroupHandle.Add( tableHandle );
    
_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl
@@ -1,7 +1,8 @@
Quintiq file version 2.0
#parent: #root
StaticMethod Initialize (
  MacroPlan owner
  MacroPlan owner,
  InterfaceDataset interface
)
{
  Description: '初始化'
@@ -23,25 +24,106 @@
    
    search                    := source.InventorySummarySearch( relnew, Unit := allunit, Generation := allunit, MqbMlb := allunit, Power := allunit, StartDate := Date::MinDate(), EndDate := Date::MaxDate() );
    
    table.GenerateColumn( owner );
    //从Product planning查找库存点为长春装配线边库的所有MQB产品,取Total Demand字段按月汇总需求数量
    table.GenerateColumn( owner, 'All', startofyear, startofnextyear );
    //info( '-----------------------------------', table.InventorySummaryColumn( relsize ) );
    //库存数量为Actual inventories里面的点Planned inventories字段库存量加总
    traverse( owner, Product_MP.ProductInStockingPoint_MP, pisp, pisp.IsLeaf() and not pisp.IsSystem() and ( pisp.StockingPoint_MP().UnitID() = ccunit or pisp.StockingPoint_MP().UnitID() = dlunit ) ){
      unit := pisp.StockingPoint_MP().UnitID();
      product := pisp.Product_MP();
        traverse( pisp, ProductInStockingPointInPeriod, pispip, pispip.Start() >= startofplanning
                and pispip.Start() < startofnextyear and pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Month() ){
          periodtime := pispip.Start().StartOfMonth().Date();
          periodname := periodtime.Format( "M2/D2/Y" );
          column    := selectobject( table, InventorySummaryColumn, column, column.Name() = periodname and column.Period() = periodtime );
          ccrow := table.GetRow( ccunit, product.ID(), startofyear, startofnextyear );
          ccrow.Initialize( column, pispip );//取Total Demand字段按月汇总需求数量
    //  info( '-----------------------------------', unit, product.ID() );
      weekpispips := construct( ProductInStockingPointInPeriods );
      monthpispips := construct( ProductInStockingPointInPeriods );
      nextweek := startofplanning.StartOfNextWeek();
      nextmonth := startofplanning.StartOfNextMonth();
      unitrow := table.GetRow( unit, product.ID() );
      allrow     := table.GetRow( allunit, product.ID() );
      pispips := selectsortedset( pisp, ProductInStockingPointInPeriod, pispip, pispip.Start() >= startofplanning and pispip.Start() < startofnextyear and pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day(), pispip.Start() );
    //  info( '-----------------------------------', isnull( allrow ), pispips.Size() );
      traverse( pispips, Elements, pispip, pispip.Start() = startofplanning ){
    //    info( '-----------------------------------', pispip.Start() );
        period     := pispip.Period_MP();
        periodtime := period.Start().Date();
        periodname := periodtime.Format( "M2/D2/Y" );
        //天,选择日颗粒度时,期末库存,最小库存,最大库存和平均库存的数值保持一致
        daycolumn := selectobject( table, InventorySummaryColumn, column, column.Name() = periodname, column.Period() = periodtime, column.TimeUnit() = Translations::MP_GlobalParameters_Day() );
        info( daycolumn.Name(), daycolumn.Period(), daycolumn.TimeUnit() );
        unitrow.SetCellValue( daycolumn, pispip.PlannedInventoryLevelEnd() );
        allrow.SetCellValue( daycolumn, pispip.PlannedInventoryLevelEnd() );
        //周,选择周时,期末库存为每一周最后一天的汇总库存信息,最小库存为这一周库存量最小的一天的数值,最大库存为这一周库存量最大的一天的数值,平均库存为该周的平均值
        if( period.Start() < nextweek ){
          weekpispips.Add( pispip );
          
          allrow     := table.GetRow( allunit, product.ID(), startofyear, startofnextyear );
          allrow.Initialize( column, pispip );
          weekend := nextweek - Duration::Days( 1 );
          if( period.Start() = weekend ){
            weekcolumn := selectobject( table, InventorySummaryColumn, column, column.Name() = periodname, column.Period() = periodtime, column.TimeUnit() = Translations::MP_GlobalParameters_Week() );
            maxinventory := max( weekpispips, Elements, e, e.PlannedInventoryLevelEnd() );
            mininventory := min( weekpispips, Elements, e, e.PlannedInventoryLevelEnd() );
            aveinventory := average( weekpispips, Elements, e, e.PlannedInventoryLevelEnd() );
            unitrow.SetCellValue( weekcolumn, pispip.PlannedInventoryLevelEnd(), mininventory, maxinventory, aveinventory );
            allrow.SetCellValue( weekcolumn, pispip.PlannedInventoryLevelEnd(), mininventory, maxinventory, aveinventory );
          }
        }else{
          weekpispips.Flush();
          weekpispips.Add( pispip );
          nextweek := nextweek.StartOfNextWeek();
        }
        //月,选择月时,期末库存为每一月最后一天的汇总库存信息,最小库存为这一个月库存量最小的一天的数值,最大库存为这一个月库存量最大的一天的数值,平均库存为该月的平均值
        if( period.Start() < nextmonth ){
          monthpispips.Add( pispip );
          monthend := nextmonth - Duration::Days( 1 );
          if( period.Start() = monthend ){
            monthcolumn := selectobject( table, InventorySummaryColumn, column, column.Name() = periodname, column.Period() = periodtime, column.TimeUnit() = Translations::MP_GlobalParameters_Month() );
            maxinventory := max( monthpispips, Elements, e, e.PlannedInventoryLevelEnd() );
            mininventory := min( monthpispips, Elements, e, e.PlannedInventoryLevelEnd() );
            aveinventory := average( monthpispips, Elements, e, e.PlannedInventoryLevelEnd() );
            unitrow.SetCellValue( monthcolumn, pispip.PlannedInventoryLevelEnd(), mininventory, maxinventory, aveinventory );
            allrow.SetCellValue( monthcolumn, pispip.PlannedInventoryLevelEnd(), mininventory, maxinventory, aveinventory );
          }
        }else{
          monthpispips.Flush();
          monthpispips.Add( pispip );
          nextmonth := nextmonth.StartOfNextMonth();
        }
      }
    }
    //首先在Entities里识别父级Unit为长春/大连的所有库存点
    //长春库存点
    ccsps := construct( Strings );
    //大连库存点
    dlsps := construct( Strings );
    allsps := construct( Strings );
    traverse( owner, Unit, unit, unit.ID() = ccunit or unit.ID() = dlunit ){
      if( unit.ID() = ccunit ){
        ccsps := selectuniquevalues( unit, StockingPoint_MP, sp, sp.ID() );
      }
      if( unit.ID() = dlunit ){
        dlsps := selectuniquevalues( unit, StockingPoint_MP, sp, sp.ID() );
      }
      allsps := allsps.Union( selectuniquevalues( unit, StockingPoint_MP, sp, sp.ID() ) );
    }
    //再在库存更新的子界面库存点选择中找到这些库存点所关联的已勾选库位
    selections := selectset( interface, InventoryPointSelection, selection, allsps.Find( selection.StockpoingPoint() ) >= 0 and selection.IsIncluded() );
    productids := selectuniquevalues( selections, Elements, selection, selection.ProductID() );
    //最后将这些库位中零件号的数量进行加总
    traverse( table, InventorySummaryColumn, column, column.Period() < startofplanning.Date() ){
      traverse( productids, Elements, productid ){
        if( column.TimeUnit() = Translations::MP_GlobalParameters_Day() ){//天
          column.GenerateCell( selections, ccsps, dlsps, table, column.Period(), column.Period(), productid, allunit, ccunit, dlunit );
        }else if( column.TimeUnit() = Translations::MP_GlobalParameters_Week() ){//周
          column.GenerateCell( selections, ccsps, dlsps, table, column.Period().StartOfWeek(), column.Period(), productid, allunit, ccunit, dlunit );
        }else if( column.TimeUnit() = Translations::MP_GlobalParameters_Month() ){//月
          column.GenerateCell( selections, ccsps, dlsps, table, column.Period().StartOfMonth(), column.Period(), productid, allunit, ccunit, dlunit );
        }
      }
    }
    rows := selectsortedset( table, InventroySummaryRow, row, row.Name() );
    i    := 0;
    traverse( rows, Elements, e ){
_Main/BL/Type_InventroySummaryRow/Method_Initialize#0.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_InventroySummaryRow/Method_Initialize.qbl
@@ -8,7 +8,7 @@
  TextBody:
  [*
    // ç”„兰鸽 Jun-24-2024 (created)
    cell := column.InventorySummaryCell( relnew );
    cell := column.InventorySummaryCell( relnew, AverageInventory := 0, EndingInventory := 0, MaximumInventory := 0, MinimumInventory := 0 );
    
    this.InventorySummaryCell( relinsert, cell );
  *]
_Main/BL/Type_InventroySummaryRow/Method_InitializeCell.qbl
@@ -1,19 +1,13 @@
Quintiq file version 2.0
#parent: #root
Method InitializeCell (
  InventorySummaryReport table,
  DateTime startdate,
  DateTime enddate
  InventorySummaryReport table
)
{
  TextBody:
  [*
    // ç”„兰鸽 Jun-28-2024 (created)
    for( start := startdate; start < enddate; start := start.StartOfNextMonth() ){
      periodtime := start.Date();
      periodname := periodtime.Format( "M2/D2/Y" );
      column := selectobject( table, InventorySummaryColumn, column, column.Name() = periodname and column.Period() = periodtime );
    traverse( table, InventorySummaryColumn, column ){
      this.Initialize( column, this.Unit() );
    }
  *]
_Main/BL/Type_InventroySummaryRow/Method_SetCellValue#0.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
Quintiq file version 2.0
#parent: #root
Method SetCellValue (
  InventorySummaryColumn column,
  Real quantity
)
{
  TextBody:
  [*
    // ç”„兰鸽 Jun-24-2024 (created)
    cell := selectobject( this, InventorySummaryCell, cell, cell.InventorySummaryColumn() = column );
    cell.AverageInventory( cell.AverageInventory() + quantity );
    cell.EndingInventory( cell.EndingInventory() + quantity );
    cell.MaximumInventory( cell.MaximumInventory() + quantity );
    cell.MinimumInventory( cell.MinimumInventory() + quantity );
  *]
}
_Main/BL/Type_InventroySummaryRow/Method_SetCellValue0.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
Quintiq file version 2.0
#parent: #root
Method SetCellValue (
  InventorySummaryColumn column,
  Real endinginventory,
  Real minimuminventory,
  Real maximuminventory,
  Real averageinventory
)
{
  TextBody:
  [*
    // ç”„兰鸽 Jun-24-2024 (created)
    cell := selectobject( this, InventorySummaryCell, cell, cell.InventorySummaryColumn() = column );
    cell.AverageInventory( cell.AverageInventory() + averageinventory );
    cell.EndingInventory( cell.EndingInventory() + endinginventory );
    cell.MaximumInventory( cell.MaximumInventory() + maximuminventory );
    cell.MinimumInventory( cell.MinimumInventory() + minimuminventory );
  *]
}
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
@@ -38,6 +38,17 @@
        Taborder: 2
      ]
    }
    Component ButtonFinancialWeeklyReport
    {
      #keys: '[415136.0.882254645]'
      BaseType: 'WebButton'
      Properties:
      [
        Image: 'DOCUMENT_DIRTY'
        Label: 'Financial weekly report'
        Taborder: 3
      ]
    }
  ]
  Properties:
  [
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonFinancialWeeklyReport_OnCli.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
Quintiq file version 2.0
#parent: ActionBarGroupReport/ButtonFinancialWeeklyReport
Response OnClick () id:Response_MacroPlanner_ActionBarGroupReport_ButtonFinancialWeeklyReport_OnClick
{
  #keys: '[415136.0.882254805]'
  CanBindMultiple: false
  DefinitionID: 'Responsedef_WebButton_OnClick'
  QuillAction
  {
    Body:
    [*
      ApplicationScope.ViewManager().ResetUserViewById( "Financial_weekly_report_view", true);
    *]
    GroupServerCalls: false
  }
}
_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_OnCreated.def
@@ -10,12 +10,12 @@
    Body:
    [*
      //初始化
      if( not exists( MacroPlan, FinancialProductionSource, source, not source.IsImport() ) ){
      //if( not exists( MacroPlan, FinancialProductionSource, source, not source.IsImport() ) ){
        FinancialProductionSource::Initialize( MacroPlan );
      }
      //}
      //info( '------------------1----------------' );
      table := selectobject( MacroPlan, FinancialProductionSource.FinancialProductionReport, table, not table.IsImport() and table.IsShow() );
      info( '------------------2----------------', table.IsImport(), table.IsShow() );
      //info( '------------------2----------------', table.IsImport(), table.IsShow() );
      DataHolderTable.Data( table );
      
      dhSearch.Data( table.FinancialProductionSource().FinancialProductionSearch() );
_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_OnCreated.def
@@ -9,12 +9,12 @@
  {
    Body:
    [*
      if( not exists( MacroPlan, FinancialSalesSource, source, not source.IsImport() ) ){
      //if( not exists( MacroPlan, FinancialSalesSource, source, not source.IsImport() ) ){
        FinancialSalesSource::Initialize( MacroPlan );
      }
      //}
      //info( '------------------1----------------' );
      table := selectobject( MacroPlan, FinancialSalesSource.FinancialSalesReport, table, not table.IsImport() and table.IsShow() );
      info( '------------------2----------------', table.IsImport(), table.IsShow() );
      //info( '------------------2----------------', table.IsImport(), table.IsShow() );
      DataHolderTable.Data( table );
      
      dhSearch.Data( table.FinancialSalesSource().FinancialSalesSearch() );
_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelUnit_715_ddslUnit_OnCreated.def
@@ -10,7 +10,7 @@
    Body:
    [*
      
      valueString := "<All>;" + FinancialProductionReport::GetDefaultCCUnit() + ";" + FinancialProductionReport::GetDefaultDLUnit();
      valueString := "<All>;" + FinancialSalesReport::GetSalesSegmentCC() + ";" + FinancialSalesReport::GetSalesSegmentDL();
      
      this.Strings( valueString );
    *]
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_MatrixEditorTable.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
Quintiq file version 2.0
Component MatrixEditorTable
{
  #keys: '[415136.0.881011903]'
  BaseType: 'WebMatrixEditor'
  Children:
  [
    Component MatrixEditorCellTable
    {
      #keys: '[415136.0.881011904]'
      BaseType: 'WebMatrixEditorCell'
      Children:
      [
        Component DataExtractorTable
        {
          #keys: '[415136.0.881011905]'
          BaseType: 'WebDataExtractor'
          Properties:
          [
            DataType: 'MacroPlan'
            Source: 'MacroPlan'
            Taborder: 0
            Transformation: 'FinancialWeeklyReport.FinancialWeeklyColumn.FinancialWeeklyCell'
          ]
        }
      ]
      Properties:
      [
        Attributes: 'Value'
        Column: 'FinancialWeeklyColumn'
        Row: 'FinancialWeeklyRow'
        Taborder: 0
      ]
    }
    Component MatrixEditorRowsTable
    {
      #keys: '[415136.0.881011908]'
      BaseType: 'WebMatrixEditorHeaderLevel'
      Children:
      [
        Component DataExtractorRow
        {
          #keys: '[415136.0.881011909]'
          BaseType: 'WebDataExtractor'
          Properties:
          [
            DataType: 'MacroPlan'
            Source: 'MacroPlan'
            Taborder: 0
            Transformation: 'FinancialWeeklyReport.FinancialWeeklyRow'
          ]
        }
      ]
      Properties:
      [
        Legend: 'Name'
        SortCriteria: 'RowNr'
        Taborder: 1
      ]
    }
    Component MatrixEditorColumnsTable
    {
      #keys: '[415136.0.881011912]'
      BaseType: 'WebMatrixEditorHeaderLevel'
      Children:
      [
        Component DataExtractorColumn
        {
          #keys: '[415136.0.881011913]'
          BaseType: 'WebDataExtractor'
          Properties:
          [
            DataType: 'MacroPlan'
            Source: 'MacroPlan'
            Taborder: 0
            Transformation: 'FinancialWeeklyReport.FinancialWeeklyColumn'
          ]
        }
      ]
      Properties:
      [
        Legend: 'Name'
        SortCriteria: 'Index'
        Taborder: 2
      ]
    }
    #child: matrixEditorActionBarPageTable
    #child: matrixeditorContextMenuTable
  ]
  Properties:
  [
    Columns: 'MatrixEditorColumnsTable'
    ContextMenu: 'matrixeditorContextMenuTable'
    Rows: 'MatrixEditorRowsTable'
    Taborder: 0
  ]
}
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_PanelHeader.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
Quintiq file version 2.0
Component PanelHeader
{
  #keys: '[415136.0.881011755]'
  BaseType: 'WebPanel'
  Children:
  [
    Component ButtonExport
    {
      #keys: '[415136.0.881011811]'
      BaseType: 'WebButton'
      Properties:
      [
        Image: 'EXPORT1'
        Taborder: 0
      ]
    }
  ]
  Properties:
  [
    FixedSize: true
    Orientation: 'horizontal'
    Taborder: 0
  ]
}
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_PanelTable.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
Quintiq file version 2.0
Component PanelTable
{
  #keys: '[415136.0.881011874]'
  BaseType: 'WebPanel'
  Children:
  [
    #child: MatrixEditorTable
  ]
  Properties:
  [
    Taborder: 1
  ]
}
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_matrixEditorActionBarPageTable.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
Quintiq file version 2.0
Component matrixEditorActionBarPageTable
{
  #keys: '[415136.0.881011916]'
  BaseType: 'matrixEditorActionBarPage'
  Properties:
  [
    Taborder: 3
  ]
}
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Component_matrixeditorContextMenuTable.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
Quintiq file version 2.0
Component matrixeditorContextMenuTable
{
  #keys: '[415136.0.881011919]'
  BaseType: 'matrixeditorContextMenu'
  Properties:
  [
    Taborder: 4
  ]
}
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Response_OnCreated.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
Quintiq file version 2.0
#parent: #root
Response OnCreated () id:Response_FormFinancialWeeklyReport_OnCreated
{
  #keys: '[415136.0.882110991]'
  CanBindMultiple: false
  DefinitionID: 'Responsedef_WebComponent_OnCreated'
  QuillAction
  {
    Body:
    [*
      FinancialWeeklyReport::Initialize( MacroPlan );
    *]
    GroupServerCalls: false
  }
}
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/Response_PanelHeader_ButtonExport_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
Quintiq file version 2.0
#parent: PanelHeader/ButtonExport
Response OnClick () id:Response_PanelHeader_ButtonExport_OnClick
{
  #keys: '[415136.0.882111199]'
  CanBindMultiple: false
  DefinitionID: 'Responsedef_WebButton_OnClick'
  QuillAction
  {
    Body:
    [*
      binaryValue := FinancialWeeklyReport::Download( MacroPlan );
      Application.Download( FinancialWeeklyReport::GetDefaultName() + '.xlsx', binaryValue.AsBinaryData() );
    *]
    GroupServerCalls: false
  }
}
_Main/UI/MacroPlannerWebApp/Component_FormFinancialWeeklyReport/_ROOT_Component_FormFinancialWeeklyReport.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
Quintiq file version 2.0
#root
#parent: MacroPlannerWebApp
OrphanComponent FormFinancialWeeklyReport
{
  #keys: '[415136.0.881011703]'
  BaseType: 'WebForm'
  Children:
  [
    #child: PanelHeader
    #child: PanelTable
  ]
  Properties:
  [
    Image: 'DOCUMENT_DIRTY'
    Title: 'Financial weekly report'
  ]
}
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelCategory.def
@@ -11,7 +11,6 @@
      BaseType: 'WebRadioButtonGroup'
      Properties:
      [
        BoundValue: 'Day'
        ButtonLabels: 'Day;Week;Month'
        ButtonValues: 'Day;Week;Month'
        Orientation: 'horizontal'
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Component_PanelPeriod.def
@@ -21,6 +21,7 @@
      BaseType: 'WebDateSelector'
      Properties:
      [
        Date: 9999-12-31
        Label: 'End date'
        Taborder: 1
      ]
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_OnCreated.def
@@ -9,12 +9,12 @@
  {
    Body:
    [*
      if( not isnull( MacroPlan.InventorySummarySource() ) ){
        InventorySummarySource::Initialize( MacroPlan );
      }
      //if( not isnull( MacroPlan.InventorySummarySource() ) ){
        InventorySummarySource::Initialize( MacroPlan, InterfaceDataset );
      //}
      //info( '------------------1----------------' );
      table := selectobject( MacroPlan, InventorySummarySource.InventorySummaryReport, table, table.IsShow() );
      info( '------------------2----------------', table.IsShow() );
      //info( '------------------2----------------', table.IsShow() );
      DataHolderTable.Data( table );
      
      dhSearch.Data( table.InventorySummarySource().InventorySummarySearch() );
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelCategory_RadioButtonGroupUseForPlanning_OnCreated.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
Quintiq file version 2.0
#parent: PanelCategory/RadioButtonGroupUseForPlanning_545
Response OnCreated () id:Response_PanelCategory_RadioButtonGroupUseForPlanning_OnCreated
{
  #keys: '[415136.0.875614032]'
  CanBindMultiple: false
  DefinitionID: 'Responsedef_WebComponent_OnCreated'
  QuillAction
  {
    Body:
    [*
      this.ButtonValues( Translations::MP_GlobalParameters_Day() + ';' + Translations::MP_GlobalParameters_Week() + ';' + Translations::MP_GlobalParameters_Month() );
    *]
    GroupServerCalls: false
  }
}
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorEnd_OnChanged.def
@@ -10,9 +10,13 @@
    Body:
    [*
      //日期改变后刷新显示
      if( dhSearch.Data().EndDate() <> this.Date() ){
        dhSearch.Data().EndDate( this.Date() );
        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
      if( this.Date() < DateSelectorStart.Date() ){
        this.HintError( 'The end date cannot be less than the start date!' );
      }else{
        if( dhSearch.Data().EndDate() <> this.Date() ){
          dhSearch.Data().EndDate( this.Date() );
          DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
        }
      }
    *]
    GroupServerCalls: false
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelPeriod_DateSelectorStart_OnChanged.def
@@ -10,9 +10,13 @@
    Body:
    [*
      //日期改变后刷新显示
      if( dhSearch.Data().StartDate() <> this.Date() ){
        dhSearch.Data().StartDate( this.Date() );
        DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
      if( this.Date() > DateSelectorEnd.Date() ){
        this.HintError( 'The start date cannot be later than the end date!' );
      }else{
        if( dhSearch.Data().StartDate() <> this.Date() ){
          dhSearch.Data().StartDate( this.Date() );
          DataHolderTable.Data().Generate( dhSearch.Data(), DataHolderProduct.Data() );
        }
      }
    *]
    GroupServerCalls: false
_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelUnit_ddslUnit_OnCreated.def
@@ -10,7 +10,7 @@
    Body:
    [*
      
      valueString := "<All>;" + FinancialProductionReport::GetDefaultCCUnit() + ";" + FinancialProductionReport::GetDefaultDLUnit();
      valueString := "<All>;" + InventorySummaryReport::GetDefaultCCUnit() + ";" + InventorySummaryReport::GetDefaultDLUnit();
      
      this.Strings( valueString );
    *]
_Main/UI/MacroPlannerWebApp/Views/Financial_weekly_report_view.vw
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
Quintiq file version 2.0
{
  viewcontents
  {
    forms
    {
      form_FormFinancialWeeklyReport
      {
        title: 'QMacroPlanner::FormFinancialWeeklyReport'
        shown: true
        componentID: 'QMacroPlanner::FormFinancialWeeklyReport'
        layout
        {
          mode: 'open'
          rowPosition: 1
          rowSpan: 15
          columnPosition: 1
          columnSpan: 13
        }
        components
        {
          FormFinancialWeeklyReport_PanelHeader
          {
            sizeRatio: 1
          }
          FormFinancialWeeklyReport_PanelTable
          {
            sizeRatio: 1
          }
          FormFinancialWeeklyReport_MatrixEditorTable
          {
            gridColor: '#c4c4c4'
            totalHeaderWidth: 67
            attributeHeaderWidthRatio: 0.6
            nameHeaderWidthRatio: 0.4
            columnWidth: 100
            horizontalGrid: true
            verticalGrid: true
            backendState
            {
              componentId: 'QMacroPlanner::FormFinancialWeeklyReport.MatrixEditorTable'
              state
              {
                cells
                {
                  attributes
                  {
                    attribute_Value
                    {
                      type: 'MatrixEditorWebApiCellDataModelInterest'
                      index: 0
                      rowsubtotal: ''
                      columnsubtotal: ''
                      attribute: 'Value'
                    }
                  }
                }
                columns
                {
                  sorting
                  {
                    criteria: "datamember:'Index'"
                  }
                }
                rows
                {
                  sorting
                  {
                    criteria: "datamember:'RowNr'"
                  }
                }
              }
            }
          }
        }
      }
    }
    userconfigurableinformation
    {
    }
    page: ''
    group: ''
    index: 19
    image: 'DOCUMENT_DIRTY'
    description: ''
  }
  formatversion: 2
  id: 'Financial_weekly_report_view'
  name: 'Financial weekly report view'
  isglobal: false
  isroot: true
}