---
title: "Mikro ERP Kapanmamış Cari Hareketler: Açık Bakiye Neden Sıfırlanmadı?"
description: "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ı..."
date: 2026-04-14
category: mikro-erp
tags: ["mikro-erp", "sql-server", "cari-hesap", "borc-alacak", "kapama", "esleme"]
url: https://mikroerp.dev/blog/mikro-erp-kapanmamis-cari-hareket-sql/
---

## 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](https://apidocs.mikro.com.tr/tablo-alan-adlari/cari_hareket_borc_alacak_esleme) · [CARI_HESAP_HAREKETLERI](https://apidocs.mikro.com.tr/tablo-alan-adlari/cari_hesap_hareketleri)

## Adım 1: Açık Kalan Borç Hareketlerini Bulma

Bakiyesi kapanmamış (pozisyonu açık) tüm borç hareketlerini listeleyen sorgu:

```sql
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:

```sql
-- 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ış:

```sql
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?

1. **Mikro sürüm farkı**: Eski Mikro sürümlerinde `cha_tpoz` alanı güncellenmeyebilir. Bu durumda kapama tablosundan kontrol yapılması gerekir.
2. **Manuel kapama yapılmadı**: Tahsilat kesildi ama "Borç/Alacak Eşleştirme" menüsünden bağlanmadı.
3. **Kısmi kapama**: Faturanın bir kısmı ödendi, geri kalanı hâlâ açık.
4. **Kur farkı**: Dövizli hareketlerde kur farkından kaynaklanan küçük tutarlar açık kalabilir.

## İlgili Yazılar

- [Cari Ekstre Raporu](/blog/mikro-erp-cari-ekstre-raporu-sql/) — Borç/alacak listesi ve bakiye
- [Cari Yaşlandırma SQL Sorgusu](/blog/mikro-erp-cari-yaslandirma-sql-sorgusu/) — Vadesi geçen bakiye analizi
- [Belge No ile Hareket Bulma](/blog/mikro-erp-belge-no-cari-hareket-bulma-sql/)

---

*Bu rehber [Mikro ERP API Docs](https://apidocs.mikro.com.tr/tablo-alan-adlari/cari_hareket_borc_alacak_esleme) tablo yapısına dayanarak hazırlanmıştır.*