12 Power Platform Concepts
Power Platform
İlke: "Ezberleme değil — anla, anlat, analoji ile köprü kur."
Bölüm 1 — Temel Kavramlar
Power Platform'un yapı taşları. Mülakatın ilk 5 dakikasında bu sorulardan en az biri sorulur.
Canvas App boş bir tuval gibidir — her pikselini sen çizersin, özgürsün ama her şeyi sen yaparsın. Model-driven App ise hazır bir bina planı gibidir — duvarlar zaten var, sen sadece odaları döşersin.
Canvas App ne zaman?
- Mobil-öncelikli, görsel olarak özelleştirilmiş UI gerektiğinde
- Birden fazla farklı veri kaynağına bağlanılacaksa (SharePoint + SQL + Excel)
- Saha ekipleri için form tabanlı, hızlı veri girişi gerektiğinde
- Tasarım özgürlüğü ve marka kimliği önemliyse
Model-driven App ne zaman?
- Veriler Dataverse'te tutuluyorsa ve karmaşık ilişkisel modele sahipse
- Standart CRUD + iş süreci akışı (Business Process Flow) gerekiyorsa
- Hızlı geliştirme öncelikliyse, görsel özgürlükten ödün verilebiliyorsa
- Role-based security önemliyse — Dataverse rolleri otomatik uygulanır
'Sayfa nasıl görünmeli' diye düşünüyorsan → Canvas
'Veri modeli nasıl olmalı' diye düşünüyorsan → Model-driven
SubmitForm hazır bir kargo formu gibidir — formu doldurursun, tek tuşla gönderirsin. Patch ise mektubu elle yazan biri gibidir — tam ne yazacağını, nereye göndereceğini, hangi alanı değiştireceğini sen belirlersin.
SubmitForm — Form Kontrolü ile
- Tek bir Form kontrolüne bağlı, basit CRUD senaryoları
- Otomatik validation (Required field check) ile
- OnSuccess / OnFailure event'leri ile geri bildirim
SubmitForm(EditForm1);
// OnSuccess: Navigate(SuccessScreen);
// OnFailure: Notify("Hata oluştu", NotificationType.Error)
Patch — Programatik Kontrol
- Form kontrolü olmadan, kod ile direkt yazma
- Birden fazla tabloya aynı anda yazma
- Conditional updates / Bulk operations
// Yeni kayıt
Patch(Talepler, Defaults(Talepler), {
Baslik: txtBaslik.Text,
Tutar: Value(txtTutar.Text),
Durum: "Beklemede"
});
// Var olan kaydı güncelle
Patch(Talepler, LookUp(Talepler, ID = varSeciliID), {Durum: "Onaylandı"});
// Bulk update
ForAll(SeciliKayitlar As item,
Patch(Talepler, LookUp(Talepler, ID = item.ID), {Durum: "Kapatildi"})
);
Bir 'Sipariş Onay' uygulamasında: Form alanlarını SubmitForm ile gönder, ama onay tarihçesini ayrı bir tabloya Patch ile aynı anda yaz.
Dataverse bir banka kasası gibidir — güvenli, ilişkisel, kurumsal. SharePoint ise ofis dolabıdır — kolay erişilir, basit ihtiyaçlar için yeterli ama büyük kritik veriyi oraya koymazsın.
| Kriter | Dataverse | SharePoint |
|---|---|---|
| Veri Modeli | İlişkisel (1:N, N:N) | Liste tabanlı, sınırlı ilişki |
| Max Kayıt | Sınırsız (kapasite ile) | 30M ama 5K sonrası yavaşlar |
| Delegation | Tüm fonksiyonlar | Kısıtlı (StartsWith, =) |
| Güvenlik | Field/record level | List/item level |
| Lisans | Premium gerektirir | M365 ile gelir |
| Audit | Yerleşik, detaylı | Sınırlı |
50.000+ kayıt · Karmaşık ilişkisel sorgular · Field-level security · Audit/compliance · Plugin/business logic
Bölüm 2 — Gerçek Proje Deneyimi
Mülakatçılar burada teknik bilgi değil, gerçek deneyim arar. STAR yapısını kullanın.
Bina inşa etmek gibi: Zemin etüdü (iş analizi) → Mimari plan (data model) → İnşaat (uygulama) → Tesisat (entegrasyon) → İskelet testi (UAT) → Anahtar teslim (deployment).
STAR Çerçevesi
- Situation — İş ihtiyacı neydi? (Ör: 200 kişilik İK ekibi izin taleplerini Excel'de takip ediyordu)
- Task — Sorumluluğunuz neydi? (Ör: Uçtan uca otomatik izin yönetim çözümü)
- Action — Nasıl çözdünüz? (Ör: Dataverse + Canvas App + Power Automate + Power BI)
- Result — Ölçülebilir sonuç? (Ör: Onay süresi 5 günden 4 saate düştü)
Mülakatçıya 'Bir mimari diyagram çizebilir miyim?' diye sor. 4 kutu çiz: Veri | Mantık | UI | Entegrasyon. Bu, senin 'sistem düşündüğünü' kanıtlar.
| Zorluk | Çözüm |
|---|---|
| Delegation limiti | Server-side filtreleme + Collection cache + Dataverse'e geçiş |
| Flow timeout | Async pattern + Do Until + child flow ile parçalama |
| Eş zamanlı güncelleme | RowVersion + IsBlank kontrolü |
| Offline çalışma | SaveData / LoadData + Connection.Connected |
| UAT vs PROD farkı | Solution + Environment Variables + Connection References |
| Yavaş açılış (15+ sn) | OnStart yerine OnVisible / Concurrent() |
- Çoklu tablo Patch işleminde transaction yönetimi (rollback mantığı)
- Çok seviyeli onay sürecinde dinamik approval matrix kurma
- Custom Connector OAuth2 flow'unda token refresh stratejisi
- Plugin'de Pre-image / Post-image karşılaştırması
- Büyük dataset'te delegation problemini çözerken UX kaybetmemek
'En zor kısım' sorusuna teknik bir detay ver, sonra 'nasıl öğrendim ve dokümante ettim' kısmına geç. Mülakatçı zorluğa değil, çözüm yöntemine değer verir.
Bölüm 3 — Senior Seviye Senaryolar
Bu sorular düşünce yapını ve mimari yaklaşımını ölçer. Trade-off'lardan bahset.
Mahkeme sistemi gibi — ilk hâkim reddederse dava üst mahkemeye çıkar. Her seviyede farklı yetkili, süre dolunca otomatik escalation.
1. Timeout → 1 üst seviyeye otomatik escalate
2. Approver yoksa → Out-of-office delegate'e
3. Tüm seviyeler timeout → Sistem yöneticisine bildirim
| Sorun | Çözüm |
|---|---|
| OnStart çok yavaş | Concurrent() + sadece zorunlu veri, gerisi OnVisible |
| Gallery scroll donuyor | Top N + lazy loading + delegation-friendly filter |
| Delegation warning | StartsWith yerine Filter, server-side index |
| Çok fazla LookUp | ClearCollect ile preload + collection üzerinden işle |
| Aynı veriyi tekrar çekiyor | Collection cache + Set() global değişken |
| Image render yavaş | AzureBlob + thumbnail URL |
Olta ile balık avlamak gibi — tüm gölü ağla taramak yerine doğru noktaya olta atarsın.
- Power Apps varsayılan delegation limiti: 500 (max 2000)
- Non-delegable fonksiyonlar client'ta sadece ilk 500-2000'i alır → eksik veri
| Delegable ✅ | Non-delegable ❌ |
|---|---|
| Filter, Search, LookUp | Sort by formula |
| StartsWith, EndsWith, In | Distinct (kısmen) |
| Sum, Average, Min, Max | Concat, Concatenate |
| = != < > <= >= | Mid, Left, Right |
1. Sarı delegation uyarısını ASLA görmezden gelme
2. Limit'i 2000'e çıkarmak çözüm değil, ertelemedir
3. Filtreyi sunucuya sok — Dataverse'e veya SQL view'a taşı
4. Pagination / infinite scroll uygula
Otel kartı sistemi gibi — resepsiyonist lobiye girer, misafir kendi odasına, müdür her yere.
- Environment seviyesi: Maker / User / System Admin rolleri
- App seviyesi: Co-owner / User olarak paylaşma
- Data seviyesi (Dataverse): Security Role → Privilege + Access Level
- Record seviyesi: Owner-based veya Sharing ile (Hierarchical Security)
- Field seviyesi: Field Security Profile ile hassas alanları gizle
- UI seviyesi: User().Email + If() ile butonları gizle (kozmetik!)
UI üzerinde gizleme = sadece kozmetiktir. Gerçek güvenlik HER ZAMAN data layer'da (Dataverse roles) yapılmalı. Aksi halde 'Inspect Element' veya Web API çağrısıyla data sızar.
Restoran mutfağı gibi — tarifi DEV'de geliştirirsin, müşteri grubuna UAT'da tattırırsın, beğenilince PROD menüsüne alırsın.
- Unmanaged Solution: DEV ortamında — düzenlenebilir
- Managed Solution: UAT ve PROD'da — kilitli
- Pipelines: GUI tabanlı, Microsoft önerisi
- Azure DevOps + Build Tools: Klasik, esnek
- GitHub Actions: PAC CLI ile otomatik export → import
❌ PROD'da doğrudan değişiklik · ❌ Unmanaged solution'ı PROD'a taşımak · ❌ Connection'ları manuel kurmak · ❌ Environment Variable yerine hardcoded URL · ❌ Versiyon kontrol olmadan deploy
Ulaşmayan mektup gibi — posta sistemi 3 kez kapıya gider, yine yoksa depoya bırakır.
- Retry Policy: Default (4 retry, exponential backoff), Fixed, None
- Try-Catch-Finally Pattern: Üç Scope kullan
- Configure Run After: Catch → Try'in 'has failed / timed out / skipped'
- Dead-letter table: Başarısız payload'ları Dataverse'e kaydet
[Try Scope] - Get items → Apply to each → HTTP call → Update record [Catch Scope] ← Run after Try: Has Failed - Compose: error details - Insert error to dlq_FailedRequests table - Send Teams alert - Terminate (Status: Failed) [Finally Scope] ← Always - Log execution metrics
Idempotent işlemler → Retry açık | Non-idempotent (kart çekme, mail gönderme) → Retry KAPALI veya idempotency key ile
- Credentials → Azure Key Vault, asla connector'a hardcoded yazma
- Auth: OAuth 2.0 > API Key > Basic (sırayla tercih)
- Custom Connector kullan (HTTP action yerine — denetim, DLP)
- On-prem Data Gateway → Şirket içi API'ler için
- Service Principal → kullanıcı bağımsız erişim
Power App → Custom Connector → Azure API Management → Backend API
↑
Azure Key Vault (secrets)
↑
Azure AD App Registration (OAuth2)
Bölüm 4 — Düşünce Yapısı & Sahiplenme
Bu sorular kişiliğini ve kariyer motivasyonunu ölçer. Samimi ol, ezbere kaçınma.
Elektrikçi olmak gibi — duvarların arkasındaki kabloları sen döşersin, sabah ofise gelen herkes ışıkları açar ve fark bile etmez. Görünmez ama hayati.
- Etki: Kullanıcının saatlerce süren işini dakikalara indirmek
- Çeşitlilik: Aynı platformda hem UI, hem mantık, hem entegrasyon
- Hız: Pro-code'a kıyasla aynı çıktıyı 10x hızda verebilmek
- Demokratikleşme: Citizen developer'a güç vermek, IT'nin yükünü azaltmak
- Öğrenme: AI Builder, Copilot Studio gibi en yeni teknolojilere erken erişim
- Manuel süreçleri otomatize eden, ölçülebilir ROI'si olan projeler
- Çoklu sistem entegrasyonu içeren mimari zorluklar
- Son kullanıcı ile direkt etkileşim — feedback'in hızlı geldiği projeler
- AI ile zenginleştirilmiş workflow'lar (Copilot, Form Processing)
- End-to-end sahiplenebilen, design'dan deployment'a giden projeler
Bölüm 5 — Teknik Detaylar
Uçakta rehber kitap taşımak gibi — uçmadan önce ihtiyacın olan sayfaları indirirsin, internetsiz okursun, yere inince notlarını buluta senkronize edersin.
// OnStart - veriyi cihazdan yükle
If(Connection.Connected,
ClearCollect(colTalepler, Talepler);
SaveData(colTalepler, "TaleplerCache"),
LoadData(colTalepler, "TaleplerCache", true)
);
// Yeni kayıt — offline ise queue'ya ekle
If(Connection.Connected,
Patch(Talepler, Defaults(Talepler), formData),
Collect(colPendingSync, formData);
SaveData(colPendingSync, "PendingSync")
);
// Bağlantı geri gelince sync
If(Connection.Connected && CountRows(colPendingSync) > 0,
ForAll(colPendingSync As item,
Patch(Talepler, Defaults(Talepler), item)
);
Clear(colPendingSync); SaveData(colPendingSync, "PendingSync")
);
| Kriter | Standart | Custom |
|---|---|---|
| Geliştirici | Microsoft / Partner | Sen / Ekibin |
| Kapsam | 1000+ hazır servis | Şirket içi API'ler |
| Lisans | Plan'a göre | Premium |
| Auth | Yapılmış | Senin tanımın |
Standart connector listesini ARA → yoksa custom yap. Bazen REST/HTTP action ile başla, sonra refactor et.
LEGO fabrikası gibi — bir kere üret, her yerde kullan. Renk değiştirmek istersen fabrikadan çık, kalıbı değiştir → tüm uygulamalar otomatik güncellenir.
- Canvas Component — drag-drop UI parçası (header, footer, custom dropdown)
- PCF — TypeScript ile yazılan ileri seviye component
- Component Library — organizasyon-wide paylaşım
// ❌ YAVAŞ
ForAll(Talepler, Patch(Log, Defaults(Log), {Tutar: ThisRecord.Tutar}))
// ✅ HIZLI
Patch(Log, ForAll(Talepler As t, {Tutar: t.Tutar}))
// ❌ YAVAŞ — her seferinde yeniden çekiyor
LookUp(Talepler, ID = varID).Baslik
// ✅ HIZLI — With ile cache
With({rec: LookUp(Talepler, ID = varID)}, rec.Baslik)
Bölüm 6 — Mimari (Senior Seviye)
| Solution | İçerik | Bağımlılık |
|---|---|---|
| Core (Foundation) | Ortak entity, choice, security roles | Hiçbir şeye bağlı değil |
| Shared Components | Component library, theme, custom connectors | Core |
| App-A | App-A'ya özgü flow + canvas + PCF | Core, Shared |
| App-B | App-B'ye özgü flow + canvas | Core, Shared |
| Integrations | Custom connector, environment vars | Core |
Tek bir devasa solution = monolith. Bir component'i değiştirmek için tüm solution'ı yeniden deploy etmek zorundasın.
- DLP Policies: Connector'ları Business / Non-Business / Blocked grupla
- Environment Strategy: Default ≠ üretim. Ayrı DEV, UAT, PROD
- CoE Starter Kit: Admin dashboard, app inventory, maker analytics
- Maker Onboarding: Eğitim + sandbox + branding rehberi
- Audit & Compliance: Audit logs, Purview entegrasyonu
| Environment Tipi | Amaç |
|---|---|
| Default | Tüm makers'ın ortak alanı — production için ÖNERİLMEZ |
| Production | Canlı uygulamalar |
| Sandbox | UAT, DEV — sıfırlanabilir, copy edilebilir |
| Developer | Bireysel maker için ücretsiz, full feature |
| Teams | Microsoft Teams için ücretsiz, sınırlı Dataverse |
Bölüm 7 — AI Agents & Copilot Studio
AI ajan tasarımı modern Power Platform mülakatlarının vazgeçilmezi. Microsoft, Power Virtual Agents'ı 2024'te Copilot Studio olarak yeniden markaladı.
Eğitilmiş bir resepsiyonist gibi — soruları anlar, doğru kaynağa yönlendirir, gerektiğinde başkasıyla konuşur, bilmediğini sana sorar.
- Topics: Konuşma akışları — trigger phrase + branching mantığı
- Entities: Kullanıcı mesajından çekilen yapılandırılmış bilgi
- Generative Answers: SharePoint, web, Dataverse'ten AI yanıt
- Actions: Power Automate flow tetikleme, harici API çağırma
- Channels: Teams, Web, Slack, Telegram — aynı bot, çoklu kanal
| Mod | Açıklama |
|---|---|
| Classic (no-code) | Topics + nodes ile akış tabanlı kurulum |
| Generative (AI-first) | LLM kararıyla dinamik akış |
| Hybrid | Kritik akışlar topic, açık uçlu sorular generative |
AI Builder LEGO'nun pre-built modelleri gibi. Copilot Studio ise LEGO'larla robot yapmak — hazır yetenekleri kullanarak konuşan asistan kurarsın.
| Özellik | AI Builder | Copilot Studio |
|---|---|---|
| Amaç | Yetenek (skill) | Konuşma ajanı |
| Kullanım | Flow / App içinde aksiyon | Standalone bot |
| Çıktı | Yapılandırılmış data | Doğal dil yanıt |
Copilot Studio bot'u → Action olarak Power Automate'i çağırır → Flow içinde AI Builder OCR ile fatura okur → Sonuç bot'a döner.
3 katman: 1) Persona ('Sen bir İK asistanısın') · 2) Constraint ('Sadece izin/maaş konuları') · 3) Format ('Cevapları madde madde ver')
Bölüm 8 — Custom Connectors (Derinlemesine)
- 4 Yöntem: OpenAPI 2.0 (Swagger) · Postman Collection · Boş başlat · Azure Service
- 1. General — Icon, color, description, host URL
- 2. Security — Auth type: No auth / Basic / API Key / OAuth 2.0 / AAD
- 3. Definition — Actions ve Triggers tanımla
- 4. Code (preview) — C# script ile request/response transform
- 5. Test — Connection oluştur → operation çalıştır → response gör
| Tip | Kullanım | Güvenlik |
|---|---|---|
| No Auth | Public API, dev/test | Düşük |
| Basic | Username + Password | Düşük (HTTPS şart) |
| API Key | Header veya query string | Orta |
| OAuth 2.0 | Authorization Code flow | Yüksek |
| AAD (Entra) | Microsoft tenant API'leri | Çok yüksek |
- Set HTTP Header — sabit header ekle
- Route Request — version'a göre URL değiştir
- Set Host URL — environment'a göre switch
- Throttle by key — rate limit
public class Script : ScriptBase
{
public override async Task<HttpResponseMessage> ExecuteAsync()
{
var content = await Context.Request.Content.ReadAsStringAsync();
var json = JObject.Parse(content);
json["timestamp"] = DateTime.UtcNow.ToString("o");
Context.Request.Content = CreateJsonContent(json.ToString());
return await Context.SendAsync(Context.Request, CancellationToken);
}
}
Bölüm 9 — C# Plugins (Dataverse)
Plugin'ler Dataverse'in motor odasıdır — server-side, sync/async, transaction içinde çalışan business logic.
| Yöntem | Ne zaman kullan? |
|---|---|
| Business Rule | Form-level, basit if-then, sadece UI |
| Power Automate Flow | Async, harici sistem, low-code |
| Custom API | Reusable server-side action |
| PLUGIN | Sync, complex, transaction-aware, kritik logic |
| Stage | No | Ne zaman? |
|---|---|---|
| Pre-validation | 10 | Transaction'dan ÖNCE — yetki kontrolü |
| Pre-operation | 20 | Transaction içinde, DB write'tan ÖNCE |
| Main operation | 30 | Dataverse core operation — değiştirilemez |
| Post-operation | 40 | DB write'tan SONRA — sync child write |
| Post-operation async | 40 | Background — email, integration |
public class HesapValidationPlugin : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
var context = (IPluginExecutionContext)serviceProvider
.GetService(typeof(IPluginExecutionContext));
var serviceFactory = (IOrganizationServiceFactory)serviceProvider
.GetService(typeof(IOrganizationServiceFactory));
var service = serviceFactory.CreateOrganizationService(context.UserId);
var tracingService = (ITracingService)serviceProvider
.GetService(typeof(ITracingService));
if (context.MessageName != "Create" && context.MessageName != "Update") return;
if (!(context.InputParameters["Target"] is Entity target)) return;
if (target.LogicalName != "account") return;
try {
if (target.Contains("revenue")) {
var revenue = target.GetAttributeValue<Money>("revenue");
if (revenue.Value > 1000000 && !target.Contains("creditrating"))
throw new InvalidPluginExecutionException(
"1M üstü hesaplar için credit rating zorunludur");
}
}
catch (InvalidPluginExecutionException) { throw; }
catch (Exception ex) {
throw new InvalidPluginExecutionException("Plugin hatası: " + ex.Message, ex);
}
}
}
- ✅ Filtering attributes kullan — gereksiz tetiklenme önle
- ✅ Tracing service ile log yaz
- ✅ Stateless yaz — instance variable kullanma
- ✅ Depth check:
if (context.Depth > 1) return;— sonsuz döngüyü engelle - ❌ External HTTP call YAPMA (sandbox kısıtlı)
- ❌ Long-running işlem yapma (2 dk sync, 24 saat async limit)
- ❌ Hardcoded GUID/URL kullanma
Bölüm 10 — Power Automate (Cloud + Desktop / RPA)
Cloud Flow telefon görüşmesi gibi — uzaktan, dijital. Desktop Flow ise fiziksel asistan — bilgisayarın başında ekran tıklayan robot.
| Özellik | Cloud Flow | Desktop Flow (RPA) |
|---|---|---|
| Hedef | API'ler, connectors | Eski uygulamalar, web UI, Excel |
| Hız | Saniye | Dakika (UI etkileşimi) |
| Kırılganlık | Az (API contract) | Yüksek (UI değişirse bozulur) |
| Kullanım | Modern sistemler | Legacy, SAP, eski ERP |
Cloud Flow tetikler → Desktop Flow eski sistemde işi yapar → Sonucu Cloud Flow'a döner → Modern sistemlere yazar.
- Automated: Olay-tabanlı — When item is created, When email arrives
- Instant (Manual): Kullanıcı tetikler — Power App'ten, mobil, button
- Scheduled: Zamanlanmış — günde 1 kez, her Pazartesi 09:00
- Polling: Power Automate her N dakikada bir API'yi sorar
- Webhook: Servis Power Automate'e push eder (anlık, daha az kaynak)
- Trigger concurrency — aynı trigger'dan eşzamanlı kaç flow run? (1-100)
- Apply to each → Concurrency Control (1-50)
- ✅ Aç: Bağımsız öğeler işleniyorsa — performans artışı
- ❌ Kapat: Sıra önemliyse veya shared resource varsa (counter)
Çoğu flow'un yavaşlığı 'Apply to each' içindeki sequential işlemden gelir. 20+ item varsa concurrency 10-20 yap.
Bölüm 11 — Dataverse Derinlemesine
- Tables — Standard / Custom / Activity / Virtual
- Columns — Text, Number, Currency, Date, Choice, Lookup, File, Calculated, Roll-up
- Relationships — 1:N, N:1, N:N
- Choices — Global veya local enum
- Business Rules — UI/Server level basit kurallar
| Calculated | Roll-up | |
|---|---|---|
| Zamanlama | Anlık hesaplanır | 12 saatte bir (+ manuel) |
| Kapsam | Tek satır içinde | Parent-child agregasyonu |
| Performans | Etkisi az | Async job — büyük veride yavaşlayabilir |
Aynaya benzer — Dataverse'te tablo gibi görünür ama veri başka yerde (SQL, OData, SharePoint, Cosmos).
- ✅ Veri replikasyonu YOK — kaynak sistemde yaşar
- ✅ Power Apps, flow'da normal tablo gibi kullanılır
- ❌ Plugin / Workflow trigger LIMITED
- ❌ Performans — kaynak sistemin hızına bağımlı
| Özellik | Dataverse for Teams | Tam Dataverse |
|---|---|---|
| Lisans | M365 ile ücretsiz | Premium |
| Plugins | ❌ | ✅ |
| Custom Connectors | ❌ | ✅ |
| Audit | ❌ | ✅ |
| Channel | Sadece Teams | Web, mobile, Teams |
Bölüm 12 — Güvenlik & Yetkilendirme
- 1. Tenant: Microsoft 365 yönetici düzeyi
- 2. Environment: Maker/User/Admin rolü
- 3. Business Unit: Departman/şirket
- 4. Security Role: Privilege seti
- 5. Team: Owner / Access / AAD Group
- 6. Record Sharing: Tek kayda bireysel yetki
- 7. Field Security Profile: Kolon seviyesinde mask/read/write
- 8. Hierarchical Security: Manager kendi altındakileri görür
| Privilege | Access Level |
|---|---|
| Create / Read / Write / Delete | User (sadece kendi) |
| Append / Append To | Business Unit (kendi BU) |
| Assign | Parent: Child Business Units |
| Share | Organization (tüm tenant) |
- 1. Azure AD'de App Registration oluştur
- 2. Client ID + Secret (veya certificate) oluştur
- 3. Power Platform admin → Application Users → New
- 4. Security Role ata
- 5. OAuth 2.0 client_credentials flow ile token al, API çağır
Bölüm 13 — Power BI Entegrasyonu
- Power BI tile — Canvas App içine embed
- Power Automate — Power BI dataset refresh tetikleme
- Power BI alert → Power Automate → Action (anomaly detection)
- Streaming dataset — real-time KPI dashboard
'Ekibe rapor paylaşmanın en hızlı yolu' = Power BI Workspace + RLS + Teams kanalına embed.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Import | Hızlı, tüm DAX, offline | Refresh gerekir |
| DirectQuery | Anlık veri | Yavaş, DAX kısıtlı |
| Dataverse Connector | Native, optimal | Premium gerekebilir |
| TDS Endpoint (SQL) | T-SQL ile sorgu | Read-only, sınırlı |
Bölüm 14 — Genel Best Practices
Tüm rehberin damıtılmış hali. 'Projende neye dikkat ediyorsun?' sorusuna 5 madde say, kazanırsın.
Naming Conventions
- Tablo: PascalCase, tekil —
IzinTalebi,MaliyetMerkezi - Kolon: camelCase / prefix —
pp_durum - Solution:
CompanyName_AppName_Type—contoso_hr_managed - Flow: Verb-Noun-Trigger —
CreateApprovalRequest_OnNewItem - Variable:
varprefix · Collection:colprefix · Component:cmpprefix
Performance
- OnStart kısa tut — kritik olmayanı OnVisible'a ertele
- Concurrent() ile paralel yükleme
- Delegation-friendly fonksiyonlar kullan
- UpdateContext > Set (scope avantajı)
Security
- Hardcoded credentials YASAK — Environment Variable / Key Vault
- UI-level gizleme ≠ data-level güvenlik
- Service Principal ile entegrasyon
- DLP policy'leri tanımla · Audit log aktif
Error Handling
- Try-Catch-Finally pattern (flow'da Scope'lar)
- IfError() ile Power FX
- Notify() ile kullanıcıya geribildirim
- Plugin'de
InvalidPluginExecutionException - Dead-letter queue başarısız mesajlar için · Retry policy + idempotency
Maintenance
- Solution + Source Control (Azure DevOps / GitHub)
- Comments — flow'da Note action, formüllerde
// yorum - Versioning — major.minor.patch
- Documentation — README, mimari diyagramı, decision log
Mülakatta kazanan 'en çok bilen' değil, 'en net düşünen'dir.
1. Problemi anlat (analoji ile) · 2. Çözümü mantığıyla açıkla · 3. Trade-off'u söyle
İyi Şanslar! 🚀