1. Anasayfa
  2. Logo Connect Destek

Logo Connect Script Kural Örnekleri

Logo Connect Script Kural Örnekleri
0

Logo Connect, e-Fatura/e-Arşiv/e-İrsaliye gibi belgeler GİB’e gönderilmeden önce veya sonra devreye giren bir “kural motoru”dur: bir alanı başka bir alana taşımak, bir veriyi hesaplayıp UBL’e eklemek, belirli bir koşulda bir satırı silmek gibi işleri, VBScript benzeri küçük script’lerle ya da hiç kod yazmadan, hazır bir arayüzden tanımlayabilirsiniz. Bu yazıda, kural örneklerinin yanı sıra bu kurallarla üretilen verilerin Tasarım Aracı’nda nasıl gösterileceğini de tek kaynakta topladım — ihtiyacınız olduğunda aşağıdaki içindekiler listesinden doğrudan ilgili bölüme atlayabilirsiniz.

İçindekiler

Kod Yazmadan Kural: İrsaliye No’ya Belge No Getirme

Her kural script gerektirmez. Logo Connect’in Kural Tanımlama ekranında “Veri üzerinde değişiklik yap” işlemini seçip alan eşlemesini yaparak da kural yazabilirsiniz. Örneğin bir e-Fatura’nın irsaliye numarasına, belge numarasını otomatik yazdırmak için:

AyarDeğer
Dokümane-Fatura (Giden)
OlayOnaylanmadan Önce
İşlemVeri üzerinde değişiklik yap
DISPATCHES.DISPATCH.NUMBERDOC_NUMBER

Sol tarafa hedef alanı, sağ tarafa kaynak alanı yazıyorsunuz; Logo Connect her belge üretiminde bu eşlemeyi otomatik uyguluyor. Script gerektiren ihtiyaçlarda ise aşağıdaki gibi ProcessEvent fonksiyonlu kurallar kullanılır.

Alan / Açıklama Taşıma Kuralları

Malzeme Açıklama2 → Satır Açıklaması

sub ProcessEvent(App)
  ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while ok1
    name = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_DEF3")
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.DESCRIPTION", name
    ok1 = App.Doc.NextChild
  wend
  App.Doc.SaveData
end sub

Description ↔ Name Alanlarını Değiştirme

Belirli bir cari hesap koduna özel çalışır:

sub ProcessEvent(App)
  TAX = App.Doc.FieldAsString("ARP_CODE")
  If TAX = "CARI-KODUNUZ" then
    rOk = App.Doc.FirstRoot
    while rOk
      ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
      while ok1
        KOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_CODE")
        DEF = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_DEF")
        App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", KOD
        App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", DEF
        ok1 = App.Doc.NextChild
      wend
      rOk = App.Doc.NextRoot
    wend
    App.Doc.SaveData
  end If
end sub

Satır Açıklaması ↔ Malzeme Açıklaması

İki yönlü kullanılabilir. Birincisi, satır açıklaması doluysa bunu malzeme açıklamasının yerine geçirir:

sub ProcessEvent(App)
  okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while okay
    ACIKLAMA = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.DESCRIPTION")
    if ACIKLAMA <> Empty then
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", ACIKLAMA
    end if
    okay = App.Doc.NextChild
  wend
  App.Doc.SaveData
end sub

İkincisi, cari hesap kodu boşsa satır açıklamasını malzeme koduna yazar (gelen faturalarda hızlı eşleme için kullanışlıdır):

sub ProcessEvent(App)
  CariKod = App.Doc.FieldAsString("ARP_CODE")
  if CariKod = "" Then
    rOk = App.Doc.FirstRoot
    while rOk
      okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
      while okay
        ASIN = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.DESCRIPTION")
        App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", ASIN
        okay = App.Doc.NextChild
      wend
      rOk = App.Doc.NextRoot
    wend
    App.Doc.SaveData
  End if
end sub

Varyant Kodu ve Açıklamasının Malzeme Kodu/Açıklamasına Getirilmesi

Varyantlı malzemelerde (CANCONFIG = 1) çalışır:

sub ProcessEvent(App)
  ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while ok1
    Var = App.Doc.FieldAsInteger("CANCONFIG")
    if Var = 1 then
      Code = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.VARIANTCODE")
      Desc = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.VARIANTNAME")
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", Code
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", Desc
    end if
    ok1 = App.Doc.NextChild
  wend
  App.Doc.SaveData
end sub

Malzeme Kodu + Üretici Kodu, Açıklama + Açıklama2’nin Yan Yana Gelmesi

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while ok1
      KOD  = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_CODE")
      URET = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.PROCEDUCER_CODE")
      ACK1 = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_DEF")
      ACK2 = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_DEF3")
      App.Doc.ModifyData "MASTER_CODE", KOD + " / " + URET
      App.Doc.ModifyData "MASTER_DEF", ACK1 + " / " + ACK2
      ok1 = App.Doc.NextChild
    wend
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

Hizmet Kartı Açıklama2’nin Açıklamaya Getirilmesi

Sadece hizmet satırlarında (TYPE = 4) çalışır:

sub ProcessEvent(App)
  okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while okay
    sType = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE")
    If sType = 4 Then
      rOk = App.Doc.FirstChild("SALES_SERVICES.SERVICE")
      while rOk
        ACIKLAMA2 = App.Doc.FieldAsString("SALES_SERVICES.SERVICE.DESCRIPTION2")
        rOk = App.Doc.NextChild
      wend
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", ACIKLAMA2
    end if
    okay = App.Doc.NextChild
  wend
  App.Doc.SaveData
end sub

Tanımlı Alanların Başlığıyla Beraber Açıklamaya Getirilmesi

sub ProcessEvent(App)
  DETAY  = App.Doc.FieldAsString("DEFNFLDSLIST.DEFNFLD.TEXTFLDS1")
  DETAY1 = App.Doc.FieldAsString("DEFNFLDSLIST.DEFNFLD.TEXTFLDS2")
  App.Doc.ModifyData "NOTES5", "Başlık: " + DETAY
  App.Doc.ModifyData "NOTES6", "Başlık2: " + DETAY1
  App.Doc.SaveData
end sub

Satıcı Kod ve Adının Genel Açıklamalara Getirilmesi

sub ProcessEvent(App)
  DETAY  = App.Doc.FieldAsString("SALESMAN_CODE")
  DETAY1 = App.Doc.FieldAsString("SALESMAN_DEF")
  App.Doc.ModifyData "NOTES5", "Satıcı Kodu:" + DETAY
  App.Doc.ModifyData "NOTES6", "Satıcı Adı:" + DETAY1
  App.Doc.SaveData
end sub

Dövizli Faturalarda “Yalnız TL” İbaresinin Kaldırılması

Döviz cinsi seçiliyken tutarın yazıyla TL karşılığını (TOTAL_NET_STR) UBL’den çıkarır:

sub ProcessEvent(App)
  sTip = App.Doc.FieldAsInteger("CURR_INVOICE")
  if sTip <> Empty Then
    App.Doc.RemoveChild "TOTAL_NET_STR"
  end if
  App.Doc.SaveData
end sub

Sipariş, İrsaliye, Barkod ve Tedarikçi Kodu Taşıma

Sipariş Fiş Numarasının Faturaya Getirilmesi

sub ProcessEvent(App)
  ORDER = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.ORDER_FICHENO")
  ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while ok1
    App.Doc.ModifyData "CUSTORDNO", ORDER
    ok1 = App.Doc.NextChild
  wend
  App.Doc.SaveData
end sub

Barkod Numarasının Tedarikçi Koduna (Satıra) Getirilmesi

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while ok1
      barkod = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.BARCODE")
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ITEM_SUPPLIERCODE", barkod
      ok1 = App.Doc.NextChild
    wend
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

GTIP Kodunun Satıra Getirilmesi

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while okay
      GTIP = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_GTIPCODE")
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ITEM_SUPPLIERCODE", GTIP
      okay = App.Doc.NextChild
    wend
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

Tedarikçi Kodunun (Özel Kod) Fatura Satırına Getirilmesi

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while okay
      OZELKOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_AUXIL_CODE")
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ITEM_CUSTOMERCODE", OZELKOD
      okay = App.Doc.NextChild
    wend
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

Malzeme Barkodunun Satıra Getirilmesi

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while okay
      OZELKOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.BARCODE")
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.PROCEDUCER_CODE", OZELKOD
      okay = App.Doc.NextChild
    wend
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

Sipariş No ve Tarihinin Açıklama Satırlarından Okunması

Sipariş bilgisi elle açıklama alanına (NOTES3/4) yazılmışsa, bunu standart sipariş alanlarına aktarır:

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    ST_DEGISKEN1 = App.Doc.FieldAsString("NOTES3")
    ST_DEGISKEN2 = App.Doc.FieldAsString("NOTES4")
    ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while ok1
      App.Doc.ModifyData "CUSTORDNO", ST_DEGISKEN1
      App.Doc.ModifyData "ORDER_FICHENO", ST_DEGISKEN1
      App.Doc.ModifyData "ORDER_FICHEDATE", ST_DEGISKEN2
      ok1 = App.Doc.NextChild
    wend
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

İrsaliye Numarası ve Tarihinin Sipariş Numarası/Tarihine Getirilmesi

Belirli bir cari hesap koduna özel çalışır:

sub ProcessEvent(App)
  ARPCODE = App.Doc.FieldAsString("ARP_CODE")
  If ARPCODE = "CARI-KODUNUZ" then
    rOk = App.Doc.FirstRoot
    while rOk
      MusteriSiparisNo = App.Doc.FieldAsString("DISPATCHES.DISPATCH_NUMBER")
      IrsaliyeTarihi = App.Doc.FieldAsString("DISPATCHES.DISPATCH.DATE")
      ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
      while ok1
        App.Doc.ModifyData "CUSTORDNO", MusteriSiparisNo
        App.Doc.ModifyData "ORDER_FICHEDATE", IrsaliyeTarihi
        ok1 = App.Doc.NextChild
      wend
      rOk = App.Doc.NextRoot
    wend
    App.Doc.SaveData
  end If
end sub

Doküman İzleme Numarasının “BAYINO” Alanına Getirilmesi

Cari hesap kodu koşullu:

sub ProcessEvent(App)
  ARPCODE = App.Doc.FieldAsString("ARP_CODE")
  If ARPCODE = "CARI-KODUNUZ" then
    DETAY = App.Doc.FieldAsString("DOC_TRACK_NR")
    App.Doc.ModifyData "SHIPLOC_CODE", DETAY
    App.Doc.SaveData
  End if
end sub

Perakende Satış Faturasında KDV’li Birim Fiyatı Satıra Getirme

sub ProcessEvent(App)
  ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while ok1
    fiyat = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.PRICE")
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ITEM_SUPPLIERCODE", fiyat
    ok1 = App.Doc.NextChild
  wend
  App.Doc.SaveData
end sub

Cari Hesap Bakiyesini Fatura Tasarımına Getirme

