28 Ağustos 2019 Çarşamba

Üretim operasyonunu planlama projesi | Dynamics Ax

Üretim operasyonunda üretim ve iş merkezi bazlı sürelerin hesaplanması

Üretimde her bir iş emrinde harcanan süreyi ve sonrasında iş merkezi bazlı raporlanması için bir proje istenildi. 

Bunun için yapmamız gerekenlerden bir tanesi ProdId ile ilişkili bir tablo oluşturmak olacak.
Ben burada DRT_ProdOpReportTrans adında bir tablo oluşturdum ve ProdTable ile ilişkilerini aşağıdaki gibi düzenledim.




Her bir adımın sayılması için Sayı alanını, Üretimin başlangıç bitiş saatlerini, Üretimdeki duruşların girilmesi için Duruş kodu alanını ve iş merkezi alanını tabloya ekledim. Bunların dışında işlemlerin gerçekleşmesi hangi üretim üzerinde çalışılıyorsa onların bilgisi ve başlangıç bitiş saatleriyle hesaplama yapılacak olan Toplam Brüt, Duruş ve Toplam net süreleri ekledim.




Sayıyı 1 arttırmak için DRT_ProdOpReportTrans tablosunun methods'una aşağıdaki gibi kodları yazıyoruz.



1
public void initValue()
{
    super();

    this.Num = 1 + this.lastNum();
    this.TransDate = dateEndMth(systemdateget());

}
2
int lastNum()
{
    return (select maxof(Num) from DRT_ProdOpReportTrans).Num;
}
3
static Integer  Num(ProdId prodId)
{
    return (select maxof(Num) from DRT_ProdOpReportTrans
                index hint ProdIdx
                where DRT_ProdOpReportTrans.ProdId == prodId).Num;
}

Sonrasında oluşturmuş olduğumuz formun methods'una da aşağıdaki kodu yazıyoruz.


void Num()
{
    i = i+1;
}

Oluşturduğumuz formda yazacağımız kodların bölümler aşağıdaki gibi. incelemekte fayda var.



Saatin düzgün hesaplanmasını sağlamak için, Formun methods'una aşağıdaki gibi bir kod yazıyoruz.




