RSS

Etiket arşivi: Workflow

Microsoft Dynamics AX İş akışı (Workflow) kategorisi

İş akışlarında boş pozisyon değerlerinin atlanarak iş akışının bir sonraki pozisyona gönderilmesi

Merhaba,

İş akışlarında bugün karşılaştığım bir durumu ve buna uyguladğım çözümü paylaşmak istiyorum. Müşterimde iş akışlarında genel olarak hiyerarşi modeli kullanılmaktadır. Bu model ile iş akışında onay adımları kullanıcının durdurma kuralına göre uyuşan tüm üst seviyedeki yöneticileri için oluşmaktadır. Kullanıcının üst seviyedeki yöneticilerinden birisinin işten ayrılması sonucu ilgili pozisyon boş kalabilmekte ve iş akışlarında “pozisyon bulunamadı” ya da “kullanıcı bulunamadı” vb hatalar görülmektedir. Bu boş pozisyonun AX tarafından algılanmayıp bir sonraki pozisyondaki kullanıcıyı bulması için aşağıda adımları belirtilen değişiklikleri yaptım. Testlerim sonucu çalışıyor görünüyor.

1- AOT –> Classes –> WorkflowLimitHierarchyProvider

2- Yeni butonu ile aşağıdaki metodu ekledim.


// Changed on 10 Oca 2012 at 13:11:29 by mesut
// Eğer bir pozisyonda çalışan yoksa bir üst pozisyona bakar.
public HRPPartyPositionTableRelationship getNextPositionTable(HRPPartyPositionTableRelationship _positionTable)
{
HRPPartyPositionTableRelationship positionTable;

ValidFromDateTime _perDate = DateTimeUtil::getSystemDateTime();
;

if (_positionTable.RecId == 0)
{
throw error("@SYS119263"); // employee not found
}

select firstonly positionTable where positionTable.PositionId == _positionTable.ReportsToPosition
&& positionTable.hrmReferenceType == HRMVirtualNetworkReferenceType::Employee
&& positionTable.ValidFromDateTime <= _perDate
&& positionTable.ValidToDateTime   >= _perDate
&& positionTable.ReportsToPosition != "";

if (positionTable.RecId == 0)
{
throw error("@SYS119263"); // postion not found
}

if(positionTable.Reference)
return positionTable;
else
return this.getNextPositionTable(positionTable);
}

3 – WorkflowLimitHierarchyProvider.getNode() metodunda aşağıdaki eklemeyi yaptım.


private WorkflowLimitHierarchyProviderNode getNode(PositionId _position, WorkflowHierarchyLevel _level)
{
ExpressionDataSource nodeDataSource;
HRPLimitTableMap limitMapTable;
HRPLimitTypeTable limitTypeTable;
HRPPartyPositionTableRelationship positionTable;
HRPPartyJobTableRelationship jobTable;
userId user;
WorkflowHierarchyLevel level = _level + 1;
FromDateTime _perDate = DateTimeUtil::getSystemDateTime();
;

positionTable = HRPPartyPositionTableRelationship::find(_position);

// ETG MB start 10012012 ----------------------------> THIS SECTION WAS ADDED AS A NEW<-----------------------
if(!positionTable.Reference)
{
positionTable = this.getNextPositionTable(positionTable);
}
// ETG MB end ----------------------------> THIS SECTION WAS ADDED AS A NEW<-----------------------

if (positionTable.RecId == 0)
{
throw error("@SYS119263"); // position not found
}

if (positionTable.hrmReferenceType != HRMVirtualNetworkReferenceType::Employee)
{
throw error("@SYS120049"); // Employee Type not found
}

user = SysCompanyUserInfo::emplId2UserId(positionTable.Reference);
if (!user)
{
throw error("@SYS119264"); // user not found
}

jobTable = HRPPartyJobTableRelationship::find(positionTable.JobId);
if (jobTable.RecId == 0)
{
throw error("@SYS119262"); //job not found
}

nodeDataSource = ExpressionDataSource::newDataSourceValue(dataSource.parmName());
nodeDataSource.addField(ExpressionField::newFieldValue(#Workflow_PositionTitle, extendedtypestr(PersonTitle), positionTable.Title));
nodeDataSource.addField(ExpressionField::newFieldValue(#Workflow_JobTitle, extendedtypestr(PersonTitle), jobTable.Title));
nodeDataSource.addField(ExpressionField::newFieldValue(#Workflow_LineManagerLevel, extendedtypestr(WorkflowHierarchyLevel), level));

while select limitTypeTable
{
limitMapTable = HRPLimitTableRelationship::getActiveLimitEmpl(limitTypeTable.LimitId, positionTable.Reference);
nodeDataSource.addField(ExpressionField::newFieldValue(#Workflow_Limit + limitTypeTable.LimitId, extendedtypestr(HRPLimitValue), limitMapTable.LimitValue));
}

return WorkflowLimitHierarchyProviderNode::newProviderNode(
positionTable.Reference,
user,
level,
nodeDataSource);
}

NOT: Yazıda belirtilen kodun, değiştirilmeden veya değiştirilerek, development/test/canlı ortamlarında kullanılması sonucu oluşabilecek olumlu/olumsuz durumlarda tüm sorumluluk kodu kullanan kişiye aittir.

Mesut BOZTAŞ

Dynamics AX ERP Danışmanı ve
İstanbul Ticaret Üni. Y.Lisans öğrencisi

İstanbul 2012

http://www.etg-it.com

Reklamlar
 

Etiketler: , , ,

Iphone üzerinden Dynamics AX İş akışlarının(workflow) onayı

Merhaba,

İş akışlarını yoğun olarak kullanan işletmeler genel olarak iş akışlarını satış ve satınalma süreçlerindeki işlemlerde kullanırlar. Bu birimlerde çalışan kişiler vakitlerinin çoğunu işlerinin doğasından dolayı ofis dışında geçiren çalışanlardır. Hal böyleken ofis dışındayken Dynamics Ax ta çalışanların üzerinde bekleyen onayların bir mobil cihaz üzerinden onaylama ihtiyacı işletmede hat safhada olabilmektedir.

Bugünlerde apple storede bu talep için bir uygulama yayınlandı. Bu uygulama ile size atanan mevcut iş akışlarını görüp onay veya red işlemlerini gerçekleştirebiliyor, tarihçelerini görebiliyor ve ayrıca uyarı kurallarının oluşturduğu bildirimleri de Iphone cihazınız üzeride görebiliyor ve yönetbiliyorsunuz.

Mevcut versiyonu şu an test ediyorum ve gayet başarılı. Kurulumu AOS tarafı için 30 dakika, ve kullanıcı tarafı için 1-2 dakika, Maliyeti de kullanıcı başına şuan 50 USD. Hepsi bu kadar!

Ek olarak ürüne ait link ve ekran görüntüleride paylaşmak istiyorum.

Ürüne ait orjinal site

Apple Store için link

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Mesut BOZTAŞ

Dynamics AX ERP Danışmanı ve
İstanbul Ticaret Üni. Y.Lisans öğrencisi

İstanbul

http://www.etg-it.com

 
 

Etiketler: , , ,

Dynamics AX iş akışları kurulum ve konfigürasyon oluşturma dokümanı

Merhaba,

Bu yazımda sizinle Dynamics AX iş akışları(Workflow) kurulum ve kurulum sonrası konfigürasyon yönetimi için çok faydalı olduğunu düşündüğüm iki dokümanı paylaşacağım. Faydalı olması dileklerimle…

Mesut BOZTAŞ

Dynamics AX ERP Danışmanı ve
İstanbul Ticaret Üni. Y.Lisans öğrencisi

İstanbul

http://www.etg-it.com

Dokümanı indirmek için tıklayınız.

https://mesutboztas.wordpress.com/

https://mesutboztas.wordpress.com/

https://mesutboztas.wordpress.com/

https://mesutboztas.wordpress.com/

https://mesutboztas.wordpress.com/

https://mesutboztas.wordpress.com/

https://mesutboztas.wordpress.com/

https://mesutboztas.wordpress.com/

https://mesutboztas.wordpress.com/

https://mesutboztas.wordpress.com/

 

Dokümanı indirmek için tıklayınız.

 

Etiketler: ,

İş Akışlarında Güvenlik Anahtarları

Dynamics AX’ta Admin yetkisine sahip olunca, kullanıcı grubu bazında bazı yetki detaylarının farkında olamayabiliyorum. 🙂

Bir iş akışı konfigürasyonunun menü öğelerinin genel olarak güvenlik anahtarı olmaz. Fakat bu menü öğelerinin üst hiyerarşisi, sistemde bir güvenlik anahtarına sahiptir. Örneğin, siz kendi iş akış konfigürasyonunuz “Kabul et (Claim)” menü öğesine güvenlik anahtarı vermesenizde, bir üst hiyerarşide, tüm sistemdeki “Kabul et” menü öğelerini kapsayan bir menü öğesi ve bunun güvenlik anahtarı vardır.

İş akışlarına ait bu güvenlik anahtarlarını Yetki ağacında Temel (Basic) güvenlik anahtarı altındaki Sorgulamalar(BasicInquries) ve çeşitli(BasicMisc) alt güvenlik anahtarlarında bulunur. Aşağıdaki Listede bu menü öğeleri ve temel fonksiyon açıklamaları yer almaktadır.

 

Mesut BOZTAŞ

Dynamics AX ERP Danışmanı ve
İstanbul Ticaret Üni. Y.Lisans öğrencisi

İstanbul

http://www.etg-it.com

 

Etiketler: , ,

Dynamics AX İş akışlarında yetersiz haklar hatası

Merhaba, bu yazımda Dynamics AX iş akışları kurulum süreçlerinden sonra çalıştırılmaya başlandığında hemen hemen herkesin karşısına sıklıklar çıkan bir hatadan bahsetmek istiyorum. İş akışı oluşturulamadı. [Kullanıcı kodu] için yetersiz haklar. ( Work item could not be created. Insufficient rights for user [USERID].)

Bu hata iş akışında sıradaki adımda atanacak kişinin belirtilen iş akışı maddesine ulaşma hakkının olmadığını belirtilir. Bir iş akışında adımdaki kullanıcının yetkisinin olup olmadığı kontrolü SysWorkflowEventDispatcher classının completeWorkItem metodunda yapılır. Bu metodta kullanıcı için iki farklı yetki kontrolü yapılır.

1- Kullanıcının, iş akışınıdaki kaydın bulunduğu formun display tipli menü öğesine olan yetkisinin kontrolü.

2- Kullanıcının, iş akışında değişiklik istendiğinde iş maddesini tekrar iş akışına gönderebilme (re-submit) yetkisinin kontrolü.

Bu noktada birinci maddedeki yetkiden kaynaklanan sorunlar daha çok karşımıza çıkmaktadır.

Normal şartlarda iş akışının kurgulandığı forma tam yetki verildiğinde bu sorun ortadan kalmaktadır. Fakat geçenlerde , forma tam yetki verdiğimiz halde bu hatadan kurtulamadığım bir durumla karşılaştım. Araştırmalarım sonucu Dynamics Ax’ta sadece forma yetki vermemin tek başına çözüm olmadığını, formun ait olduğu üst güvenlik anahtarına da(security key) kullanıcı grubu için tam yetki verilmesi durumunda karşılaşılan iş akış hatasının çözüldüğünü tespit ettik. Kısaca kullanıcı satınalma formunda okuma ve yazma yetkisine sahip olsa bile, bu formun bağlı olduğu VendTables güvenlik anahtarında (security key) tam yetkiye sahip değilse satınalma iş akışlarında bu hatayla karşılabilmektedir.

Bu durumda kullanıcının bir güvenlik anahtarı altında görmesini istemediğiniz yetkisinde olmayan başka tabloları da görebilmesine sebeb olmaktadır. Mevcut durumda böyle bir durumlar karşılaşmak istemiyorsanız iş akışı kurguladığınız formların güvenlik anahtarlarını onlara özgü olarak vermelisiniz.

Microsoft KB971260 hotfixi ile bu konuya bir çözüm getirmiş olsa da benzer hata gözlemlerim sonucu devam etmektedir.

Mesut BOZTAŞ

Dynamics AX ERP Danışmanı ve
İstanbul Ticaret Üni. Y.Lisans öğrencisi

İstanbul

http://www.etg-it.com

 

Etiketler: , , , ,

İş akışı koşul ve bilgilendirme ekranlarında hesaplanan alanların kullanılabilmesi

Microsoft Dynamics AX 2009 iş akışlarında gerçek alanlar haricinde bir metodla hesaplanmış alanları da kriter olarak iş akışlarına verebilir veya bilgilendirme notlarında kullanabiliriz.
Bunun için:

  1. İlgili iş akışının Document classını açınız.
  2. Parm uzantılı yeni bir metod oluşturun.
  3. Metoda TableId, RecId ve DataAreaId değerlerini parametre olarak veriniz.
  4. Geri döndüreceğiniz EDT(Extended Data Type) değerini tanımlanıyız.
// Changed on 06 Kas 2010 at 10:40:36 by mesut
//GN 267 Siparişe bağlı satırların toplamını iş akışına gönderir...
public SalesAmountApproval parmApprovalAmount(CompanyId _companyId,
                                                 tableId   _tableId,
                                                 RecId     _recId)
{
    SalesTable      salesTable;
    ;

    this.checkContext(_tableId, _recId);
    salesTable = Salestable::findRecId(_recId);
    return salesTable.amountLine();
}
// Changed on 06 Kas 2010 at 10:55:33 by mesut

server AmountCur  amountLine()
{
    SalesLine       salesLine;
    ;
    select sum(LineAmount) from salesLine
            index hint SalesLineIdx
            where salesLine.SalesId     == this.SalesId
            &&    salesLine.SalesStatus == SalesStatus::Backorder;

    return salesLine.LineAmount;
}

Bu kodda satış sipariş satırlarının toplam tutar değerini iş akışında kullanabilmek üzere hazır etmiş bulunmaktayız.

NOT: Yazıda belirtilen kodun, değiştirilmeden veya değiştirilerek, development/test/canlı ortamlarında kullanılması sonucu oluşabilecek olumlu/olumsuz durumlarda tüm sorumluluk kodu kullanan kişiye aittir.

Mesut BOZTAŞ
Dynamics AX ERP Danışmanı ve
İstanbul Ticaret Üni. Y.Lisans öğrencisi

İstanbul

http://www.etg-it.com

 

Etiketler: , ,

 
%d blogcu bunu beğendi: