AIFA AKADEMI · Kurumsal Wiki
4.310 makale
Ana sayfa Kurumsal Wiki › Raporlar › Functions › DOC-REPORT-GUIDE

Rapor (tablo fonksiyonu) yazma rehberi

REPORT_FUNCTIONMOD-RAPORERPGOLD_COREACTIVEHIGHSOURCE_IMPLEMENTED
Kanonik kaynak: markdown · bu sayfa üretilmiş görünümdür

Kaynak: KB-v1 10_Reports/REPORT_WRITING_GUIDE.md (2026-09-10, kısmi kod kapsamı). Bu makale artık kanoniktir; KB-v1 kopyası 22_Archive'da referanstır.

Kısım 8 — Teknik Ek: Veritabanı ve Rapor Yazımı

Bu kısım rapor hazırlayan destek personeli ve yazılımcılar içindir. Önceki kısımlardaki "kontrol adı yazma" kuralı burada geçerli değildir; tablo, alan ve fonksiyon adları birebir yazılır. Veritabanı Microsoft SQL Server üzerindedir; erişim SQL Server Management Studio ile, yalnız okuma yetkili bir kullanıcıyla yapılmalıdır. Üretim veritabanında UPDATE/DELETE, bu dokümanda açıkça yazılan birkaç bakım işlemi dışında yapılmaz.

8.1 Başlamadan önce bilinmesi gereken on kural

  1. Tablolar arasında tanımlı ilişki (foreign key) yoktur. Çekirdek şemalarda (Cari, Stok, Sistem) hiçbir tablo diğerine kısıtla bağlı değildir; ilişkiler SubeId, KasaId, HesapId, StokId, BirimId, IslemId adlarıyla gelenek olarak kurulur. Veritabanı sizi yanlış join'den korumaz. Yalnız yeni KYC şeması düzgün ilişkilidir.
  2. Silme yoktur, işaretleme vardır. Neredeyse her tabloda IsDeleted alanı vardır. İptal edilen işlem, silinen kasa, pasife alınan hesap tabloda durur. Her sorguya IsDeleted = 0 şartı koymayı unutan rapor, iptal edilmiş işlemleri toplar. Bu, en sık yapılan rapor hatasıdır.
  3. Cari.Islemler tek gerçek kaynaktır. Bakiye defteri (Cari.BakiyeIslem) ve stok defteri (Stok.StokHaraketleri) bu tablodan otomatik kural (trigger) ile türetilir. Bu iki tabloya asla elle yazılmaz; Cari.Islemler'deki bir satır değişince kural o işlemin türetilmiş satırlarını silip yeniden üretir.
  4. StokId çok anlamlıdır. Hangi tabloya işaret ettiği IslemKodu'na bağlıdır (8.4). Cari.Islemler'i StokId üzerinden koşulsuz Stok.Maden'e bağlayan rapor, nakit satırlarını maden kartlarıyla eşleştirir ve sessizce yanlış sonuç verir.
  5. BirimId de çok anlamlıdır. İşlem tipi PEŞİN ise Stok.Nakit.Id, diğerlerinde Sistem.Birimler.Id; 0 ise "para tarafı yok".
  6. İşaret iki katmanlıdır. Cari.Islemler.Yon: GİRİŞ/ALACAK/ALIŞ → '+', diğerleri '−' (stok bakış açısı). Cari.BakiyeIslem.Bakiye: artı = müşteri borçlu, eksi = müşteri alacaklı. Hazır raporlar sunarken Bakiye * -1 yapar. Stok.StokHaraketleri.Miktar: giriş artı, çıkış eksi.
  7. Hesaplanan sütunlara yazılmaz. Cari.Islemler'de 14 sütun (IslemYonu, Type, Yon, Aciklama2, IscilikTL, Kar, Durum, SAdet, SMiktar, SHas, SIscilik, USDTutar, TLTutar, IsArbitiraj) formülle türetilir; INSERT/UPDATE listesine konursa hata verir. Raporda okumak serbesttir ve pratiktir.
  8. Kur fotoğrafı işlem satırındadır. HasKur, GumKur, PltKur, PldKur, UsdKur, EurKur, BirimKur işlem anındaki alış kurlarıdır. "İşlem günkü kur" gereken raporda bunlar, "bugünkü kur" gereken raporda Sistem.GetKurListesi(GETDATE) kullanılır.
  9. Bölme her zaman FN.Bol(a, b) ile yapılır. Sıfıra bölmede hata yerine 0 döner. Düz / kullanan rapor er geç "Divide by zero" verir.
  10. Veritabanı uyumluluk düzeyi 100'dür (SQL Server 2008 modu). STRING_AGG, FORMAT, TRY_CONVERT gibi yeni komutlar çalışmaz; FOR XML PATH + STUFF, CONVERT, CASE kullanılır. "2008'de çalışmıyor" notu destek dokümanlarında bu yüzden geçer.

8.2 Şema haritası

Şema İçerik Rapor yazarken
Cari İşlemler, hesaplar, bakiye defteri, işlem detayı, geçmiş, transferler Her raporun kaynağı
Stok Maden, nakit, takoz, taş, pırlanta, model, hizmet, genel, emtia kartları; stok defteri Stok ve maliyet raporları
Sistem Şube, kasa, kullanıcı, yetki, birim, kur, pano, ayar, kod tabloları Join için tanım tabloları
Bakiye Bakiye hesaplayan fonksiyonlar Bakiye.GetBakiye
FN Yardımcı skaler fonksiyonlar FN.Bol, FN.GetKur, FN.BakiyeDurum, FN.GetCariLimit
Reports, Report, ReportsV2 Programdaki raporların tablo fonksiyonları Örnek ve şablon deposu
Bilanco Bilanço anlık görüntüleri ve fonksiyonu Bilanco.OzetBilanco, Bilanco.Bilancolar
Pozisyon Döviz açık pozisyon tablosu (5 saniyede bir servis yazar) Pozisyon raporları
AifaDev Programın rapor ve form tasarımları (AifaDev.Reports, ReportLayouts, ReportsFilter) Rapor kaydı burada durur; elle değil Developer Studio ile
KYC Uyum modülü (AifaUyum) Evrak kontrol raporları
Muhasebe, NetEkstre, NET, Siparis, Uretim Muhasebe arşivi, banka ekstresi, sipariş, üretim Müşteriye göre
POS Yeni web banko modülü (2026) Masaüstüne dokunmaz
Repair Repair.BalanceRepairçalıştırmayın, kalıcı veri kaybı yapmıştır

8.3 Çekirdek tablolar alan alan

8.3.1 Cari.Islemler — her işlem, tek satır

Alan Tip Anlamı ve rapor notu
Id int İşlem numarası. Ekranda Id sütunu. Tüm sistemde tek.
IslemYonu hesaplanan 'ALIS' (tür GİRİŞ/ALIŞ) veya 'SATIS' (ÇIKIŞ/SATIŞ); ALACAK/BORÇ için boş
ProjeId int Proje takibi yapan kurulumlarda proje
HesapType int 0 = cari işlem, 1 = transfer/provizyon. Raporlarda HesapType = 0 şartı
Type hesaplanan 'Islem' / 'Transfer'
OwnerRefNo, RefNo nvarchar Bağlı satırların ortak referansı (virman, parite, vadeli çifti). Karşı bacak: aynı RefNo, aynı IslemKodu, farklı Id
SubeId, KasaId int Şube ve kasa. Rapor parametresi @SubeId buraya bağlanır
HesapId int Cari.Hesaplar.Id
FisNo int Fiş numarası (kasa bazında artar)
Tarih date İşlem tarihi (kullanıcının seçtiği). Kayıt anı için InsertDate
IslemKodu tislemkodu Ekran: 0 TAKOZ, 1 MADEN, 2 HURDA, 3 NAKİT, 4 ÇEVİR, 5 HİZMET, 6 VADELİ, 7 TAŞ, 8 PIRLANTA, 9 MODEL, 10 GENEL, 11 VİRMAN, 12 FATURA, 13 EMTİA, 14 ÇEŞNİ, 999 BORÇ İŞLEMLERİ (kod tablosunda adı DEVİR)
IslemTuru tislemturu Yön: 0 GİRİŞ, 1 ÇIKIŞ, 2 ALACAK, 3 BORÇ, 4 ALIŞ, 5 SATIŞ. Çift = artı yön, tek = eksi yön
IslemTipi tislemtipi 0 NORMAL, 1 PEŞİN, 2 BEDELLİ, 3 İADE, 4 EMANET, 5 MİKTAR, 6 ALTIN, 7 GÜMÜŞ, 8 PLATİN, 9 PALADYUM, 10 PARİTE, 11 RESMİ; −1/−2 = bakiye üreten ama stok üretmeyen özel satırlar (çevir, virman); 11/12 stok/bakiye üretmez
Yon hesaplanan '+' (tür 0/2/4) veya '−'
Vade date Vade tarihi
StokId int Çok anlamlı, bkz. 8.4
AyarEviId, RaporNo, IsRapor Takoz: ayar evi, rapor no, raporlu mu
IsExtra bit Takoz: ekstra işaret
Kodu nvarchar Stok kodu / birim kodu / hizmet kodu — rapor için en pratik alan, join gerektirmez
BakiyeId int Mal tarafının bakiye birimi (Sistem.Birimler.Id); 0 = bu satır mal bakiyesi üretmez
Adet, Miktar, CesniMiktar Adet, gram/tutar, çeşni gramı
AuMilyem, AgMilyem, PldMilyem, PltMilyem decimal(18,5) Altın, gümüş, paladyum, platin milyemleri
HasIsc, HasIscBirimId, HasIscBirimKur Takoz has işçiliği, birimi, kuru
GumIsc, GumIscBirimId, GumIscBirimKur Takoz gümüş işçiliği
IscilikDurumu, GumusDurumu, PlatinDurumu, PalladiumDurumu int Takoz ekranındaki durum seçimleri
Fiyat decimal(18,8) Fiyat
FiyatTipi tfiyattipi 0 Adet (A), 1 Miktar (M), 2 Ons (O), 3 Has (H)
Tutar decimal(18,2) Para tutarı
BirimId, Birim, BirimKur Para tarafının birimi (id, kodu) ve o günkü alış kuru
Aciklama, Aciklama2 Açıklama; Aciklama2 hizmet satırında "Tag-Açıklama"
Kategori, Kategori2 Ekrandan girilen kategori
Maliyet, Satis, Kar Maliyet, satış değeri (bilanço biriminde), kâr (hesaplanan)
Iscilik, IscilikBirim, IscilikBirimKur, IscilikBirimId, IscilikTL İşçilik tutarı, birimi, kuru; TL karşılığı hesaplanan
HasKur, GumKur, PltKur, PldKur, UsdKur, EurKur decimal(18,5) İşlem anındaki alış kurları (fotoğraf)
Tag nvarchar Hizmet kodu / serbest etiket
Locked bit Kilitli (düzenlenemez)
UserId, LoginId, InsertDate, LastModify Kim, hangi oturum, ne zaman kaydetti, son düzeltme
IsDeleted bit 1 = iptal edilmiş. Her raporda = 0
Status, Durum Provizyon durumu; Durum = RS aktarıldı mı ('EVET'/'HAYIR')
SAdet, SMiktar, SHas, SIscilik hesaplanan İşaretli adet/miktar/has/işçilik (GİRİŞ +, diğerleri −). Stok toplamı için SUM(SMiktar)
MUser, MTarih, Mutabakat Mutabakat bilgisi
VaryantId int Varyant; vadeli/nakit satırında ≠ 0 ise arbitraj çifti
OzelKodId, Olcu Özel kod, ölçü
RsAktar, FaturaIscilikTL, BSMV Dış aktarım işareti, fatura işçilik TL'si, vergi tutarı
USDTutar, TLTutar hesaplanan Tutarın USD ve TL karşılığı (kur fotoğrafıyla)
IsArbitiraj hesaplanan 1 = (NAKİT veya VADELİ) ve VaryantId ≠ 0

8.3.2 Cari.History — işlem değişiklik izi

Cari.Islemler ile aynı alanlara ek olarak:

