currency names of the FX rates or the connection between the FX rates

Marco
Contributor II

Hi Everyone.

I am running an SQL query, but I am now encountering an issue with currency conversions. The only thing my table contains is the column with the currency name, but it is not very helpful because the FX rates table only contains the ID. I would like to know where I can find the FX rate IDs and names in the query, or if there is an intermediary table to accomplish this. The tables I am currently using are: XFW_PLP_Register and XFW_PLP_Plan.

5 REPLIES 5

sameburn
Contributor II

Hi @Marco 

If you want all currencies in OneStream you can create a Dictionary like below where the currency Name is the Key and the Id is the Value e.g. 

' Declare StringBuilder (for Logging)
Dim sb As New Text.StringBuilder	

' Get Currencies
Dim currencyDict As Dictionary(Of String, Integer) = Currency.GetItems().ToDictionary(Function(kvp) kvp.Name, Function(kvp) kvp.Id)

' Log Result ➡ ErrorLog
sb.AppendLine(String.Join(Environment.NewLine, currencyDict.Select(Function(kvp) String.Format("Key ➡ {0}, Value ➡ {1}", kvp.Key, kvp.Value))))	
BRApi.ErrorLog.LogMessage(si, "Currencies:", sb.ToString())	

Alternatively, if you only want the Currencies in your application you can do the same with a Member Expansion...

' Declare StringBuilder (for Logging)
Dim sb As New Text.StringBuilder	

' Get Currencies
Dim dimPk As DimPk = BRApi.Finance.Dim.GetDimPk(si, "Consolidation")
Dim currencyDict As Dictionary(Of String, Integer) = BRApi.Finance.Members.GetBaseMembers(si, dimPk, DimConstants.Currencies, Nothing). _
													 ToDictionary(Function(kvp) kvp.Name, Function(kvp) kvp.MemberId)

' Log Result ➡ ErrorLog
sb.AppendLine(String.Join(Environment.NewLine, currencyDict.Select(Function(kvp) String.Format("Key ➡ {0}, Value ➡ {1}", kvp.Key, kvp.Value))))	
BRApi.ErrorLog.LogMessage(si, "Currencies:", sb.ToString())	

 

Both examples can be run in an Extensibility rule with logging to see results.

You won't be able to find this in a SQL Table so you would need to either create a CASE Statement or do something dynamic with your SQL in a Business Rule for your use case

Hope this helps

Sam

Hi Sameburn.

