VeloxPulse SİSTEM ANALİZİ ÖRNEĞİ · MÜŞTERİ VE AĞ BİLGİLERİ ANONİM Analiz Talep Et ← Site

🏭 AX 2012 R3 Kapsamlı Sistem Analizi

Terminal Server + El Terminali + Kantar + Sevkiyat Entegrasyonu
📅 20 Ocak 2026 🏢 Örnek Üretim A.Ş. 📊 93.000+ Satır Kod Analizi 📁 19 RPT Dosya
📊

Yönetici Özeti

4
Kritik Sorun
8
Orta Seviye Sorun
15+
İyileştirme Önerisi
29
Form Analiz Edildi
🔴 Session Kopması

Neden: ERP_WeighBridgeEngine.getWeighBridge() metodunda throw error() kullanımı

Etki: Kantar bağlantısı kesildiğinde tüm AX session çöküyor, kullanıcı sistemden atılıyor

🔴 Yazdırma Hatası

Neden: ERP_Utility.printReport() metodunda try-catch yok

Etki: Yazıcı hatası veya iptal = Session çökme

🟡 Performans Sorunu

Neden: N+1 sorgu problemi, sleep(600), tekrarlanan sorgular

Etki: Sistem 3-5 kat yavaş çalışıyor

🔵 Eksik Tablolar

Durum: ERP_Barcode, ERP_BarcodeReaded, ERP_WeighBridge tabloları projede export edilmemiş

Etki: Tam analiz yapılamıyor

🏗️

Sistem Mimarisi

Ağ Topolojisi ve Veri Akışı
📱 El Terminali Barkod Okuyucu
⚖️ Kantar 10.0.20.15:1001
🖨️ Etiket Yazıcı Zebra/TSC
⬇️ RDP / TCP ⬇️
🖥️ Terminal Server 10.0.10.5
⬇️ AX Client ⬇️
⚙️ AX AOS Server 10.0.10.8
⚙️ AX Batch Server 10.0.10.9
⬇️ SQL ⬇️
🗄️ SQL Server 10.0.10.12

Kritik Bağlantı Noktaları

Bağlantı Protokol Port Risk Seviyesi Sorun
Terminal → Kantar TCP/IP 1001 Yüksek Timeout yönetimi yok, throw error() kullanımı
Terminal → Yazıcı Windows Print - Yüksek Exception handling yok
El Terminali → Terminal Server RDP 3389 Orta Session timeout ayarları
AX Client → AOS AX Protocol 2712 Düşük Standart AX bağlantısı
💥

Session Kopma Analizi

🔴 Sorun 1: Kantar Bağlantı Hatası

Dosya: ERP_WeighBridgeEngine sınıfı

Metod: getWeighBridge()

❌ Mevcut Kod (HATALI)
static Real getWeighBridge(ERP_WeighBridge _weighBridge)
{
    ...
    weighBridgeResponse = engine.getValue(_weighBridge.IP, _weighBridge.Port);
    success = weighBridgeResponse.get_success();

    if(success == false)
    {
        throw error(response);  // 💀 SESSION ÇÖKER!
    }
    ...
}
✅ Düzeltilmiş Kod
static Real getWeighBridge(ERP_WeighBridge _weighBridge)
{
    ...
    try
    {
        weighBridgeResponse = engine.getValue(_weighBridge.IP, _weighBridge.Port);
        success = weighBridgeResponse.get_success();

        if(success == false)
        {
            if(_weighBridge.AllowManualEntry)
            {
                warning(strFmt("Kantar hatası: %1", response));
                return -1;  // Manuel giriş sinyali
            }
            warning(strFmt("Kantar hatası: %1", response));
            return 0;
        }
    }
    catch (Exception::CLRError)
    {
        warning("Kantar DLL hatası!");
        return _weighBridge.AllowManualEntry ? -1 : 0;
    }
    ...
}

🔴 Sorun 2: Yazdırma Hatası

Dosya: ERP_Utility sınıfı

Metod: printReport()

❌ Mevcut Kod (HATALI)
static client void printReport(str _reportName, Common _record, 
                               str _printerName, int _copies)
{
    reportRun   reportRun;
    PrintJobSettings printJobSettings;
    
    reportRun = new ReportRun(...);
    reportRun.init();
    
    reportRun.run();  // 💀 TRY-CATCH YOK!
}
✅ Düzeltilmiş Kod
static client void printReport(str _reportName, Common _record, 
                               str _printerName, int _copies)
{
    reportRun   reportRun;
    PrintJobSettings printJobSettings;
    
    try
    {
        reportRun = new ReportRun(...);
        reportRun.init();
        reportRun.run();
        
        info("Etiket başarıyla yazdırıldı.");
    }
    catch (Exception::Error)
    {
        warning("Yazdırma hatası! Lütfen yazıcıyı kontrol edin.");
    }
    catch (Exception::CLRError)
    {
        warning("Yazıcı bağlantı hatası!");
    }
    catch (Exception::Break)
    {
        info("Yazdırma iptal edildi.");
    }
}

Session Kopma Senaryosu

1. El terminalinden barkod okutulur

Kullanıcı ürünü tarar

2. Kantar verisi istenir

ERP_WeighBridgeEngine::getWeighBridge() çağrılır

3. Kantar bağlantısı başarısız

Ağ sorunu, timeout veya kantar kapalı

4. throw error() çağrılır

Yakalanmayan exception fırlatılır

5. AX Client session çöker

Kullanıcı sistemden atılır, veri kaybı riski

🐢

Performans Analizi

🔴 Sorun 1: N+1 Sorgu Problemi

Lokasyon: createPickingList() metodu (Satır 35040-35111)

// Her döngü adımında veritabanına gidiliyor!
while select forUpdate thisProdBom
    where thisProdBom.ProdId == prodTable.ProdId
{
    inventTable = thisProdBom.inventTable();          // Sorgu 1
    
    while select forUpdate barcodeReaded
        where barcodeReaded.ProdBomRecId == thisProdBom.RecId
    {
        barcode = ERP_Barcode::find(barcodeReaded.BarcodeId);  // Sorgu 2
        inventDim = thisProdBom.inventDim();                    // Sorgu 3
        inventDim = inventDim::findOrCreate(inventDim);         // Sorgu 4
        prodPool = ProdPool::find(prodTable.ProdPoolId);        // Sorgu 5 (aynı değer!)
        
        select inventTransOrigin join forUpdate inventTrans ... // Sorgu 6
    }
}

// 10 ProdBOM x 5 Barkod = 300+ veritabanı sorgusu! 💀

Çözüm: Cache Kullanımı

// Döngü dışında bir kez oku, cache'le
ProdPool prodPool = ProdPool::find(prodTable.ProdPoolId);  // 1 kez

// Map ile cache oluştur
Map inventTableCache = new Map(Types::String, Types::Record);
while select inventTable
    exists join thisProdBom
        where thisProdBom.ProdId == prodTable.ProdId
        &&    thisProdBom.ItemId == inventTable.ItemId
{
    inventTableCache.insert(inventTable.ItemId, inventTable);
}

// Döngüde cache'den oku
while select thisProdBom ...
{
    if(inventTableCache.exists(thisProdBom.ItemId))
        inventTable = inventTableCache.lookup(thisProdBom.ItemId);
}

🔴 Sorun 2: sleep(600) Kullanımı

Lokasyon: ERP_WeighBridgeEngine (Satır 405, 458)

❌ Mevcut Kod
tcpClient = new System.Net.Sockets.TcpClient(ipAddress, port);
stream = tcpClient.GetStream();
sleep(600);  // 600ms tüm thread'i bloklar!
✅ Düzeltilmiş Kod
tcpClient = new System.Net.Sockets.TcpClient();
tcpClient.set_ReceiveTimeout(2000);  // Timeout kullan
tcpClient.set_SendTimeout(1000);
tcpClient.Connect(ipAddress, port);
stream = tcpClient.GetStream();
// sleep() KALDIRILDI!