Alan Anlamı
Id İz satırı numarası
LogType 'Yeni Kayıt', 'Düzeltme', 'İptal Edildi', 'Geri Alındı', 'Silindi'
LogDate İzin düştüğü an
TransactionId İzlenen işlemin Cari.Islemler.Id'si (ekranda RefId)

Kural: 'Yeni Kayıt' ve 'Düzeltme' satırları işlemin yeni hâlini, 'İptal Edildi' ve 'Geri Alındı' satırları değişiklik öncesi hâlini taşır. Mutabakat işaretlemesi iz üretmez. IsDeleted iz satırında da vardır; hazır fonksiyonlar IsDeleted = 0 süzer.

8.3.3 Cari.BakiyeIslem — türetilmiş bakiye defteri

Alan Anlamı
IslemId Kaynak işlem. −1 = devir (açılış) satırı, kaynağı yoktur
Tarih, HesapType, HesapId, KasaId Tarih, tür (0 = cari), hesap, kasa. Bakiye hesabında kasa kullanılmaz
BirimId Sistem.Birimler.Id
Bakiye decimal(18,2). Artı = müşteri borçlu, eksi = müşteri alacaklı
NetBakiye Hesaplanan yürüyen toplam
RefNo Karşı kayıt eşleştirmesi

Bir hesabın birim bazında bakiyesi: SELECT BirimId, SUM(Bakiye) FROM Cari.BakiyeIslem WHERE HesapType=0 AND HesapId=@HesapId GROUP BY BirimId. Sunarken * -1 yapıp eksi olanları ALACAK, artı olanları BORÇ sütununa koyun (hazır Bakiye.GetBakiye bunu yapar).

8.3.4 Stok.StokHaraketleri — türetilmiş stok defteri

Alan Anlamı
IslemId Kaynak işlem (Bolum = 2 ise transfer, kaynağı Cari.Transferler)
Bolum 0 = cari işlem, 2 = kasa transferi
IslemTuru Yön
Tarih, SubeId, KasaId Ne zaman, nerede
StokTipi 1 = maden (mal), 2 = nakit (para); taş/pırlanta/model için diğer değerler
StokId StokTipi 1 → Stok.Maden.Id, 2 → Stok.Nakit.Id
Adet, Miktar, Milyem, Has Fiziki hareket; giriş artı, çıkış eksi
Maliyet Maliyet
VaryantId Varyant
NetBakiye Yürüyen toplam

Not: PEŞİN bir maden satışı iki satır üretir: StokTipi 1 (mal çıkışı, eksi) ve StokTipi 2 (para girişi, artı). NORMAL maden satışı yalnız StokTipi 1 üretir. Nakit stok listesi: SUM(Miktar) … WHERE StokTipi = 2 GROUP BY KasaId, StokId.

8.3.5 Cari.Hesaplar — cari kart

Alan Anlamı
Id, HesapAdi, TicariUnvan Kimlik ve ad
KarsiHesapId Şubeler arası işlemde karşı şubedeki eş hesap
MuhHesapId Muhasebe hesap eşlemesi
KartId Hesap kart tipi (Cari.Kartlar)
SubeId Hesabın şubesi
GrupKodu, Kategori, DosyaKategori Gruplama, kategori, evrak kategorisi
VergiDairesi, VergiNo, TCNo, PassaportNo, HukukiKod Resmi kimlik
SanalHesap, HesapTuru Sanal/ana hesap işareti, hesap türü
Kaldirac, OnsCarpan, MarginLevel, MarginCall, MarginStop, AutoStop Vadeli/FX teminat ayarları
Limit, LimitBirimId Kredi limiti ve birimi
TakozHasIsc, TakozHasIscBirimId, TakozGumIsc, TakozGumIscBirimId Müşteriye özel takoz işçilikleri
FixingDiscount, FixingBirimId Fixing indirimi
Yetkili, Temsilci1, Temsilci2, Adres, Ulke, Il, Ilce, Semt, Telefon1, Telefon2, Fax, Gsm, Email, Web İletişim
IsActive, PasifDescription Aktif mi, pasif gerekçesi
LastDate Son işlem tarihi
Rating Puan
UserId, InsertDate, IsDeleted, RefNo Kayıt bilgisi

8.3.6 Cari.IslemDetaylari — fatura ve resmi işlem detayı

Bir işlemin fatura/e-belge tarafı. IslemId ile Cari.Islemler'e bağlanır (bire bir). Önemli alanlar: FaturaSeri, FaturaNo, FaturaUnvan, FaturaAdres, FaturaVergiDairesi, FaturaVergiNo, KimlikTipi, KimlikNo, OdemeTipi, MusteriTipi, DovizKodu, DovizMiktar, DovizTLKuru, VergiOrani, VergiHaricTutar, VergiDahilTutar, VergiTutari, DolarKuru, IstatistikKodu, ETTN (e-belge evrensel numarası), IsSended, Durum ('EIPTAL' = e-belge iptal), ErrorText. Gümrük ve döviz beyan alanları döviz bürosu mevzuatı içindir. Cari.Faturalar ve Cari.FaturaDetay tabloları boştur; fatura bilgisi buradadır.

8.3.7 Cari.Transferler — kasa/şube transferi

Tarih, SubeId, CikanKasaId, GirenKasaId, StokTipi, StokId, Kodu, Adet, Miktar, Milyem, Has, Maliyet, Status, IsDeleted. Her transfer stok defterine Bolum = 2 ile iki satır (çıkan kasa eksi, giren kasa artı) yazar. Cari bakiyeyi etkilemez.

8.3.8 Stok.Maden — maden kartı

Alan Anlamı
Id, Kodu, Aciklama, Barkod, GrupKodu, Kategori Tanım
AnaBirimId Bakiyenin tutulduğu birim (genelde HAS)
IsHurda 1 = hurda kartı (HURDA ekranı yalnız bunları listeler)
StabilMiktar Ziynette parça gramı (çeyrek 1,754)
IsAdet Adetle işlem görür
Milyem, MilyemDurumu Sabit milyem; 1 ise ortalama (son giren ilk çıkar) milyem kullanılır
IscTuru, IscTuruDurumu 0 adet başı / 1 miktar başı işçilik
FiyatTipi 0 Ad, 1 Miktar, 2 Oz, 3 Has
GirisIsciligi, GirisIsciligiBirimId, GirisIscDrm, CikisIsciligi, CikisIsciligiBirimId, CikisIscDrm Varsayılan giriş/çıkış işçiliği
MaliyetBirimId Maliyet birimi
AlacakMizan, BorcMizan Muhasebe mizan kodları
IsExtra, SirketId, IsActive, IsDeleted

8.3.9 Stok.Nakit — nakit kartı

Id, AnaBirimId (→ Sistem.Birimler), Kodu (USD, EUR, TL), Aciklama, SirketId, IsActive, IsDeleted, AlacakMizan, BorcMizan. Nakit kartı ile birim aynı şey değildir; AnaBirimId ile eşleşirler.

8.3.10 Stok.Takoz — takoz kartı

Kodu (hesaplanan: TK + 5 hane), HesapId (kimden geldi), SubeId, TakozTipi, AyarEviId, RaporNo, IsRapor, Miktar, CesniMiktar, AuMilyem/AgMilyem/PltMilyem/PldMilyem, AuHas/AgHas/PltHas/PldHas (hesaplanan), AuKur…, Maliyet (hesaplanan), XRFAuMilyem, XRFAgMilyem, SuMiktar, TkMiktar, ScalaNo/ScalaTarih/ScalaMiktar (tartı kaydı), CesniKodu/CesniHas/CesniGum (hesaplanan), OwnerId, IsDeleted. Raporsuz takozun has'ı bakiye raporlarında XRF milyemiyle, XRF 0 ise 0,600 varsayımıyla hesaplanır.

8.3.11 Stok.Hizmet — hizmet kartı

Id, Kodu, Aciklama, GrupKodu, Kategori, IsActive, IsDeleted, SirketId.

8.3.12 Sistem.Birimler — birimler

Alan Anlamı
Id, Kodu HAS = 1, TL = 5 (kurulumdan kuruluma değişebilir; koda göre join edin)
AnaBirim, AnaBirimId, Carpan Türev birimlerde ana birim ve çarpan; normalde kendisi ve 1
IsComputed, ComputedBirimId, ComputedCarpan Türev birim tanımı (nadiren kullanılır)
IsStatic 1 = bakiye sıfır olsa da listede görün
IsMetal Maden birimi
SiraNo Liste sırası
AlisFormul, SatisFormul Dış kur beslemesi sembolü
IsDeleted Pasif

Cari.BakiyeKodlari görünümü bu tabloya sanal "TAKOZ" birimini (Id −1) ekler; bakiye raporları bunu kullanır.

8.3.13 Sistem.Kurlar — günlük kur

Tarih, BirimId, Alis, Satis, UserId, LastModify, IsDeleted. Bir tarih-birim çifti için bir satır. Kur listesi: Sistem.GetKurListesi(@Tarih) (o tarihte satır yoksa sessizce son kura düşer). FN.GetKur(@BirimId) her zaman bugünün alış kurunu döner.

8.3.14 Sistem.DovizPanosu — pano

SubeId, BirimId, AlisFiyati, SatisFiyati, LastModify. Şube bazlı perakende fiyatı.

8.3.15 Sistem.Subeler — şube

Kodu, Aciklama, SirketId, BilancoBirimId, Sermaye, SermayeBirimId, SubeGrubu, SubeTuru, SubeTipi ('DOVIZ' / 'GENEL'), IsResmi, ResmiIslemLimitiTL, RsAktar, IsActive, IsLimitControl, RevCostDate, resmi kimlik alanları (Unvan, VergiDairesi, VergiNo, Adres, Sehir, Ilce, YetkiliMuesseseNo, TicaretSicilNo, RSBKodu), e-belge alanları (Entegrator, EntUserName, EntPassword, EntCustId, EBelgeTaslak, EBelgeTest, EBelgeTcknControl, EBelgeUsdLimit, EBelgeTlLimit), IsDeleted. Entegratör şifresi bu tabloda açık durur; raporlara asla çekilmez.

8.3.16 Sistem.Kasalar — kasa

Id, SirketId, SubeId, Kodu, Aciklama, ResmiKasa, IsDeleted. Rapor parametresi için kasa listesi: SELECT Id, Kodu FROM Sistem.Kasalar WHERE IsDeleted = 0 AND SubeId = @SubeId.

8.3.17 Sistem.Users, Sistem.UserGroup, Sistem.Login

Sistem.Users: Id, UserName, Password (raporlara çekilmez), Email, Gsm, IsActive, IsDeleted, PersonelId. Sistem.UserGroup: GroupName, Permission (yetki listesi metin olarak). Sistem.Login: oturum kayıtları (LoginId işlemde saklanır).

8.3.18 Sistem.Settings — genel ayarlar (tek satır)

Sembol alanları (HasSymbol, GumSymbol, PltSymbol, PldSymbol, UsdSymbol, EurSymbol), OnsCarpan, KurRefreshInterval, SilmeOnayi/SilGun, DuzeltmeOnayi/DuzeltmeGun, MutabakatLock, DuzeltmeAciklama, Provizyon, PesinKurTipi, IslemKurFarki, DFIslemTipi, FiyatKitle, TakvimKilidi, Numaralandirma, BSMV (2 = binde 2), BSMVTipi (0 = dahil), SMS/e-posta hesapları (şifreler raporlara çekilmez).

8.3.19 Sistem.SilAciklama, Sistem.SilOnay

SilAciklama: TransID (işlem), DeletedDescription (iptal/düzeltme gerekçesi), UserId, InsertDate. SilOnay: eski tarihli iptal talepleri (TransactionId, ClientUserId, Description, onay durumu).

8.3.20 Sistem.Vadeli — vadeli işlem kodları

Kodu, Symbol, LotSize, AnaBirimId, BirimId, FiyatTipi, Carpan, SiraNo, SubeId, IsActive, IsDeleted.

8.3.21 Kod tabloları ve kısaltma

