Blog'a Dön

Power BI'da canlı döviz kurları nasıl alınır: Power Query, DAX ve yenileme tuzağı

V
Vlado Grigirov
September 01, 2026
Currency API Exchange Rates Power BI Power Query DAX Tutorial Finexly

Power BI'da canlı döviz kurları almak, gerçekten bitmesinden çok önce bitmiş gibi görünen işlerden biridir. Veri Al → Web'e bir API URL'si yapıştırırsınız, bir kur tablosu belirir, dönüştürülmüş gelir ölçünüz yanar ve yayımlarsınız. İki gün sonra veri kümesi yenilemesi Power BI hizmetinde dinamik veri kaynağı mesajıyla başarısız olur — ya da başarılı olur ve her geçmiş işlemi sessizce bugünkü kurla çevirir.

Bu rehber yolun tamamını kapsıyor: temiz bir kur tablosu döndüren bir Power Query M sorgusu, onu hizmette yenilenebilir tutan RelativePath deseni, işlem tarihiyle çevirmek için bir geçmiş kur fonksiyonu, dinamik raporlama para birimi için bir DAX ölçüsü ve yenileme takviminizin bir API planına sığıp sığmadığını belirleyen istek sayısı hesabı.

Aşağıdaki tüm sorgular Finexly API belgelerindeki yanıt yapılarına göre yazıldı. Excel'de canlı döviz kurları rehberimizi okuduysanız buradaki M tanıdık gelecek — ama Power BI'ın Excel'de bulunmayan bir hizmet tarafı yenileme katmanı var ve bu projelerin çoğu tam orada kırılıyor.

Power BI'a kur almanın üç yolu

YaklaşımHizmette yenilenir mi?API anahtarı güvenli mi?Geçmiş kurlarEn uygun kullanım
Web bağlayıcısı, URL'yi iletişim kutusuna yapıştırmaÇoğu zaman hayır — URL genelde dinamik veri kaynağına dönüşür❌ Anahtar URL'de kalırHayırBeş dakikalık kavram kanıtı
Boş sorgu + Web.Contents + RelativePath✅ Evet✅ Üst bilgi ile✅ EvetNeredeyse her gerçek model
Kur tablosunu besleyen veri akışı (veya Fabric işlem hattı)✅ Evet, üstelik rapor yenilemesinden bağımsız✅ Üst bilgi ile✅ EvetBirden fazla rapor, yüksek satır sayısı
İkinci satır varsayılan yanıttır. Aynı kurlara birden fazla rapor ihtiyaç duymaya başlayınca üçüncüye geçilir. Birincisi ise ekran görüntüsüne dayalı her eğitimin öğrettiği yol ve bunca döviz modelinin ilk zamanlanmış yenilemede çökmesinin sebebi.

Yöntem 1: Power Query ile canlı kur tablosu

Verileri dönüştür → Yeni Kaynak → Boş Sorgu → Gelişmiş Düzenleyici'yi açın ve şunu yapıştırın. Her döviz çifti için bir satır, UTC alım zaman damgasıyla birlikte döner.

let
    ApiKey  = "YOUR_API_KEY",
    Base    = "USD",
    Symbols = "EUR,GBP,JPY,CHF,AUD,CAD,SEK,NZD",

    Source = Json.Document(
        Web.Contents(
            "https://api.finexly.com",
            [
                RelativePath = "v1/latest",
                Query        = [ base = Base, symbols = Symbols ],
                Headers      = [ #"Authorization" = "Bearer " & ApiKey ]
            ]
        )
    ),

    Rates    = Record.ToTable( Source[rates] ),
    Renamed  = Table.RenameColumns( Rates, {{"Name", "Quote"}, {"Value", "Rate"}} ),
    AddBase  = Table.AddColumn( Renamed, "Base", each Base, type text ),
    AddStamp = Table.AddColumn( AddBase, "RetrievedUTC", each DateTimeZone.UtcNow(), type datetimezone ),
    Typed    = Table.TransformColumnTypes(
                   AddStamp,
                   {{"Quote", type text}, {"Rate", type number}}
               )
in
    Typed

Çağırdığı uç nokta komut satırında şöyle görünür; ayrıştıracağınız yapıyı görmek için bir kez çalıştırmaya değer:

curl "https://api.finexly.com/v1/latest?base=USD&symbols=EUR,GBP,JPY" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "success": true,
  "base": "USD",
  "date": "2026-09-01",
  "rates": { "EUR": "…", "GBP": "…", "JPY": "…" }
}

