Öncelikle minimum sistem gereksinimlerini kontrol edin. MS-SQL kurulumunuzun collate değeri turkish olmamalı. SAP ve Oracle'da da sorun olan meşhur "i" problemi sebebiyle AX kurulumu tamamlandıktan sonra database sync işleminiz patlar.
Kurulum için Microsoft'un uzun ve karmaşık kurulum dökümanı yerine Dilip's Blog'dan faydalandım. AX 2012 kurulumu çok basit veya bana öyle denk geldi.
Öncelikle Active Directory kurulum gerekiyor. Active Directory kurulumu çok basit ve Google'da anlatan çok fazla makale var.
Ben aynen Dilip'in yaptığı gibi SSRS vs.. kurulumları daha sonraya bırakarak temel AX 2012 kurdum. AX 2012 Setup gerekli yazılımların download linklerini veriyor ve yazılımları otomatik konfigüre ediyor. Kurulum esnasında hiç problem yaşamadım.
Daha sonra Microsoft'un demo datayı da yine bir blog sayfasından faydalanarak kurdum. Demo data kurulumu AX 2012 kurulumundan daha zor.
SQL Server SSRS eklentisini kurduktan sonra ayarlarını da yine bir blogdan faydalanarak yaptım. Bu arada SSRS rapor düzenleyebilmek için (Deploy için gerekmiyor) SQL Server Setup ile Business Intelligence Development Studio kurmayı unutmayın. SSRS ayarları oldukça basitti; sırasıyla Service account, Web service URL, Database, Report Manager URL tablarını varsayılan ayarlarıyla çalıştırmak yeterli oluyor.
Yine başka bir Dilip sayfasından faydalanarak AX 2012 SSRS kurulumunu yaptım. Burda da hiç sorun yaşamadım ve Dilip'in gösterdiği manuel kuruluma ihtiyacım olmadı, raporlarım otomatik deploy oldu.
Blog Listem
29 Eylül 2014 Pazartesi
26 Eylül 2014 Cuma
AX 2012 - Batch joblar bir türlü başlamıyorsa?
Home->Inquiries->Batch jobs->My batch jobs 'a girince jobların başlamadığını görürseniz.
System administration->Setup->System->Server configuration'a girip Batch server schedule'de uygun saatlerde (00-23:59) kayıt olduğuna ve Maximum batch threads değerinin sıfırdan farklı olmasına dikkat edin.
Ayrıca sorun batch gruplarına hiç server atanmamasıyla da ilgili olabilir:
Administration -> setup -> Batch Groups
Buradaki boş batch group için Batch Servers tabına girip Selected server alanında doğru sunucu seçili mi onu da kontrol edin.
System administration->Setup->System->Server configuration'a girip Batch server schedule'de uygun saatlerde (00-23:59) kayıt olduğuna ve Maximum batch threads değerinin sıfırdan farklı olmasına dikkat edin.
Ayrıca sorun batch gruplarına hiç server atanmamasıyla da ilgili olabilir:
Administration -> setup -> Batch Groups
Buradaki boş batch group için Batch Servers tabına girip Selected server alanında doğru sunucu seçili mi onu da kontrol edin.
15 Eylül 2014 Pazartesi
AX 2012 - Tabloya bağlı yeni bir finansal boyut tanımlama
Microsoft'un ilgili white paper sayfasından faydalanan bir blogdan öğrendiğim bu işlem çok kolay:
1-AOT'dan DimAttribute adıyla başlayan viewlerden birini kopyala ve adı yine aynen DimAttribute ile başlasın.
2. Ana data sourcenin orijinal tablo adı ne olursa olsun adı data source adı BackingEntity olsun.
3.Viewdeki tanımlı alanların adı (orijinal isimleri farklı olabilir) şöyle olmak zorunda:
Key - Data source tablosunun Surrogate key field'ı. RecId gibi...
Value - Data source tablosunun primary key field'ı. AccountNum gibi...
Name - Açıklama alanı. Description gibi...
Bu boyutun geçerli olması için iki yol var:
AOS restart
veya
DimensionCache::clearAllScopes();
komutu.
1-AOT'dan DimAttribute adıyla başlayan viewlerden birini kopyala ve adı yine aynen DimAttribute ile başlasın.
2. Ana data sourcenin orijinal tablo adı ne olursa olsun adı data source adı BackingEntity olsun.
3.Viewdeki tanımlı alanların adı (orijinal isimleri farklı olabilir) şöyle olmak zorunda:
Key - Data source tablosunun Surrogate key field'ı. RecId gibi...
Value - Data source tablosunun primary key field'ı. AccountNum gibi...
Name - Açıklama alanı. Description gibi...
Bu boyutun geçerli olması için iki yol var:
AOS restart
veya
DimensionCache::clearAllScopes();
komutu.
11 Eylül 2014 Perşembe
AX 2012 - Bir LedgerDimension değerinden tek bir boyutun değerini almak
Bu konuyu oluştururken bir blogda bulduğum dimension hakkında çizilmiş data modelini kullandım. Malesef blogdaki kodu anlayamadım ve bu kodu yazdım:
DimensionDefault d = 5637183219;
DimensionAttributeValueCombination dimensionAttributeValueCombination;
DimensionAttributeValueGroupCombination dimensionAttributeValueGroupCombination;
DimensionAttributeValueGroup dimensionAttributeValueGroup;
DimensionAttributeLevelValue dimensionAttributeLevelValue;
DimensionAttributeValue dimensionAttributeValue;
DimensionAttribute dimensionAttribute;
select dimensionAttributeValueCombination
where dimensionAttributeValueCombination.RecId == d
join dimensionAttributeValueGroupCombination
where dimensionAttributeValueGroupCombination.DimensionAttributeValueCombination ==
dimensionAttributeValueCombination.RecId
join dimensionAttributeValueGroup
where dimensionAttributeValueGroup.RecId == dimensionAttributeValueGroupCombination.DimensionAttributeValueGroup
join dimensionAttributeLevelValue
where dimensionAttributeLevelValue.DimensionAttributeValueGroup == dimensionAttributeValueGroup.RecId
join dimensionAttributeValue
where dimensionAttributeValue.RecId == dimensionAttributeLevelValue.DimensionAttributeValue
join dimensionAttribute
where dimensionAttribute.RecId == dimensionAttributeValue.DimensionAttribute &&
DimensionAttribute.Name == "Proje";
info(DimensionAttributeLevelValue.DisplayValue);
Güncelleme:
Yukarıdaki bağlantı PurchTable defaultDimension alanı için çalışmadı.
Aşağıdaki kodu Andesoft'un web sitesinden aldım:
DimensionDefault d = 5637169331;
DimensionAttributeValueSet dimAttrValueSet;
DimensionAttributeValueSetItem dimAttrValueSetItem;
DimensionAttributeValue dimAttrValue;
DimensionAttribute dimAttr;
Common dimensionValueEntity;
DimensionValue dimensionValue;
DimensionAliasName dimensionName;
dimAttrValueSet = DimensionAttributeValueSet::find(D);
while select dimAttrValueSetItem
where dimAttrValueSetItem.DimensionAttributeValueSet == dimAttrValueSet.RecId
{
dimAttrValue = DimensionAttributeValue::find(dimAttrValueSetItem.DimensionAttributeValue);
dimAttr = DimensionAttribute::find(DimAttrValue.DimensionAttribute);
dimensionvalueentity = DimensionDefaultingControllerBase::findBackingEntityInstance(
curext(),DimAttr,dimAttrvalue.EntityInstance);
dimensionvalue = dimattrvalue.getValue();
info(strFmt("%1 %2",Dimensionvalue, DimAttr.Name));
}
DimensionDefault d = 5637183219;
DimensionAttributeValueCombination dimensionAttributeValueCombination;
DimensionAttributeValueGroupCombination dimensionAttributeValueGroupCombination;
DimensionAttributeValueGroup dimensionAttributeValueGroup;
DimensionAttributeLevelValue dimensionAttributeLevelValue;
DimensionAttributeValue dimensionAttributeValue;
DimensionAttribute dimensionAttribute;
select dimensionAttributeValueCombination
where dimensionAttributeValueCombination.RecId == d
join dimensionAttributeValueGroupCombination
where dimensionAttributeValueGroupCombination.DimensionAttributeValueCombination ==
dimensionAttributeValueCombination.RecId
join dimensionAttributeValueGroup
where dimensionAttributeValueGroup.RecId == dimensionAttributeValueGroupCombination.DimensionAttributeValueGroup
join dimensionAttributeLevelValue
where dimensionAttributeLevelValue.DimensionAttributeValueGroup == dimensionAttributeValueGroup.RecId
join dimensionAttributeValue
where dimensionAttributeValue.RecId == dimensionAttributeLevelValue.DimensionAttributeValue
join dimensionAttribute
where dimensionAttribute.RecId == dimensionAttributeValue.DimensionAttribute &&
DimensionAttribute.Name == "Proje";
info(DimensionAttributeLevelValue.DisplayValue);
Güncelleme:
Yukarıdaki bağlantı PurchTable defaultDimension alanı için çalışmadı.
Aşağıdaki kodu Andesoft'un web sitesinden aldım:
DimensionDefault d = 5637169331;
DimensionAttributeValueSet dimAttrValueSet;
DimensionAttributeValueSetItem dimAttrValueSetItem;
DimensionAttributeValue dimAttrValue;
DimensionAttribute dimAttr;
Common dimensionValueEntity;
DimensionValue dimensionValue;
DimensionAliasName dimensionName;
dimAttrValueSet = DimensionAttributeValueSet::find(D);
while select dimAttrValueSetItem
where dimAttrValueSetItem.DimensionAttributeValueSet == dimAttrValueSet.RecId
{
dimAttrValue = DimensionAttributeValue::find(dimAttrValueSetItem.DimensionAttributeValue);
dimAttr = DimensionAttribute::find(DimAttrValue.DimensionAttribute);
dimensionvalueentity = DimensionDefaultingControllerBase::findBackingEntityInstance(
curext(),DimAttr,dimAttrvalue.EntityInstance);
dimensionvalue = dimattrvalue.getValue();
info(strFmt("%1 %2",Dimensionvalue, DimAttr.Name));
}
10 Eylül 2014 Çarşamba
AX 2012 - Bir DefaultDimension değerinden tek bir boyutu almak
Bu kodu yazarken bir blogdan faydalandım:
DimensionAttributeValueSetStorage dimStorage;
Counter i;
DimensionAttribute dimAttributeCostCenter;
DimensionAttributeValue dimAttributeValue;
DimensionDefault d = 5637168596;
dimStorage = DimensionAttributeValueSetStorage::find(d);
info(dimStorage.getDisplayValueByDimensionAttribute(DimensionAttribute::findByName("Project").RecId));
DimensionAttributeValueSetStorage dimStorage;
Counter i;
DimensionAttribute dimAttributeCostCenter;
DimensionAttributeValue dimAttributeValue;
DimensionDefault d = 5637168596;
dimStorage = DimensionAttributeValueSetStorage::find(d);
info(dimStorage.getDisplayValueByDimensionAttribute(DimensionAttribute::findByName("Project").RecId));
AX 2012 - Default dimension verisine yeni bir dimension değeri eklemek
Bu kodu Eyüp Tezar'ın bir kodundan faydalanarak yazdım:
DimensionDefault DefDim;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue newValue;
DimensionAttributeValueSetStorage dimensionStorage;
DefDim = mytable.Defaultdimension;
dimensionAttribute = DimensionAttribute::find(myDimRecid);
newValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,
myDimValue,false,true);
dimensionStorage = DimensionAttributeValueSetStorage::find(DefDim);
dimensionStorage.addItem(newValue);
DefDim = dimensionStorage.save();
//------------------- another dimension ------------------------
dimensionAttribute = DimensionAttribute::findbyName("Project");
newValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,
myDimValue2,false,true);
dimensionStorage = DimensionAttributeValueSetStorage::find(DefDim);
dimensionStorage.addItem(newValue);
DefDim = dimensionStorage.save();
DimensionDefault DefDim;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue newValue;
DimensionAttributeValueSetStorage dimensionStorage;
DefDim = mytable.Defaultdimension;
dimensionAttribute = DimensionAttribute::find(myDimRecid);
newValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,
myDimValue,false,true);
dimensionStorage = DimensionAttributeValueSetStorage::find(DefDim);
dimensionStorage.addItem(newValue);
DefDim = dimensionStorage.save();
//------------------- another dimension ------------------------
dimensionAttribute = DimensionAttribute::findbyName("Project");
newValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,
myDimValue2,false,true);
dimensionStorage = DimensionAttributeValueSetStorage::find(DefDim);
dimensionStorage.addItem(newValue);
DefDim = dimensionStorage.save();
8 Eylül 2014 Pazartesi
AX 2012 - Taxtrans tablosunun değişen yapısı
AX 2012 ile birlikte eskiden taxtrans tablosunda olan bazı alanlar değişik tablolara dağıldı. Microsoft'un bu konuda açıklayıcı bir makalesi var. Aşağıda örnek bir join var:
select generalJournalAccountEntry
join generalJournalEntry
where generalJournalEntry.RecId == generalJournalAccountEntry.GeneralJournalEntry &&
generalJournalEntry.RecId == _RecId
join subledgerVoucherGeneralJournalEntry
where subledgerVoucherGeneralJournalEntry.GeneralJournalEntry == generalJournalEntry.RecId
join dimensionAttributeValueCombination
where dimensionAttributeValueCombination.RecId == generalJournalAccountEntry.LedgerDimension
join mainAccount
where mainAccount.RecId == dimensionAttributeValueCombination.MainAccount;
select generalJournalAccountEntry
join generalJournalEntry
where generalJournalEntry.RecId == generalJournalAccountEntry.GeneralJournalEntry &&
generalJournalEntry.RecId == _RecId
join subledgerVoucherGeneralJournalEntry
where subledgerVoucherGeneralJournalEntry.GeneralJournalEntry == generalJournalEntry.RecId
join dimensionAttributeValueCombination
where dimensionAttributeValueCombination.RecId == generalJournalAccountEntry.LedgerDimension
join mainAccount
where mainAccount.RecId == dimensionAttributeValueCombination.MainAccount;
AX 2012 - LedgerTrans nereye gitti?
AX 2012 ile LedgerTrans tablosunun yerine birkaç tablo geliyor. Bu tabloları join ile birleştirmek gerekiyor. Bu konu hakkında Microsoft'un açıklayıcı bir makalesi var. İsimleri değişen ve değişik tablolara dağılan alanların açıklamalarını buradan bulabilirsiniz. Aşağıda örnek bir join var:
select generalJournalAccountEntry
join generalJournalEntry
where generalJournalEntry.RecId == generalJournalAccountEntry.GeneralJournalEntry &&
generalJournalEntry.AccountingDate >= beginDate && generalJournalEntry.AccountingDate <= endDate
join subledgerVoucherGeneralJournalEntry
where subledgerVoucherGeneralJournalEntry.GeneralJournalEntry == generalJournalEntry.RecId
join dimensionAttributeValueCombination
where dimensionAttributeValueCombination.RecId == generalJournalAccountEntry.LedgerDimension
join mainAccount
where mainAccount.RecId == dimensionAttributeValueCombination.MainAccount &&
mainAccount.MainAccountId == myAccount
select generalJournalAccountEntry
join generalJournalEntry
where generalJournalEntry.RecId == generalJournalAccountEntry.GeneralJournalEntry &&
generalJournalEntry.AccountingDate >= beginDate && generalJournalEntry.AccountingDate <= endDate
join subledgerVoucherGeneralJournalEntry
where subledgerVoucherGeneralJournalEntry.GeneralJournalEntry == generalJournalEntry.RecId
join dimensionAttributeValueCombination
where dimensionAttributeValueCombination.RecId == generalJournalAccountEntry.LedgerDimension
join mainAccount
where mainAccount.RecId == dimensionAttributeValueCombination.MainAccount &&
mainAccount.MainAccountId == myAccount
3 Eylül 2014 Çarşamba
AX 2012 - LedgerJournalTrans tablosuna Voucher atamak
AXLedgerJournalTrans sınıfı kullanıldığında voucher otomatik atanır. Ancak direk tablodan kayıt eklendiğinde bunu kendiniz yapmalısınız:
numberSeq = numberSeq::newGetVoucherFromCode(NumberSequenceTable::find(ledgerJournalTable.ledgerJournalName().NumberSequenceTable).NumberSequence);
LedgerJournalTrans.Voucher = numberSeq.voucher();
numberSeq = numberSeq::newGetVoucherFromCode(NumberSequenceTable::find(ledgerJournalTable.ledgerJournalName().NumberSequenceTable).NumberSequence);
LedgerJournalTrans.Voucher = numberSeq.voucher();
Etiketler:
2012,
ax,
AXAPTA,
ledgerjournaltrans,
voucher
2 Eylül 2014 Salı
AX 2012 - Forma splitter eklemek
AX 2012'de splitter eklemek 2009'a göre çok daha kolay. Burada dikey splitter'i anlatacağım:
Formun üst parçası için bir grup oluşturun. Splitter için bir grup oluşturun. Ben Hsplitter adını verdim. AutoDeclaration = Yes olsun ve Style = SplitterHorizontalContainer olsun. Alt taraf için de bir grup oluşturun. Üst gruba bir isim verin. Burada ben TopGroup adını verdim, ayrıca bu grup için de AutoDeclaration = Yes olsun. Alt grup için Height Column Height olsun. Splitter grubu bu iki grubun arasında olsun.
Form classDeclaration'a bu satırı ekleyin:
SysFormSplitter_Y HorizontalSplitter;
Eğer yatay olacaksa SysFormSplitter_X olmalı. Form init metoduna da bu satırı ekleyin:
HorizontalSplitter = new SysFormSplitter_Y(HSplitter,TopGroup, element);
Yatay olacaksa new SysFormSplitter_X ... olmalı.
Hepsi bu...
Formun üst parçası için bir grup oluşturun. Splitter için bir grup oluşturun. Ben Hsplitter adını verdim. AutoDeclaration = Yes olsun ve Style = SplitterHorizontalContainer olsun. Alt taraf için de bir grup oluşturun. Üst gruba bir isim verin. Burada ben TopGroup adını verdim, ayrıca bu grup için de AutoDeclaration = Yes olsun. Alt grup için Height Column Height olsun. Splitter grubu bu iki grubun arasında olsun.
Form classDeclaration'a bu satırı ekleyin:
SysFormSplitter_Y HorizontalSplitter;
Eğer yatay olacaksa SysFormSplitter_X olmalı. Form init metoduna da bu satırı ekleyin:
HorizontalSplitter = new SysFormSplitter_Y(HSplitter,TopGroup, element);
Yatay olacaksa new SysFormSplitter_X ... olmalı.
Hepsi bu...
Kaydol:
Kayıtlar (Atom)