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
- 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,IslemIdadlarıyla gelenek olarak kurulur. Veritabanı sizi yanlış join'den korumaz. Yalnız yeni KYC şeması düzgün ilişkilidir. - Silme yoktur, işaretleme vardır. Neredeyse her tabloda
IsDeletedalanı vardır. İptal edilen işlem, silinen kasa, pasife alınan hesap tabloda durur. Her sorguyaIsDeleted = 0şartı koymayı unutan rapor, iptal edilmiş işlemleri toplar. Bu, en sık yapılan rapor hatasıdır. Cari.Islemlertek 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.StokIdçok anlamlıdır. Hangi tabloya işaret ettiğiIslemKodu'na bağlıdır (8.4).Cari.Islemler'iStokIdüzerinden koşulsuzStok.Maden'e bağlayan rapor, nakit satırlarını maden kartlarıyla eşleştirir ve sessizce yanlış sonuç verir.BirimIdde çok anlamlıdır. İşlem tipi PEŞİN iseStok.Nakit.Id, diğerlerindeSistem.Birimler.Id; 0 ise "para tarafı yok".- İş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 sunarkenBakiye * -1yapar.Stok.StokHaraketleri.Miktar: giriş artı, çıkış eksi. - 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. - Kur fotoğrafı işlem satırındadır.
HasKur,GumKur,PltKur,PldKur,UsdKur,EurKur,BirimKurişlem anındaki alış kurlarıdır. "İşlem günkü kur" gereken raporda bunlar, "bugünkü kur" gereken rapordaSistem.GetKurListesi(GETDATE)kullanılır. - 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. - Veritabanı uyumluluk düzeyi 100'dür (SQL Server 2008 modu).
STRING_AGG,FORMAT,TRY_CONVERTgibi yeni komutlar çalışmaz;FOR XML PATH+STUFF,CONVERT,CASEkullanı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
WHERE I.IsDeleted = 0— her zaman.I.HesapType = 0— transfer/provizyon satırlarını dışarıda bırakır.@SubeIdparametresi ilk sırada; program bunu otomatik doldurur, kullanıcıya sormaz.- Tarih parametreleri
datetipinde;BETWEENkullanın.InsertDatedatetime'dır, gün karşılaştırması içinCONVERT(date, I.InsertDate). - Kısaltma için
Sistem.GetIslemKodu, has içinCONVERT(decimal(18,2), Miktar * AuMilyem). - Bölme için
FN.Bol. - Stok kartına join yalnız uygun
IslemKoduşartıyla. - Bakiye sunarken
Bakiye * -1; eksi → ALACAK, artı → BORÇ. - Resmi işlemleri ayırmak gerekiyorsa
IslemTipi = 11/<> 11. - Sütun adlarına Türkçe karakter konabilir (
Kullanıcı) ama parametre adlarına konmaz. TOPkullanılıyorsaORDER BYda yazın; aksi halde sıra rastgeledir.- Yeni SQL komutları (STRING_AGG, FORMAT, IIF bazı sürümlerde) uyumluluk düzeyi 100'de çalışmaz.
- Fonksiyon yalnız okur; içinde INSERT/UPDATE olamaz.
- 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)
- Programa ADMIN ile girin. Üst şeritten Aifa Developer Studio → Report Designer.
- 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.
- SQL Query sekmesine sorguyu yazın:
Select * from Reports.GunlukKasaRaporu(@SubeId,@KasaId,@Tarih). Parametreler fonksiyondaki sırayla, veri tipi yazılmadan. - F5: parametre değerleri sorulur, List View sekmesinde sonuç görünür. Müşterinin göreceği ekran budur.
- Report Properties: CreatedDate, ReportName, Developer, IsGrid = True.
- 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.
- 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 MemberKodu, Value MemberId. @SubeId için filtre tanımlanmaz, program otomatik verir. - 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, Milyemn5, Hasn2. - 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.
- 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. - 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). - 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.SettingsSMS/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.BakiyeIslemveStok.StokHaraketlerielle değiştirilmez; bir işlemin türetilmiş satırlarını yenilemek gerekiyorsa işlem programdan düzeltilip kaydedilir (kural yeniden üretir).