Faturanın altına, o anki cari hesap bakiyesini otomatik yazdırmak iki adımda kurulur: önce bakiyeyi hesaplayıp UBL’e yazan bir kural, sonra bu veriyi tasarımda gösteren bir ek alan tanımı.

1. Adım — Kural: cari hesabın borç-alacak farkını (SUM(DEBIT)-SUM(CREDIT)) sorgular ve sonucu UBL’e BAKIYE etiketiyle yazar:

sub ProcessEvent(App)
  ST_ClRef = App.Doc.FieldAsInteger("ARP_LOGICALREF")
  ST_CHRRef = CStr(ST_ClRef)
  BAKIYE = App.UQUERY_GETFLD(60,"SUM(DEBIT)-SUM(CREDIT)",24,6,FALSE, _
    "CARDREF ="+ST_CHRRef+" AND TOTTYP = 1" )

  App.Doc.WriteStartElement "ADDITIONALDOCUMENTS/ADDITIONALDOCUMENT"
  App.Doc.WriteElementString "ID", Replace(cstr(BAKIYE),",",".")
  App.Doc.WriteElementString "ISSUEDATE", Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2)
  App.Doc.WriteElementString "DOCUMENTTYPE", "BAKIYE"
  App.Doc.WriteEndElement

  App.Doc.SaveData
end sub

Kuralı doküman türü olarak e-Fatura (Giden), olay olarak Onaylanmadan Önce tanımlamanızı öneririm — bakiye, fatura GİB’e gitmeden hemen önceki güncel haliyle hesaplanır.

2. Adım — Tasarım: kural çalıştıktan sonra UBL’e şu kayıt eklenir:

<cac:AdditionalDocumentReference>
  <cbc:ID>4250.75</cbc:ID>
  <cbc:IssueDate>2026-08-25</cbc:IssueDate>
  <cbc:DocumentType>BAKIYE</cbc:DocumentType>
</cac:AdditionalDocumentReference>

Bunu görmek için Özel Entegratörlük Portalı → Araçlar → Görsel Tasarım Ek Alanları‘na gidip yeni bir ek alan açın ve DocumentType değerine göre filtreleyen şu XSLT’yi yazın:

<xsl:for-each select="//n1:Invoice/cac:AdditionalDocumentReference">
  <xsl:if test="cbc:DocumentType = 'BAKIYE'">
    <xsl:value-of select="cbc:ID"/>
  </xsl:if>
</xsl:for-each>

Bu ek alanı kaydettikten sonra Tasarım Aracı’nda “Kullanıcı Tanımlı” alanlar listesinde görünür; sürükleyip faturanın altına, örneğin “Cari Hesap Bakiyeniz:” etiketinin yanına yerleştirebilirsiniz.

Dikkat: Bu bakiye, kuralın çalıştığı andaki bir “anlık görüntü”dür — fatura kesildikten sonra yapılan tahsilat/ödemeler bu rakamı otomatik güncellemez. Tasarımda “Bakiye, fatura tarihi itibarıyladır” gibi kısa bir not eklemenizi öneririm.

e-Arşiv Faturalarında Sevkiyat Adresini UBL’e Ekleme

e-Arşiv faturalarında sevkiyat adresi bilgisi (açıklama, il, ilçe, adres) varsayılan olarak UBL’e yazılmaz. Aşağıdaki kural, bu bilgileri “ek belge” olarak fatura XML’ine ekler:

sub ProcessEvent(App)
  DETAY = App.Doc.FieldAsString("SHIPLOC_DEF")
  App.Doc.WriteStartElement "ADDITIONALDOCUMENTS/ADDITIONALDOCUMENT"
  App.Doc.WriteElementString "ID", DETAY
  App.Doc.WriteElementString "ISSUEDATE", Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2)
  App.Doc.WriteElementString "DOCUMENTTYPE", "SEVKIYAT"
  App.Doc.WriteEndElement
  App.Doc.SaveData

  ' Ayni mantikla il / ilce / acik adres icin de EINVOICE_EXTENSIONS
  ' altindaki SHIPINFO_CITY, SHIPINFO_TOWNDIST, SHIPINFO_ADDRES alanlari
  ' SEHIR / ILCE / ADRES DOCUMENTTYPE degerleriyle tekrarlanir.
end sub

Tasarımda göstermek için dört ayrı ek alan (SEVKIYAT, ADRES, SEHIR, ILCE) tanımlayıp her biri için kuralla eklenen serbest alanı gösterme bölümündeki if kalıbını kullanmanız yeterli.

“İrsaliye Yerine Geçer” İbaresi Kuralı

e-Arşiv faturalarda irsaliye bağlantısı yoksa, tasarımda otomatik olarak “irsaliye yerine geçer” ifadesinin çıkması istenebilir. Bunun yolu, UBL’deki irsaliye alanını kuralla kaldırmaktır — irsaliye alanı UBL’de yoksa ifade otomatik devreye girer:

sub ProcessEvent(App)
  rOk = App.Doc.FirstChild("DISPATCHES.DISPATCH")
  while rOk
    App.Doc.RemoveChild "DISPATCH.NUMBER"
    rOk = App.Doc.NextChild
  wend
  App.Doc.SaveData
end sub
Dikkat: Bu kurala kısıt eklemezseniz tüm faturalarda çalışır ve irsaliye bilgisi faturadan tamamen kalkar. Sadece belirli koşullarda çalışmasını istiyorsanız kurala koşul eklemeniz, istemediğiniz durumda ise kuralı pasif hale getirmeniz gerekir.

Karma Koli Kuralları

“Karma koli satırına KDV oranı ve toplamı gelsin, fakat alt satırlar (koli içeriği) silinsin; e-Fatura gönderirken tasarımda ve UBL’de bu alt satırlar görünmesin” isteniyorsa şu kural kullanılır. Doküman olarak e-Fatura/e-Arşiv, olay olarak Onaylanmadan/İmzalanmadan Önce seçilmelidir:

sub ProcessEvent(App)
  okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  While okay
    sTip = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE")
    if sTip = 6 Then
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.VAT_RATE", 18
    elseif sTip = 7 Then
      App.Doc.RemoveChild "TRANSACTION.TYPE"
    end if
    okay = App.Doc.NextChild
  Wend
  App.Doc.SaveData
end sub

Kaynak dokümanda “Karma Koli Kuralı” ve “Karma Koli Malzeme Kuralı” adıyla iki ayrı başlık altında verilse de kod bloğu aynıdır — pratikte tek bir kural, hem KDV satırını düzenleyip hem de koli içi malzeme satırlarını (tip 7) kaldırma işini birlikte yapar.

Özel Durum Kuralları

Ana Birim Kodu / Ana Birim Çevrimi

Birden fazla birim setiyle çalışan malzemelerde, satırdaki miktarı ana birime çevirip açıklamaya ya da UBL’e ek alan olarak yazar:

' Ana birim koduna gore miktari cevirip aciklamaya yazma
sub ProcessEvent(App)
  okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while okay
    Quantity = App.Doc.FieldAsFloat("TRANSACTIONS.TRANSACTION.QUANTITY")
    GBKod = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.UNIT_GLOBAL_CODE")
    ok1 = App.Doc.FirstChild("UNIT_SETS.UNIT_SET.UNITS.UNIT")
    while ok1
      GBKod2 = App.Doc.FieldAsString("GLOBAL_CODE")
      If GBKod = GBKod2 Then
        value = App.Doc.FieldAsFloat("CONV_FACT1")
      end if
      ok1 = App.Doc.NextChild
    wend
    a = ((Quantity) * (value))
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.DESCRIPTION", a
    okay = App.Doc.NextChild
  wend
  App.Doc.SaveData
end sub

' Butun satirlarin toplam ana birim karsiligini UBL'e ek alan olarak yazma
sub ProcessEvent(App)
  b = 0.0
  okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while okay
    Quantity = App.Doc.FieldAsFloat("TRANSACTIONS.TRANSACTION.QUANTITY")
    GBKod = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.UNIT_GLOBAL_CODE")
    ok1 = App.Doc.FirstChild("UNIT_SETS.UNIT_SET.UNITS.UNIT")
    while ok1
      GBKod2 = App.Doc.FieldAsString("GLOBAL_CODE")
      If GBKod = GBKod2 Then
        value = App.Doc.FieldAsFloat("CONV_FACT1")
      end if
      ok1 = App.Doc.NextChild
    wend
    a = ((Quantity) * (value))
    b = b + a
    okay = App.Doc.NextChild
  wend
  App.Doc.WriteStartElement "ADDITIONALDOCUMENTS/ADDITIONALDOCUMENT"
  App.Doc.WriteElementString "ID", b
  App.Doc.WriteElementString "ISSUEDATE", Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2)
  App.Doc.WriteElementString "DOCUMENTTYPE", "KILOTOPLAM"
  App.Doc.WriteEndElement
  App.Doc.SaveData
end sub

İhracat Faturalarında Satır Miktar Toplamının Açıklamaya Getirilmesi

EXIM_FICHE_TYPE = 2 veya 3 koşuluyla çalışır:

sub ProcessEvent(App)
  Type1 = App.Doc.FieldAsString("EXIM_FICHE_TYPE")
  If Type1 = 2 or 3 Then
    b = 0.0
    okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while okay
      Type2 = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE")
      If Type2 = 0 Then
        Quantity = App.Doc.FieldAsFloat("TRANSACTIONS.TRANSACTION.QUANTITY")
        b = Quantity + b
      end if
      okay = App.Doc.NextChild
    wend
    App.Doc.WriteStartElement "ADDITIONALDOCUMENTS/ADDITIONALDOCUMENT"
    App.Doc.WriteElementString "ID", b
    App.Doc.WriteElementString "ISSUEDATE", Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2)
    App.Doc.WriteElementString "DOCUMENTTYPE", "TOPLAMMIKTAR"
    App.Doc.WriteEndElement
  end if
  App.Doc.SaveData
end sub

Gelen Faturada Satırları Tek Bir Malzeme İle Eşleme

Tedarikçiden gelen e-faturadaki tüm satırları, kendi tek bir “genel malzeme” kartınıza eşlemek için:

sub ProcessEvent(App)
  ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while ok1
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.TYPE", "0"
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.UNITSET_CODE", "05"
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.UNIT_GLOBAL_CODE", "C62"
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.UNIT_CODE", "ADET"
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", "TM-001"
    ok1 = App.Doc.NextChild
  wend
  App.Doc.SaveData
end sub

Tesis Devri Kuralı

Belirli bir özel koda (TESISDEVRI) sahip faturalarda, genel gider tutarını KDV ve net tutara dağıtan daha kapsamlı bir örnek. Farklı belge tiplerinde (fatura, irsaliye, e-fatura vergi alanları) aynı tutarı tekrar tekrar yazması nedeniyle en uzun kurallardan biridir; kendi firmanızda kullanmadan önce test ortamında denemenizi öneririm:

' Ozelkod: TESISDEVRI
sub ProcessEvent(App)
  OZELKOD = App.Doc.FieldAsString("AUXIL_CODE")
  If OZELKOD = "TESISDEVRI" then
    rOk = App.Doc.FirstRoot
    while rOk
      ToplamTutarA = App.Doc.FieldAsFloat("TOTAL_NET")
      ToplamTutarB = App.Doc.FieldAsFloat("TC_NET")
      Geneltutar   = App.Doc.FieldAsFloat("EXPENSE_DISTRB")
      Geneltutarnew = CDbl(Geneltutar)
      Toplambedel1  = Geneltutarnew + ToplamTutarA
      Toplambedel2  = Geneltutarnew + ToplamTutarB

      App.Doc.ModifyData "TOTAL_VAT", Replace(cstr(Geneltutarnew), ",", ".")
      App.Doc.ModifyData "TOTAL_NET", Replace(cstr(Toplambedel1), ",", ".")
      App.Doc.ModifyData "TC_NET", Replace(cstr(Toplambedel2), ",", ".")

      ok1 = App.Doc.FirstChild("DISPATCHES.DISPATCH")
      while ok1
        App.Doc.ModifyData "TOTAL_VAT", Replace(cstr(Geneltutarnew), ",", ".")
        App.Doc.ModifyData "TOTAL_NET", Replace(cstr(Toplambedel1), ",", ".")
        ok1 = App.Doc.NextChild
      wend

      ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
      while ok1
        App.Doc.ModifyData "VAT_AMOUNT", Replace(cstr(Geneltutarnew), ",", ".")
        ok1 = App.Doc.NextChild
      wend

      ok1 = App.Doc.FirstChild("EINVOICE_EXTENSIONS.EXTENSIONS.TAXSUBTOTALS.TAXSUBTOTAL")
      while ok1
        App.Doc.ModifyData "TAXAMOUNT", Replace(cstr(Geneltutarnew), ",", ".")
        App.Doc.ModifyData "PERCENT", 18
        ok1 = App.Doc.NextChild
      wend

      rOk = App.Doc.NextRoot
    wend
    App.Doc.SaveData
  end If
end sub
' Not: "Dagitilacak Toplam" alani KDV Tutari olarak girilmelidir.

Detaylı Bilgi Alanını Tasarıma Getirme

Logo Tiger/Go’da malzeme veya hizmet satırına girilen “Detaylı Bilgi” metni, varsayılan olarak fatura tasarımında görünmez. Kural motorunda bu alan ITEXT olarak okunur.

Basit yöntem — tek satırlık kısa notlar için, doğrudan boş bir açıklama alanına yazmak yeterli:

sub ProcessEvent(App)
  DETAY = App.Doc.FieldAsString("ITEXT")
  App.Doc.ModifyData "NOTES5", DETAY
  App.Doc.SaveData
end sub

Satır sonu korumalı yöntem — detaylı bilgi metninde birden fazla satır varsa (madde madde yazılmış bir açıklama), düz metne aktarıldığında satır sonları kaybolur. Önce satır ayraçlarını özel bir işaretleyiciyle değiştirip, tasarım tarafında bu işaretleyiciyi gerçek satır sonuna çeviren bir XSLT şablonu kullanmak gerekir.

1. Kural (her faturada çalışır):

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    ST_DETAY = App.Doc.FieldAsString("ITEXT")
    App.Doc.ModifyData "NOTES12", Replace(ST_DETAY, "\u00a6", "\\YS_ST#")
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

2. Tasarımda “Genel Açıklamalar” bloğunun eklendiği yere:

<xsl:if test="//n1:Invoice/cbc:Note">
  <b>Genel Açıklamalar</b><br/>
  <xsl:for-each select="//n1:Invoice/cbc:Note">
    <xsl:call-template name="insertBreaks">
      <xsl:with-param name="pText" select="." />
    </xsl:call-template>
  </xsl:for-each>
</xsl:if>

3. XSLT dosyasının en altına (kapanış </xsl:template> etiketinden hemen sonra):

<xsl:template match="text()" name="insertBreaks">
  <xsl:param name="pText" select="."/>
  <xsl:choose>
    <xsl:when test="not(contains($pText, '\\YS_ST#'))">
      <xsl:copy-of select="$pText"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="substring-before($pText, '\\YS_ST#')"/>
      <br/>
      <xsl:call-template name="insertBreaks">
        <xsl:with-param name="pText" select="substring-after($pText, '\\YS_ST#')"/>
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
Nasıl çalışır: Kural, detaylı bilgideki her satır ayracını \YS_ST# işaretiyle değiştirir. XSLT şablonu ise metni bu işaretten böler ve aralarına gerçek bir <br/> koyar — böylece madde madde yazılmış bir açıklama, faturada da okunaklı şekilde görünür.

Fatura Tasarımı Ek Alanları (Görsel Tasarım Ek Alanları)

Tasarım Aracı, hazır alan listesinde bulunmayan ihtiyaçlar için (irsaliye numaralarını yan yana yazdırmak, sevkiyat adresini göstermek, satırdaki sipariş bilgisini bastırmak gibi) Araçlar → Görsel Tasarım Ek Alanları bölümünde kendi XSLT kod parçanızı tanımlamanızı ister. Tanımladığınız her ek alan, Tasarım Aracı’nda “Kullanıcı Tanımlı” alanlar listesinde görünür ve normal bir alan gibi sürükleyip tasarıma ekleyebilirsiniz.

Birden Fazla İrsaliye Numarasını Yan Yana Yazma

<b>İrsaliye Numaraları</b><br/>
<xsl:for-each select="//n1:Invoice/cac:DespatchDocumentReference">
  <xsl:value-of select="cbc:ID"/>
  <text>-</text>
</xsl:for-each>

Numaranın yanına tarihi de eklemek isterseniz, cbc:IssueDate alanını gün/ay/yıl olacak şekilde parçalayıp aynı döngü içine eklemeniz yeterli:

<xsl:for-each select="//n1:Invoice/cac:DespatchDocumentReference">
  <xsl:value-of select="cbc:ID"/><text>/</text>
  <xsl:for-each select="cbc:IssueDate">
    <xsl:value-of select="substring(.,9,2)"/>.<xsl:value-of select="substring(.,6,2)"/>.<xsl:value-of select="substring(.,1,4)"/>
  </xsl:for-each>
</xsl:for-each>

Ödeme Planı Tarihi

<b>Ödeme Planı Tarihleri</b><br/>
<xsl:for-each select="//n1:Invoice/cac:PaymentMeans/cbc:PaymentDueDate">
  <xsl:value-of select="substring(.,9,2)"/>-<xsl:value-of select="substring(.,6,2)"/>-<xsl:value-of select="substring(.,1,4)"/>
  <text> </text>
</xsl:for-each>

Sevkiyat Hesabı Unvanı, Adresi ve VKN’si

Bu alanlar, fatura detaylarındaki “Sevkiyat Hesabı” alanına vergi/TC kimlik numarası girildiğinde UBL’e BuyerCustomerParty altında ayrı bir kayıt olarak düşer. VKN en kısası:

VKN:
<xsl:value-of select="n1:Invoice/cac:BuyerCustomerParty/cac:Party/cac:PartyIdentification/cbc:ID"/>

Unvan (cac:Person altında ad/soyad parçaları) ve adres (cac:PostalAddress altında cadde, kapı no, ilçe, il) alanları daha uzundur çünkü her alt alanı ayrı ayrı okuyup birleştirmeniz gerekir:

<!-- Sevkiyat unvani / ad-soyad -->
<xsl:for-each select="//n1:Invoice/cac:BuyerCustomerParty/cac:Party">
  <xsl:if test="cac:PartyName">
    <xsl:value-of select="cac:PartyName/cbc:Name"/><br/>
  </xsl:if>
  <xsl:for-each select="cac:Person">
    <xsl:value-of select="cbc:FirstName"/> <xsl:value-of select="cbc:FamilyName"/>
  </xsl:for-each>
</xsl:for-each>

<!-- Sevkiyat adresi -->
<xsl:for-each select="//n1:Invoice/cac:BuyerCustomerParty/cac:Party/cac:PostalAddress">
  <xsl:value-of select="cbc:StreetName"/>
  <xsl:if test="cbc:BuildingNumber"> No:<xsl:value-of select="cbc:BuildingNumber"/></xsl:if>
  <xsl:value-of select="cbc:CitySubdivisionName"/> / <xsl:value-of select="cbc:CityName"/>
</xsl:for-each>

Alıcı / Satıcı / Üretici Kodu (Satır Bazlı)

Bu üç alan InvoiceLine içinde yer aldığı için yalnızca satır tasarımında kullanılabilir:

<!-- Alıcı Kodu -->
<xsl:value-of select="./cac:Item/cac:BuyersItemIdentification/cbc:ID"/>

<!-- Satıcı Kodu -->
<xsl:value-of select="./cac:Item/cac:SellersItemIdentification/cbc:ID"/>

<!-- Üretici Kodu -->
<xsl:value-of select="./cac:Item/cac:ManufacturersItemIdentification/cbc:ID"/>

Kural İle Eklenen Serbest Alanı Tasarımda Gösterme

Logo Connect’ten bir kuralla UBL’e AdditionalDocumentReference olarak serbest bir alan eklediğinizde, bu şu şekilde XML’e düşer:

<cac:AdditionalDocumentReference>
  <cbc:ID>AS-003</cbc:ID>
  <cbc:IssueDate>2026-01-17</cbc:IssueDate>
  <cbc:DocumentType>CARIKOD</cbc:DocumentType>
</cac:AdditionalDocumentReference>

Bunu tasarıma çekmek için, UBL’de birden fazla AdditionalDocumentReference olabileceğini unutmadan, DocumentType değerine göre filtreleyen bir if kısıtı kullanmanız gerekir:

<xsl:for-each select="//n1:Invoice/cac:AdditionalDocumentReference">
  <xsl:if test="cbc:DocumentType = 'CARIKOD'">
    <xsl:value-of select="cbc:ID"/>
  </xsl:if>
</xsl:for-each>
Önemli: DocumentType etiketindeki metin, kuralda ve tasarımdaki if koşulunda birebir aynı yazılmalı. Farklı bir ek alan için farklı bir DocumentType değeri (örn. BELGENO) kullanıp ayrı bir tasarım ek alanı tanımlayarak birden çok serbest alanı karıştırmadan yönetebilirsiniz.

Satırdaki İrsaliye / Sipariş Numarası ve Tarihi

<!-- Satırdaki irsaliye numarası -->
<xsl:for-each select="./cac:DespatchLineReference">
  <xsl:value-of select="./cac:DocumentReference/cbc:ID"/>
</xsl:for-each>

<!-- Satırdaki sipariş numarası (müşteri sipariş no için cbc:ID kullanın) -->
<xsl:for-each select="./cac:OrderLineReference">
  <xsl:value-of select="./cac:OrderReference/cbc:SalesOrderID"/>
</xsl:for-each>

Tarihler için aynı yapıya substring ile gün/ay/yıl parçalama eklenir — yukarıdaki irsaliye tarihi örneğindeki kalıpla birebir aynı mantık kullanılır.

İhracat Faturalarında Navlun / Sigorta Tutarı

İhracat profilindeki (ProfileID = 'IHRACAT') faturalarda navlun ve sigorta bedelleri AllowanceCharge altında, AllowanceChargeReason alanına göre ayırt edilerek tutulur:

<xsl:if test="//n1:Invoice/cbc:ProfileID = 'IHRACAT'">
  <xsl:for-each select="//n1:Invoice/cac:AllowanceCharge">
    <xsl:if test="cbc:AllowanceChargeReason = 'Navlun'">
      <xsl:value-of select="format-number(cbc:Amount, '###.##0,00', 'european')"/>
      <xsl:if test="cbc:Amount/@currencyID = 'TRY'"> TL</xsl:if>
    </xsl:if>
  </xsl:for-each>
</xsl:if>

“Sigorta” için aynı bloğu AllowanceChargeReason = 'Sigorta' koşuluyla tekrarlayın. Dövizli faturada bu tutarın TL karşılığını göstermeniz gerekirse, cbc:Amount değerini cac:PricingExchangeRate/cbc:CalculationRate ile çarparak formatlayabilirsiniz.

Veritabanından Ek Veri Çeken Kurallar (ve Bunları Güvenli Yazmak)

Bazı ihtiyaçlar, faturanın kendi alanlarında değil, veritabanındaki başka bir tabloda karşılığını bulur — İngilizce kod/açıklama, iş yeri adresi, ürün menşei, cari özel kod gibi. Bu kurallar hep aynı iskeleti kullanır: ADODB ile ayrı bir bağlantı açılır, sorgu çalıştırılır, sonuç ilgili alana yazılır.

sub ProcessEvent(App)
  strDBUser   = "kural_kullanici"      ' salt-okunur, sinirli yetkili kullanici
  strDBPass   = "***"                  ' asla acik metin yazmayin
  strDBServer = "SUNUCU_ADI"
  strDBName   = "VERITABANI_ADI"

  Set conn = CreateObject("ADODB.Connection")
  conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" + _
    strDBUser + ";Password=" + strDBPass + ";Initial Catalog=" + strDBName + ";Data Source=" + strDBServer
  conn.Open

  Set rs = CreateObject("adodb.recordset")
  rs.ActiveConnection = conn

  ' -- Ornek: Malzemenin ingilizce kod/aciklamasini LNGEXCSETS'ten okuma --
  ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while ok1
    Ref = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.MASTER_ORGLOGICALREF")
    strQuery = "SELECT A.FIELDCONT,B.FIELDCONT FROM LG_001_LNGEXCSETS A,LG_001_LNGEXCSETS B " & _
               "WHERE A.DOCREF=B.DOCREF AND A.DOCID=1 AND A.LANGID=2 AND A.FIELDID=10 " & _
               "AND B.FIELDID=1 AND A.DOCREF=" & CStr(Ref)
    rs.Open strQuery, conn
    strCode = rs.Fields(0).value
    strDesc = rs.Fields(1).value
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", strCode
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", strDesc
    rs.close
    App.Doc.SaveData
    ok1 = App.Doc.NextChild
  wend

  conn.close
end sub

Aynı iskeletle çözülen diğer örnekler:

  • Cari özel kod alanının PROFILE_ID’ye getirilmesiSELECT PROFILEID FROM LG_001_CLCARD WHERE LOGICALREF = ...
  • İş yeri bazlı adres bilgilerinin e-faturaya getirilmesiSELECT STREET, ROAD, DOORNR, DISTRICT, CITY FROM L_CAPIDIV WHERE FIRMNR=1 AND NR IN (SELECT BRANCH FROM LG_001_03_INVOICE WHERE FICHENO = ...)
  • Ürün menşei / malzeme özel kod1’in satır açıklamasına getirilmesi (ihracat fatura koşullu) — SELECT DEFINITION_ FROM LG_001_SPECODES WHERE ... AND SPECODE IN (SELECT PRODCOUNTRY/SPECODE FROM LG_001_ITEMS WHERE LOGICALREF = ...)
  • E-arşiv faturada malzeme barkodunun satıra getirilmesiUNITBARCODE, ITMUNITA, ITEMS, STLINE ve INVOICE tablolarının LEFT OUTER JOIN ile birleştirilmesiyle malzeme koduna karşılık gelen barkodu bulur.
Güvenlik notu: Bu kuralların hiçbirinde gerçek sunucu adı/şifre kullanmayın — script dosyası okunabilir haldedir. Sorguya yalnızca ihtiyaç duyduğu tabloya SELECT yetkisi olan, ayrı ve sınırlı bir SQL kullanıcısı tanımlayın; sa gibi yönetici yetkili bir hesabı asla kurala gömmeyin.

UQUERY_GETFLD ile Cari Özel Kod 5’in Cari Açıklamaya Yazılması — ayrı bir veritabanı bağlantısı açmadan, Logo Connect’in kendi UQUERY_GETFLD metoduyla da aynı işi yapabilirsiniz:

sub ProcessEvent(App)
  ClCode = App.Doc.FieldAsString("ARP_CODE")
  If ClCode = "CARI-KODUNUZ" Then
    rOk = App.Doc.FirstRoot
    While rOk
      ClOzelCode5 = App.UQUERY_GETFLD(15, "SPECODE5", 16, 52, FALSE, "CODE='"+ClCode+"'")
      App.Doc.ModifyData "ARP_DEF", ClOzelCode5
      rOk = App.Doc.NextRoot
    Wend
  end if
  App.Doc.SaveData
end sub

UQUERY_GETFLD Metodu

UQUERY_GETFLD(portNr, fldName, fldSz, fldType, isDate, whrCls) — Logo Connect’in ayrı bir veritabanı bağlantısı açmadan, Logo’nun kendi tablolarından tek bir alan okumasını sağlayan kestirme yoldur. Parametreler:

  • portNr: Sorgulanacak tabloyu belirten port numarası (aşağıdaki tabloda en sık kullanılanlar var)
  • fldName: Döndürülecek alanın adı
  • fldSz: Döndürülecek alanın boyutu
  • fldType: Alan tipi — BYTE=1, SMALLINT=2, INT=3, REAL=5, DOUBLE=6, EXTENDED=7, STRING=51, CSTRING=52, WSTRING=53
  • isDate: Dönecek alan tarih tipinde mi (TRUE/FALSE)
  • whrCls: SQL WHERE koşulu, metin olarak
PortTablo
1Stok kartları
2Hizmet kartları
5Ambar toplamları
8Stok fişleri
9Stok hareket
12Sipariş fişi
13Sipariş satırı
14Fatura
15Cari hesap kartı
16Cari hesap hareket
18Cari hesap risk rakamları
19Cari hesap toplamlar
20Ödeme planı
21Ödeme planı satırı
23Banka kartı
24Banka hesap
25Banka hareket
27Muhasebe kart
28Muhasebe fiş
29Muhasebe hareket
33Kasa kart
34Kasa hareket
35Çek / senet
38Fiyat listesi
40Özel kod tanımları
42Müstahsil makbuzu
47Sabit kıymet kayıtları
58Sevkiyat bilgileri
60Cari hesap genel toplamları
70Satış elemanları
81Satış fırsatları
83Teklifler
106Çalışan tanımları
111Seri / lot numaraları
117Malzeme tedarikçileri
130Birim setleri tanımları
157Üretim emri
188Üretim reçeteleri
205Kampanya kartları
207Genel gider kartları
226Talep fişi
236Paketleme fişleri
246Geri ödeme planı
293E-Beyanname kayıtları
298Cari hesap teminat mektubu risk bilgileri
305Malzeme özellik setleri
307Malzeme varyantları
316Ürün katalog tanımları
330Banka kredileri kartları
350Garanti kayıtları
355Satınalma siparişi şablon kartı
Bu, Logo Connect’in desteklediği port numaralarının tamamı değil, en sık ihtiyaç duyulanların bir özeti — 350’den fazla port mevcut (üretim/MRP, iş istasyonları, analitik bütçe, ithalat/ihracat dosyaları gibi çok daha uzmanlık gerektiren modüller dahil). İhtiyacınız olan tablo burada yoksa, Logo Connect kural editöründeki alan listesinden ilgili tabloyu arayarak port numarasını bulabilirsiniz.

Kural Koşullarında Kullanılan Operatörler

Kuralın çalışacağı koşulları tanımlarken alan değerlerini karşılaştırmak için aşağıdaki operatörlerden yararlanılır.

GrupOperatörAçıklama
Matematiksel+Toplama
-Çıkarma
*Çarpma
/Bölme
Karşılaştırma=Eşit
<>Eşit değil
>Büyük
>=Büyük eşit
<Küçük
<=Küçük eşit
MantıksalANDTüm şartlar doğru olmalı
OREn az bir şart doğru olmalı
NOTSonucu tersine çevirir
XORYalnızca bir şart doğruysa sonuç doğru
KoşulIFTHENIFTHEN(Koşul?Doğruysa;Yanlışsa)
SWITCHSWITCH(ifade?Değer1=Sonuç1;DeğerN=SonuçN;...)
MetinMIDMID(String,Başlangıç,Bitiş) — belirli aralıktaki karakterleri alır
LENMetnin karakter sayısını verir
%NUMBER='A%' gibi, belirtilen önekle başlıyor mu kontrolü
ÖzelTODAYTerminalin sistem tarihini metin olarak getirir

İki örnek kullanım:

' Fis numarasi 7 karakterse basina 'X', degilse 'Y' ekler
NUMBER = IFTHEN(LEN(NUMBER)=7 ? 'X'+NUMBER ; 'Y'+NUMBER)

' Dokuman izleme numarasina gore harf atar
NUMBER = SWITCH(DOC_NUMBER ? '01'='A' ; '02'='B' ; '03'='D')

CNB Kural Kütüphanesi (Gerçek Üretim Kuralları)

Aşağıdaki 13 kural, gerçek bir Logo Connect kural kütüphanesinden (kod öneki CNB00xx) derlenmiştir — yalnızca e-Fatura, e-Arşiv ve e-İrsaliye ile ilgili olanlar seçilmiştir (sipariş fişi, cari hesap fişi, banka fişi, kasa işlemi, çek/senet bordrosu gibi e-devlet dışı doküman türlerine ait kurallar kapsam dışı bırakılmıştır). Gerçek şifre, e-posta ve IBAN gibi kimlik bilgileri örnek değerlerle değiştirilmiştir.

1. Banka Bilgileri Aktarımı

e-Fatura (Giden) · Onaylanmadan Önce (Giden)

sub ProcessEvent(App)
rOk=App.Doc.FirstRoot
while rOk

DTUR = App.Doc.FieldAsString("TRCURR_GLOBAL_CODE")
App.Doc.ModifyData "NOTES5", "-------------------------------------------------------------------------------------------------"
App.Doc.ModifyData "NOTES6", "--------------Banka Bilgilerimiz----------------------------------------"

