Performanslı ve güvenli bir script yazmak için ipuçları


Elinizdeki bir nesneyi başka bir nesneye kopyalamak istediğinizde, bu işlemi Set komutuyla veritabanına gitmeden yapabilirsiniz.

// Kaynak taşıma kabının Id si ile hedef taşıma kabı veritabanından okunuyor
Container.Get(@@Container.Id,@@Container2)
 
// Veritabanına gitmeden, kaynak taşıma kabı nesnesi hedef taşıma kabına atanıyor
Set(@@Container2, @@Container)

Get işlemi, okunan nesnenin içindeki bağlantılı nesneleri de otomatik doldurur. Eğer sadece ana nesneye ihtiyacınız varsa, Get komutunun 2. parametresine nesnenin adını yazabilirsiniz.

// Bu işlem @@Address nesnesi ile birlikte ilgili @@Warehouse, @@WarehouseFloor, @@WarehouseZone, @@WarehouseBlock nesnelerini de veritabanından okuyup doldurur.
Address.Get("Address='@AdresBarkod'")
 
// Bu işlem sadece @Adres nesnesini veritabanından okuduğu adres bilgisiyle doldurur.
Address.Get("Address='@AdresBarkod'",@Adres)

Scriptteki tüm nesneler globaldir. Yani bir kez dolduğunda, boşaltılmadığı ya da başka bir komutla doldurulmadığı müddetçe dolu kalır. Kayıt hataları yaşamamak için, işlem öncesinde işlemi etkileyecek değişkenleri boşaltmalısınız.

// ResetVariables komutu hafızadaki değişkenleri boşaltır.
ResetVariables({"name":["@@ProductionOrder","@@ProductionOrderLine","@@WorkOrder","@@WorkOrderLine","@@OrderSlip","@@OrderSlipLine","@@Arp"]})

Sık yaptığınız işlemleri ortak bir forma taşıyarak oradan çağırabilir, scriptinizin daha kısa ve derli toplu olmasını sağlayabilirsiniz.

Set(@YetkiKodu, "GIRIS") // Adres için kullanılacak yetki kodu değişkene atanıyor
CallForm(AdresListeleSec) // Adres seçim formu çağrılıyor
If(@AdresSecimSonucu = -1,Goto(BasaDon)) // Formdan hatalı sonuç dönmüşse script yönlendiriliyor
 
BeginForm(AdresListeleSec) // Ortak adres seçim formu
    Set(@AdresSecimSonucu, 0) // Sonuç değişkeni sıfırlanıyor
    Address.List("AuthCode='@YetkiKodu'","",@AdresListesi)
    If(@AdresListesi.rowCount<1)
        ShowMessage({"title":"UYARI","message":"Tanımlı Adres Bulunamadı","buttons":"TAMAM"},@Secenek)
        Set(@AdresSecimSonucu, -1) // Sonuç değişkeni hatalı olarak belirleniyor
    Else()
        If(@AdresListesi.rowCount = 1) // Tek adres varsa direkt @@Address değişkenine atanıyor
            Address.Get(@AdresListesi.rows.1.Id)
        Else() // Birden çok adres varsa listeden seçip yaptırılıyor
            PopupView(@AdresListesi.rows,{"mode":"list","title":"Kabul Adres Listesi","fields":["Address|Adres Tanımı|15|L"]},@sira)
            Address.Get(@[email protected])
        EndIf()
    EndIf()
    ReturnForm() // Bu formu çağıran satıra geri dönülüyor
EndForm()

Sık kullandığınız sabitleri bir kez tanımlayıp, scriptin her yerinde kullanabilirsiniz.

// Set komutu JSON yapısında değişken atamasını destekler.
Set(@EmirDurum, {"Bekliyor":12,"IslemeAlindi":13, "Tamamlandi":14})
 
// Emir statüsü tamamlandı olarak belirleniyor. JSON nesnelerin alt nesnelerine . (nokta) ile erişilebilir.
CustomState.Get(@EmirDurum.Tamamlandi)

Gerekmedikçe, nesneleri veritabanından doldurmak için Sql komutu kullanmayın. List ve Get komutları, yetkiler dahil bir çok kontrolü yaparak verileri getirir.

// Kullanıcının yetkisi olduğu-olmadığı, aktif firmaya ait olan-olmayan, kullanımda olan-olmayan bütün depoları getirir.
Sql("SELECT * FROM SysWarehouse", @Depolar)
 
// Sadece aktif firmaya ait, kullanımda olan ve o kullanıcının yetkisi olan depoları getirir.
Warehouse.List("","", @Depolar)

Gerekmedikçe, veritabanında güncelleme işlemleri için Sql komutu kullanmayın. Save komutu kaydetme sırasında bir çok kontrolü yapar.

// Fiş statüsünü Entegre Edildi olarak günceller ama entegrasyonu tetiklemez.
Sql("UPDATE Slip SET StateId=19", @sonuc)
 
// Fiş statüsünü Entegre Edildi olarak günceller ve o statünün otomatik eylemi olarak ERP'ye entegre olmasını sağlar.
CustomState.Get(19)
Slip.Save()