Sistem.CariIslemKodu (Id, Islem, Kod), Sistem.CariIslemTuru (Id, IslemTuru, Kod, Yon), Sistem.CariIslemTipi (Id, IslemTipi, Kod). İşlem listesindeki kısaltma Sistem.GetIslemKodu(IslemKodu, IslemTuru, IslemTipi) = Kod(işlem) + Kod(tür) + Kod(tip):

İşlem → harf Tür → harf Tip → harf
TAKOZ T · MADEN M · HURDA H · NAKİT N · ÇEVİR C · HİZMET G · VADELİ V · TAŞ D · PIRLANTA P · MODEL R · GENEL S · VİRMAN V · FATURA F · EMTİA E · BORÇ İŞLEMLERİ/DEVİR B GİRİŞ G · ÇIKIŞ C · ALACAK A · BORÇ B · ALIŞ A · SATIŞ S NORMAL N · PEŞİN P · BEDELLİ B · İADE I · EMANET E · MİKTAR M · ALTIN A · GÜMÜŞ G · PLATİN P · PALADYUM D · PARİTE X · RESMİ R · (−1/−2 → boş)

Örnek: MGN = Maden Giriş Normal; HCP = Hurda Çıkış Peşin; NCN = Nakit Çıkış Normal; GGN = Hizmet Giriş Normal; CA = Çevir Alacak; VA = Vadeli Alış; VB = Virman Borç; TGN = Takoz Giriş Normal. ÇEŞNİ (14) kod tablosunda yoktur; kısaltması boş döner.

8.4 İlişki haritası

Sistem.Sirketler.Id
 └── Sistem.Subeler.SirketId
 ├── Sistem.Kasalar.SubeId
 │ └── Cari.Islemler.KasaId
 │ └── Stok.StokHaraketleri.KasaId
 └── Cari.Hesaplar.SubeId
 └── Cari.Islemler.HesapId
 └── Cari.BakiyeIslem.HesapId

Cari.Islemler.Id
 ├── Cari.BakiyeIslem.IslemId (−1 ise devir, kaynağı yok)
 ├── Stok.StokHaraketleri.IslemId (Bolum = 2 ise kaynağı Cari.Transferler)
 ├── Cari.IslemDetaylari.IslemId (fatura/e-belge)
 ├── Cari.History.TransactionId (değişiklik izi)
 ├── Sistem.SilAciklama.TransID (iptal/düzeltme gerekçesi)
 └── Cari.Islemler.VaryantId (arbitraj çifti: kendine referans)

Cari.Islemler.StokId → IslemKodu'na göre:
 0 → Stok.Takoz.Id
 1, 2 → Stok.Maden.Id
 3 → Stok.Nakit.Id
 4 → Sistem.Birimler.Id (stok değil, birim)
 5 → Stok.Hizmet.Id
 6 → Sistem.Vadeli.Id
 7 → Stok.Tas.Id
 8 → Stok.Pirlanta.Id
 9 → Stok.Model.Id
 10 → Stok.Genel.Id
 11 → Cari.Hesaplar.Id (karşı hesap)
 12 → fatura kaydı
 13 → Stok.Emtia.Id
 14 → sabit 1
 999 → 0

Cari.Islemler.BirimId → IslemTipi = 1 (PEŞİN) → Stok.Nakit.Id ; diğer → Sistem.Birimler.Id ; 0 → yok
Cari.Islemler.BakiyeId → Sistem.Birimler.Id (0 = mal bakiyesi üretmez)

Sistem.Birimler.Id
 ├── Sistem.Kurlar.BirimId
 ├── Sistem.DovizPanosu.BirimId
 ├── Stok.Maden.AnaBirimId / MaliyetBirimId
 ├── Stok.Nakit.AnaBirimId
 └── Cari.BakiyeIslem.BirimId

Join yazarken kural: Cari.Islemler I LEFT JOIN Stok.Maden M ON M.Id = I.StokId AND I.IslemKodu IN (1,2). Koşulsuz join yanlıştır.

8.5 Hazır fonksiyon ve görünümler

Nesne Parametre Ne döner / not
Sistem.GetIslemKodu(k, t, p) üç kod Kısaltma (MGN…)
Sistem.GetKurListesi(@Tarih) tarih BirimId, Birim, Alis, Satis; tarihte kur yoksa son kur
FN.GetKur(@BirimId) birim Bugünün alış kuru
FN.Bol(a, b) Korumalı bölme
FN.BakiyeDurum(x) 'ALACAK'/'BORÇ' etiketi
FN.GetCariLimit(@HesapId) Kalan limit (HAS)
Bakiye.GetBakiye(@HesapType, @HesapId, @IslemId) Ekrandaki bakiye kartı: BAKIYE, ALACAK, BORC, NET; @IslemId = 0 → bugüne kadar
Cari.GetNetBakiye(@HesapId) Net bakiye
Cari.GetTarihliBakiyeler(@HesapId, @T1, @T2) Tarih aralığı bakiyesi
Cari.HesapExtresi(@HesapId, @BasTarih) Ekrandaki hesap ekstresi (F4)
Cari.IslemListesi(@HesapType, @HesapId, @FisNo, @T1, @T2) Ekrandaki işlem listesi (0 - LİSTE)
Cari.HistoryListesi(@HesapType, @HesapId, @T1, @T2) / Cari.HistoryDetails(@TransactionId) İşlem geçmişi
Reports.IslemRaporu(@SubeId, @HesapId, @T1, @T2) @HesapId = 0 tümü Programdaki "İşlem Raporu"; RESMİ (11) hariç
Reports.IslemKontrolRaporu(...) aynı İşlem kontrol raporu
Reports.SilinmisIslemlerRaporu(@SubeId, @T1, @T2, @HesapId) İptal edilenler
Reports.DuzeltilmisIslemlerRaporu(@SubeId, @T1, @T2) Düzeltilenler + gerekçe
Reports.BakiyeListesi(@Tarih, @SubeId) / Report.BakiyeListesi(@SubeId, @Tarih) Bakiye ekstresi (birim sütunları pivot)
Cari.GetFullBakiye(@Tarih, @SubeId) Tüm hesapların bakiyesi
Stok.GetMadenStoklari(@SubeId, @KasaId, @Tarih, @IsVaryant) 0 = tümü Maden stok listesi
Stok.GetNakitStoklari(@SubeId, @KasaId, @Tarih) Nakit stok listesi
Stok.GetTakozStoklari(@SubeId, @KasaId, @Tarih) Takoz stoku
Stok.GetStokHaraketleri(@StokId, @T1, @T2) Stok kartı hareketleri
Reports.MadenStokExtresi / Reports.NakitStokExtresi(@SubeId, @StokId, @T1, @T2) Stok ekstreleri
Stok.GetMadenMaliyeti(@SubeId, @KasaId, @StokId, @Tarih, @Miktar) Maliyet (son giren ilk çıkar, en fazla 50 parti)
Stok.GetOrtMilyem(aynı) "Ortalama" milyem (aslında son giren ilk çıkar)
Bilanco.OzetBilanco(@SubeId, @Tarih) Özet bilanço (tarihin kuruyla)
Reports.MusteriCiroRaporu, Reports.MadenCiroRaporu, Reports.GetNakitGirisCikis, Reports.MasrafRaporu, Reports.VadeliBakiyeRaporu, Reports.EvrakKontrolRaporu, Reports.GetPozisyonDetay Diğer hazır raporlar; şablon olarak açıp inceleyin
Cari.BakiyeKodlari (görünüm) Birimler + sanal TAKOZ
Cari.AnaBakiyeIslem (görünüm) Bakiye defteri ana birime çevrilmiş
Cari.HesapListesi (görünüm) Programın hesap seçim listesi
Sistem.GetLastKur (görünüm) Son girilen kurlar