public void init()
{
    super();

   if (DRT_ProdOpReportTrans.End == NoYes::No && DRT_ProdOpReportTrans.Start == NoYes::No)
   {
    DRT_ProdOpReportTrans.StopHour =  (DRT_ProdOpReportTrans.EndHour - DRT_ProdOpReportTrans.StartHour) / 3600;
   }

  else
   {
    DRT_ProdOpReportTrans.StopHour =  (DRT_ProdOpReportTrans.EndHour - DRT_ProdOpReportTrans.StartHour) * 0;
   }
}
DataSourcw'daki aktive'ıne aşağıdaki kodu yazarak kaydın durumuna göre alanların pasif ya da aktif olmasını sağlıyoruz.
public int active()
{
    int ret;
    DRT_ProdOpReportTrans   prodOpReportTrans;
    ProdTable               ProdTable;

    ret = super();

   if (DRT_ProdOpReportTrans.Num < DRT_ProdOpReportTrans::Num(DRT_ProdOpReportTrans.ProdId) || (DRT_ProdOpReportTrans.End == NoYes::Yes))
      {
        OpEnd.enabled(false);
        DRT_ProdOpReportTrans_ds.allowCreate(false);
        DRT_ProdOpReportTrans_ds.allowEdit(false);
      }

    else
      {
         OpEnd.enabled(true);
         DRT_ProdOpReportTrans_ds.allowCreate(true);
         DRT_ProdOpReportTrans_ds.allowEdit(true);
      }

   if (DRT_ProdOpReportTrans.Num < DRT_ProdOpReportTrans::Num(DRT_ProdOpReportTrans.ProdId) || (DRT_ProdOpReportTrans.End == NoYes::Yes || DRT_ProdOpReportTrans.Start == NoYes::Yes ))
      {
        OpEnd.enabled(false);
      }

     else
      {
         OpEnd.enabled(true);
         DRT_ProdOpReportTrans_ds.allowCreate(true);
      }

    while select firstonly prodOpReportTrans
            where DRT_ProdOpReportTrans.End == NoYes::Yes // DRT_ProdOpReportTrans.ProdId  == ProdTable.ProdId && DRT_ProdOpReportTrans.Num > 1
    {
      {
        DRT_ProdOpReportTrans_ds.allowEdit(false);

      }

     if (DRT_ProdOpReportTrans.Num > DRT_ProdOpReportTrans::Num(DRT_ProdOpReportTrans.ProdId) && DRT_ProdOpReportTrans.End == NoYes::Yes)

      {
        DRT_ProdOpReportTrans_ds.allowEdit(false);

     }
    else
     {
        DRT_ProdOpReportTrans_ds.allowEdit(true);

     }
   }
   if (DRT_ProdOpReportTrans.Num < DRT_ProdOpReportTrans::Num(DRT_ProdOpReportTrans.ProdId))
      {
        DRT_ProdOpReportTrans_ds.allowDelete(false);
      }

     else
      {
        DRT_ProdOpReportTrans_ds.allowDelete(true);
      }

   if (DRT_ProdOpReportTrans.Start == NoYes::Yes)
      {
         DRT_ProdOpReportTrans_ds.object(fieldnum(DRT_ProdOpReportTrans, End)).allowEdit(false);
         DRT_ProdOpReportTrans_ds.object(fieldnum(DRT_ProdOpReportTrans, StopId)).allowEdit(false);
         DRT_ProdOpReportTrans_ds.object(fieldnum(DRT_ProdOpReportTrans, EndHour)).allowEdit(false);
         DRT_ProdOpReportTrans_ds.object(fieldnum(DRT_ProdOpReportTrans, StartHour)).allowEdit(true);
      }

     else
      {
        DRT_ProdOpReportTrans_ds.object(fieldnum(DRT_ProdOpReportTrans, EndHour)).allowEdit(true);
      }

   if (DRT_ProdOpReportTrans.End == NoYes::Yes)
       {
         DRT_ProdOpReportTrans_ds.object(fieldnum(DRT_ProdOpReportTrans, Start)).allowEdit(false);
         DRT_ProdOpReportTrans_ds.object(fieldnum(DRT_ProdOpReportTrans, StartHour)).allowEdit(false);
       }

   if (DRT_ProdOpReportTrans.Start == NoYes::No && DRT_ProdOpReportTrans.End == NoYes::No)
       {
         DRT_ProdOpReportTrans_ds.object(fieldnum(DRT_ProdOpReportTrans, StopId)).allowEdit(true);
         DRT_ProdOpReportTrans_ds.object(fieldnum(DRT_ProdOpReportTrans, StartHour)).allowEdit(true);
       }

     else
       {
         DRT_ProdOpReportTrans_ds.object(fieldnum(DRT_ProdOpReportTrans, StopId)).allowEdit(false);
       }


    return ret;
}

Create böülümünde kayıt oluşturulurken ilgili alanların istenilen şekilde dolmasını sağlıyoruz.


public void create(boolean _append = false)
{
    DRT_ProdOpReportTrans   ProdOpReportTrans;
    ProdTable               ProdTable;
    super(_append);

    DRT_ProdOpReportTrans.TransDate =  systemdateget();
    DRT_ProdOpReportTrans.WrkCtrId  =  ProdRoute::findFirst(DRT_ProdOpReportTrans.ProdId).WrkCtrId;

    DRT_ProdOpReportTrans.Num          =  DRT_ProdOpReportTrans::Num(DRT_ProdOpReportTrans.ProdId) + 1;
    DRT_ProdOpReportTrans.QtySched     =  ProdTable::find(DRT_ProdOpReportTrans.ProdId).QtySched;
    DRT_ProdOpReportTrans.InventDimId  =  ProdTable::find(DRT_ProdOpReportTrans.ProdId).InventDimId;

    if  ((DRT_ProdOpReportTrans::Num(DRT_ProdOpReportTrans.ProdId)) < 1)
    {
      DRT_ProdOpReportTrans.Start     =  NoYes::Yes;
    }

    if  ((DRT_ProdOpReportTrans::Num(DRT_ProdOpReportTrans.ProdId)) > 1)
    {
      DRT_ProdOpReportTrans.Start     =  NoYes::No;
      DRT_ProdOpReportTrans.StartHour  = 0;
    }

}

ValidateWrite'a yazdığımız kodlar belirlenen koşullarda kayıtlara güncelleme yaptırmaya izin verir, yoksa kayıt ettirmez.


public boolean validateWrite()
{
    boolean     ret;
;

    if (DRT_ProdOpReportTrans.TransDate < ProdTable::find(DRT_ProdOpReportTrans.ProdId).SchedStart)

        return checkfailed (strfmt(" %1 Üretimin başlangıç tarihinden önce olamaz! %2",
                             ProdTable::find(DRT_ProdOpReportTrans.ProdId).ProdId, ProdTable::find(DRT_ProdOpReportTrans.ProdId).SchedStart));

    ret = super();

    return ret;
}

Bu operasyonu da bitirmek için buton eklendi ve click method'unda aşağıdaki Formun methods'una yazdığımız kod çağrıldı

.
void OpEnd()
{
    Dialog                  d = new Dialog(strfmt("%1 üretimi bitirme", DRT_ProdOpReportTrans.ProdId));
    DialogField             dlgEndHour;
    DialogGroup             dlgGroup;
    boolean ret = true;
    ;

    dlgGroup = d.addGroup("Üretimi bitir");
    dlgGroup.widthMode(FormWidth::ColumnWidth);
    dlgGroup.heightMode(FormHeight::ColumnHeight);
    dlgEndHour  = d.addField(typeid(SchedFromTime), "Bitiş saati");
    dlgEndHour.value(DRT_ProdOpReportTrans.ProdId);

    if  ((dlgEndHour.value(DRT_ProdOpReportTrans::StartHour(DRT_ProdOpReportTrans.ProdId)) > DRT_ProdOpReportTrans::EndHour(DRT_ProdOpReportTrans.ProdId)))
     {
         ret = checkfailed  ("Üretimin başlangıç saatinden önce olamaz!");
     }

     else
    if (DRT_ProdOpReportTrans)
    {
        d.run();
        if (d.closedOk())
        {
            ttsbegin;
                DRT_ProdOpReportTrans.EndHour = dlgEndHour.value();
                DRT_ProdOpReportTrans.End     = NoYes::Yes;
                DRT_ProdOpReportTrans.Update();
            ttscommit;

            DRT_ProdOpReportTrans_ds.research(true);
        }
    }
    else
        throw warning ("Öncelikle bir satır seçmelisiniz!");


Böylelikle bir üretim için operasyon süreleri sonlandırılmış oldu. Harcanan süreleri hesaplamak için yapmamız gerekenler de aşağıdaki gibi.

Toplam brüt süreyi hesaplamak için Operasyonun başladığı saatten bittiği saate kadar olan süreyi çıkardığımızda sonucu elde etmiş oluruz.

Başlangıç saatlerini aşağıdaki kodla alabiliriz. Birden fazla başlama olabilir.



display real dispStartProdHour()
{
    DRT_ProdOpReportTrans DRT_ProdOpReportTrans;

    select sum(StartHour) from DRT_ProdOpReportTrans
    where DRT_ProdOpReportTrans.ProdId == this.ProdId  && DRT_ProdOpReportTrans.Start == Noyes::Yes;
    return DRT_ProdOpReportTrans.StartHour;
}

Bitiş saatini de aşağıdaki kodla alabiliriz.



display real dispEndProdHour()
{
    DRT_ProdOpReportTrans   DRT_ProdOpReportTrans;
    select sum(EndHour) from DRT_ProdOpReportTrans
        where DRT_ProdOpReportTrans.ProdId == this.ProdId && DRT_ProdOpReportTrans.End == NoYes::Yes;
        return DRT_ProdOpReportTrans.EndHour;
}

Bitiş saatinden başlangıç saatini çıkardığımızda bu operasyonda geçen Toplam brüt süreyi elde ederiz.



server display Hours TotalTime()
{
    DRT_ProdOpReportTrans   ProdOpReportTrans;
    Hours   hours = 0;
    ;

    while select ProdOpReportTrans
            index hint ProdLineIdx
            where ProdOpReportTrans.ProdId     == this.ProdId
      if(ProdOpReportTrans.End == NoYes::Yes || ProdOpReportTrans.Start == NoYes::Yes )
      {
        hours = (ProdOpReportTrans.dispEndProdHour() - ProdOpReportTrans.dispStartProdHour()) / str2Time('00:60');
      }

   return hours;
}



Hiç yorum yok:

Yorum Gönder

Total ciro

static void MAA_SalesTableTotal(Args _args) { SalesTable SalesTable; utcDateTime dateTime; dateTime ...