🟡 Sorun 3: Tekrarlanan Metod Çağrıları

Lokasyon: updateAutoConsumption() (Satır 35339-35345)

❌ Mevcut Kod
// Aynı metod 3 kez çağrılıyor!
if(localBarcode.availPhysicalByLocation(inventLocationId) <= 0)
    continue;
    
if(localBarcode.availPhysicalByLocation(inventLocationId) >= bomQty)
    miktar = bomQty - toplamMiktar;
else
    miktar = localBarcode.availPhysicalByLocation(inventLocationId);

// 100 barkod = 300 ekstra sorgu!
✅ Düzeltilmiş Kod
// Bir kez hesapla, değişkene ata
Qty availQty = localBarcode.availPhysicalByLocation(inventLocationId);

if(availQty <= 0)
    continue;
    
if(availQty >= bomQty - toplamMiktar)
    miktar = bomQty - toplamMiktar;
else
    miktar = availQty;

Performans Etki Tablosu

Sorun Mevcut Durum Düzeltme Sonrası Kazanç
N+1 Sorgu (createPickingList) 300+ sorgu ~20 sorgu %90 azalma
sleep(600) 600ms/okuma 0ms 600ms kazanç
availPhysicalByLocation 3x 300 sorgu 100 sorgu %66 azalma
ProdPool::find tekrarı 50+ sorgu 1 sorgu %98 azalma
📦

Eksik Nesneler Analizi

Mevcut Tablolar ✅

Tablo Adı Açıklama Index Durum
ERP_HandTerminalParameters El terminali parametreleri OK
ERP_HeadpanTable Kap/konteyner takibi ❌ Eksik Index gerekli
ERP_PalletTable Palet başlık ✅ PalletIdx OK
ERP_PackingTable Paketleme başlık ✅ PackingIdx OK
ERP_PackingLine Paketleme satır ? İncelenmeli
ERP_ProductionStockTransferTemp Üretim transfer (InMemory) - TempDB önerilir

Eksik Tablolar 🔴

ERP_Barcode

Kullanım: Tüm barkod işlemleri

Referans: ERP_Barcode::find(), availPhysicalByLocation()

Önem: Kritik - Sistem çalışmaz

ERP_BarcodeReaded

Kullanım: Üretim malzeme tüketimi

Referans: createPickingList(), insertBarcodeReaded()

Önem: Kritik - Üretim çalışmaz

ERP_WeighBridge

Kullanım: Kantar parametreleri

Referans: IP, Port, Kalibrasyon değerleri

Önem: Kritik - Kantar çalışmaz

ERP_PalletLine

Kullanım: Palet satırları

Referans: ERP_PalletTable cascade delete

Önem: Orta

ERP_ShippingOrderTable

Kullanım: Sevkiyat başlık

Referans: Form datasource

Önem: Orta

ERP_ShippingOrderLine

Kullanım: Sevkiyat satır

Referans: Form datasource

Önem: Orta

Tahmini ERP_Barcode Tablo Yapısı

Kod analizine göre bu tablonun şu alanlara sahip olması gerekiyor:

Alan Adı Tip Açıklama Index
BarcodeIdString (PK)Barkod numarası✅ Unique
ItemIdStringMadde kodu✅ Composite
ItemNameStringMadde adı
InventConfigIdStringKonfigürasyon✅ Composite
InventColorIdStringRenk
InventSizeIdStringBoyut
InventBatchIdStringParti numarası✅ Composite
InventSerialIdStringSeri numarası
InventLocationIdStringAmbar✅ Composite
OrderNoStringÜretim emri (ProdId)
QtyRealMiktar
HeadpanIdStringKap referansı
🔍

Kod Kalitesi Analizi

Tespit Edilen Sorunlar

infolog.clear() Kullanımı

4 yerde hata mesajları siliniyor (Satır 35292, 35296, 41334, 41339)

Sorun: Debug imkansız, kullanıcı hatayı görmüyor

Çözüm: Kaldırın veya sadece başarılı işlemden sonra kullanın

Kod Tekrarı (DRY İhlali)

Barkod tarama mantığı 5 formda tekrarlanıyor

Formlar: PressStockTransfer, MontageStockTransfer, DoughStockTransfer, WeavingStockTransfer, InjectionStockTransfer

Çözüm: ERP_StockTransferHelper sınıfı oluşturun

forUpdate Fazla Kullanımı

Gereksiz yere tüm kayıtlar kilitleniyor

Sorun: Database lock contention

Çözüm: Sadece güncellenecek kayıtları kilitleyin

Eski Metodlar

getWeighBridge_old, getWeighBridge_old2, getWeighBridge_old3 metodları mevcut

Öneri: Kullanılmıyorsa silin

Best Practice Önerileri

🔄

İş Süreci Analizi

Üretim Süreci Akışı

📥
Hammadde
Girişi
�icing
Stok
Transfer
⚙️
Üretim
Tüketim
📦
Mamul
Etiketleme
🚚
Sevkiyat

Üretim Havuzları (ProdPool)

Havuz Tip Form Özel Mantık
PRES Press ERP_PressProduction Kantar + Barkod okuma
MONTAJ Montage ERP_MontageProduction Çoklu barkod birleştirme
DOKUMA Weaving ERP_WeavingProduction Farklı miktar hesaplama
ENJEKSİYON Injection ERP_InjectionProduction Otomatik tüketim
HAMUR Dough ERP_DoughProduction Hammadde karışım

Sevkiyat Durumları

Durum Açıklama İzin Verilen İşlemler
Created Oluşturuldu Düzenleme, Silme, Sevke Gönder
Read Okundu (Barkod tarandı) Sevkiyat Oluştur
Discharged Yüklendi Manuel Kantar, Düzenleme
Shipped Sevk Edildi İrsaliye Kes
Cancelled İptal -
💡

İyileştirme Önerileri

A. Teknik İyileştirmeler

1
Exception Handling Framework
Tüm kritik metodlara try-catch ekleyin. ERP_ExceptionHandler sınıfı oluşturun.
2
Kantar Bağlantı Yönetimi
Retry mekanizması, timeout yönetimi, fallback (manuel giriş) sistemi ekleyin.
3
Veritabanı Optimizasyonu
Index'ler ekleyin, N+1 sorguları düzeltin, cache mekanizması kullanın.
4
Logging Altyapısı
ERP_AuditLog tablosu ile tüm kritik işlemleri kaydedin.
5
Kod Refactoring
Tekrarlanan kodları helper sınıflara taşıyın (DRY prensibi).

B. İş Süreci İyileştirmeleri

📊 Dashboard

Gerçek zamanlı üretim durumu, kantar okumaları, sevkiyat durumu için dashboard ekleyin.

📱 Offline Mod

El terminalinde offline çalışma ve sonra senkronizasyon desteği.

⚠️ Uyarı Sistemi

Stok düşük, kantar bağlantısı yok, yazıcı hatası gibi durumlar için bildirim sistemi.

📈 Raporlama

Üretim verimliliği, barkod okuma istatistikleri, hata raporları.

C. Yeni Özellik Önerileri

Özellik Açıklama Fayda Zorluk
Barkod Doğrulama Okutmadan önce format ve geçerlilik kontrolü Hata azaltma Kolay
Çift Okutma Engelleme Aynı barkodun tekrar okutulmasını engelle Veri doğruluğu Kolay
Otomatik Yedekleme Session çökmelerinde veri kurtarma Veri güvenliği Orta
Mobil Onay Kritik işlemler için mobil bildirim/onay Kontrol artışı Zor
📋

Aksiyon Planı

Hafta 1: Kritik Düzeltmeler

Hafta 2: Performans Optimizasyonu

Hafta 3-4: Yapısal İyileştirmeler

Tahmini Sonuçlar

%95
Session Kopma Azalması
3-5x
Performans Artışı
%80
Hata Görünürlüğü
%50
Kod Tekrarı Azalması