8.6 Rapor yazma rehberi

8.6.1 Programdaki raporlar nedir

ERPGOLD'daki her rapor bir tablo fonksiyonudur (table-valued function): parametre alan, tablo döndüren SQL nesnesi. Program SELECT * FROM Reports.XRaporu(@SubeId, @T1, @T2) cümlesini çalıştırır, dönen tabloyu ızgarada gösterir. Rapor yazmak = fonksiyonu yazmak + programa tanıtmak.

8.6.2 Şablon

CREATE FUNCTION Reports.OrnekRaporu (@SubeId int, @StartDate date, @EndDate date)
RETURNS TABLE
AS
RETURN
(
 SELECT
 I.Id,
 I.Tarih,
 H.HesapAdi,
 Sistem.GetIslemKodu(I.IslemKodu, I.IslemTuru, I.IslemTipi) AS Islem,
 I.Kodu,
 I.Adet,
 I.Miktar,
 I.AuMilyem AS Milyem,
 CONVERT(decimal(18,2), I.Miktar * I.AuMilyem) AS Has,
 I.Fiyat,
 CASE I.FiyatTipi WHEN 0 THEN 'A' WHEN 1 THEN 'M' WHEN 2 THEN 'O' WHEN 3 THEN 'H' END AS F,
 I.Tutar,
 I.Birim,
 I.Aciklama,
 K.Kodu AS Kasa,
 U.UserName AS Kullanici,
 I.InsertDate AS Kayit
 FROM Cari.Islemler I
 LEFT JOIN Cari.Hesaplar H ON H.Id = I.HesapId
 LEFT JOIN Sistem.Kasalar K ON K.Id = I.KasaId
 LEFT JOIN Sistem.Users U ON U.Id = I.UserId
 WHERE I.IsDeleted = 0
 AND I.HesapType = 0
 AND I.SubeId = @SubeId
 AND I.Tarih BETWEEN @StartDate AND @EndDate
)

Değiştirmek için CREATE yerine ALTER yazılır. Fonksiyon, SSMS'te Databases → ERPGOLDV2 → Programmability → Functions → Table-valued Functions altında görünür; sağ tık → Modify ile kaynağı açılır.

8.6.3 Uyulacak kurallar

  1. WHERE I.IsDeleted = 0 — her zaman.
  2. I.HesapType = 0 — transfer/provizyon satırlarını dışarıda bırakır.
  3. @SubeId parametresi ilk sırada; program bunu otomatik doldurur, kullanıcıya sormaz.
  4. Tarih parametreleri date tipinde; BETWEEN kullanın. InsertDate datetime'dır, gün karşılaştırması için CONVERT(date, I.InsertDate).
  5. Kısaltma için Sistem.GetIslemKodu, has için CONVERT(decimal(18,2), Miktar * AuMilyem).
  6. Bölme için FN.Bol.
  7. Stok kartına join yalnız uygun IslemKodu şartıyla.
  8. Bakiye sunarken Bakiye * -1; eksi → ALACAK, artı → BORÇ.
  9. Resmi işlemleri ayırmak gerekiyorsa IslemTipi = 11 / <> 11.
  10. Sütun adlarına Türkçe karakter konabilir (Kullanıcı) ama parametre adlarına konmaz.
  11. TOP kullanılıyorsa ORDER BY da yazın; aksi halde sıra rastgeledir.
  12. Yeni SQL komutları (STRING_AGG, FORMAT, IIF bazı sürümlerde) uyumluluk düzeyi 100'de çalışmaz.
  13. Fonksiyon yalnız okur; içinde INSERT/UPDATE olamaz.
  14. Test: SELECT * FROM Reports.OrnekRaporu(1, '2026-01-01', '2026-01-31'). Sonuç ile programdaki İşlem Raporu'nu aynı parametrelerle karşılaştırın.

8.6.4 Çözümlü örnekler

Örnek 1 — Günlük kasa raporu (bir kasada bugün ne girdi ne çıktı).

CREATE FUNCTION Reports.GunlukKasaRaporu (@SubeId int, @KasaId int, @Tarih date)
RETURNS TABLE AS RETURN
(
 SELECT
 Sistem.GetIslemKodu(I.IslemKodu, I.IslemTuru, I.IslemTipi) AS Islem,
 H.HesapAdi,
 I.Kodu,
 I.SMiktar AS IsaretliMiktar,
 I.SHas AS IsaretliHas,
 CASE WHEN I.Yon = '+' THEN I.Tutar ELSE -I.Tutar END AS IsaretliTutar,
 I.Birim,
 I.FisNo,
 I.InsertDate AS Saat,
 U.UserName AS Kullanici
 FROM Cari.Islemler I
 LEFT JOIN Cari.Hesaplar H ON H.Id = I.HesapId
 LEFT JOIN Sistem.Users U ON U.Id = I.UserId
 WHERE I.IsDeleted = 0 AND I.HesapType = 0
 AND I.SubeId = @SubeId
 AND (I.KasaId = @KasaId OR @KasaId = 0)
 AND I.Tarih = @Tarih
)

