Mikro ERP Kapanmamış Cari Hareketler: Açık Bakiye Neden Sıfırlanmadı?
Mikro ERP'de cari bakiye neden sıfırlanmıyor? Kapanmamış borç/alacak hareketlerini bulma, borç-alacak eşleme tablosu analizi ve açık kalan evrakları...
Sorun: “Ödeme Yaptık Ama Bakiye Hâlâ Açık Görünüyor”
Müşteri ödeme yaptı, makbuz kesildi — ama Mikro’da bakiye hâlâ sıfırlanmadı. Bu sorun ERP kullanan firmaların en sık karşılaştığı problemdir.
Sebebi genellikle şudur: Borç ve alacak hareketleri birbirine eşlenmemiş (kapatılmamış). Mikro’da bir tahsilat makbuzu kestiğinizde, o tahsilatın hangi faturayı kapadığı CARI_HAREKET_BORC_ALACAK_ESLEME tablosunda tutulur. Bu eşleme yapılmadıysa, ERP borcu açık olarak gösterir.
Hangi Tabloları Kullanacağız?
| Tablo | Açıklama | Rolü |
|---|---|---|
CARI_HESAP_HAREKETLERI | Tüm borç/alacak hareketleri | Borçlu evrakları bulmak |
CARI_HAREKET_BORC_ALACAK_ESLEME | Kapama eşleştirmeleri | Hangi ödeme hangi borcu kapadı |
Kritik alanlar:
| Alan | Tablo | Açıklama |
|---|---|---|
cha_Guid | CARI_HESAP_HAREKETLERI | Her hareketin benzersiz ID’si |
cha_tpoz | CARI_HESAP_HAREKETLERI | 0=Açık, 1=Kapalı |
chk_Borc_uid | CARI_HAREKET_BORC_ALACAK_ESLEME | Kapatılan borç kaydının UID’si |
chk_Alc_uid | CARI_HAREKET_BORC_ALACAK_ESLEME | Kapatılan alacak kaydının UID’si |
chk_Tutar | CARI_HAREKET_BORC_ALACAK_ESLEME | Kapatma tutarı |
Kaynak: CARI_HAREKET_BORC_ALACAK_ESLEME · CARI_HESAP_HAREKETLERI
Adım 1: Açık Kalan Borç Hareketlerini Bulma
Bakiyesi kapanmamış (pozisyonu açık) tüm borç hareketlerini listeleyen sorgu:
SELECT
cha_kod AS [Cari Kodu],
CONVERT(VARCHAR(10), cha_tarihi, 104) AS [Tarih],
CASE cha_evrak_tip
WHEN 63 THEN 'Satis Faturasi'
WHEN 0 THEN 'Alis Faturasi'
WHEN 31 THEN 'Borc Dekontu'
WHEN 29 THEN 'Acilis Fisi'
ELSE 'Tip: ' + CAST(cha_evrak_tip AS VARCHAR)
END AS [Evrak Tipi],
cha_evrakno_seri + '-' +
CAST(cha_evrakno_sira AS VARCHAR) AS [Evrak No],
cha_belge_no AS [Belge No],
cha_meblag AS [Tutar],
cha_vade AS [Vade],
DATEDIFF(DAY,
CASE
WHEN cha_vade = 0 THEN cha_tarihi
WHEN cha_vade BETWEEN 1 AND 3650
THEN DATEADD(DAY, cha_vade, cha_tarihi)
WHEN cha_vade BETWEEN 19000101 AND 20991231
THEN TRY_CONVERT(datetime, CONVERT(char(8), cha_vade), 112)
ELSE cha_tarihi
END, GETDATE()) AS [Geciken Gun]
FROM CARI_HESAP_HAREKETLERI WITH (NOLOCK)
WHERE cha_tip = 0 -- Borc hareketleri
AND cha_tpoz = 0 -- Pozisyonu: Acik
AND cha_iptal = 0 -- Iptal olmayanlar
AND cha_kod = '120.001' -- Cari kodu (isletmenize gore degistirin)
ORDER BY cha_tarihi;
cha_tpoz = 0: Bu alan Mikro’nun kendi kapama mekanizmasıyla güncellenir. 0 = Açık, 1 = Kapalı.
Adım 2: Bir Evrağın Kapama Detayını Görme
Belirli bir faturanın hangi ödemelerle ne kadar kapatıldığını görmek için:
-- Faturanın Guid'ini bul
DECLARE @FaturaGuid UNIQUEIDENTIFIER;
SELECT @FaturaGuid = cha_Guid
FROM CARI_HESAP_HAREKETLERI WITH (NOLOCK)
WHERE cha_kod = '120.001'
AND cha_evrakno_seri = 'B'
AND cha_evrakno_sira = 4521;
-- Bu faturayı kapatan ödemeleri getir
SELECT
'Fatura → Ödeme' AS [Yön],
E.chk_Tutar AS [Kapatılan Tutar],
CONVERT(VARCHAR(10), O.cha_tarihi, 104) AS [Ödeme Tarihi],
CASE O.cha_evrak_tip
WHEN 1 THEN 'Tahsilat Makbuzu'
WHEN 2 THEN 'Kasa Tahsilat'
WHEN 4 THEN 'Çek Giriş'
WHEN 34 THEN 'Gelen Havale'
ELSE 'Tip: ' + CAST(O.cha_evrak_tip AS VARCHAR)
END AS [Ödeme Tipi],
O.cha_evrakno_seri + '-' +
CAST(O.cha_evrakno_sira AS VARCHAR) AS [Ödeme Evrak No]
FROM CARI_HAREKET_BORC_ALACAK_ESLEME E WITH (NOLOCK)
INNER JOIN CARI_HESAP_HAREKETLERI O WITH (NOLOCK)
ON E.chk_Alc_uid = O.cha_Guid
WHERE E.chk_Borc_uid = @FaturaGuid
AND E.chk_iptal = 0
ORDER BY O.cha_tarihi;
Çıktı:
Yön │ Kapatılan Tutar │ Ödeme Tarihi │ Ödeme Tipi │ Ödeme Evrak No
─────────────────┼─────────────────┼──────────────┼───────────────────┼───────────────
Fatura → Ödeme │ 5.000,00 │ 20.01.2026 │ Tahsilat Makbuzu │ C-102
Fatura → Ödeme │ 3.500,00 │ 05.02.2026 │ Çek Giriş │ D-45
Fatura tutarı 8.500 TL ise ve toplam kapatılan 8.500 TL ise fatura tam kapanmıştır. Fark varsa kısmi kapama söz konusudur.
Adım 3: Tüm Carilerin Açık Bakiye Özeti
Hangi müşterinin ne kadar açık borcu var, kaç evrak açık kalmış:
SELECT
H.cha_kod AS [Cari Kodu],
C.cari_unvan1 AS [Unvan],
COUNT(*) AS [Acik Evrak Sayisi],
SUM(H.cha_meblag) AS [Toplam Acik Borc],
MIN(H.cha_tarihi) AS [En Eski Evrak],
MAX(DATEDIFF(DAY,
CASE
WHEN H.cha_vade = 0 THEN H.cha_tarihi
WHEN H.cha_vade BETWEEN 1 AND 3650
THEN DATEADD(DAY, H.cha_vade, H.cha_tarihi)
WHEN H.cha_vade BETWEEN 19000101 AND 20991231
THEN TRY_CONVERT(datetime, CONVERT(char(8), H.cha_vade), 112)
ELSE H.cha_tarihi
END, GETDATE())) AS [Max Geciken Gun]
FROM CARI_HESAP_HAREKETLERI H WITH (NOLOCK)
INNER JOIN CARI_HESAPLAR C WITH (NOLOCK) ON H.cha_kod = C.cari_kod
WHERE H.cha_tip = 0 -- Borc
AND H.cha_tpoz = 0 -- Acik
AND H.cha_iptal = 0
GROUP BY H.cha_kod, C.cari_unvan1
HAVING SUM(H.cha_meblag) > 0
ORDER BY [Toplam Acik Borc] DESC;
Neden Farklı Çıkabilir?
- Mikro sürüm farkı: Eski Mikro sürümlerinde
cha_tpozalanı güncellenmeyebilir. Bu durumda kapama tablosundan kontrol yapılması gerekir. - Manuel kapama yapılmadı: Tahsilat kesildi ama “Borç/Alacak Eşleştirme” menüsünden bağlanmadı.
- Kısmi kapama: Faturanın bir kısmı ödendi, geri kalanı hâlâ açık.
- Kur farkı: Dövizli hareketlerde kur farkından kaynaklanan küçük tutarlar açık kalabilir.
İlgili Yazılar
- Cari Ekstre Raporu — Borç/alacak listesi ve bakiye
- Cari Yaşlandırma SQL Sorgusu — Vadesi geçen bakiye analizi
- Belge No ile Hareket Bulma
Bu rehber Mikro ERP API Docs tablo yapısına dayanarak hazırlanmıştır.