IF DTUR="" THEN
App.Doc.ModifyData "NOTES7", "BANKA ADI ŞUBE ADI HESAP ADI ------ TL ------ TR00 0000 0000 0000 0000 0000 00"
App.Doc.ModifyData "NOTES8", "BANKA ADI ŞUBE ADI HESAP ADI"

END IF

IF DTUR="USD" THEN
        App.Doc.ModifyData "NOTES7", "BANKA ADI ŞUBE ADI HESAP ADI ------ USD ------ TR00 0000 0000 0000 0000 0000 00"
        App.Doc.ModifyData "NOTES8", "BANKA ADI ŞUBE ADI HESAP ADI"
         
END IF

IF DTUR="EUR" THEN
        App.Doc.ModifyData "NOTES7", "BANKA ADI ŞUBE ADI HESAP ADI ------ EUR ------ TR00 0000 0000 0000 0000 0000 00"
        App.Doc.ModifyData "NOTES8", "BANKA ADI ŞUBE ADI HESAP ADI"
       
END IF

App.Doc.ModifyData "NOTES11", "-------------------------------------------------------------------------------------------------"

rOk=App.Doc.NextRoot
wend  'MSGBOX(DOKUMANNO)  'App.Doc.ModifyData NOTES1,NOTES1+DOKUMANNO
App.Doc.SaveData
end sub

2. SATIR AÇIKLAMAYA VARYANT EKLEME

e-Fatura (Giden) · Onaylanmadan Önce (Giden)

sub ProcessEvent(App)
    ' ÖRNEK : Fatura satırındaki açıklama alanı üzerinden veri gönderme
   
    'CariKod = App.Doc.FieldAsString("ARP_CODE") ' Bu örneğin sadece bir Cari için (CARI.01 için) çalışmasını istiyoruz.
                                                ' Bu yüzden öncelikle faturadaki carinin ne olduğunu XML üzerinden okuyoruz

    'if CariKod = "CARI.01" then         ' Fatura XML i üzerinden okuduğumuz carinin CARI.01 olup olmadığını kontrol ediyoruz 
    
        okay=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION") ' Faturanın ilk satırına konumlanılıyor. 
    
        while okay      ' Eğer faturanın bir satırı varsa okay değişkeni true(başarılı) sonucunu alıyor.
                        ' bir sonraki satıra her başarılı konumlanmada aşağıdaki while bloğu bir kez dönmektedir.

             sType = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE") ' Satır tipi okunuyor

             if sType = 0 then         ' Eğer satır tipi = 0 ise (malzemeyse) okuma-yazma işlemleri başlıyor

                strLineSpeCode1 = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.VARIANTNAME")   ' istenilen veriler ERP XML i içerisinden okunuyor
                strLineSpeCode2 = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.AUXIL_CODE2")
                strLineDeliveryCode = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.DELVRY_CODE")

                ' Veriler tek bir alan (satır açıklaması) üzerinden aktarılacağı için yukarıda toplanan veriler
                ' birleştiriliyor. Birleştirme esnasında verilerin birbiriyle karışmaması için ";" ayracını yerleştiriyoruz
                strDescription = strLineSpeCode1 '+ ";" + strLineSpeCode2 + ";" + strLineDeliveryCode 

                App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.DESCRIPTION", strDescription   ' birleştirilen veri, DESCRIPTION alanına yazılıyor
             end If
         
             okay=App.Doc.NextChild	 ' bir sonraki satır çağırılıyor. 
                                     ' eğer çağırılabilirse okay = true değeri alıp dönü devam ediyor
                                     ' eğer çağırılamazsa, yani son satırda isek okay = false değeri alır ve döngü sona erer

         wend

        App.Doc.SaveData    ' Yapılan değişiklikler kaydediliyor 
    'end if
end sub

3. SEVKİYAT ADRESİ

e-Fatura (Giden) · Onaylanmadan Önce (Giden)

sub ProcessEvent(App)

    strDBUser   = "sa"                
    strDBPass   = "***"           
    strDBServer = "SRVAPP"  
    strDBName   = "TIGERENTERPRISE"
   
          Set conn = CreateObject("ADODB.Connection")
    conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" + strDBUser + ";Password=" + strDBPass + ";Initial Catalog=" + strDBName+ ";Data Source=" + strDBServer
    conn.Open
    Set rs = CreateObject("adodb.recordset")
    rs.ActiveConnection = conn
    Ref = App.Doc.FieldAsString("SHIPLOC_CODE")
    CLCODE= App.Doc.FieldAsString("ARP_CODE")
    strQuery = "SELECT SEVKADR FROM CNB_EFATURA_SEVKADRES_118 WHERE CODE='" + Ref + "' AND CARIKOD='"+ CLCODE +"'"
     rs.Open strQuery, conn
       strname = rs.Fields(0).value
       App.Doc.ModifyData "NOTES10", "SEVKİYAT ADRESİ: " + strname
     rs.close
                   App.Doc.SaveData
     
                        conn.close          ' ADODB bağlantısı kapatılıyor
end sub

4. Gelen faturadaki bazı verileri boşalt

Fatura · Kaydedilmeden Önce

sub ProcessEvent(App)
  rOk=App.Doc.FirstRoot
  while rOk
    App.Doc.ModifyData "GL_CODE", ""
    App.Doc.ModifyData "PAYMENT_CODE", ""
    App.Doc.ModifyData "SALESMAN_CODE", ""
    App.Doc.ModifyData "OHP_CODE", ""
    App.Doc.ModifyData "PROJECT_CODE", ""
    App.Doc.ModifyData "SHIPLOC_CODE", ""
    ok1=App.Doc.FirstChild("DISPATCHES.DISPATCH")
    while ok1
      App.Doc.ModifyData "OHP_CODE", ""
      App.Doc.ModifyData "PROJECT_CODE", ""
      App.Doc.ModifyData "SHIPLOC_CODE", ""
      App.Doc.ModifyData "PAYMENT_CODE", ""
      App.Doc.ModifyData "SALESMANCODE", ""
      App.Doc.ModifyData "GL_CODE", ""
      ok2=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
      while ok2
        App.Doc.ModifyData "OHP_CODE2", ""
        App.Doc.ModifyData "OHP_CODE1", ""
        App.Doc.ModifyData "PRCLISTREF", 0
        App.Doc.ModifyData "PROJECT_CODE", ""
        App.Doc.ModifyData "SALEMANCODE", ""
        App.Doc.ModifyData "PAYMENT_CODE", ""
        App.Doc.ModifyData "GL_CODE2", ""
        App.Doc.ModifyData "GL_CODE1", ""
        ok2=App.Doc.NextChild
      wend
      ok1=App.Doc.NextChild
    wend
    ok1=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while ok1
      App.Doc.ModifyData "PROJECT_CODE", ""
      App.Doc.ModifyData "OHP_CODE2", ""
      App.Doc.ModifyData "PURCH_GL_CODE", ""
      App.Doc.ModifyData "PRCLISTREF", 0
      App.Doc.ModifyData "OHP_CODE1", ""
      App.Doc.ModifyData "PAYMENT_CODE", ""
      App.Doc.ModifyData "SALEMANCODE", ""
      App.Doc.ModifyData "GL_CODE2", ""
      App.Doc.ModifyData "GL_CODE1", ""
      ok1=App.Doc.NextChild
    wend
    rOk=App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

5. Fatura üzerinde değişiklik yap 1

Fatura · Onaylanmadan Önce

sub ProcessEvent(App)
  qry ="INVOICE.TRANSACTIONS.AsString.TRANSACTION.INVOICE.TYPE=2"
  if App.Doc.RunQuery(qry, false) then
    rOk=App.Doc.FirstRoot
    while rOk
      ok1=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
      while ok1
        App.Doc.ModifyData "DISCEXP_CALC", 1
        App.Doc.ModifyData "MASTER_CODE", ""
        ok1=App.Doc.NextChild
      wend
      rOk=App.Doc.NextRoot
    wend
    App.Doc.SaveData
  end if
end sub

6. Birim setinde kullanılan birimi adet’e çevirir

Fatura · Kaydedilmeden Önce

sub ProcessEvent(App)
    okay=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while okay
         sType = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE")
         if sType = 0 then
            App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.UNIT_CODE", "ADET"
            App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.UNITSET_CODE", "ADET1"
         end if
         okay=App.Doc.NextChild
     wend
    App.Doc.SaveData
end sub

7. Fatura kart tipindeki indirim masraf

Fatura · Kaydedilmeden Önce

sub ProcessEvent(App)
    okay=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while okay
         sType = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE")
         sMaterCode = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_CODE")
         if (((sType = 2) OR (sType = 3)) AND (sMaterCode <> "")) then
            App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", ""
            App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.DISCEXP_CALC", 1
         end if
         okay=App.Doc.NextChild
     wend
    App.Doc.SaveData
end sub

8. Fatura Kural Tanımı

Fatura · Onaylanmadan Önce

'unity login bilgileri
Public const unityUser   = "LOGO"
Public const unityPass   = ""

'ldx login bilgileri
Public const ldxUser      = "LOGO"
Public const ldxPass      = ""


'alıcı logoid
Public const receiverLOGOID = "YJİ"


'Üretici Kodu
Public const speCode = "LOGO"


'Gönderilecek fatura tran kodları
Public const invTrCodes = "2, 3, 7, 8, 14"

function GetADMOwnerDept(UObj, CityCode)

  set qry = uObj.NewQuery
  qStr = "Select DEPARTMENTID from LDX_ADMOWNERS WHERE CITYCODE =  CAST('"&CityCode&"' AS int)"
  AddDebugFile(qStr)
  qry.Statement = qStr
  res = qry.OpenDirect
  res = qry.First
  if res then

     DeptNr = qry.QueryFields(0).Value
     DeptCode = "XXX"

     Select Case DeptNr
       Case 1
          DeptCode = "MAR"
       Case 2
          DeptCode = "ANA"
       Case 3
          DeptCode = "EGE"
     End Select
     AddDebugFile("Bulunan fatura clCode = "&DeptCode)
  end if
  qry.Close
  qry = Empty

  GetADMOwnerDept =DeptCode
end function

function GetFormatedCityCode(CityCode)
  prefix = CityCode
  do while len(prefix) < 3
     prefix = "0"+prefix
  Loop
  GetFormatedCityCode = prefix
end function

function GetFormatedCLCodeNumber(CLNumber)
  prefix = ""
  prefix = CStr(CLNumber)
  do while len(prefix) < 4
     prefix = "0"+prefix
  Loop
  GetFormatedCLCodeNumber = prefix
end function