Örnek 2 — Müşteri bazında aylık HAS hareketi (giriş, çıkış, net).

CREATE FUNCTION Reports.MusteriHasHareketi (@SubeId int, @StartDate date, @EndDate date)
RETURNS TABLE AS RETURN
(
 SELECT
 H.HesapAdi,
 H.GrupKodu,
 SUM(CASE WHEN I.IslemTuru % 2 = 0 THEN I.Miktar * I.AuMilyem ELSE 0 END) AS GirisHas,
 SUM(CASE WHEN I.IslemTuru % 2 = 1 THEN I.Miktar * I.AuMilyem ELSE 0 END) AS CikisHas,
 SUM(I.SHas) AS NetHas,
 COUNT(*) AS IslemSayisi
 FROM Cari.Islemler I
 LEFT JOIN Cari.Hesaplar H ON H.Id = I.HesapId
 WHERE I.IsDeleted = 0 AND I.HesapType = 0
 AND I.SubeId = @SubeId
 AND I.IslemKodu IN (1, 2) -- yalnız maden ve hurda
 AND I.IslemTipi IN (0, 1) -- normal ve peşin
 AND I.Tarih BETWEEN @StartDate AND @EndDate
 GROUP BY H.HesapAdi, H.GrupKodu
)

Örnek 3 — Bir hesabın birim bazında bakiyesi, tarih itibarıyla (bakiye kartının sade hâli).

CREATE FUNCTION Reports.HesapBakiyeTarihli (@HesapId int, @Tarih date)
RETURNS TABLE AS RETURN
(
 SELECT
 Brm.Kodu AS Birim,
 CASE WHEN SUM(B.Bakiye) < 0 THEN ABS(SUM(B.Bakiye)) END AS Alacak,
 CASE WHEN SUM(B.Bakiye) > 0 THEN SUM(B.Bakiye) END AS Borc,
 CONVERT(decimal(18,2), SUM(B.Bakiye) * -1 * ISNULL(K.Alis, 0)) AS NetKarsilik
 FROM Cari.BakiyeIslem B
 LEFT JOIN Sistem.Birimler Brm ON Brm.Id = B.BirimId
 LEFT JOIN Sistem.GetKurListesi(@Tarih) K ON K.BirimId = B.BirimId
 WHERE B.HesapType = 0 AND B.HesapId = @HesapId AND B.Tarih <= @Tarih
 GROUP BY Brm.Kodu, K.Alis
 HAVING SUM(B.Bakiye) <> 0
)

Örnek 4 — Maden stok son durumu (kasa bazında, tarih itibarıyla), maden kartı bilgisiyle.

CREATE FUNCTION Reports.MadenStokSonDurum (@SubeId int, @KasaId int, @Tarih date)
RETURNS TABLE AS RETURN
(
 SELECT
 K.Kodu AS Kasa,
 M.Kodu AS StokKodu,
 M.Aciklama,
 M.GrupKodu,
 SUM(S.Adet) AS Adet,
 SUM(S.Miktar) AS Miktar,
 SUM(S.Has) AS Has,
 FN.Bol(SUM(S.Has), SUM(S.Miktar)) AS OrtMilyem
 FROM Stok.StokHaraketleri S
 LEFT JOIN Stok.Maden M ON M.Id = S.StokId
 LEFT JOIN Sistem.Kasalar K ON K.Id = S.KasaId
 WHERE S.StokTipi = 1
 AND S.SubeId = @SubeId
 AND (S.KasaId = @KasaId OR @KasaId = 0)
 AND S.Tarih <= @Tarih
 GROUP BY K.Kodu, M.Kodu, M.Aciklama, M.GrupKodu
 HAVING SUM(S.Miktar) <> 0
)

Örnek 5 — Düzeltilmiş ve iptal edilmiş işlemler, kim/ne zaman/gerekçe.

CREATE FUNCTION Reports.DegisiklikIzi (@SubeId int, @StartDate date, @EndDate date)
RETURNS TABLE AS RETURN
(
 SELECT
 Hs.TransactionId AS IslemNo,
 Hs.LogType AS KayitTipi,
 Hs.LogDate AS Zaman,
 H.HesapAdi,
 Sistem.GetIslemKodu(Hs.IslemKodu, Hs.IslemTuru, Hs.IslemTipi) AS Islem,
 Hs.Kodu, Hs.Miktar, Hs.Fiyat, Hs.Tutar, Hs.Birim,
 U.UserName AS Kullanici,
 SA.DeletedDescription AS Gerekce
 FROM Cari.History Hs
 LEFT JOIN Cari.Hesaplar H ON H.Id = Hs.HesapId
 LEFT JOIN Sistem.Users U ON U.Id = Hs.UserId
 LEFT JOIN Sistem.Kasalar K ON K.Id = Hs.KasaId
 LEFT JOIN Sistem.SilAciklama SA ON SA.TransID = Hs.TransactionId AND SA.UserId = Hs.UserId
 WHERE K.SubeId = @SubeId
 AND Hs.LogType <> 'Yeni Kayıt'
 AND CONVERT(date, Hs.LogDate) BETWEEN @StartDate AND @EndDate
)

Örnek 6 — Kur listesi kontrolü (hangi gün hangi birimin kuru girilmemiş).

CREATE FUNCTION Reports.EksikKurGunleri (@StartDate date, @EndDate date)
RETURNS TABLE AS RETURN
(
 SELECT DISTINCT
 I.Tarih,
 Brm.Kodu AS Birim
 FROM Cari.Islemler I
 CROSS JOIN Sistem.Birimler Brm
 WHERE I.IsDeleted = 0
 AND I.Tarih BETWEEN @StartDate AND @EndDate
 AND Brm.IsDeleted = 0 AND Brm.IsStatic = 1
 AND NOT EXISTS (SELECT 1 FROM Sistem.Kurlar Ku
 WHERE Ku.Tarih = I.Tarih AND Ku.BirimId = Brm.Id AND Ku.IsDeleted = 0)
)

