10-12-2022 04:19 PM - last edited on 05-12-2023 06:56 AM by JackLacava
Hi community,
Does anyone have a good member formula for calculating income/equity attributable to minority interest on the P&L and balance sheet? My understanding is in our case we can report this in a simple manner with just two additional accounts, one on the P&L and one on the balance sheet.
In my mind the P&L account would work something like the following, if ownership type equals Non-Controlling Interest then multiply net income by (1 - percent ownership).
I'm currently trying the below formula for the P&L account, but not yielding any results. After running a consolidation there is no data in the new account. Any suggestions on how to solve this? Thanks,
Dim dValue As Decimal = api.Entity.PercentOwnership()
Dim objOwnershipType As OwnershipType = api.Entity.OwnershipType()
If objOwnershipType = "Non-Controlling Interest" Then
api.Data.Calculate("A#NCI_Income:I#None:F#PL_LOAD:O#Import:U1#None:U2#None:U3#None:U4#None:U5#None:U6#None:U7#Data_Load:U8#None = A#NetIncome:I#Top:F#Top:O#Top:U1#Top:U2#Top:U3#None:U4#None:U5#None:U6#None:U7#Top:U8#None * (1-"& dValue &")")
End If
10-17-2022 07:28 AM - edited 10-17-2022 07:36 AM
That formula should error out, I'm surprised it doesn't. This is how you perform that check:
Dim ownType As OwnershipType = api.Entity.OwnershipType()
If ownType.Equals(OwnershipType.NonControllingInterest) Then
....
Also, that dValue is a decimal, so dropping it like that in a formula might give you problems in some configurations (different Cultures might use different decimal characters). Use dValue.XFToStringForFormula() instead
10-18-2022 10:29 AM - last edited on 05-12-2023 06:57 AM by JackLacava
A little bit different from your example case, because the client's needs didn't include P&L. What we did was create a Non-Controlling Interest account that loops through all the entities and checks the ownership type. When it finds the "NonControllingInterest" type, it stores the percentage of ownership. it runs through and creates a running total of the equity from those entities * the ownership percentage. If you want to adapt this, just replace the TOP_ENTITY member with whatever your topmost entity is and the Min_Int_Acct with the account number you create.
Dim debugSwitch As Boolean = False '<----- Turn on the debug switch To Log debug messages
Dim ePOV As String = api.Pov.Entity.Name
Dim tPOV As String = api.Pov.Time.Name
If ePOV = "TOP_ENTITY" Then
Dim entityDimPk As DimPk = api.Pov.EntityDim.DimPk
Dim ePovId As Integer = api.Pov.Entity.MemberId
Dim topEntityParent = api.Members.GetMemberId(DimType.Entity.Id, "E#TOP_ENTITY")
'Get base Entity members
Dim allMembers As List(Of Member) = api.Members.GetDescendants(entityDimPk, ePovId) 'GetAllMembers(EntityDimPk)
Dim ScenName As String = api.Pov.Scenario.Name
Dim RunTotal As Decimal
If Not allMembers Is Nothing Then 'Check to make sure the list is populated
For Each objMember As Member In allMembers
Dim CurrEnt As String = objMember.Name
Dim entId As Integer = objMember.MemberId
Dim parList As List(Of Member) = api.Members.GetParents(entityDimPk, entId, False)
For Each parMe As Member In parList
Dim ParId As Integer = parMe.MemberId
Dim IsPar As Boolean = api.Members.HasChildren(entityDimPk, entId)
If IsPar = True Then
Dim OwnType As String = api.Entity.OwnershipType(entId, ParId, -1, -1).ToString
Dim RateMe As Decimal = 1 - (api.Entity.PercentOwnership(entId, ParId, -1, -1) / 100)
Dim TextMe As String = api.Entity.Text(entId, 1)
If OwnType = "NonControllingInterest" Then
Dim TotAmt As Decimal = api.Data.GetDataCell("E#" & CurrEnt & ":C#USD:S#" & ScenName & ":V#Periodic:A#Equity:F#EndBal:O#Top:I#Top:U1#Tot_Consol:U2#Top_Departments:U3#None:U4#None:U5#None:U6#None:U7#None:U8#None").CellAmount
If Not TotAmt = 0 Then
RunTotal = RunTotal + (TotAmt * RateMe)
'********* debug info *********
If debugSwitch = True Then brapi.ErrorLog.LogMessage(si, "33000:CurrEnt=" & CurrEnt & "~EntId=" & entId & "~ParID=" & ParId & "~OwnType=" & OwnType & "~Rate=" & RateMe & "~Text1=" & TextMe & "~TotAmt=" & TotAmt & "~RunTotal=" & RunTotal)
'******************************
End If
End If
End If
Next ' parme
Next 'objmember
api.Data.Calculate("A#Min_Int_Acct:E#TOP_ENTITY:S#" & ScenName & ":V#Periodic:F#EndBal:O#AdjInput:I#None:U1#None:U2#None:U3#None:U4#None:U5#None:U6#None:U7#None:U8#None = " & RunTotal)
End If
End If