Entwicklungs-Richtlinien

Aus TRENZ PartnerNet
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Grundlegendes

  • Lange/Komplexe Trigger vermeiden. Die Zyklomatische Zahl oder die Maintenance Complexity geben einen guten anhaltspunkt, ob eine Funktion einfach genug ist oder in kleiner teilstückt aufgeteilt werden sollte.
  • Möglichst viel in Prozeduren und Methoden auslagern
  • Nestlevel in Triggern auf 1 reduzieren
  • Trigger komplett in Funktion auslagern, sodass dieser bei Bedarf von deren Prozeduren aufgerufen werden kann kann
  • Wenn möglich immer Using nutzen
  • Die ELA v2 bietet die Möglichkeit für "Queue" für Befehlsabarbeitung, sodass Berechnungen etc. erst am Ende des Triggers in einem Zyklus abgearbeitet werden.
  • Feldfunktionen müssen auch im Trigger ausgeführt werden. Die Berechnung darf NICHT nochmal separat geschehen, sondern es muss dieselbe Funktion wieder verwendet werden. Damit werden ggf. auftretende Abweichungen vermieden.

zukünftig geplant

Hierbei handelt es sich im geplante Änderungen in der ELA v2.

  • Disposed von der ELA, Löst den Bezeichnungtrigger von veränderten Container automatisch auf.

Verzeichnissstruktur eines Assembly Projekts:

  • _global
    • ELA.cs (Einzellne ELA Datei oder auch Klassenweise mehrere Dateien)
  • _Default
    • ContainerTypName
      • dContainerTypName.cs (Datei für Überladungen der jeweiligen Klasse)
      • ContainerTypName_ButtonProzedurName.cs
      • ContainerTypName_FunktionsName.cs
      • Update_LocalKatName.cs (Trigger {Insert/Update}_{Name der Kategorie})
  • Zcontainer
    • Insert.cs
    • Delete.cs
  • X_Zcontainer
    • Update.cs

ContainerTypName_ButtonProzedurName.cs

namespace ELA._Default
{
    public partial class dContainerTypName
    {
        [SqlProcedure]
        public static void ContainerTypName_ButtonProzedur(int container_id, int userid)
        {
            using (ELDatas _eldata = ELDatas.Open(userid))
            {
                _eldata.Log.LogProcedureBegin();
 
                // todo
 
                _eldata.Log.LogProcedureEnd();
            }
        }
    };
}

dContainerTypName.cs

namespace ELA._Default
{
    public partial class dContainerTypName
    {
    }
}

ContainerTypName_FunktionsName.cs

namespace ELA._Default
{
    public partial class dContainerTypName
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="c67">Firma#</param>
        /// <returns></returns>
        [Microsoft.SqlServer.Server.SqlFunction]
        public static SqlString ContainerTypName_FunktionsName(int c67)
        {
        }
    };
}

Update_LocalKatName.cs

namespace ELA._Default
{
    public partial class dContainerTypName
    {
        [Microsoft.SqlServer.Server.SqlTrigger(Target = "zz_xx_0", Event = "FOR UPDATE")]
        public static void dContainerTypName_Update_KatName()
        {
            using (ELDatas _eldata = ELDatas.Open())
            {
                _eldata.SetBezeichnungWhereUpdated<dContainerTypName>();
 
                if (_eldata.GetTriggerNestlevel() > 1) return;
 
                _eldata.Log.LogTriggerBegin();
 
                foreach (var item in _eldata.GetInserted_ZZTrigger<dContainerTypName>())
                {
                    item.Update_KatName();
                    item.SaveQueueAdd(); // Wenn etwas verändert wurde, wird es in die Speicherqueue eingereiht.
                }
 
                dContainerTypName.SaveQueueApply(_eldata); // Alle dContainerTypName in der Speicherqueue werden gespeichert.
 
                _eldata.Log.LogTriggerEnd();
            }
        }
 
        public void Update_KatName()
        {
            // ToDo Berechnungen 
        }
 
        [BezeichnungsAttribute(ELFields.dContainerTypName_mText1, ELFields.dContainerTypName_mText2))]
        public void dContainerTypName_Bezeichnung()
        {
            this.Bezeichnung = string.Format("{0} - {1}", this.mText1, this.mText2);
        }
    }
}
Meine Werkzeuge