Mikro ERP fn_ Fonksiyonlarını Farklı Şube Veritabanlarına Kopyalama

Mikro ERP güncellendikten sonra bazı şubelerde fn_Aysm fonksiyonları eksik mi? Fonksiyonları kontrol etme, kopyalama ve doğrulama adımları.

Sorun: Bazı Şubelerde Raporlar Çalışmıyor

Mikro ERP’de fn_Aysm adlı fonksiyonlar cari yaşlandırma ve bakiye hesaplama için kullanılır. Sorun şu: Mikro güncellenirken bu fonksiyonlar bazen sadece bazı veritabanlarına ekleniyor.

Merkez DB  → fn_Aysm_v2_BakiyeHesapla ✅ var
Adana DB   → fn_Aysm_v2_BakiyeHesapla ❌ YOK!
Antalya DB → fn_Aysm_v2_BakiyeHesapla ✅ var
Bursa DB   → fn_Aysm_v2_BakiyeHesapla ❌ YOK!

Sonuç: Yaşlandırma sorgusunu çalıştırdığınızda bazı şubelerde Invalid object name 'dbo.fn_Aysm_v2_BakiyeHesapla' hatası alırsınız.

Adım 1: Hangi Şubelerde Eksik?

Tüm veritabanlarını tarayıp fonksiyonun nerede var, nerede yok kontrol edin:

DECLARE @sql NVARCHAR(MAX) = '';

SELECT @sql = @sql + '
SELECT ''' + name + ''' AS db_name,
  CASE WHEN EXISTS(
    SELECT 1 FROM [' + name + '].sys.objects 
    WHERE name = ''fn_Aysm_v2_BakiyeHesapla'' AND type = ''FN''
  ) THEN ''✅ MEVCUT'' ELSE ''❌ EKSİK'' END AS durum
UNION ALL'
FROM sys.databases
WHERE name LIKE 'MikroDB%' AND state = 0;

SET @sql = LEFT(@sql, LEN(@sql) - 10);
EXEC sp_executesql @sql;

Çıktı:

db_name        | durum
-------------- | ----------
MikroDB_Merkez | ✅ MEVCUT
MikroDB_Adana  | ❌ EKSİK
MikroDB_Bursa  | ❌ EKSİK

Adım 2: Fonksiyonun Kaynak Kodunu Çıkarma

Fonksiyonun var olduğu bir veritabanından kodunu alın:

USE [MikroDB_Merkez];

-- Fonksiyonun tam kodunu göster
SELECT m.definition
FROM sys.sql_modules m
JOIN sys.objects o ON m.object_id = o.object_id
WHERE o.name = 'fn_Aysm_v2_BakiyeHesapla';

💡 İpucu: sp_helptext yerine sys.sql_modules kullanın — tek parçada tam kodu döndürür, satır kesme sorunu olmaz.

Adım 3: Eksik Şubelere Kopyalama

Tek Şubeye Elle Kopyalama

  1. Kaynak veritabanında fonksiyonu sağ tık → Script Function as → CREATE To
  2. Hedef veritabanını seçin
  3. CREATE FUNCTION yerine CREATE OR ALTER FUNCTION kullanın (SQL Server 2016+)
USE [MikroDB_Adana];
GO

CREATE OR ALTER FUNCTION [dbo].[fn_Aysm_v2_BakiyeHesapla]
(
    @CariKod VARCHAR(50),
    @BaslangicTarihi DATETIME,
    @BitisTarihi DATETIME
)
RETURNS DECIMAL(18,2)
AS
BEGIN
    -- Fonksiyon gövdesi kaynak DB'den kopyalanır
    DECLARE @Bakiye DECIMAL(18,2) = 0;
    -- ...
    RETURN ISNULL(@Bakiye, 0);
END;
GO

Tüm Şubelere Otomatik Kopyalama

Birden fazla şubeye tek seferde kopyalamak için:

-- Fonksiyon tanımını kaynak DB'den al
DECLARE @fnDefinition NVARCHAR(MAX);

SELECT @fnDefinition = m.definition
FROM [MikroDB_Merkez].sys.sql_modules m
JOIN [MikroDB_Merkez].sys.objects o ON m.object_id = o.object_id
WHERE o.name = 'fn_Aysm_v2_BakiyeHesapla';

-- CREATE → CREATE OR ALTER dönüşümü
SET @fnDefinition = REPLACE(@fnDefinition, 
    'CREATE FUNCTION', 'CREATE OR ALTER FUNCTION');

-- Tüm hedef veritabanlarını döngüle
DECLARE @dbName NVARCHAR(128);
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE name LIKE 'MikroDB%' AND name != 'MikroDB_Merkez' AND state = 0;

OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @dbName;

WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRY
        EXEC('USE [' + @dbName + ']; EXEC sp_executesql N''' 
             + REPLACE(@fnDefinition, '''', '''''') + '''');
        PRINT 'OK: ' + @dbName;
    END TRY
    BEGIN CATCH
        PRINT 'HATA: ' + @dbName + ' - ' + ERROR_MESSAGE();
    END CATCH
    FETCH NEXT FROM db_cursor INTO @dbName;
END;

CLOSE db_cursor;
DEALLOCATE db_cursor;

Adım 4: Doğrulama

Kopyalama sonrası tüm şubelerde fonksiyonun çalıştığını kontrol edin — Adım 1’deki sorguyu tekrar çalıştırın. Tüm şubeler ”✅ MEVCUT” göstermeli.

Sık Karşılaşılan Hatalar

Bağımlı Fonksiyonlar

Fonksiyon başka bir fonksiyon veya view’a bağımlı olabilir. Bağımlılıkları kontrol edin:

SELECT referenced_entity_name
FROM sys.dm_sql_referenced_entities('dbo.fn_Aysm_v2_BakiyeHesapla', 'OBJECT');

Farklı Mikro Versiyonları

Farklı şubelerde farklı Mikro versiyonları çalışıyorsa, tablo yapıları farklı olabilir. Fonksiyon bir sütuna referans veriyorsa ve o sütun hedef DB’de yoksa hata alırsınız.

Ne Zaman Yapmalısınız?

DurumAksiyon
Mikro güncellendikten sonraTüm şubelerde fonksiyonları kontrol edin
Yeni şube eklediğinizdeTüm fn_ fonksiyonlarını kopyalayın
Yaşlandırma hata verirseİlk kontrol: fonksiyon var mı?

Biz Ne Yaptık?

8 şubeli yapımızda bu süreci tamamen otomatize ettik. Her Mikro güncellemesinden sonra otomatik doğrulama, eksik fonksiyonların tespiti ve kopyalanması, versiyon uyumsuzluğu raporlama.


Bu yazı AstaFlow Case Study serisinin bir parçasıdır.