I am currently using a CASE statement, but it is not a solution I am very satisfied with, as I have to assign the currency name according to its ID. That is why I wanted to know if this information can be obtained from another table or if there is a table that holds the relationships with the tables I previously mentioned.

    SELECT
        CASE
            WHEN fx.SourceCurrencyId = 0 THEN 'AED'
            WHEN fx.SourceCurrencyId = 1 THEN 'AFN'
            WHEN fx.SourceCurrencyId = 2 THEN 'ALL'
            WHEN fx.SourceCurrencyId = 3 THEN 'AMD'
            WHEN fx.SourceCurrencyId = 4 THEN 'ANG'
            WHEN fx.SourceCurrencyId = 5 THEN 'AOA'
            WHEN fx.SourceCurrencyId = 6 THEN 'ARS'
            WHEN fx.SourceCurrencyId = 7 THEN 'ATS'
            WHEN fx.SourceCurrencyId = 8 THEN 'AUD'
            WHEN fx.SourceCurrencyId = 9 THEN 'AWG'
            WHEN fx.SourceCurrencyId = 10 THEN 'AZN'
            WHEN fx.SourceCurrencyId = 11 THEN 'BAM'
            WHEN fx.SourceCurrencyId = 12 THEN 'BBD'
            WHEN fx.SourceCurrencyId = 13 THEN 'BDT'
            WHEN fx.SourceCurrencyId = 14 THEN 'BEF'
            WHEN fx.SourceCurrencyId = 15 THEN 'BGN'
            WHEN fx.SourceCurrencyId = 16 THEN 'BHD'
            WHEN fx.SourceCurrencyId = 17 THEN 'BIF'
            WHEN fx.SourceCurrencyId = 18 THEN 'BMD'
            WHEN fx.SourceCurrencyId = 19 THEN 'BND'
            WHEN fx.SourceCurrencyId = 20 THEN 'BOB'
            WHEN fx.SourceCurrencyId = 21 THEN 'BRL'
            WHEN fx.SourceCurrencyId = 22 THEN 'BSD'
            WHEN fx.SourceCurrencyId = 23 THEN 'BTN'
            WHEN fx.SourceCurrencyId = 24 THEN 'BWP'
            WHEN fx.SourceCurrencyId = 25 THEN 'BYR'
            WHEN fx.SourceCurrencyId = 26 THEN 'BZD'
            WHEN fx.SourceCurrencyId = 27 THEN 'CAD'
            WHEN fx.SourceCurrencyId = 28 THEN 'CC1'
            WHEN fx.SourceCurrencyId = 29 THEN 'CC2'
            WHEN fx.SourceCurrencyId = 30 THEN 'CC3'
            WHEN fx.SourceCurrencyId = 31 THEN 'CC4'
            WHEN fx.SourceCurrencyId = 32 THEN 'CC5'
            WHEN fx.SourceCurrencyId = 33 THEN 'CC6'
            WHEN fx.SourceCurrencyId = 34 THEN 'CC7'
            WHEN fx.SourceCurrencyId = 35 THEN 'CC8'
            WHEN fx.SourceCurrencyId = 36 THEN 'CDF'
            WHEN fx.SourceCurrencyId = 37 THEN 'CHF'
            WHEN fx.SourceCurrencyId = 38 THEN 'CLP'
            WHEN fx.SourceCurrencyId = 39 THEN 'CNY'
            WHEN fx.SourceCurrencyId = 40 THEN 'COP'
            WHEN fx.SourceCurrencyId = 41 THEN 'CRC'
            WHEN fx.SourceCurrencyId = 42 THEN 'CUP'
            WHEN fx.SourceCurrencyId = 43 THEN 'CVE'
            WHEN fx.SourceCurrencyId = 44 THEN 'CYP'
            WHEN fx.SourceCurrencyId = 45 THEN 'CZK'
            WHEN fx.SourceCurrencyId = 46 THEN 'DEM'
            WHEN fx.SourceCurrencyId = 47 THEN 'DJF'
            WHEN fx.SourceCurrencyId = 48 THEN 'DKK'
            WHEN fx.SourceCurrencyId = 49 THEN 'DOP'
            WHEN fx.SourceCurrencyId = 50 THEN 'DZD'
            WHEN fx.SourceCurrencyId = 51 THEN 'ECS'
            WHEN fx.SourceCurrencyId = 52 THEN 'EEK'
            WHEN fx.SourceCurrencyId = 53 THEN 'EGP'
            WHEN fx.SourceCurrencyId = 54 THEN 'ERN'
            WHEN fx.SourceCurrencyId = 55 THEN 'ESP'
            WHEN fx.SourceCurrencyId = 56 THEN 'ETB'
            WHEN fx.SourceCurrencyId = 57 THEN 'EUR'
            WHEN fx.SourceCurrencyId = 58 THEN 'FIM'
            WHEN fx.SourceCurrencyId = 59 THEN 'FJD'
            WHEN fx.SourceCurrencyId = 60 THEN 'FKP'
            WHEN fx.SourceCurrencyId = 61 THEN 'FRF'
            WHEN fx.SourceCurrencyId = 62 THEN 'GBP'
            WHEN fx.SourceCurrencyId = 63 THEN 'GEL'
            WHEN fx.SourceCurrencyId = 64 THEN 'GGP'
            WHEN fx.SourceCurrencyId = 65 THEN 'GHC'
            WHEN fx.SourceCurrencyId = 66 THEN 'GIP'
            WHEN fx.SourceCurrencyId = 67 THEN 'GMD'
            WHEN fx.SourceCurrencyId = 68 THEN 'GNF'
            WHEN fx.SourceCurrencyId = 69 THEN 'GRD'
            WHEN fx.SourceCurrencyId = 70 THEN 'GTQ'
            WHEN fx.SourceCurrencyId = 71 THEN 'GYD'
            WHEN fx.SourceCurrencyId = 72 THEN 'HKD'
            WHEN fx.SourceCurrencyId = 73 THEN 'HNL'
            WHEN fx.SourceCurrencyId = 74 THEN 'HRK'
            WHEN fx.SourceCurrencyId = 75 THEN 'HTG'
            WHEN fx.SourceCurrencyId = 76 THEN 'HUF'
            WHEN fx.SourceCurrencyId = 77 THEN 'IDR'
            WHEN fx.SourceCurrencyId = 78 THEN 'IEP'
            WHEN fx.SourceCurrencyId = 79 THEN 'ILS'
            WHEN fx.SourceCurrencyId = 80 THEN 'IMP'
            WHEN fx.SourceCurrencyId = 81 THEN 'INR'
            WHEN fx.SourceCurrencyId = 82 THEN 'IQD'
            WHEN fx.SourceCurrencyId = 83 THEN 'IRR'
            WHEN fx.SourceCurrencyId = 84 THEN 'ISK'
            WHEN fx.SourceCurrencyId = 85 THEN 'ITL'
            WHEN fx.SourceCurrencyId = 86 THEN 'JEP'
            WHEN fx.SourceCurrencyId = 87 THEN 'JMD'
            WHEN fx.SourceCurrencyId = 88 THEN 'JOD'
            WHEN fx.SourceCurrencyId = 89 THEN 'JPY'
            WHEN fx.SourceCurrencyId = 90 THEN 'KES'
            WHEN fx.SourceCurrencyId = 91 THEN 'KGS'
            WHEN fx.SourceCurrencyId = 92 THEN 'KHR'
            WHEN fx.SourceCurrencyId = 93 THEN 'KMF'
            WHEN fx.SourceCurrencyId = 94 THEN 'KPW'
            WHEN fx.SourceCurrencyId = 95 THEN 'KRW'
            WHEN fx.SourceCurrencyId = 96 THEN 'KWD'
            WHEN fx.SourceCurrencyId = 97 THEN 'KYD'
            WHEN fx.SourceCurrencyId = 98 THEN 'KZT'
            WHEN fx.SourceCurrencyId = 99 THEN 'LAK'
            WHEN fx.SourceCurrencyId = 100 THEN 'LBP'
            WHEN fx.SourceCurrencyId = 101 THEN 'LKR'
            WHEN fx.SourceCurrencyId = 102 THEN 'LRD'
            WHEN fx.SourceCurrencyId = 103 THEN 'LSL'
            WHEN fx.SourceCurrencyId = 104 THEN 'LTL'
            WHEN fx.SourceCurrencyId = 105 THEN 'LUF'
            WHEN fx.SourceCurrencyId = 106 THEN 'LVL'
            WHEN fx.SourceCurrencyId = 107 THEN 'LYD'
            WHEN fx.SourceCurrencyId = 108 THEN 'MAD'
            WHEN fx.SourceCurrencyId = 109 THEN 'MCF'
            WHEN fx.SourceCurrencyId = 110 THEN 'MDL'
            WHEN fx.SourceCurrencyId = 111 THEN 'MGA'
            WHEN fx.SourceCurrencyId = 112 THEN 'MKD'
            WHEN fx.SourceCurrencyId = 113 THEN 'MMK'
            WHEN fx.SourceCurrencyId = 114 THEN 'MNT'
            WHEN fx.SourceCurrencyId = 115 THEN 'MOP'
            WHEN fx.SourceCurrencyId = 116 THEN 'MRO'
            WHEN fx.SourceCurrencyId = 117 THEN 'MTL'
            WHEN fx.SourceCurrencyId = 118 THEN 'MUR'
            WHEN fx.SourceCurrencyId = 119 THEN 'MVR'
            WHEN fx.SourceCurrencyId = 120 THEN 'MWK'
            WHEN fx.SourceCurrencyId = 121 THEN 'MXN'
            WHEN fx.SourceCurrencyId = 122 THEN 'MYR'
            WHEN fx.SourceCurrencyId = 123 THEN 'MZN'
            WHEN fx.SourceCurrencyId = 124 THEN 'NAD'
            WHEN fx.SourceCurrencyId = 125 THEN 'NGN'
            WHEN fx.SourceCurrencyId = 126 THEN 'NIO'
            WHEN fx.SourceCurrencyId = 127 THEN 'NLG'
            WHEN fx.SourceCurrencyId = 128 THEN 'NOK'
            WHEN fx.SourceCurrencyId = 129 THEN 'NPR'
            WHEN fx.SourceCurrencyId = 130 THEN 'NZD'
            WHEN fx.SourceCurrencyId = 131 THEN 'OMR'
            WHEN fx.SourceCurrencyId = 132 THEN 'PAB'
            WHEN fx.SourceCurrencyId = 133 THEN 'PEN'
            WHEN fx.SourceCurrencyId = 134 THEN 'PGK'
            WHEN fx.SourceCurrencyId = 135 THEN 'PHP'
            WHEN fx.SourceCurrencyId = 136 THEN 'PKR'
            WHEN fx.SourceCurrencyId = 137 THEN 'PLN'
            WHEN fx.SourceCurrencyId = 138 THEN 'PTE'
            WHEN fx.SourceCurrencyId = 139 THEN 'PYG'
            WHEN fx.SourceCurrencyId = 140 THEN 'QAR'
            WHEN fx.SourceCurrencyId = 141 THEN 'RON'
            WHEN fx.SourceCurrencyId = 142 THEN 'RSD'
            WHEN fx.SourceCurrencyId = 143 THEN 'RUB'
            WHEN fx.SourceCurrencyId = 144 THEN 'RWF'
            WHEN fx.SourceCurrencyId = 145 THEN 'SAR'
            WHEN fx.SourceCurrencyId = 146 THEN 'SBD'
            WHEN fx.SourceCurrencyId = 147 THEN 'SCR'
            WHEN fx.SourceCurrencyId = 148 THEN 'SDG'
            WHEN fx.SourceCurrencyId = 149 THEN 'SEK'
            WHEN fx.SourceCurrencyId = 150 THEN 'SGD'
            WHEN fx.SourceCurrencyId = 151 THEN 'SHP'
            WHEN fx.SourceCurrencyId = 152 THEN 'SIT'
            WHEN fx.SourceCurrencyId = 153 THEN 'SKK'
            WHEN fx.SourceCurrencyId = 154 THEN 'SLL'
            WHEN fx.SourceCurrencyId = 155 THEN 'SML'
            WHEN fx.SourceCurrencyId = 156 THEN 'SOS'
            WHEN fx.SourceCurrencyId = 157 THEN 'SPL'
            WHEN fx.SourceCurrencyId = 158 THEN 'SRD'
            WHEN fx.SourceCurrencyId = 159 THEN 'STD'
            WHEN fx.SourceCurrencyId = 160 THEN 'SVC'
            WHEN fx.SourceCurrencyId = 161 THEN 'SYP'
            WHEN fx.SourceCurrencyId = 162 THEN 'SZL'
            WHEN fx.SourceCurrencyId = 163 THEN 'THB'
            WHEN fx.SourceCurrencyId = 164 THEN 'TJS'
            WHEN fx.SourceCurrencyId = 165 THEN 'TMM'
            WHEN fx.SourceCurrencyId = 166 THEN 'TND'
            WHEN fx.SourceCurrencyId = 167 THEN 'TOP'
            WHEN fx.SourceCurrencyId = 168 THEN 'TRL'
            WHEN fx.SourceCurrencyId = 169 THEN 'TRY'
            WHEN fx.SourceCurrencyId = 170 THEN 'TTD'
            WHEN fx.SourceCurrencyId = 171 THEN 'TVD'
            WHEN fx.SourceCurrencyId = 172 THEN 'TWD'
            WHEN fx.SourceCurrencyId = 173 THEN 'TZS'
            WHEN fx.SourceCurrencyId = 174 THEN 'UAH'
            WHEN fx.SourceCurrencyId = 175 THEN 'UGX'
            WHEN fx.SourceCurrencyId = 176 THEN 'USD'
            WHEN fx.SourceCurrencyId = 177 THEN 'UYP'
            WHEN fx.SourceCurrencyId = 178 THEN 'UYU'
            WHEN fx.SourceCurrencyId = 179 THEN 'UZS'
            WHEN fx.SourceCurrencyId = 180 THEN 'VAL'
            WHEN fx.SourceCurrencyId = 181 THEN 'VEB'
            WHEN fx.SourceCurrencyId = 182 THEN 'VEF'
            WHEN fx.SourceCurrencyId = 183 THEN 'VND'
            WHEN fx.SourceCurrencyId = 184 THEN 'VUV'
            WHEN fx.SourceCurrencyId = 185 THEN 'WST'
            WHEN fx.SourceCurrencyId = 186 THEN 'XAF'
            WHEN fx.SourceCurrencyId = 187 THEN 'XAG'
            WHEN fx.SourceCurrencyId = 188 THEN 'XAU'
            WHEN fx.SourceCurrencyId = 189 THEN 'XCD'
            WHEN fx.SourceCurrencyId = 190 THEN 'XDR'
            WHEN fx.SourceCurrencyId = 191 THEN 'XOF'
            WHEN fx.SourceCurrencyId = 192 THEN 'XPD'
            WHEN fx.SourceCurrencyId = 193 THEN 'XPF'
            WHEN fx.SourceCurrencyId = 194 THEN 'XPT'
            WHEN fx.SourceCurrencyId = 195 THEN 'YER'
            WHEN fx.SourceCurrencyId = 196 THEN 'ZAR'
            WHEN fx.SourceCurrencyId = 197 THEN 'ZMK'
            WHEN fx.SourceCurrencyId = 198 THEN 'ZWD'
            WHEN fx.SourceCurrencyId = 199 THEN 'UKP'
            WHEN fx.SourceCurrencyId = 200 THEN 'ROL'
            WHEN fx.SourceCurrencyId = 201 THEN 'GHS'
            WHEN fx.SourceCurrencyId = 202 THEN 'MZM'
            WHEN fx.SourceCurrencyId = 203 THEN 'SDD'
            WHEN fx.SourceCurrencyId = 204 THEN 'ZMW'
            WHEN fx.SourceCurrencyId = 205 THEN 'SSP'
            WHEN fx.SourceCurrencyId = 206 THEN 'CUC'
            WHEN fx.SourceCurrencyId = 207 THEN 'BYN'
            WHEN fx.SourceCurrencyId = 208 THEN 'PRB'
            WHEN fx.SourceCurrencyId = 209 THEN 'TMT'
            WHEN fx.SourceCurrencyId = 222 THEN 'MRU'
            WHEN fx.SourceCurrencyId = 223 THEN 'STN'
            WHEN fx.SourceCurrencyId = 224 THEN 'VES'
            WHEN fx.SourceCurrencyId = 225 THEN 'BOV'
            WHEN fx.SourceCurrencyId = 226 THEN 'CHE'
            WHEN fx.SourceCurrencyId = 227 THEN 'CLF'
            WHEN fx.SourceCurrencyId = 228 THEN 'COU'
            WHEN fx.SourceCurrencyId = 229 THEN 'MXV'
            WHEN fx.SourceCurrencyId = 230 THEN 'UYI'
            WHEN fx.SourceCurrencyId = 231 THEN 'UYW'
            WHEN fx.SourceCurrencyId = 232 THEN 'XSU'
            WHEN fx.SourceCurrencyId = 233 THEN 'XUA'
            WHEN fx.SourceCurrencyId = 234 THEN 'ZWL'
            WHEN fx.SourceCurrencyId = 235 THEN 'CHW'
            WHEN fx.SourceCurrencyId = 236 THEN 'CNH'
            WHEN fx.SourceCurrencyId = 237 THEN 'CNT'
            WHEN fx.SourceCurrencyId = 238 THEN 'KID'
            WHEN fx.SourceCurrencyId = 239 THEN 'NIS'
            WHEN fx.SourceCurrencyId = 240 THEN 'NTD'
            WHEN fx.SourceCurrencyId = 241 THEN 'SLS'
            WHEN fx.SourceCurrencyId = 242 THEN 'RMB'
            WHEN fx.SourceCurrencyId = 243 THEN 'USN'
            Else 'None'
        END AS Currency,
        fx.Amount AS Amount
    FROM
        (
            SELECT
                UniqueID
            FROM
                FxRateType
            WHERE
                (
                    Month(GETDATE()) = 1
                    AND NAME LIKE '%' + CAST((Year(GETDATE()) -1) AS NVARCHAR(4)) + 'M2%'
                )
                OR (
                    Month(GETDATE()) > 1
                    AND NAME LIKE '%' + CAST(Year(GETDATE()) AS NVARCHAR(4)) + 'M2%'
                )
        ) fxr
        LEFT JOIN(
            SELECT
                *
            FROM
                FxRate
            WHERE
                (
                    Month(GETDATE()) = 1
                    AND TimeId = CAST((Year(GETDATE()) -1) AS NVARCHAR(4)) + '004000'
                )
                OR (
                    Month(GETDATE()) > 1
                    AND TimeId = CAST(Year(GETDATE()) AS NVARCHAR(4)) + '004000'
                )
        ) fx ON fx.FxRateTypeID = fxr.UniqueID

 