8.6.5 Raporu programa tanıtma (Aifa Developer Studio)

  1. Programa ADMIN ile girin. Üst şeritten Aifa Developer StudioReport Designer.
  2. Report List ekranı tüm raporları (Id, Create Date, Report Name, Developer) gösterir. Yeni rapor için mavi artı; var olanı düzenlemek için seçip yeşil düğme.
  3. SQL Query sekmesine sorguyu yazın: Select * from Reports.GunlukKasaRaporu(@SubeId,@KasaId,@Tarih). Parametreler fonksiyondaki sırayla, veri tipi yazılmadan.
  4. F5: parametre değerleri sorulur, List View sekmesinde sonuç görünür. Müşterinin göreceği ekran budur.
  5. Report Properties: CreatedDate, ReportName, Developer, IsGrid = True.
  6. Report Layout: artı ile bir görünüm adı ekleyin; düzenlemeler bu görünüme kaydedilir (görünüm seçili → yeşil düğme). Birden fazla görünüm olabilir.
  7. Filter Fields: her parametre için artı → Field Name (@ olmadan), Caption (kullanıcının göreceği ad), Control Type (tarih, sayı, metin, Lookup). Lookup seçilirse SQL / Display Member / Value Member açılır; kasa seçimi için: Select Id,Kodu from Sistem.Kasalar Where IsDeleted=0 and SubeId=@SubeId — Display Member Kodu, Value Member Id. @SubeId için filtre tanımlanmaz, program otomatik verir.
  8. Görünüm düzeni: Properties → GridControl → GridView → Appearance; Header Panel → Font → Bold; sütun başlığına sağ tık → Best Fit (all columns); istenmeyen sütunu aşağı sürükleyip kaldırın; sayı biçimi için sütuna çift tık → Miktar n2, Milyem n5, Has n2.
  9. Gruplama: sütun başlığına sağ tık → Group By This Column; grupların açık gelmesi için GridView → OptionsBehavior → AutoExpandAllGroups = True; gruplanan sütunun görünmesi için OptionsView → ShowGroupedColumns = True.
  10. Toplam: alttaki sigma → sütunun altına sağ tık → Sum. Grup altı toplam: OptionsView → GroupFooterShowMode = VisibleAlways; grup başlığında toplam: Add Summary'de üye numarası alınıp GroupFormat'a {1}{2} gibi eklenir.
  11. Koşullu renk: Conditions Editor → artı → Fields'tan sütun çift tık → Islem = 'MCN' → OK; BackColor, ForeColor, Font, Column (boşsa tüm satır).
  12. Kaydet: görünüm seçili → yeşil düğme. Programdan çıkıp girin; rapor Raporlar sekmesinde görünür.

Var olan rapora sütun ekleme: SSMS'te fonksiyonu ALTER ile değiştirip yeni sütunu SELECT'e ekleyin (örneğin H.TCNo, H.VergiNo, H.PassaportNo) → Report Designer'da raporu açın → Field List sekmesinde artı → Pivot Grid Field ekranında FieldName (sorgudaki adla birebir) ve Caption → KAYDET → List View'da sütun başlığına sağ tık → Column Chooser → yeni sütunu ızgaraya sürükleyin → görünümü seçip yeşil düğmeyle kaydedin → programdan çıkıp girin.

8.6.6 Rapor yazarken sık yapılan hatalar

Belirti Sebep Çözüm
Rakamlar programdakinden büyük IsDeleted = 0 yok; iptal edilenler toplandı Şartı ekleyin
Nakit satırlarında maden kodu görünüyor StokId koşulsuz join AND IslemKodu IN (…)
"Divide by zero" Düz bölme FN.Bol
Toplam sütunu 0 O günün kuru yok Kur girişi / KOPYALA; raporda ISNULL(K.Alis, 0) yerine son kur
Aynı birim iki satır Sistem.Birimler'de çift kod Fazla kaydın kodunu değiştirin
Zaman aşımı Büyük tarih aralığı, indeks dışı şart (YEAR(Tarih) = …) Tarih BETWEEN, gerekli şartları öne alın; eski bakiye ekstresi için destek dokümanındaki hızlandırılmış sürüm
"Invalid column name" Sütun adı yanlış / uyumluluk 100'de olmayan komut Adı kontrol; CONVERT/CASE kullanın
Rapor programda parametre sormuyor Filter Fields tanımlanmadı Her parametre için filtre ekleyin (@SubeId hariç)
Sütun eklendi ama görünmüyor Field List'e tanım + Column Chooser'dan sürükleme yapılmadı 8.6.5 sonundaki adımlar
Bakiye yönü ters Bakiye işaretini çevirmeden sundunuz * -1; eksi → ALACAK
Geçmiş tarihli rapor bugünkü kurla çıkıyor GETDATE kullanıldı Sistem.GetKurListesi(@Tarih) veya işlem satırındaki HasKur
Transfer satırları raporda HesapType/Bolum süzülmedi HesapType = 0 / Bolum = 0

8.6.7 Güvenlik ve bakım notları

  • Raporlara Sistem.Users.Password, Sistem.Subeler.EntPassword, Sistem.Settings SMS/e-posta şifreleri asla çekilmez.
  • Üretimde UPDATE/DELETE yalnız dokümante edilmiş durumlarda: bilanço kaydı silme (DELETE FROM Bilanco.Bilancolar WHERE Tarih = '…'), çift birim kodu düzeltme, vadeli kod sırası (UPDATE Sistem.Vadeli SET SiraNo = …). Öncesinde yedek alınır.
  • Repair.BalanceRepair çalıştırılmaz.
  • SSMS oturumu iş bitince kapatılır; müşteri sunucusunda açık bırakılmaz.
  • Cari.BakiyeIslem ve Stok.StokHaraketleri elle değiştirilmez; bir işlemin türetilmiş satırlarını yenilemek gerekiyorsa işlem programdan düzeltilip kaydedilir (kural yeniden üretir).