RelativePath ve Query neden isteğe bağlı değil

Yazının en önemli noktası bu, o yüzden kendi başlığını hak ediyor.

URL'yi tek bir birleştirilmiş dize olarak kurarsanız — "https://api.finexly.com/v1/latest?base=" & Base — Power Query, sorgu fiilen çalışana kadar hedefi belirleyemez. Microsoft bunu dinamik veri kaynağı olarak sınıflandırır ve dinamik veri kaynakları güvenlik ile gizlilik gerekçesiyle Power BI hizmetinde yenilenmez. Rapor dizüstünüzde kusursuz yenilenir, zamanlandığı anda başarısız olur.

Yolu RelativePath, parametreleri Query içinde geçirmek belgelenmiş istisnadır. Böylece Power BI, kimlik bilgisi ve gizlilik denetimleri için tek bir statik temel URL'yi — https://api.finexly.com — çözebilir, değişken kısımlar değişken kalır. Buradan üç kural çıkar:

  1. Temel URL bir dize sabiti olmalı. Parametre yok, birleştirme yok, içinde hiç & yok.
  2. RelativePath sabit uç nokta yolu olmalı. "v1/latest", "v1/latest?base=USD" değil.
  3. Query içinde asla birleştirme yapmayın. Ad/değer çiftlerinden oluşan bir kayıt geçirin, URL kodlamasını Power Query yapsın. Ayrıca isteği bozacak karakterleri de kaçışlar.

Kimlik bilgilerini ayarlama

Sorguyu ilk çalıştırdığınızda Power BI, https://api.finexly.com için nasıl kimlik doğrulanacağını sorar. Anonim'i seçin. Yanlış hissettirir ama doğrudur: API anahtarı, M kodunda verdiğiniz Authorization üst bilgisiyle gider, Power BI'ın kimlik bilgisi deposundan değil. Web API veya Temel seçmek Power BI'ın kendi üst bilgisini eklemesine yol açar ve istek reddedilir.

Gizlilik düzeyini tüm kaynaklarda tutarlı biçimde Genel veya Kuruluş olarak ayarlayın. Uyumsuz gizlilik düzeyleri, "Desktop'ta çalışıp hizmette başarısız olan yenileme"nin en yaygın ikinci nedenidir — Power BI, bir kaynağın verisinin başka bir kaynağın isteğine sızması riskini almaktansa sorguyu engeller.

Dürüst bir uyarı: anahtar artık sorgunun içinde düz metin olarak duruyor. .pbix dosyasını açan herkes okuyabilir. Kendi makinenizin dışına çıkacak her şey için anahtarı bir Power Query parametresine yükseltin ve doldurulmuş sürümü bir hizmet hesabına ait veri akışında tutun; böylece rapor yazarları kimlik bilgisini hiç görmeden kur tablosunu kullanır.

Yöntem 2: İşlem tarihi çevrimi için geçmiş kurlar

Canlı kur tablosu "EUR/USD şu anda kaç" sorusunu yanıtlar. "Ocak gelirimiz USD cinsinden neydi" sorusunu yanıtlayamaz ve bunu o iş için kullanmak tüm konunun en pahalı hatasıdır — modelin yeni bir kurla yeniden çevirmesi yüzünden geçen çeyreğin rakamlarını yeniden düzenlemek, denetçilerin tam da aradığı durumdur. Raporunuz ileride savunmanız gereken bir şeyi besliyorsa, bu bölümle birlikte döviz kurları ve vergi raporlaması rehberimizi de okuyun.

Tarihe göre anahtarlanmış bir kur tablosuna ihtiyacınız var. Aşağıdaki M fonksiyonu zaman serisi uç noktasını sarmalar ve tarih başına, para birimi başına bir satır döndürür:

let
    FxHistory = (base as text, symbols as text, startDate as date, endDate as date) as table =>
        let
            ApiKey = "YOUR_API_KEY",

            Source = Json.Document(
                Web.Contents(
                    "https://api.finexly.com",
                    [
                        RelativePath = "v1/timeseries",
                        Query = [
                            base       = base,
                            symbols    = symbols,
                            start_date = Date.ToText( startDate, [Format = "yyyy-MM-dd", Culture = "en-US"] ),
                            end_date   = Date.ToText( endDate,   [Format = "yyyy-MM-dd", Culture = "en-US"] )
                        ],
                        Headers = [ #"Authorization" = "Bearer " & ApiKey ]
                    ]
                )
            ),

            Days      = Table.RenameColumns( Record.ToTable( Source[rates] ), {{"Name", "RateDate"}} ),
            Expanded  = Table.ExpandRecordColumn( Days, "Value", Record.FieldNames( Days{0}[Value] ) ),
            Unpivoted = Table.UnpivotOtherColumns( Expanded, {"RateDate"}, "Quote", "Rate" ),
            AsDate    = Table.TransformColumns(
                            Unpivoted,
                            {{"RateDate", each Date.FromText( _, [Format = "yyyy-MM-dd", Culture = "en-US"] ), type date}}
                        ),
            AddBase   = Table.AddColumn( AsDate, "Base", each base, type text ),
            Typed     = Table.TransformColumnTypes( AddBase, {{"Quote", type text}, {"Rate", type number}} )
        in
            Typed
in
    FxHistory

Buradaki iki ayrıntı gerçekten iş görüyor:

  • Hem Date.ToText hem Date.FromText üzerindeki Culture = "en-US". Bu olmadan, Almanca veya Fransızca yerel ayarlı bir makine start_date olarak 01.09.2026 gönderir ve API reddeder — ya da daha kötüsü, bir meslektaşınızın yenilemesi sizinkinden farklı biçimde bir tablo üretir. Yerel ayar, birden fazla ülkeye yayılan her Power Query projesindeki görünmez değişkendir.
  • Table.UnpivotOtherColumns. API tarihleri kayıt anahtarı olarak, değerleri ise iç içe para birimi kaydı olarak döndürür. RateDate / Base / Quote / Rate uzun biçimine dönüştürmek, tarih boyutuyla temiz birleşen ve her yeni para biriminde yeniden şekillendirilmesi gerekmeyen bir tablo verir.

Her yükleme için bir kez çağırın: FxHistory( "USD", "EUR,GBP,JPY", #date(2026,1,1), Date.From( DateTime.LocalNow() ) ).

Geçmiş tarihlerin kurları hiç değişmediğinden bu tablo artımlı yenileme için ders kitabı örneğidir: RateDate üzerinden bölümleyin, son 7 günü yenileyin, daha eskisini arşivleyin. Yenileme süreniz geçmişle birlikte büyümeyi bırakır, istek sayınız da öyle.

API'yi satır başına çağırmayın

Bu modelleri öldüren desen, kur fonksiyonunu olgu tablosunda özel sütun olarak çağırmaktır. On bin işlem, her yenilemede on bin HTTP isteği, kırk dakikalık bir yenileme ve öğle yemeğinden önce gelen bir kota faturası demektir.

İnşa etmeden önce hesabı yapın. Power BI Pro veri kümesi başına günde 8 zamanlanmış yenileme; Premium Per User ve Fabric kapasitesi 48 yenilemeye izin verir. İhtiyacınız olan tüm para birimlerini kapsayan tek bir /v1/latest çağrısı, Pro üst sınırında yenilendiğinde günde 8 istek — ayda yaklaşık 240 eder ve 1.000'lik ücretsiz kotanın rahatça içinde kalır. Aynı takvim satır başına fonksiyonla sınırsızdır. PPU'nun 48 yenileme üst sınırında bile birleştirilmiş tek çağrı ayda yaklaşık 1.440 istekte kalır; bu, satır başına felaket değil küçük bir ücretli plandır. Kesin boyutlandırma gerekiyorsa fiyat planlarımız eşikleri listeliyor.

Kurlara birden fazla rapor ihtiyaç duyduğunda sorguyu bir veri akışına taşıyın. Veri akışı API'yi kendi takvimiyle çağırır ve sonucu somutlaştırır; aşağı akıştaki her veri kümesi API'ye yeniden yüklenmek yerine depodan okur. Aynı veri akışındaki beş rapor, beş değil bir set istek üretir.

Tutarları çevirmek: Power Query birleştirmesi mi, DAX ölçüsü mü

Çevrimi uygulamak için iki meşru yer vardır ve bunlar farklı sorulara yanıt verir.

Seçenek A: Power Query'de birleştirme

Raporlama para biriminiz sabitse — her şey USD olarak raporlanıyor, nokta — birleştirmeyi yükleme anında yapın.

  1. Olgu tablosunu Power Query'ye yükleyin.
  2. Kur tablosuna karşı Sorguları Birleştir; para birimi kodu ve tarih üzerinden eşleştirin. Ctrl tuşunu basılı tutup her iki tabloda sütunları aynı sırayla seçin.
  3. Yalnızca Rate sütununu genişletin ve Sabit ondalık sayı olarak ayarlayın.
  4. Amount ve Rate'i seçip Sütun Ekle → Standart → Çarp.
  5. Başka hiçbir şey başvurmuyorsa kur tablosunun yüklenmesini devre dışı bırakın.

Bu hızlıdır, bir kez somutlaşır ve bir dilimleyiciyle oynanamaz. Son madde de bedelidir.

Seçenek B: Seçilebilir raporlama para birimiyle DAX ölçüsü

Kullanıcıların raporun tamamını USD, EUR ve GBP arasında değiştirmesi gerekiyorsa çevrim sorgu anında olmalıdır. Tek sütunu ISO kodlarından oluşan, bağlantısız bir Reporting Currency tablosu ekleyin, dilimleyiciye koyun ve şunu yazın:

Revenue (Reporting Currency) =
VAR ReportingCurrency = SELECTEDVALUE( 'Reporting Currency'[Code], "USD" )
RETURN
SUMX (
    'Sales',
    VAR TxCurrency = 'Sales'[CurrencyCode]
    VAR TxDate     = 'Sales'[OrderDate]
    VAR Rate =
        CALCULATE (
            MAX ( 'FX Rates'[Rate] ),
            REMOVEFILTERS ( 'FX Rates' ),
            'FX Rates'[Base]     = TxCurrency,
            'FX Rates'[Quote]    = ReportingCurrency,
            'FX Rates'[RateDate] = TxDate
        )
    RETURN 'Sales'[Amount] * Rate
)

Dikkat edilecek üç şey:

  • VAR satırları taşıyıcıdır. TxCurrency ve TxDate'i CALCULATE'ten önce değişkene almak, onları geçerli SUMX satırına sabitler. Sütunlara doğrudan filtre argümanları içinde başvurmak, makul görünen ama yanlış toplamlar üreten bir bağlam geçişi hatasını davet eder.
  • REMOVEFILTERS( 'FX Rates' ), kur tablosuna gelen herhangi bir filtrenin aramayı daraltmasını engeller.
  • Eksik kur BLANK() döndürür ve Amount * BLANK() da BLANK()'tır. İstediğiniz davranış budur. Sessizce çevrilmemiş tutara geri düşen bir satır, toplamınızı o kur kadar şişiren bir satırdır.

İlişki tuzağı

Olgu tablosundan kur tablosuna yalnızca para birimi kodu üzerinden fiziksel ilişki kurmayın. Tarihe göre anahtarlanmış bir kur tablosunda para birimi kodu benzersiz değildir; bu yüzden Power BI çoka-çok ilişki önerir ve çift yönlü filtrelemeli çoka-çok, satır sayınızı seve seve kabartıp gelirinizi katlar. Ya Power Query'de bileşik birleştirmeyi kullanın ya da kur tablosunu bağlantısız tutup kurları yukarıdaki gibi DAX'ta arayın.

Hata vermeden yanlış sayı üreten beş yanlış

  1. Birleştirilmiş URL'ler. Desktop'ta yenilenir, hizmette "Bu veri kümesi dinamik bir veri kaynağı içeriyor" ile başarısız olur. RelativePath ve Query ile düzelir.
  2. Ters çiftler. base=USD&symbols=EUR USD→EUR döndürür. Olgu tablonuz EUR tutarları saklıyorsa tersine ihtiyacınız var. Herhangi bir toplama güvenmeden önce bilinen bir çifti elle doğrulayın. Hangi kodun hangi tarafa geldiğinden emin değilseniz ISO 4217 başvurumuz yardımcı olur.
  3. Geçmiş satırlarda bugünkü kur. Sayı her yenilemede değişir ve biri aynı raporun iki dışa aktarımını karşılaştırana dek kimse fark etmez.
  4. Yerel biçimli tarihler ve ondalıklar. Ondalık virgül 1,0842'yi metne çevirir, Table.TransformColumnTypes modelin boş saydığı bir hata döndürür ve etkilenen satırlar toplamlarınızdan kaybolur.
  5. Yanlış adımda yuvarlama. Bir kez, sunum aşamasında, çarpmadan sonra yuvarlayın. Yedi haneli bir tutarla çarpmadan önce kuru dört ondalığa yuvarlamak, muhasebe sistemine karşı gözle görülür bir fark yaratır.

Sıkça sorulan sorular

Power BI döviz kurlarını otomatik yenileyebilir mi?

Evet. Yayımlanmış bir veri kümesi Power BI Pro'da günde en fazla 8, Premium Per User veya Fabric kapasitesinde günde 48 yenileme için zamanlanabilir. Premium'un XMLA uç noktası, dış araçların bu sınırların ötesinde yenileme tetiklemesine izin verir. Kur sorgusunun kendisi, hizmetin kabul etmesi için Web.Contents + RelativePath ile kurulmuş olmasının ötesinde özel bir işlem gerektirmez.

Power BI'da API anahtarını nasıl güvenle geçiririm?

Web.Contents'in Headers kaydına Authorization = "Bearer " & ApiKey olarak koyun ve Power BI sorduğunda Anonim kimlik doğrulamayı seçin. Bu, anahtarı URL'nin, proxy günlüklerinin ve tarayıcı geçmişinin dışında tutar. Ancak .pbix içinde şifrelemez — paylaşılan modellerde anahtarı bir hizmet hesabına ait veri akışında tutun ve raporlara yalnızca somutlaştırılmış tabloyu okutun.

Veri kümem neden "Bu veri kümesi dinamik bir veri kaynağı içeriyor" diyor?

Çünkü URL kodda birleştiriliyor; Power BI sorgu çalışmadan hedefi doğrulayamıyor ve hizmette yenilemeyi reddediyor. Çağrıyı statik bir temel URL artı RelativePath ve Query seçenekleriyle yeniden kurun, yeniden yayımlayın ve temel URL için kimlik bilgisini yeniden girin.

Tutarları işlem tarihindeki kurla nasıl çeviririm?

Bir zaman serisi uç noktasından tarihe göre anahtarlanmış bir kur tablosu yükleyin, sonra hem para birimi hem tarih üzerinden eşleştirin — ya Power Query'de bileşik birleştirmeyle ya da yukarıda gösterildiği gibi SUMX içindeki bir CALCULATE aramasıyla. Asla yalnızca para birimiyle birleştirmeyin; sıralamada rastgele başa gelen kur satırını sessizce alırsınız.

Power BI ile çalışan ücretsiz bir döviz API'si var mı?

Var. Finexly'nin ücretsiz döviz API katmanı, kredi kartı gerektirmeden ayda 1.000 istek içerir; bu da Pro lisanslı bir veri kümesinin günde sekiz kez yenilenmesini geniş bir payla karşılar. Sağlayıcıları yenileme sınırları, geçmiş derinliği veya para birimi kapsamı üzerinden tartıyorsanız, yıllarca bakımını üstleneceğiniz bir modele birini bağlamadan önce döviz API'lerini karşılaştırın.


Finexly ile başlayın

Power BI raporlarınıza canlı döviz kurları eklemeye hazır mısınız? Ücretsiz Finexly API anahtarınızı alın — kredi kartı gerekmez. Ayda 1.000 ücretsiz istekle başlayın, büyüdükçe yükseltin. 170'ten fazla para birimi için gerçek zamanlı ve geçmiş kurlar; Power Query'den, Python'dan ya da bir ödeme servisinden çağırsanız da aynı davranan tek bir REST API'den.

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 →