ERP(SAP)中Allocation的迭代展开

一般SAP分配表下载下来的数据是以下结构,这里我手工添加了Dir_BU字段不判断是否是底层分配表Y->True,X->False

FROMTOVALUEDir_BU
61000101006100019311100X
61000102006100019312100X
61000103006100019320100X
61000104006100019370100X
6100724320320100Y
61007243703333.66Y
610072437037075.41Y
610072437038020.93Y
610072631131182.34Y
61007263113128.08Y
61007263113709.19Y
61007263113800.39Y
6100740311311100Y
610081100031127.53Y
610081100031222.76Y
610081100032032.54Y
61008110003330.29Y
61008110003606.88Y
61008110003705.33Y
61008110003804.38Y
61008110008480.29Y
61008230006100901000100X
610082500061000101005X
6100825000610001020015X
6100825000610001030017X
610082500061008110004X
610082500061008510001X
610082500061008860002X
610082500061008862001X
6100825000610088700010X
610082500061008910005X
610082500061009010004X
610082500061009124005X
610082500061009210003X
610082500061009413007X
610082500061009418004X
6100825000610095010012X
610082500061009620005X
610085100031127.53Y
610085100031222.76Y
610085100032032.54Y
61008510003330.29Y
61008510003606.88Y
61008510003705.33Y
61008510003804.38Y
61008510008480.29Y
610087600031127.53Y
610087600031222.76Y
610087600032032.54Y
61008760003330.29Y
61008760003606.88Y
61008760003705.33Y
61008760003804.38Y
61008760008480.29Y
610088600031128.86Y
610088600031233.66Y
610088600032024.6Y
61008860003600.86Y
61008860003707.07Y
61008860003804.45Y
61008860008480.5Y
6100886200610001010032X
6100886200610001020038X
6100886200610001030030X
610088700031128.86Y
610088700031233.66Y
610088700032024.6Y
61008870003600.86Y
61008870003707.07Y
61008870003804.45Y
61008870008480.5Y
610089100031132.86Y
610089100031226.02Y
610089100032028.77Y
61008910003608.8Y
61008910003702.36Y
61008910003801.07Y
61008910008480.12Y
6100901000610001010020X
6100901000610001020030X
6100901000610001030030X
6100901000610001040020X
6100901500610081100012X
610090150061008510007X
610090150061008862005X
6100901500610088700019X
6100901500610089100024X
6100901500610090100019X
6100901500610092100014X
6100912400610001010010X
6100912400610001020035X
6100912400610001030040X
6100912400610001040015X
6100921000610001010026X
6100921000610001020025X
6100921000610001030025X
6100921000610001040024X
6100941300610001010025X
6100941300610001020025X
6100941300610001030020X
6100941300610001040030X
6100941800610001010020X
6100941800610001020020X
6100941800610001030010X
6100941800610001040050X
6100950100610001010020X
6100950100610001020030X
6100950100610001030030X
6100950100610001040020X
6100962000610001010015X
6100962000610001020065X
610096200061000103005X
6100962000610001040015X
6100019311311100Y
6100019312312100Y
6100019320320100Y
6100019370370100Y

我们想要得到的结果是以下结式,方便观察每个BU分摊的情况

COST_CENTER311312320333355360370380848
6100010100   100.00          -            -            -            -            -            -            -            -  
6100010200          -     100.00          -            -            -            -            -            -            -  
6100010300          -            -     100.00          -            -            -            -            -            -  
6100010400          -            -            -            -            -            -     100.00          -            -  
6100724320          -            -     100.00          -            -            -            -            -            -  
6100724370          -            -            -         3.66          -            -       75.41     20.93          -  
6100726311     82.34       8.08          -            -            -            -         9.19       0.39          -  
6100740311   100.00          -            -            -            -            -            -            -            -  
6100811000     27.53     22.76     32.54       0.29          -         6.88       5.33       4.38       0.29
6100823000     20.00     30.00     30.00          -            -            -       20.00          -            -  
6100825000     19.58     34.96     32.92       0.01          -         0.89     10.75       0.81       0.08
6100851000     27.53     22.76     32.54       0.29          -         6.88       5.33       4.38       0.29
6100876000     27.53     22.76     32.54       0.29          -         6.88       5.33       4.38       0.29
6100886000     28.86     33.66     24.60          -            -         0.86       7.07       4.45       0.50
6100886200     32.00     38.00     30.00          -            -            -            -            -            -  
6100887000     28.86     33.66     24.60          -            -         0.86       7.07       4.45       0.50
6100891000     32.86     26.02     28.77          -            -         8.80       2.36       1.07       0.12
6100901000     20.00     30.00     30.00          -            -            -       20.00          -            -  
6100901500     27.64     28.06     28.46       0.06          -         3.58     10.08       1.93       0.18
6100912400     10.00     35.00     40.00          -            -            -       15.00          -            -  
6100921000     26.00     25.00     25.00          -            -            -       24.00          -            -  
6100941300     25.00     25.00     20.00          -            -            -       30.00          -            -  
6100941800     20.00     20.00     10.00          -            -            -       50.00          -            -  
6100950100     20.00     30.00     30.00          -            -            -       20.00          -            -  
6100962000     15.00     65.00       5.00          -            -            -       15.00          -            -  
6100019311   100.00          -            -            -            -            -            -            -            -  
6100019312          -     100.00          -            -            -            -            -            -            -  
6100019320          -            -     100.00          -            -            -            -            -            -  
6100019370          -            -            -            -            -            -     100.00          -            -  

以下是程序代码,

Option Explicit

Dim arrDB                                'Original Data
Public Dic As Object
'主程序
Sub Get_Mapping()
Dim t
Dim BU_List
Dim CC_List
Dim Output
Dim i%, j%
Dim CC$, BU$
'------------------------------------------------------------
t = Timer
arrDB = Sheets("ALLOCATION").UsedRange
CC_List = Unique_CC(arrDB)                '获取CC列表,begin with 0
BU_List = Get_BU_List                     '获取BU列表,begin with 1
ReDim Output(1 To UBound(CC_List) + 2, 1 To UBound(BU_List) + 1)
'------------------------------------------------------------
'标题栏读入
Output(1, 1) = "COST_CENTER"
For i = 0 To UBound(CC_List)
    Output(i + 2, 1) = CC_List(i)       '列
Next i
For j = 1 To UBound(BU_List)
    Output(1, j + 1) = BU_List(j)       '行
Next j
'------------------------------------------------------------
For i = 2 To UBound(Output)
    CC = Output(i, 1)                     'COST CENTER
    For j = 2 To UBound(Output, 2)
        BU = Output(1, j)                 'BU
        Output(i, j) = Get_Value(arrDB, CC, BU) '根据CC+BU获取相应值
    Next j
Next i
'============================================================
With Sheets("Mapping")
    .[A1].CurrentRegion.ClearContents
    .[A1].Resize(UBound(Output), UBound(Output, 2)) = Output
End With
'=============================================================
Erase arrDB
Erase Output
MsgBox (Timer - t)
End Sub

'获取BU=>VALUE
Function Get_Value(arr, ByVal CC, ByVal BU) As Double
Dim Val As Double
If Dic(CC) = "Y" Then
   Val = Get_BU_Value(arr, CC, BU)
ElseIf Dic(CC) = "X" Then
   Val = Get_CC_Value(arr, CC, BU)
Else
    Val = 0
End If
Get_Value = Val             '返回值
End Function

'直接根据CC获取BU值
Function Get_BU_Value(arr, ByVal CC, ByVal BU) As Double
Dim n%
Dim Val As Double
Val = 0                         '初始化
For n = 2 To UBound(arr)
    If arr(n, 1) = CC And arr(n, 2) = BU Then
       Val = arr(n, 3)          '获取值
       Exit For
    End If
Next n
Get_BU_Value = Val              '返回值
End Function

'获取CC的权重值
Function Get_CC_Value(arr, ByVal CC, ByVal BU) As Double
Dim n%
Dim Val As Double
Dim CC_From$, CC_To$
Dim Weight As Double
Val = 0                         '初始化
For n = 2 To UBound(arr)
    CC_From = arr(n, 1)
    CC_To = arr(n, 2)
    Weight = arr(n, 3)          '权重
    '因为不同的CC可能会因为CC_TO的不同而产生不同层级迭代,这里不设出口
    '每次都进行完全循环来确保TO的目标BU没有缺失
    If CC_From = CC Then        '目标CC
        If Dic(CC_To) = "Y" Then        'CC_To
            Get_CC_Value = Get_CC_Value + Weight * Get_BU_Value(arr, CC_To, BU) / 100
        Else
            Get_CC_Value = Get_CC_Value + Weight * Get_CC_Value(arr, CC_To, BU) / 100
        End If
    End If
Next n
End Function


'建立字典,储存每个COST CENTER的内存地址
Function Unique_CC(arr)
Dim i%
Dim SK$
Dim m%
Set Dic = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(arr)
    SK = arr(i, 1)                  'From
    If Not Dic.Exists(SK) Then
        Dic(SK) = arr(i, 4)         '判断是直接获取VALUE
    End If
Next i
Unique_CC = Dic.keys               '返回值
End Function

'建立BU_Arry列表
Function Get_BU_List()
Dim arr(1 To 9) As String
    arr(1) = "311"
    arr(2) = "312"
    arr(3) = "320"
    arr(4) = "333"
    arr(5) = "355"
    arr(6) = "360"
    arr(7) = "370"
    arr(8) = "380"
    arr(9) = "848"
Get_BU_List = arr                   '返回值
End Function

最后可以用googleVis或D3包在R中创建一个sankey来观察数据的流向

152704_Gpmr_2718942.png

 

 

转载于:https://my.oschina.net/tedzheng/blog/735078

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值