function GetMaxCLCodeNumber(UObj,FirmNr, DeptCode)

  set qry = uObj.NewQuery
  qStr = "Select MAX(CODE) from " + GetFirmPrefix(FirmNr) + "CLCARD MAIN WHERE (CARDTYPE<>22) AND (CODE LIKE '" & DeptCode & "%')"
  AddDebugFile(qStr)
  qry.Statement = qStr
  res = qry.OpenDirect
  res = qry.First

  TotStr=""
  if res then
     MaxClCode = qry.QueryFields(0).Value
     res = NOT ((isnull(MaxClCode)) OR (MaxClCode = ""))
  end if

  if res then
     MaxClCode = qry.QueryFields(0).Value
     AddDebugFile("Bulunan Max clCode = "&MaxClCode)
     TotStr = ""
     For i = Len(MaxClCode) To 1 Step -1
         a = Mid(MaxClCode, i, 1)
         If isnumeric(a) Then
            TotStr = CStr(a) + TotStr
         Else
            if (Len(TotStr)=0) then
               TotStr = "1"
            end if
            Exit For
         End If
     Next
     TotStr = TotStr + 1
  else
     TotStr="1"
  end if
  qry.Close
  qry = Empty
  AddDebugFile("Kodlamada kullanılacak numara = "&TotStr)
  GetMaxCLCodeNumber=TotStr
end Function

function GetARPCode(UObj, CityCode,FirmNr)
Part1 = GetADMOwnerDept(UObj,CityCode)
Part2 = GetFormatedCityCode(CityCode)
dummystr = GetMaxCLCodeNumber(UObj, FirmNr, Part1)
AddDebugFile("formatlanmamış kullanılacak numara : " & dummystr)
dummystr1 = GetFormatedCLCodeNumber(dummystr)
AddDebugFile("formatlanmış kullanılacak numara : " & dummystr1)
Part3 = dummystr1

dummystr = Part1 & "." & Part2 & "." & Part3

AddDebugFile(dummystr)

GetARPCode = dummystr
end function

'////////////////////////////////////////////////////////////////
'*********************************

function GetFirmPrefix(uFirm)

  prefix = CStr(uFirm)
  do while len(prefix) < 3
     prefix = "0"+prefix
  Loop
  GetFirmPrefix = "LG_"+prefix+"_"

end function



'*********************************

function GetFullPrefix(uFirm, uPeriod)

  prefix = CStr(uFirm)
  do while len(prefix) < 3
     prefix = "0"+prefix
  Loop

  if uPeriod < 10 then
     prefix = prefix + "_0"+ CStr(uPeriod)
  else
     prefix = prefix + "_"+ CStr(uPeriod)
   end if

  prefix = "LG_"+prefix +"_"

  GetFullPrefix = prefix
end function

'*********************************

sub AddDebugFile(str)

    set fso = CreateObject("Scripting.FileSystemObject")
    set ts = fso.OpenTextFile ("c:\Debug.txt", 8, True)
    ts.WriteLine (str)
    ts.Close()
    fso = Null
end sub

'*********************************

sub ProcessEvent(App)
  WorkSpaceNr = 951
  FirmNr = 951
  PeriodNr = 1


  AddDebugFile("****************************************************************")
  AddDebugFile(" !!!  Script Rule  LOGO-SERVER   !!!  Başladı : " & now())
  AddDebugFile("****************************************************************")


  MyArpCode = App.Doc.FieldAsString("ARP_CODE")
  MyclCode = App.Doc.FieldAsString("EXTCLCODE")
  MyclDef = App.Doc.FieldAsString("EXTCLDEF")
  MyclAddr1 = App.Doc.FieldAsString("EXTCLADDR1")
  MyclAddr2 = App.Doc.FieldAsString("EXTCLADDR2")
  MyclTaxNr = App.Doc.FieldAsString("EXTCLTAXNR")
  MyclTaxOffice = App.Doc.FieldAsString("EXTCLTAXOFFICE")
  MyclCity = App.Doc.FieldAsString("EXTCLCITY")
  MyclCityCode = App.Doc.FieldAsString("EXTCLCITYCODE")
  MyclCountry = App.Doc.FieldAsString("EXTCLCOUNTRY")
  MyclCountryCode = App.Doc.FieldAsString("EXTCLCOUNTRYCODE")

  AddDebugFile("gelen faturadaki EXTCLCITYCODE bilgisi : " & MyclCityCode)
  AddDebugFile("gelen faturadaki EXTCLTAXNR bilgisi : " & MyclTaxNr)

  if (MyclCityCode = "") AND (MyclCityCode = null) then
      msgbox("Şehir bilgisi alınamadı!")
      exit sub
  end if

  if (MyclTaxNr = "") AND (MyclTaxNr = null) then
      msgbox("Vergi Numarası alınamadı!")
      exit sub
  end if


  if (MyArpCode = "") AND (MyArpCode = null) then
      msgbox("Cari Hesap alınamadı!")
      exit sub
  end if

  if (MyclCode = "") AND (MyclCode = null) then
      msgbox("Cari Hesap alınamadı!")
      exit sub
  end if

  'if (MyclCode <> MyArpCode) then
  '    msgbox("alınan cari ile fatura carisi uyumsuz!")
  '    exit sub
  'end if

  set uObj =  CreateObject("UnityObjects.UnityApplication")


  if isnull(uObj) then
     msgbox("Logo Objects yaratılamıyor!")
     exit sub
  end if


  if Not uObj.Login(unityUser, unityPass, FirmNr) then                                  'Unity kullanıcı adı şifresi ve firma
     msgbox("Logo Objects Login Err Nr: " & uObj.GetLastError & uObj.GetLastErrorString)
     exit sub
  end if


  if NOT uObj.loggedIn then
     msgbox("Logo Objects ile bağlantı kurulamadı!")
     exit sub
  End if


  set qry = uObj.NewQuery


  qStr = "Select CODE,DEFINITION_,ADDR1,ADDR2,TAXNR, TAXOFFICE, CITY, CITYCODE, COUNTRY,COUNTRYCODE from " + GetFirmPrefix(FirmNr) + "CLCARD MAIN WHERE (CARDTYPE<>22) AND (TAXNR='"&MyclTaxNr&"')"
  AddDebugFile(qStr)


  qry.Statement = qStr


  res = qry.OpenDirect


  res = qry.First

  if res then
     clCode = qry.QueryFields(0).Value
     dummystr= "Bulunan fatura clCode = "&clCode
     AddDebugFile(dummystr)
     App.Doc.ModifyData "ARP_CODE", clCode
     AddDebugFile("Gelen faturadaki cari hesap bilgisi değiştirildi.")
     App.Doc.SaveData
     AddDebugFile("Fatura XML dosyasında yapılan değişiklikler kaydedildi.")
   else


     Set ar_ap = uObj.NewDataObject(30)
     ar_ap.New
     If IsEmpty(ar_ap) Then
        MsgBox("Objects can not create")
        Exit Sub
     End If

     ar_ap.DataFields.FieldByName("ACCOUNT_TYPE").Value = 3

     MyCityCode = MyclCityCode
     MyARPCode = GetARPCode(UObj,MyCityCode, FirmNr)

     ar_ap.DataFields.FieldByName("CODE").Value =MyARPCode

     ar_ap.DataFields.FieldByName("TITLE").Value = MyclDef
     ar_ap.DataFields.FieldByName("ADDRESS1").Value = MyclAddr1
     ar_ap.DataFields.FieldByName("ADDRESS2").Value = MyclAddr2
     ar_ap.DataFields.FieldByName("CITY_CODE").Value = MYclCityCode
     ar_ap.DataFields.FieldByName("CITY").Value = MyclCity
     ar_ap.DataFields.FieldByName("COUNTRY_CODE").Value = MyclCountryCode
     ar_ap.DataFields.FieldByName("COUNTRY").Value = MyclCountry
     ar_ap.DataFields.FieldByName("TAX_ID").Value = MYclTaxNr
     ar_ap.DataFields.FieldByName("TAX_OFFICE").Value = MyclTaxOffice
     'ar_ap.DataFields.FieldByName("TAX_OFFICE_CODE").Value = vergi kodu
     ar_ap.DataFields.FieldByName("CORRESP_LANG").Value = 1
     ar_ap.DataFields.FieldByName("CREDIT_TYPE").Value = 1
     ar_ap.DataFields.FieldByName("RISKFACT_CHQ").Value = 1
     ar_ap.DataFields.FieldByName("RISKFACT_PROMNT").Value = 1
     'ar_ap.DataFields.FieldByName("ORD_RISK_TOTAL").Value = 2827.28
     ar_ap.DataFields.FieldByName("CL_ORD_FREQ").Value = 1
     'ar_ap.DataFields.FieldByName("LOGOID").Value = YJİ
     'ar_ap.DataFields.FieldByName("INVOICE_PRNT_CNT").Value = 1
     ar_ap.DataFields.FieldByName("PURCHBRWS").Value = 1
     ar_ap.DataFields.FieldByName("SALESBRWS").Value = 1
     ar_ap.DataFields.FieldByName("IMPBRWS").Value = 1
     ar_ap.DataFields.FieldByName("EXPBRWS").Value = 1
     ar_ap.DataFields.FieldByName("FINBRWS").Value = 1

     If ar_ap.Post Then
        AddDebugFile("!!! CARİ Hesap EKLENDİ !!!")
        AddDebugFile("Oluşturulan Cari Kodu " & MyARPCode)
        App.Doc.ModifyData "ARP_CODE", MyARPCode
        App.Doc.SaveData

     else
        If ar_ap.ErrorCode <> 0 Then
           MsgBox ("DB Error : (" + CStr(ar_ap.ErrorCode) + ") - " + ar_ap.ErrorDesc)
        Else
           If ar_ap.ValidateErrors.Count > 0 Then
              For i = 0 To ar_ap.ValidateErrors.Count - 1
                  MsgBox ("XML Error : (" + CStr(ar_ap.ValidateErrors.Item(i).ID) + ") - " + ar_ap.ValidateErrors.Item(i).Error)
              Next
           End If
        End If
     End If
     ar_ap = Empty

  end if

  qry.Close
  qry = Empty

  AddDebugFile("****************************************************************")
  AddDebugFile(" !!!  Script Rule - LOGO SERVER !!!   Bitti : " & now())
  AddDebugFile("****************************************************************")

  AddDebugFile("****************************************************************")
  AddDebugFile("****************************************************************")

end sub

9. Varyant Bilgi Boşalt

Fatura · İmzalanmadan/Onaylanmadan Önce

sub ProcessEvent(App)
  rOk=App.Doc.FirstRoot
  while rOk
    ok1=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while ok1
      App.Doc.ModifyData "VARIANTCODE", " "
      App.Doc.ModifyData "VARIANTNAME", " "
      ok1=App.Doc.NextChild
    wend
    rOk=App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

10. SATIŞ ELEMANI

Fatura · Kaydedilmeden Önce

sub ProcessEvent(App)

  sCode = App.Doc.FieldAsString("SALESMAN_CODE")
  sDef  = App.Doc.FieldAsString("SALESMAN_DEF")

  if (sCode<>"") then
    salesman = App.UQuery_GetFld(70, CODE, 24, 52, FALSE, "CODE='"+sCode+"'")
    if (saleman="") then
      App.UQuery_Insert 70, "CODE, DEFINITION_, CARDTYPE, ACTIVE, USERID, FIRMNR, DIVISID, DEPTID, TYP", "'"+sCode+"','"+sDef+"',0,0,1," + CStr(App.FirmNr)+",0,0,0"
    end if
  end if

  okay=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while okay
    sCode = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.SALEMANCODE")
    sDef  = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.SALESMAN_DEF")

    if (sCode<>"") then
      salesman = App.UQuery_GetFld(70, CODE, 24, 52, FALSE, "CODE='"+sCode+"'")
      if (saleman="") then
        App.UQuery_Insert 70, "CODE, DEFINITION_, CARDTYPE, ACTIVE, USERID, FIRMNR, DIVISID, DEPTID, TYP", "'"+sCode+"','"+sDef+"',0,0,1," + CStr(App.FirmNr)+",0,0,0"
      end if
    end if

    okay=App.Doc.NextChild

  wend