Hi @Marco 

Since this information does not exist in a table.  The only option available other than your CASE statement would be to get creative and do something with your SQL in a Business Rule instead.  For example, if you move your logic to a Business Rule e.g. Dashboard DataSet.  You have a bit more flexibility with how you can reference things e.g. using a dictionary.  Below is an untested example of how you can do this. 

Here we create a placeholder NVARCHAR column called Currency in our SQL query.  We then loop through the DataTable result and use a Dictionary (this time the ID is the Key and the Name is the Value) to lookup the Name based on the SourceCurrencyId and populate the Currency column with the corresponding Currency Name

This should give you same result, without that big CASE statement. 

	' Get Currency Dictionary
	Dim currencyDict As Dictionary(Of Integer, String) = Currency.GetItems().ToDictionary(Function(kvp) kvp.Id, Function(kvp) kvp.Name)
	
	' Declare SQL	
	Dim sql As String = "WITH CTE
						 AS (
						 SELECT 
						  fxt.[UniqueID]
						 ,fxt.Name
						 ,fx.SourceCurrencyId
						 ,'Unknown' Currency
						 ,fx.Amount
						 FROM [FxRateType] fxt
						 LEFT JOIN [FxRate] fx
							ON fxt.UniqueID = fx.FxRateTypeID
						 WHERE                 
						 (
		                    Month(GETDATE()) = 1
		                    AND Name LIKE '%' + CAST((Year(GETDATE()) -1) AS NVARCHAR(4)) + 'M2%'
		                 )
		                 OR (
		                    Month(GETDATE()) > 1
		                    AND Name LIKE '%' + CAST(Year(GETDATE()) AS NVARCHAR(4)) + 'M2%'
		                 )
						    )
						 SELECT SourceCurrencyId, Currency, Amount FROM CTE"
	
	'Execute Query on App DB
	Dim dt As New DataTable()
	Using dbConnApp As DBConnInfo = BRApi.Database.CreateApplicationDbConnInfo(si)
	    dt = BRApi.Database.ExecuteSql(dbConnApp, sql.ToString(), True)
        If Not dt Is Nothing Then
			' prepare placeholder column
			dt.Columns("Currency").ReadOnly = False
			dt.Columns("Currency").MaxLength = -1
			' Loop on rows
            For Each dr As DataRow In dt.Rows
                'Process rows
				dr.BeginEdit
					' Lookup Currency Name from Dictionary by passing in SourceCurrencyId DataRow and assign value to Currency column
                	dr("Currency") = currencyDict.Item(dr("SourceCurrencyId"))
				dr.EndEdit
            Next
        End If
	End Using					

Hey Marco

Given the currencies in your case statement above aren't going to change, why not store this permanently in a table or view? It would centralise your logic (compared to building it in multiple BRs as above) making maintenance easier and resolving issues if they changed the IDs in a future version for some reason (which I think is worth highlighting as a possibility when doing these sort of ID/Name queries). You also wouldn't have to modify or loop through your data after retrieval.

Regards,

Daniel

sameburn
Contributor II

You might also find this previous related post helpful.  Solved: Where is stored the Currency Name ? - OneStream Community (onestreamsoftware.com)