Power BI'da para birimi dönüştürme konusundaki her rehber iki kamptan birine düşer. DAX kampı size zarif bir ölçü gösterir ve modelinizde bir ExchangeRate tablosunun zaten var olduğunu sessizce varsayar. API kampı ise size Power BI Desktop'ta mükemmel çalışan, yayımladığınız anda çöken bir Power Query parçası gösterir; çünkü zamanlanmış yenileme onu kabul etmez.
Bu rehber iki yarıyı da sırasıyla ele alıyor: canlı döviz kurlarını bir REST API'den Power BI'a, Power BI hizmetine yayımlamayı atlatacak şekilde nasıl çekersiniz; rakamlarınızın savunulabilir olması için bu kurları nasıl modellersiniz; ve raporunuzun gerçekte neye ihtiyacı olduğuna göre tutarları içe aktarma sırasında mı yoksa sorgu sırasında mı dönüştürürsünüz.
Aşağıdaki tüm Power Query ve DAX örnekleri, Finexly API belgelerindeki yanıt yapılarına göre yazıldı.
Önce hangi dönüştürme sorununa sahip olduğunuza karar verin
"Power BI'da para birimi dönüştürme" aynı adı taşıyan üç ayrı mühendislik problemidir ve yanlışını seçmek bu yazının en pahalı hatasıdır.
- Çok sayıda kaynak para birimi, tek raporlama para birimi. Satış tablonuzda EUR, GBP ve JPY satırları var ve finans müdürü tek bir USD rakamı istiyor. İçe aktarma sırasında dönüştürün. Kur, işlemin bir özelliğidir, raporun değil.
- Tek kaynak para birimi, çok sayıda raporlama para birimi. Her şey USD olarak saklanıyor ve kullanıcı görüntüleme para birimini bir dilimleyiciden seçiyor. DAX ile sorgu sırasında dönüştürün. Her para birimini önceden hesaplamak pratik değildir.
- Çok kaynak, çok raporlama para birimi. İçe aktarmada tek bir eksen para birimine normalleştirin, sonra üzerine 2. durumu uygulayın. Bunu tek adımda çözmeye çalışmayın.
Deneyimli modelleyicilerin tekrarladığı ve burada bir kez daha tekrarlamaya değer kural şu: dönüştürmeyi elinizden geldiğince erken yapın. Sorgu zamanına ertelediğiniz her dönüştürme; her görselde, her filtre değişikliğinde, her dilimleyici tıklamasında size fatura çıkarır.
Canlı kurları Power Query'ye doğru şekilde çekmek
Kur tablosuyla başlayın. En verimli çağrı çoklu-parite sorgusudur: ilgilendiğiniz tüm para birimlerini para birimi başına bir istek yerine tek istekte alırsınız.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.finexly.com/v1/convert?q=USD_EUR,USD_GBP,USD_JPY"{
"USD_EUR": { "rate": 0.9215 },
"USD_GBP": { "rate": 0.7892 }
}Bunun Power Query M karşılığı şöyle. Boş bir sorgu oluşturun (Giriş → Yeni Kaynak → Boş Sorgu → Gelişmiş Düzenleyici) ve yapıştırın:
let
ApiKey = "YOUR_API_KEY",
Pairs = "USD_EUR,USD_GBP,USD_JPY,USD_CAD,USD_AUD,USD_CHF",
Source = Json.Document(
Web.Contents(
"https://api.finexly.com",
[
RelativePath = "v1/convert",
Query = [ q = Pairs ],
Headers = [ #"Authorization" = "Bearer " & ApiKey ]
]
)
),
ToTable = Record.ToTable(Source),
Expanded = Table.ExpandRecordColumn(ToTable, "Value", {"rate"}, {"Rate"}),
Split = Table.SplitColumn(
Expanded, "Name",
Splitter.SplitTextByDelimiter("_", QuoteStyle.None),
{"BaseCurrency", "Currency"}
),
Typed = Table.TransformColumnTypes(
Split,
{{"BaseCurrency", type text}, {"Currency", type text}, {"Rate", type number}}
),
Stamped = Table.AddColumn(Typed, "RetrievedAt", each DateTimeZone.UtcNow(), type datetimezone)
in
StampedAdını FxRates koyun. Dört sütunlu bir tablo elde edersiniz — BaseCurrency, Currency, Rate, RetrievedAt — ilişkilerde ve ölçülerde doğrudan kullanılabilir.
Zamanlanmış yenilemeyi bozan Web.Contents hatası
Yukarıdaki sorgunun yapmadığı şeye dikkat edin: parametreleri hiçbir zaman URL metnine eklemiyor. Para birimi dönüştürme raporlarının masaüstünde çalışıp bulutta ölmesinin bir numaralı nedeni budur.
Bunun yerine şöyle yazarsanız:
// Do NOT do this
Source = Json.Document(
Web.Contents("https://api.finexly.com/v1/convert?q=" & Pairs)
)…Power BI Desktop bunu itiraz etmeden yeniler, Power BI hizmeti ise "Bu veri kümesi dinamik bir veri kaynağı içeriyor. Yenileme desteklenmiyor." diyerek reddeder. Hizmetin kimlik bilgilerini iliştirebilmek için analiz aşamasında statik bir temel URL çözümleyebilmesi gerekir. Değişken kısımları RelativePath ve Query üzerinden geçirmek tam olarak bunu sağlar: temel https://api.finexly.com olarak kalır, dinamik olan her şey seçeneklerde yaşar.
Aynısı, bir parametreden, tarihten ya da başka bir tablodaki değerden URL kuran her sorgu için geçerlidir. Bu yazıdan tek bir şey alacaksanız RelativePath'i alın.
API anahtarını koda gömmeden yönetmek
ApiKey = "YOUR_API_KEY" satır içinde beş dakikalık bir test için uygundur, paylaşılan hiçbir şey için değildir. Bir anlamsal modelin M kodu, üzerinde derleme izni olan herkese görünür.
İki uygulanabilir seçenek:
- Power Query parametresi (Giriş → Parametreleri Yönet),
ApiKey = KeyParamşeklinde referans verilir. Yine modelle birlikte saklanır ama merkezîdir, döndürmesi kolaydır ve dağıtım işlem hatlarıyla ortam bazında geçersiz kılınabilir. - Web API kimlik bilgisi türü. Power BI hizmetinde Anlamsal model ayarları → Veri kaynağı kimlik bilgileri → Kimlik bilgilerini düzenle yolunu izleyip Web API'yi seçin ve anahtarı oraya girin. Bundan sonra
Authorizationüstbilgisini hizmet kendisi ekler;Headersseçeneğini M kodunuzdan tamamen kaldırabilirsiniz. Böylece sır, model tanımının dışında kalır.
Hangisini seçerseniz seçin, yalnızca raporlamayla sınırlı bir anahtar kullanın ve ekipten biri ayrıldığında değiştirin. Anahtar üstbilgi yerine URL sorgu dizesine düşerse, proxy ve sunucu erişim günlüklerinde görünebilir — Finexly belgeleri bunu ayrıca belirtiyor ve bu her sağlayıcı için geçerli.
Kur listesi değil, para birimi boyutu kurun
Yalnızca kur tablosu size sayı verir. Doğru etiketleri, doğru ondalık basamakları veya mantıklı sıralanan bir dilimleyiciyi vermez. Para birimi listesini kendi boyutu olarak çekin:
let
ApiKey = "YOUR_API_KEY",
Source = Json.Document(
Web.Contents(
"https://api.finexly.com",
[
RelativePath = "v1/currencies",
Headers = [ #"Authorization" = "Bearer " & ApiKey ]
]
)
),
ToTable = Table.FromList(Source, Splitter.SplitByNothing(), {"Currency"}),
Typed = Table.TransformColumnTypes(ToTable, {{"Currency", type text}})
in
TypedArdından Power BI'ın sizin adınıza çıkaramayacağı iki sütunu ekleyin:
MinorUnits— para biriminin gerçekte kullandığı ondalık basamak sayısı. JPY'de 0, KWD'de 3, çoğunda 2. Bir yen toplamını iki ondalıkla biçimlendirmek finansal bir raporda göze çarpan bir doğruluk hatasıdır ve yanlış adımda yuvarlamak bunu büyütür. Para birimi yuvarlama rehberi hatanın nereden sızdığını anlatıyor.FormatString— örneğin"\€#,0.00","\¥#,0". İleride dinamik biçim dizeleri için gerekecek.
İkisi de Power BI'ın yerleşik olarak bildiği bir şeyi değil ISO 4217 standardını izler; ISO 4217 referansında tam tablo var. Bu tabloyu boyut olarak işaretleyin, FxRates[Currency] ile bire-çok ilişkilendirin ve dilimleyicinizin kaynağı olarak kur tablosunu değil bunu kullanın.
Yol A: İçe aktarmada dönüştürme (hızlı, sıkıcı, doğru)
- senaryo için — çok para birimi girer, tek para birimi çıkar — işi Power Query'de bitirin ve modelde tek bir temiz sayı saklansın.
- İşlem sorgunuzu Power Query'ye yükleyin.
- Giriş → Sorguları Birleştir ile
Transactions[Currency]sütununuFxRates[Currency]ile eşleştirin (sol dış). - Birleştirilen sütunu genişletin ve
Ratealanını tutun. - Sütun Ekle → Özel Sütun:
= if [Currency] = "USD" then [Amount]
else if [Rate] = null then null
else [Amount] / [Rate]null dalına dikkat edin. Bir para biriminin eksik olduğu kur tablosuna yapılan sol dış birleştirme null üretir ve Power Query aritmetiğinde null, hata yerine sessizce yine null üretir — bu da görselde boşluğa ve fark edilmeden düşük kalan bir toplama dönüşür. Boşluğu açık hale getirin ki filtreleyip görebilesiniz.
Bölmeye de dikkat edin. USD_EUR = 0.9215, bir USD'nin 0,9215 EUR aldığı anlamına gelir; dolayısıyla EUR tutarını USD'ye çevirmek bölme işlemidir. USD tutarını EUR'ya çevirmek çarpmadır. Yönü ters çevirmek çok para birimli raporlarda en sık ikinci hatadır ve kurlar 1,0'a yakınken neredeyse görünmez: bir EUR/USD rakamındaki %3'lük hata, biri mutabakat yapana kadar yuvarlama farkı gibi görünür.
Yol B: DAX ile sorgu sırasında dönüştürme
- senaryo için — tek saklama para birimi, kullanıcının seçtiği görüntüleme para birimi — dönüştürmenin bir ölçü içinde gerçekleşmesi gerekir.
Naif sürüm satır başına bir LOOKUPVALUE yapar ve birkaç yüz bin satırdan sonra yavaşlar. Önce toplayın, sonra bir kez dönüştürün:
Sales (Reporting Currency) =
VAR SelectedCurrency = SELECTEDVALUE ( Currency[Currency], "USD" )
VAR Rate =
CALCULATE (
SELECTEDVALUE ( FxRates[Rate] ),
FxRates[Currency] = SelectedCurrency
)
VAR Result =
IF (
SelectedCurrency = "USD",
[Sales Amount],
[Sales Amount] * Rate
)
RETURN
IF ( ISBLANK ( Rate ) && SelectedCurrency <> "USD", BLANK (), Result )Göründüğünden daha önemli iki ayrıntı:
- Varsayılan değerli
SELECTEDVALUE."USD"yedeği olmazsa, hiçbir para birimi seçili değilken ölçü boş döner — ve raporunuzun açıldığı durum tam olarak budur. - Açık boşluk koruması. Bir para biriminin kuru yoksa,
[Sales Amount] * BLANK()ifadesinin sıfır döndürmesine izin vermek yerine bilerek boş döndürün. Gelir kartındaki sıfır bir yalandır; boşluk ise görünür bir eksiktir.
Kur zamanla değiştiğinde
Yukarıdaki ölçü tüm veri kümesine tek bir güncel kur uygular. Bu "geçen yılın geliri bugün ne eder" sorusu için doğru, neredeyse diğer her şey için yanlıştır. Kur tablonuzda para birimi başına günlük bir satır varsa, dönüştürmeden önce tarihe göre gruplayın:
Sales (Historical Rates) =
SUMX (
VALUES ( 'Date'[Date] ),
VAR DayRate =
CALCULATE (
SELECTEDVALUE ( FxRates[Rate] ),
FxRates[Currency] = SELECTEDVALUE ( Currency[Currency], "USD" )
)
RETURN
[Sales Amount] * DayRate
)Olgu tablosu yerine VALUES('Date'[Date]) üzerinde yinelemek yineleyiciyi küçük tutar — işlem sayısı değil, gün sayısı.
Dinamik biçim dizeleri
Sabit $ önekli dönüştürülmüş bir sayı, hiç sembol olmamasından kötüdür. Power BI'da ölçünün Biçim ayarını Dinamik yapın ve bir ifade verin:
SELECTEDVALUE ( Currency[FormatString], "#,0.00" )Artık ¥ gösteren kart, ikinci bir ölçüye gerek kalmadan ¥ işaretini sıfır ondalıkla gösterir. Bu eskiden Analysis Services'te hesaplama grupları gerektiriyordu; ölçüler için dinamik biçim dizeleri bunu Power BI'ın kendisine taşıdı.
Aslında hangi kuru kullanmalısınız?
Bu, bir panoyu finans biriminin imzalayacağı bir rapordan ayıran sorudur ve hiçbir API bunu sizin yerinize yanıtlayamaz.
- İşlem tarihli spot kur — tekil işlemleri kaydetmek için. En yüksek doğruluk, en büyük kur tablosu.
- Aylık ya da dönemsel ortalama — hem IAS 21 hem ASC 830 kapsamında gelir tablosu kalemleri için standart. Ay içi oynaklığı yumuşatır ve çoğu konsolidasyonun fiilen kullandığı yöntemdir.
- Dönem kapanış kuru — bilanço kalemleri için: nakit, alacaklar, borçlar.
- Bütçe ya da plan kuru — yıl boyunca sabit tutulan bir kur; böylece sapma analizi operasyonel performansı kur hareketinden ayırır.
Ciddi bir model çoğu zaman bunlardan iki üçünü aynı anda ister; ayrı tablolar olarak değil, aynı kur tablosunun ayrı sütunları olarak (SpotRate, AverageRate, ClosingRate). Raporunuz bir beyana giden bir şeyi besliyorsa, döviz kurları ve vergi raporlaması rehberi hangi kaynağı ve hangi zaman damgasını savunabilmeniz gerektiğini ele alıyor; geçmiş kurlar rehberi ise canlı kur yerine tarihli kur çekmeyi anlatıyor.
Toplamları sessizce bozan hafta sonu boşluğu
Döviz piyasaları kapanır. Canlı bir API'den kurulan günlük kur tablosunda cumartesi yoktur, pazar yoktur, 25 Aralık yoktur. Cumartesi tarihli bir işlemi bu tabloya bağlayın; null alırsınız, null boşluğa dönüşür ve boşluk, tam olarak hafta sonu satışları kadar düşük bir toplama dönüşür.
Bunu ölçüde değil kur tablosunda düzeltin. Eksiksiz bir tarih listesi üretip aşağı doğru doldurun:
let
Dates = List.Dates(#date(2026,1,1), Duration.Days(Date.From(DateTime.LocalNow()) - #date(2026,1,1)) + 1, #duration(1,0,0,0)),
DateTable = Table.FromList(Dates, Splitter.SplitByNothing(), {"Date"}),
Typed = Table.TransformColumnTypes(DateTable, {{"Date", type date}}),
Joined = Table.NestedJoin(Typed, {"Date"}, RateHistory, {"Date"}, "r", JoinKind.LeftOuter),
Expanded = Table.ExpandTableColumn(Joined, "r", {"Currency", "Rate"}),
Filled = Table.FillDown(Expanded, {"Currency", "Rate"})
in
FilledTable.FillDown cuma kurunu hafta sonu boyunca taşır; bu alışılmış uygulamadır ve daha önemlisi, tesadüfi değil beyan edilmiş bir uygulamadır. Doldurmadan önce para birimi ve tarihe göre sıralayın, aksi halde boşluk boyunca yanlış para biriminin kurunu taşırsınız.
Planınız geçmiş uç noktaları içermiyorsa, geçmişi ileriye doğru inşa edebilirsiniz: her yenilemede bugünün kurlarını saklanan bir tabloya ekleyin — bir veri akışı ya da Fabric Lakehouse tablosu iyi çalışır — ve bir çeyrek sonra gerçek bir zaman serisine sahip olursunuz. Geriye dönük değildir ama günde bir API çağrısına mal olur.
Yenileme zamanlaması ve kota aritmetiği
Power BI Pro, anlamsal model başına günde 8 zamanlanmış yenilemeye izin verir; Premium ve Fabric kapasiteleri 48'e izin verir. API kotanızın karşılaması gereken sayı budur ve hesap çoğu kişinin sandığından daha dosttur.
Yukarıdaki kur tablosu yenileme başına iki çağrıdır: biri /v1/currencies, biri /v1/convert. Yani:
| Yenileme sıklığı | Aylık yenileme | Aylık API çağrısı | Finexly planı |
|---|---|---|---|
| Günde 8 (Pro üst sınırı) | ~240 | ~480 | Ücretsiz (1.000/ay) |
| Günde 48 (Fabric, 30 dakikada bir) | ~1.440 | ~2.880 | Starter |
| Günde 48 + saatlik veri akışı geçmişi | ~2.160 | ~4.320 | Growth |
Asıl dikkat edilmesi gereken dakikada 10 tavanıdır. Table.AddColumn içinde para birimi başına bir kez /v1/rate çağıran bir sorgu kurarsanız, yirmi para birimi birkaç saniyede yirmi çağrı ve yenilemenin ortasında bir dizi 429 yanıtı demektir. Çoklu-parite /v1/convert çağrısı tam olarak bunun için vardır. Toplu çağırın ve önbelleğe alın: önbellekleme ve hata yönetimi rehberi zamanlanmış yenileme için de aynı ölçüde geçerli olan geri çekilmeli yeniden deneme kalıplarını anlatıyor.
Ağ geçitleri, Excel ve Fabric
Her biri bir öğleden sonra kazandıran birkaç ortam notu:
- Ağ geçidi gerekmez. Bulut tabanlı bir REST API şirket içi kaynak değildir, dolayısıyla şirket içi veri ağ geçidine ihtiyacınız yoktur. Yenileme başarısız olur ve biri ağ geçidi kurmayı önerirse, bu neredeyse her zaman kılık değiştirmiş dinamik veri kaynağı hatasıdır.
- Excel aynı motoru kullanır. Excel'deki Power Query yukarıdaki M kodunu birebir kabul eder. Kitleniz panolarda değil çalışma kitaplarında yaşıyorsa, Excel'de canlı kurlar rehberi
WEBSERVICE,LAMBDAve sürüm matrisini ele alıyor; bir de Google E-Tablolar karşılığı var. - Birden fazla rapor kur tablosuna ihtiyaç duyduğunda Fabric Dataflow Gen2 daha iyi bir yuvadır. Kurları bir kez indirin, tüm anlamsal modeller aynı tabloyu okusun; API kullanımınız rapor sayısıyla birlikte büyümeyi bırakır.
- Yayımlamadan önce bilinen bir rakamla karşılaştırın. Para birimi dönüştürücüden bir parite alın ve modelinizin aynı an için aynı paritede gösterdiği değerle kıyaslayın. Uyuşmuyorsa yön ya da yuvarlama sorununuz var demektir; bunu yönetim kurulu toplantısında değil şimdi bulmak istersiniz.
Sık sorulan sorular
Power BI API olmadan para birimi dönüştürebilir mi? Kurları siz sağlarsanız evet: elle güncellenen bir tablo, finans sisteminden bir dışa aktarım ya da bir veritabanı görünümü. Power BI'da yerleşik kur kaynağı yoktur. API, kimsenin güncellemeyi hatırlamasına gerek kalmadan güncellenen kurlara ihtiyaç duyduğunuzda anlam kazanır.
Dönüştürme raporum neden Power BI Desktop'ta yenileniyor da hizmette başarısız oluyor?
Neredeyse her zaman dinamik veri kaynağı hatası yüzünden. Web.Contents çağrınız URL'yi metin birleştirmeyle kuruyor. Değişken kısımları RelativePath ve Query seçeneklerine taşıyıp temel URL'yi statik hale getirin, yeniden yayımlayın ve kimlik bilgilerini yeniden girin.
Dönüştürmeyi Power Query'de mi DAX'ta mı yapmalıyım? Raporun tek bir raporlama para birimi varsa Power Query — daha hızlı ve daha basit. Kullanıcı para birimini çalışma anında seçiyorsa DAX. İkisi de gerekiyorsa Power Query'de tek bir eksen para birimine normalleştirin ve DAX ölçüsünü üstüne koyun.
Bir Power BI yenilemesi kaç API isteği harcar?
Tüm pariteleri tek bir /v1/convert çağrısında topluyorsanız yenileme başına iki. Power BI Pro'nun günde 8 yenileme üst sınırında bu ayda yaklaşık 480 istek eder ve ücretsiz planın içinde kalır. Pahalıya patlaması yalnızca API'yi para birimi başına ya da satır başına çağırdığınızda olur.
Günlük kur tablosunda hafta sonlarını ve resmi tatilleri nasıl ele alırım? Kesintisiz bir tarih tablosu üretin, kurları sola birleştirin, para birimi ve tarihe göre sıralayın ve aşağı doğru doldurun. Cuma kuru hafta sonuna taşınır. Önemli olan bu yaklaşımın bilinçli ve belgelenmiş olması; satırların sessizce kaybolmaması.
Finansal raporlamada hangi kuru kullanmalıyım? Gelir tablosu kalemleri için dönemsel ortalama kurlar, bilanço kalemleri için kapanış kurları — hem IAS 21 hem ASC 830 kapsamında. Bunları tek bir kur tablosunun ayrı sütunları olarak saklayın ki rapor, modeli değiştirmeden aralarında geçiş yapabilsin.
Panolarınızın arkasına canlı kurlar koymaya hazır mısınız? Ücretsiz Finexly API anahtarınızı alın — kredi kartı gerekmez. Ayda 1.000 istekle başlayın; bu, bir Power BI Pro çalışma alanını azami sıklıkta yenilemeye yeter. Geçmiş veriye ya da daha sık güncellemeye ihtiyaç duyduğunuzda planı yükseltin. Hâlâ sağlayıcıları karşılaştırıyorsanız, karşılaştırma sayfası seçenekleri yan yana gösteriyor.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →