sıralama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
sıralama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

13 Ekim 2017 Cuma

AX 2012 - Bir Finansal Boyuta Göre Sıralama

AX 2012'de mali boyutlar bir RecId alanında saklı olduğu ve çeşitli tabloları refere ettiği için sıralama olayı biraz karışık. Bunun için işimizi kolaylaştırıcı bir sınıf var:

DimensionProvider           dimProvider = new DimensionProvider();
    dimProvider.addOrderByAttribute(BorAXJournalTrans_DS.query(),BorAXJournalTrans_DS.query().dataSourceNo(1).name(),
       FieldStr(BorAXJournalTrans,DefaultDimension),
        DimensionComponent::DimensionAttribute,SortOrder::Ascending,
"Departmanı");
BorAXJournalTrans_DS.executeQuery();
  
Bu sınıfı kullanmak istemiyorum derseniz bir de şöyle bir seçenek var:

RecId  depRecId = 5637152827; //departman boyutunun DimensionAttribute tablosundaki recId değeri
    BorAXJournalTrans   boraxJournalTrans;
    DimensionAttributeValueSet dimensionAttributeValueSet;
    DimensionAttributeValueSetItem dimensionAttributeValueSetItem;
    DimensionAttributeValue dimensionAttributeValue;
    DimensionAttribute dimensionAttribute;

while SELECT firstOnly10 borAXJournalTrans 
    ORDER BY DimensionAttributeValueSetItem.DisplayValue
 JOIN dimensionAttributeValueSet 
    where borAXJournalTrans.DefaultDimension == dimensionAttributeValueSet.RecId 
 JOIN dimensionAttributeValueSetItem 
    where dimensionAttributeValueSet.RecId == dimensionAttributeValueSetItem.DimensionAttributeValueSet 
 JOIN dimensionAttributeValue 
    where dimensionAttributeValueSetItem.DimensionAttributeValue == dimensionAttributeValue.RecId 
 JOIN dimensionAttribute 
    where dimensionAttributeValue.DimensionAttribute == dimensionAttribute.RecId && 
     dimensionAttribute.RecId == depRecId
    {
        info(dimensionAttributeValueSetItem.DisplayValue);
    }

22 Ocak 2016 Cuma

Axapta - Neden bazen MultiSelectionHelper bazen klasik okuma yöntemi?

Bir formda gridde seçili kayıtları okumak için klasik yöntem aşağıdaki gibidir:

 c = CustTable_DS.getFirst(true);
 while (c.RecId != 0)
 {
      info(c.Name);
      c = CustTable_DS.getNext();
 }


Ancak bu yöntemin bir sakıncası vardır. Bu yöntemle kayıt okuduğunuz zaman eğer ki kullanıcı listeden birkaç kayıt işaretlemeyip sadece üzerinde durduğu kaydı işlemek isterse o kayıt malesef atlanır. Bunu bertaraf etmek için aşağıdaki eklemeyi yapmak gerekir:


c = CustTable_DS.getFirst(true);
noSelected = true;
while (c.RecId != 0)
{
     noSelected = false;
     info(c.Name);
     c = CustTable_DS.getNext();

}
if  (noSelected)
    info(CustTable.Name);

MultiSelectionHelper sınıfı bu sıkıntıyı bertaraf eder:

 MultiSelectionHelper helper = MultiSelectionHelper::construct();
CustTable c;
;

helper.parmDatasource(CustTable_ds);

c = helper.getFirst();
while (c.RecId != 0)
{
      info(c.Name);
      c = helper.getNext();

}

Ancak MultiSelectionHelper sınıfının da bir dezavantajı vardır. Eğer ki kullanıcı gridde kayıtları sıralamak isterse ve o sıraya göre liste almak isterse yine yukarıdaki klasik yöntemi kullanmak gerekir zira MultiSelectionHelper sınıfı kullanıcının yaptığı sıralamayı malesef dikkate almaz.

MultiselectionHelper sınıfının bir sınıf içinde kullanılması:

public static void main(Args _args)
{
    SMAServiceOrderTable    serviceOrder;
    MultiSelectionHelper    helper;
    FormRun                 caller = _args.caller();
    FormDataSource          SMAServiceOrderTable_DS;
  
    SMAServiceOrderTable_DS = caller.dataSource();
    helper = MultiSelectionHelper::createFromCaller(caller);
    helper.createQueryRanges(SMAServiceOrderTable_DS.queryBuildDataSource(),fieldStr(SMAServiceOrderTable,RecId));
    
    serviceOrder = helper.getFirst();
    
    while(serviceOrder)
    {
        info(strFmt("%1",serviceOrder.RecId));
        serviceOrder = helper.getNext();
    }
}