end sub

11. FATURA GONDER KURAL

Fatura · İmzalanmadan/Onaylanmadan Önce

sub ProcessEvent(App)

      TBL_ORFICHE = 12
      TBL_ORFLINE = 13
      intFirmNr = App.UObject.CurrentFirm
      intPeriod = App.UObject.ActivePeriod
      tblOrfiche = App.UObject.GetTableName(TBL_ORFICHE, intFirmNr, intPeriod)
      tblOrfline = App.UObject.GetTableName(TBL_ORFLINE, intFirmNr, intPeriod)

  rOk=App.Doc.FirstRoot
  while rOk
    App.Doc.RemoveChild "GL_CODE"
    App.Doc.RemoveChild "PAYMENT_CODE"
    App.Doc.RemoveChild "SALESMAN_CODE"
    App.Doc.RemoveChild "SALESMAN_DEF"
    App.Doc.RemoveChild "OHP_CODE"
    App.Doc.RemoveChild "PROJECT_CODE"
    App.Doc.RemoveChild "SHIPLOC_CODE"
    App.Doc.RemoveChild "ARP_CODE_SHPM"
    App.Doc.RemoveChild "SHIPMENT_TYPE"
    App.Doc.RemoveChild "SHIPPING_AGENT"
    App.Doc.RemoveChild "TRADING_GRP"
    App.Doc.RemoveChild "TRACK_NR"
    App.Doc.RemoveChild "DOC_TRACK_NR"
    App.Doc.RemoveChild "PROJECT_CODE"
    App.Doc.RemoveChild "OHP_CODE"
    App.Doc.RemoveChild "AUXIL_CODE"
    App.Doc.RemoveChild "AUTH_CODE"
    App.Doc.RemoveChild "FRG_TYP_CODE"
    App.Doc.RemoveChild "APPROVE"
    App.Doc.RemoveChild "PAYMENT_LIST"

    strDocNumber = App.Doc.FieldAsString("DOC_NUMBER")
    App.Doc.ModifyData "NUMBER", strDocNumber

    
    ok1=App.Doc.FirstChild("DISPATCHES.DISPATCH")
    while ok1
      App.Doc.RemoveChild "OHP_CODE"
      App.Doc.RemoveChild "PROJECT_CODE"
      App.Doc.RemoveChild "SHIPLOC_CODE"
      App.Doc.RemoveChild "PAYMENT_CODE"
      App.Doc.RemoveChild "SALESMANCODE"
      App.Doc.RemoveChild "GL_CODE"
      App.Doc.RemoveChild "AUXIL_CODE"
      App.Doc.RemoveChild "AUTH_CODE"
      App.Doc.RemoveChild "ARP_CODE_SHPM"
      App.Doc.RemoveChild "TRADING_GRP"
      ok2=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
      while ok2
        App.Doc.RemoveChild "OHP_CODE2"
        App.Doc.RemoveChild "OHP_CODE1"
        App.Doc.RemoveChild "PRCLISTREF"
        App.Doc.RemoveChild "PROJECT_CODE"
        App.Doc.RemoveChild "SALEMANCODE"
        App.Doc.RemoveChild "PAYMENT_CODE"
        App.Doc.RemoveChild "GL_CODE2"
        App.Doc.RemoveChild "GL_CODE1"
        App.Doc.RemoveChild "AUXIL_CODE"
        App.Doc.RemoveChild "DELVRY_CODE"

        ok2=App.Doc.NextChild
      wend
      ok1=App.Doc.NextChild
    wend
    ok1=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while ok1
      App.Doc.RemoveChild "PROJECT_CODE"
      App.Doc.RemoveChild "OHP_CODE2"
      App.Doc.RemoveChild "PURCH_GL_CODE"
      App.Doc.RemoveChild "PRCLISTREF"
      App.Doc.RemoveChild "OHP_CODE1"
      App.Doc.RemoveChild "PAYMENT_CODE"
      App.Doc.RemoveChild "SALEMANCODE"
      App.Doc.RemoveChild "GL_CODE2"
      App.Doc.RemoveChild "GL_CODE1"
      App.Doc.RemoveChild "MASTER_TRACK_TYPE"

      strOrderLineRef = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.ORDER_REFERENCE")
      strOrderLineSiteID = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.ORDER_SITE")
      if strOrderLineSiteID = "" Then strOrderLineSiteID = "0"
      
      If strOrderLineRef <> "" Then
      Set objQry = App.UObject.NewQuery
      strQuery = " SELECT ORF.CUSTORDNO FROM " + tblOrfiche + " ORF WITH(NOLOCK)" + Chr(10)
      strQuery = strQuery + " LEFT OUTER JOIN " + tblOrfline + " ORFL WITH(NOLOCK) ON ORFL.ORDFICHEREF = ORF.LOGICALREF " + Chr(10)
      'strQuery = strQuery + " WHERE (ORFL.LOGICALREF = " + strOrderLineRef + ")"
      strQuery = strQuery + " WHERE (((ORFL.ORGLOGICREF = " + strOrderLineRef + ") AND (ORFL.SITEID = " + strOrderLineSiteID + "))"
      strQuery = strQuery + " OR ((ORFL.LOGICALREF = " + strOrderLineRef + ")AND(ORFL.SITEID = " + strOrderLineSiteID + ")))"
      objQry.Statement = strQuery
      If objQry.OpenDirect Then

      If objQry.First Then
      strOrderFicheNo = objQry.QueryFields.ITEM(0).Value
      Else
      MsgBox "Error occured. Logo Objects Error Nr : " & CStr(objQry.Error)
      End If
      objQry.Close
      End If
      End If
      
        App.Doc.RemoveChild "SL_DETAILS"   
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.MASTER_TRACK_TYPE", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SOURCE_MT_SITEID", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SOURCE_MT_REFERENCE", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SOURCE_SLT_REFERENCE", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SOURCE_QUANTITY", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.IOCODE", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SL_TYP", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SL_CODE", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.MU_QUANTITY", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.QUANTITY", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.UNIT_CONV1", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.UNIT_CONV2", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.DATE_EXPIRED", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.DATA_REFERENCE", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.ORGLOGOID", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.ORGLINKREF", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SL_NAME", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SALESMAN_CODE", ""
        'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SALESMAN_DEF", ""
 
        
      ok1=App.Doc.NextChild
    wend

    App.Doc.ModifyData "DOC_NUMBER", strOrderFicheNo
    rOk=App.Doc.NextRoot

    wend
  App.Doc.SaveData
end sub

12. IRSALİYE KURAL (VERILERI SIL)

İrsaliye · İmzalanmadan/Onaylanmadan Önce

sub ProcessEvent(App)
  rOk=App.Doc.FirstRoot
  while rOk
    App.Doc.ModifyData "SALESMANCODE", ""
    App.Doc.ModifyData "SALESMAN_DEF", ""
    App.Doc.ModifyData "PROJECT_CODE", ""
    App.Doc.ModifyData "ARP_CODE_SHPM", ""
    App.Doc.ModifyData "SHIPMENT_TYPE", ""
    App.Doc.ModifyData "SHIPPING_AGENT", ""
    App.Doc.ModifyData "AUXIL_CODE", ""
    App.Doc.ModifyData "AUTH_CODE", ""
    App.Doc.ModifyData "SHIPLOC_CODE", ""
    App.Doc.ModifyData "TRACK_NR", ""
    App.Doc.ModifyData "FRG_TYP_CODE", ""
    App.Doc.ModifyData "GL_CODE", ""
    App.Doc.RemoveChild "FACTORY"
    App.Doc.RemoveChild "DIVISION"
    App.Doc.RemoveChild "DEPARTMENT"
    App.Doc.RemoveChild "SOURCE_WH"
    App.Doc.RemoveChild "SOURCE_COST_GRP"
    App.Doc.RemoveChild "APPROVE"

     
    ok1=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while ok1
      App.Doc.ModifyData "PROJECT_CODE", ""
      App.Doc.ModifyData "GL_CODE1", ""
      App.Doc.ModifyData "AUXIL_CODE", ""
      App.Doc.RemoveChild "SOURCEINDEX"
      App.Doc.RemoveChild "SOURCECOSTGRP"
      App.Doc.ModifyData "DELVRY_CODE", ""
      App.Doc.ModifyData "GL_CODE2", ""
      App.Doc.ModifyData "SALEMANCODE", ""
      App.Doc.ModifyData "MASTER_TRACK_TYPE", ""
      App.Doc.RemoveChild "TRANSACTIONS.TRANSACTION.SL_DETAILS" 
      ok1=App.Doc.NextChild
    wend
    rOk=App.Doc.NextRoot
  wend
  App.Doc.SaveData

end sub

13. Müşteri Tedarikçi Kodu Kuralı (GoPlus için)

e-Fatura (Giden) · Onaylanmadan Önce (Giden)

sub ProcessEvent(App)
rOk=App.Doc.FirstRoot
 while rOk
      okay=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
      
while okay

Ozelkod=App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_AUXIL_CODE")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ITEM_CUSTOMERCODE", Ozelkod
okay=App.Doc.NextChild
wend
rOk=App.Doc.NextRoot
wend
App.Doc.SaveData ' Yapılan değişiklikler kaydediliyor
end sub

Ek Kural Örnekleri

Gelen Fatura Satırlarındaki Açıklamayı Boşaltma

sub ProcessEvent(App)
  ' Gelen fatura satirlarindaki aciklama alaninin silinmesi
  okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
  while okay
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.DESCRIPTION", " "
    okay = App.Doc.NextChild
  wend
  App.Doc.SaveData
end sub

Açıklama (NOTES4) Alanını Sipariş Numarasına Atama

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    DOKUMANNO = App.Doc.FieldAsString("NOTES4")
    App.Doc.ModifyData "NOTES4", ""
    STLINEOK = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while STLINEOK
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ORDER_FICHENO", DOKUMANNO
      STLINEOK = App.Doc.NextChild("TRANSACTIONS.TRANSACTION")
    wend
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

Raporlama Dövizi Kur/Tutar/Türünün Açıklama Alanına Eklenmesi

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    DOKUMANIZLEMENO = App.Doc.FieldAsString("DOC_TRACK_NR")
    DKUR = App.Doc.FieldAsString("RC_XRATE")
    DTUTAR = App.Doc.FieldAsString("RC_NET")
    App.Doc.ModifyData "RC_XRATE", ""
    App.Doc.ModifyData "NOTES1", "KUR :" + DKUR + " Döviz Tutarı :" + DTUTAR + " " + DOKUMANIZLEMENO
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

