RSS

Etiket arşivi: Dynamics AX 2009

Microsoft Dynamics AX 2009

Kullanıcı grubu yetkilerini kodla toplu olarak güncelleme

Merhaba,
Yetkilendirme malumunuzdur ki AX’ın en hassas kısımlarından biridir. Bir müşterimizde SecurityKey değeri olmadan Canlıya alınan bir form menüdeki ilgili klasörü ve menüyü otomatik olarak tüm kullanıcılara açmıştır. Daha sonra forma SecurityKey değeri verilse bile birkez açılan ana anahtarlar kapanmamaktadır. Eğer çok kullanıcı grubunuz ve etki alanınız varsa bu işlemi telafi etmek uzun sürecek bir işlemdir.
Altta belirtiğim job kullanılarak istenilen bir objenin yetki ayarlaması otomatik olarak yapılabilmektedir. İşlem süresi Kullanıcı grubu ve etki alanı sayısına göre değişkenlik gösterebilir.

// Changed on 18 Tem 2012 at 13:55:00 by mboztas
static void changeAccessRights(Args _args)
{
   SecurityKeySet          swSysSecurity;
   UserGroupList           userGroupList;
   DomainInfo              domainInfo;
   #admin

   ttsbegin;

   while select domainInfo
        //where domainInfo.id == #AdminDomain   sadece belirli domainler için çalıştırmak istersen
   {
       while select userGroupList
           where userGroupList.groupId != #AdminUserGroup
       {
           swSysSecurity = SysSecurity::constructSecurityKeySet();
           swSysSecurity.loadGroupRights(userGroupList.groupId, domainInfo.id);
                swSysSecurity.secureNodeAccess("DRTCreateProdDemandsTable",UtilElementType::DisplayTool,AccessType::NoAccess);

           xAccessRightsList::saveSecurityRights(swSysSecurity.packTouched(), userGroupList.groupId, domainInfo.id);

       }
   }

   ttscommit;
   info("tamamlandı");
}

Mesut BOZTAŞ
Dynamics AX ERP Danışmanı
Antalya 2012

http://www.etg-it.com

Reklamlar
 
1 Yorum

Yazan: 18/07/2012 in Geliştirme, Yönetim

 

Etiketler: , , ,

Stok hareketi üzerindeki rezervasyonu kaldırmak

Uzun süre sonra tekrar merhaba,

Bir geliştirme kapsamında transfer günlüğü satırlarını kullanarak işlem yapmak istiyorduk, fakat günlük satırlarındaki miktarlar ya sistem ya kullanıcı tarafından fiziksel veya siparişe göre rezerv edilmişti. Bizim geliştirmemizin ilerleyebilmesi adına varsa bu tür rezervasyonların günlük işleme başlamadan önce kaldırılması gerekiyordu.

Malumunuz üzere rezervasyon ile ilgili kodlar çok dallı budaklı ve karışık bir mahiyete sahiptir. Bende uzun süre uğraştıktan sonra tam ümidi keserken, Mr.Google da yazılmış bir kod öbeği buldum. Kod çok basit fakat inanılmaz derecede de doğru çalışıyordu. Onu biraz düzenledim ve aşağıdaki son halini verdim. Sizde olursa kendi ihtiyaçlarınıza göre uyarlayıp kullanabilirsiniz.

Güle güle kullanın.

// Changed on 22 May 2012 at 09:22:42 by etg_m
// Code is added to InventJournalTable methods
void removeAllJournalLinesReservation()
{

InventUpd_Reservation       res;
InventMovement              inventmovement;
Inventtrans                 inventtrans;
InventJournalTrans          inventJournalTrans
;
if(this.Posted)
return;

while select inventJournalTrans
index hint LineIdx
where inventJournalTrans.JournalId  == this.JournalId
{
while select inventTrans
index hint TransIdIdx
where inventTrans.InventTransId == inventJournalTrans.InventTransId
&&   (inventTrans.StatusIssue   == statusIssue::ReservOrdered ||
      inventTrans.StatusIssue   == statusIssue::ReservPhysical)
  {
   inventmovement  =   inventTrans.inventmovement(true);
   res =  InventUpd_Reservation::newInventDim(inventmovement,inventTrans.inventDim(),abs(inventTrans.Qty),true);
   res.updatenow();
  }
}
}

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

 
Yorum yapın

Yazan: 22/05/2012 in 3S, Geliştirme

 

Etiketler: , , ,

İş 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

 

Etiketler: , , ,

Dynamics AX Favoriler menüsüne kod ile öğe eklenmesi

Merhaba,

Normal şartlar altında Favorilerim alanına almak istediğimiz menü öğesini sürekle bırakla yapabildiğimiz süreci bazı durumlarda kod/buton ile yapmamız gerektiğinde aşağıdaki kodu kullanabilirsiniz.

void addToFavorites()
{
#AOT
#define.ReportBuilderMenuItemName ("InventTable")

TreeNode            treeNode;
TreeNodeIterator    iterator;
TreeNode            myFavoritesNode;
     Menu                myFavoritesMenuNode;
;

// get the top level user node
treeNode = infolog.userNode();
if (!treeNode)
return;

// get the User Menu List which is the 1st child of the user node
     iterator = treeNode.AOTiterator();
treeNode = iterator.next();
if (!treeNode)
return;

// get the "My Favorites" node which is the 1st child of the User Menu List node
iterator = treeNode.AOTiterator();
     myFavoritesNode = iterator.next();
if (!myFavoritesNode)
return;

// find the "Report Builder" MenuItem
treeNode = TreeNode::findNode(#MenuItemsActionPath + #AOTDelimiter + #ReportBuilderMenuItemName);
     if (!treeNode)
return;

myFavoritesMenuNode = myFavoritesNode;
if (myFavoritesMenuNode)
{
myFavoritesMenuNode.addMenuitem(treeNode);
}
}

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

 
Yorum yapın

Yazan: 10/01/2012 in Geliştirme

 

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: , , , ,

 
%d blogcu bunu beğendi: