Skrypt w Strukturze obliczający wielkość wsadu

wpis w: Przykłady C#, t-sql | 0

Poniżej znajduje się kod skryptu dla obiektu BOM (Struktura), który na podstawie ilości składników wyjściowych oblicza ilość składnika wyjściowego, czyli tym samym wielkość wsadu Struktury. Dodatkowo obliczona wielkość wsadu jest wstawiana jako Ilość jednostek / Proces w normach operacji technologicznych.

Skrypt tworzony jest w zakładce Systemowe \ Obiekty biznesowe wybierając BOM na zakładce Zdarzenia.

using System.Linq;
using System.Windows;
using Worm;
using Worm.Authentication;
using Worm.Ui.Wpf;
using Worm.Ui.Core;
using Worm.Ui.Wpf.Forms;
using Worm.Ui.Wpf.Views;

public override void OnObjectUpdating (object sender, ObjectChangingEventArgs args) {
    if(args.IsRemote) return;
    var result = args.Result;
    var bom = args.DbObject as Unicore.Manufacture.Business.BOM;
    bom.BatchSize = 0;
    foreach (var line in bom.Lines.Where(l => l.Type != Unicore.Manufacture.Business.BOMLineType.RoutingLine && l.Input == true))
        bom.BatchSize += line.IssuePlanQty;

       var outputLine =
           bom.Lines.Where(l => l.Type == Unicore.Manufacture.Business.BOMLineType.IssueLine && l.ItemId == bom.ItemId && l.Output == true).FirstOrDefault();
       if (outputLine != null)
      	{
      		outputLine.Quantity = bom.BatchSize;
      		result.AddInfo("Ustawiono wielkość wsadu Struktury "+bom.Shortcut+": "+bom.BatchSize.ToString("n4"));
      	}
    foreach(var process in bom.Lines.Where(p => p.Type == Unicore.Manufacture.Business.BOMLineType.RoutingLine))
    {
    	var routingLine = Unicore.Manufacture.Business.RoutingLine.Get(process.Id);
    	if(routingLine != null)
    	{
    		decimal laborHours = 0.0m;
    		foreach(var operation in routingLine.Operations)
    		{
	    		laborHours += operation.LaborHours;
    		}
    		foreach(var norm in process.Norms)
    		{
	    		norm.ItemsProcess = bom.BatchSize;
	    		norm.ProcessHours = laborHours;
    			norm.Save();
    		}
    	}
    }
}