İşlem Döviz Bilgilerinin Açıklamaya Eklenmesi (İki Varyant)

Birincisi kur/tutar/dövizi tek satırda birleştirir:

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    DKUR = App.Doc.FieldAsString("TC_XRATE")
    DTUTAR = App.Doc.FieldAsString("TC_NET")
    DTUR = App.Doc.FieldAsString("TRCURR_GLOBAL_CODE")
    NOT4 = App.Doc.FieldAsString("NOTES4")
    App.Doc.ModifyData "NOTES4", NOT4 + " Döviz Bilgileri - KUR:" + DKUR + " TUTAR:" + DTUTAR + " " + DTUR
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

İkincisi, döviz cinsi boşsa hiç yazmayan, TL/döviz ayrımlı hali:

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    DKUR = App.Doc.FieldAsString("TC_XRATE")
    DTUTAR = App.Doc.FieldAsString("TC_NET")
    DTUR = App.Doc.FieldAsString("TRCURR_GLOBAL_CODE")
    NOT5 = App.Doc.FieldAsString("NOTES5")
    IF DTUR = "" THEN
    ELSE
      App.Doc.ModifyData "NOTES5", NOT5 + "Döviz Bilgileri : Döviz Kuru: " + DKUR + " / Döviz Tutarı: " + DTUTAR + " " + DTUR
    END if
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

Ürün/Hizmet Özel Kodunu Malzeme Açıklamasına Ekleme

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    MALHIZACIKLAMA = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_DEF")
    MALOZELKOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_AUXIL_CODE")
    HIZOZELKOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.SALES_SERVICES.SERVICE.AUXIL_CODE")
    App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", ""
    STLINEOK = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while STLINEOK
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", MALHIZACIKLAMA + " " + MALOZELKOD + " " + HIZOZELKOD
      STLINEOK = App.Doc.NextChild("TRANSACTIONS.TRANSACTION")
    wend
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

Fatura Belge No Alanını İrsaliye No’ya Aktarma

Belge no alanını okuyup hem irsaliye numarasına hem orijinal numara alanına yazar, ardından belge no alanını temizler:

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    BELGENO = App.Doc.FieldAsString("DOC_NUMBER")
    App.Doc.ModifyData "DOC_NUMBER", ""
    STFICHEOK = App.Doc.FirstChild("DISPATCHES.DISPATCH")
    while STFICHEOK
      App.Doc.ModifyData "DISPATCHES.DISPATCH.NUMBER", BELGENO
      App.Doc.ModifyData "DISPATCHES.DISPATCH.ORIG_NUMBER", BELGENO
      STFICHEOK = App.Doc.NextChild("DISPATCHES.DISPATCH")
    wend
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub
Bonus — kuralı XML olarak dışa/içe aktarma: Logo Connect kuralları, <RULES><RULE>...</RULE></RULES> yapısında bir XML olarak dışa aktarılabilir. Script’in kendisi bu XML içinde RULE_DATA etiketi altında Base64 ile kodlanmış olarak durur — bir kuralı yedeklemek veya başka bir firmaya taşımak için bu XML dosyasını Logo Connect’in içe aktarma ekranından kullanabilirsiniz.

SQL’den Fatura Tarihine Göre Günlük USD/EUR Kurunu Çekme

Faturanın tarihine göre, Logo’nun kendi döviz kuru tablosundan o günün USD ve EUR alış kurunu okuyup açıklama alanlarına yazar:

sub ProcessEvent(App)
  strDBUser   = "kural_kullanici"
  strDBPass   = "***"
  strDBServer = "SUNUCU_ADI"
  strDBName   = "VERITABANI_ADI"

  Set conn = CreateObject("ADODB.Connection")
  conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" + strDBUser + _
    ";Password=" + strDBPass + ";Initial Catalog=" + strDBName + ";Data Source=" + strDBServer
  conn.Open

  Set rs = CreateObject("adodb.recordset")
  rs.ActiveConnection = conn

  fInvoiceDate = App.Doc.FieldAsString("DATE")
  strQuery = "SELECT REPLACE(CONVERT(VARCHAR(10),RATES2),'.',','), CRTYPE FROM LG_EXCHANGE_515 " & _
             "WHERE CONVERT(NVARCHAR(10),EDATE,104)='" & fInvoiceDate & "' AND CRTYPE IN (1,20)"
  rs.Open strQuery, conn

  do while (rs.EOF = false)
    fBak = rs.Fields(0).value
    fCrType = rs.Fields(1).value
    if fCrType = 1 then
      USDKUR = "Kur USD : " + fBak
    else
      EURKUR = "Kur EUR : " + fBak
    end if
    rs.MoveNext()
  loop
  rs.close

  App.Doc.ModifyData "NOTES5", USDKUR
  App.Doc.ModifyData "NOTES6", EURKUR
  App.Doc.SaveData

  conn.close
end sub

Malzeme Grup Açıklamasını SQL’den Okuyup Koda Yazma (Örnek Şablon)

Bazı entegrasyonlarda, gelen faturadaki malzeme kodunun bir kısmına (örn. ilk birkaç karakterine) göre, o gruba ait açıklamayı özel kod tablosundan (SPECODES) çekip malzeme koduna yazmak gerekebilir. Aşağıdaki şablon bu tekniği gösterir — strQuery içindeki grup kodu ve firma numarasını kendi sisteminize göre değiştirmeniz gerekir:

sub ProcessEvent(App)
  strDBUser   = "kural_kullanici"
  strDBPass   = "***"
  strDBServer = "SUNUCU_ADI"
  strDBName   = "VERITABANI_ADI"

  Set conn = CreateObject("ADODB.Connection")
  conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" + strDBUser + _
    ";Password=" + strDBPass + ";Initial Catalog=" + strDBName + ";Data Source=" + strDBServer
  conn.Open
  Set rs = CreateObject("adodb.recordset")
  rs.ActiveConnection = conn

  rOk = App.Doc.FirstRoot
  while rOk
    ' Firmanizin tekil bir kayit numarasini (orn. vergi no) SND alanindan okuyup
    ' aciklama alanina ek bilgi (orn. Mersis No) eklemek isterseniz buraya yazabilirsiniz.

    STLINEOK = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while STLINEOK
      strQuery = "SELECT SPECODES.DEFINITION_ FROM LG_001_ITEMS ITEMS " & _
                 "LEFT JOIN LG_001_SPECODES SPECODES ON ITEMS.STGRPCODE = SPECODES.SPECODE " & _
                 "AND CODETYPE = 4 WHERE CODE LIKE 'GRUP-KODU%'"
      rs.Open strQuery, conn
      strEkAciklama = ""
      IF rs.EOF = false THEN
        strEkAciklama = rs.Fields(0).value
      END IF
      App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", strEkAciklama
      rs.close
      STLINEOK = App.Doc.NextChild("TRANSACTIONS.TRANSACTION")
    wend
    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
  conn.close
end sub

Cari Koda ve İrsaliye Özel Koduna Göre Çoklu Koşullu Kural (Şablon)

Farklı müşteriler için farklı davranış gerektiğinde (örneğin bir müşteride sipariş no zorunlu, başka bir müşteride sabit bir değer atanacak; irsaliye özel koduna göre farklı bir e-posta adresine bildirim gidecek), kural içinde birden fazla IF bloğu birlikte kullanılabilir. Aşağıdaki şablon bu deseni gösterir — gerçek cari kodları, firma adlarını ve e-posta adreslerini kendi verilerinizle değiştirin:

sub ProcessEvent(App)
  rOk = App.Doc.FirstRoot
  while rOk
    CariKod = App.Doc.FieldAsString("ARP_CODE")
    DokumanNo = App.Doc.FieldAsString("DOC_TRACK_NR")

    Irs = App.Doc.FirstChild("DISPATCHES.DISPATCH")
    while Irs
      IrsaliyeOzelKod = App.Doc.FieldAsString("AUXIL_CODE")
      Irs = App.Doc.NextChild
    wend

    okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
    while okay
      IF CariKod = "CARI-KODU-1" THEN
        IF DokumanNo = "" THEN
          MSGBOX ("Bu müşteri için Doküman No alanı zorunludur.")
        else
          App.Doc.ModifyData "ORDER_FICHENO", DokumanNo
        end if
      END if
      IF CariKod = "CARI-KODU-2" THEN
        App.Doc.ModifyData "ORDER_FICHENO", "SABIT-DEGER"
      END IF
      okay = App.Doc.NextChild
    wend

    IF CariKod = "CARI-KODU-3" THEN
      IF IrsaliyeOzelKod = "GRUP-A" OR IrsaliyeOzelKod = "GRUP-B" THEN
        IF IrsaliyeOzelKod = "GRUP-A" THEN
          App.Doc.ModifyData "ARP_EMAILADDR", "grup-a@sirketiniz.com"
        END IF
        IF IrsaliyeOzelKod = "GRUP-B" THEN
          App.Doc.ModifyData "ARP_EMAILADDR", "grup-b@sirketiniz.com"
        END IF
      ELSE
        MSGBOX ("Hatalı irsaliye özel kodu girişi: " + IrsaliyeOzelKod)
      END IF
    END IF

    rOk = App.Doc.NextRoot
  wend
  App.Doc.SaveData
end sub

Kural Yazarken Genel Tavsiyeler

  • Yeni bir kuralı doğrudan canlı firmada değil, test/deneme firmasında deneyin.
  • Kuralı “Öncelik” ve “Olay” (Onaylanmadan Önce / Sonra, Hazırlanmadan Önce vb.) alanlarıyla doğru sıraya oturtun — sıralama yanlışsa kural beklenmedik sonuç verebilir.
  • RemoveChild gibi veri silen kurallarda kısıt (koşul) eklemeyi unutmayın; koşulsuz kural tüm belgeleri etkiler.
  • UBL’e yazdığınız her ek alanın tasarımda da karşılığı olduğundan emin olun — kural veriyi taşır, görünürlüğü tasarım sağlar.
  • Veritabanı bağlantılı kurallarda gerçek sunucu bilgisi/şifre kullanmayın, sınırlı yetkili ayrı bir SQL kullanıcısı tanımlayın.
Bu Yazıya Tepkiniz Ne Oldu?
  • 0
    be_endim
    Beğendim
  • 0
    alk_l_yorum
    Alkışlıyorum
  • 0
    e_lendim
    Eğlendim
  • 0
    d_nceliyim
    Düşünceliyim
  • 0
    _rendim
    İğrendim
  • 0
    _z_ld_m
    Üzüldüm
  • 0
    _ok_k_zd_m
    Çok Kızdım

Logo destek, logo gowings, logo tiger3, logo muhasebe, logo gowings eğitim, logo tiger eğitim, logo connect, logo kural yazma, logo connect kural, logo sql, logo raporlama, logo rapor tasarımı, logo sqlinfo, bordro plus, ik, puantaj

Yazarın Profili

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir