Microsoft malesef Windows 8 single için sanal makine seçeneğini kapatmış. Malesef hala Foxpro DOS ile de geliştirmeler yaptığım için XP ihtiyacım oldu. Oracle ve VMware ücretsiz sanal makine seçenekleri sunarken Microsoft bunu single için kaldırarak birilerinin sırf sanal makine için pro geçiş yapacağını sanmış galiba... :)
Önce Oracle VM VirtualBox sanal makinesini denedim. Otomatik kurulma seçeneği yok. Default kurulumda mavi ekran hatası aldım. Daha sonra şimdi hatırlayamadığım bir parametreyi değiştirince hata kalmadı. Host disklerini (Bilgisayarın asıl işletim sisteminin kurulu olduğu diskler) göstermek için aynı Windows sanal makinesindeki gibi bir seçenek sunuyor VirtualBox da. Böylece ana bilgisayarda disk paylaşımı vs.. açıp ona bağlanmak gibi bir sürü teferruatla uğraşmak gerekmiyor. Host disk tanıtımı doğrusu Windows sanal makinesinden daha zordu. Ayrıca Foxpro DOS içinden ana disklere erişirken bazı sorunlar yaşadım ve klasörlerimi sanal makineye kopyalayıp öylece kullanmak zorunda kaldım. Tam ekran modunda VirtualBox menüsünde istediğim seçeneğe erişmekte zorluk yaşadım ve pencere moduna döndüm. Ekran çözünürlüğü konusunda da çok iyi değil VirtualBox. Her istediğim çözünürlüğe ayarlayamadım ekranı. Sağ ve solda boşluklar bırakarak kullanmak zorunda kaldım.
VMware Player, VMware'nin en düşük ve ücretsiz tek versiyonu. XP'nin seri numarasını dahi sorarak tam bir otomatik kurulum sağlıyor. Harika bir kurulumdan sonra ekran çözünürlüğünü ayarlama kısmında beni daha da güzel bir sürpriz bekliyordu. Ekranın sağ altında "Ekran çözünürlüğünün otomatik ayarlanmasını ister misiniz" yazan bir baloncuğu onayladıktan sonra pencereyi nasıl boyutlandırırsam boyutlandırayım VMware sanal makinenin ekran çözünürlüğünü ona göre ayarlıyordu. Host disklerini ayarlama kısmı da tamamen pürüzsüz ve kolaydı.
Eskiden Parallel vardı, iyi bir sanal makineydi. Ücretsiz değildi. Windows desteği kesilmiş.
Sonuç olarak VMware Player kişisel bilgisayarlar için gördüğüm en iyi sanal makine. Ücretli olsaydı dahi bu kadar iyi olduğunu gördükten sonra alırdım.
Blog Listem
7 Kasım 2014 Cuma
2 Ekim 2014 Perşembe
AX 2012 - TC kimlik no sorgulama ile örnek web servisi kullanımı
Bu örneği geliştirirken bir blogdan faydalandım. Kullanıma hazır class halini buradan indirebilirsiniz.
1- Visual Studio'ya girip Class Library tipinde yeni bir C# projesi oluşturun.
2- Proje adındayken sağ klik Add service reference ile Address kısmına https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL, Namespace kısmına Sorgula yazarak GO butonuna basarak servis referansını ekleyin.
3- Projenizi Add to AOT ile AOT'a ekleyin.
4- Projenin properylerine girip
Debug Target = No
Deploy to Client = Yes
Deploy to EP = No
Deploy to Server = Yes
Deploy to SSRS = No
yapın.
5. Deploy yapıp tüm AX clientleri kapatın. Deploy esnasındaki mesajda tüm clientler kapatılmadıkça deploy işleminin tamamlanmayacağı yazıyor. Sanırım blog yazarı da bu yüzden clientları resetleyin diye uyarıyor.
Bu da benim örnek Jobum:
//Metin Emre, 2.10.2014
static void TCKimlikTest(Args _args)
{
CLRObject clientType;
TCKimlik.Sorgula.KPSPublicSoapClient cl;
System.Exception ex;
boolean s,erOccured;
System.Exception e;
str ret;
new InteropPermission(InteropKind::ClrInterop).assert();
try
{
clientType = CLRInterop::getType("TCKimlik.Sorgula.KPSPublicSoapClient");
cl = AifUtil::createServiceClient(clientType);
s = cl.TCKimlikNoDogrula(11111111111,"METİN","EMRE",1999);
}
catch(Exception::CLRError)
{
Ex=CLRInterop::getLastException();
ret = Ex.ToString();
if (!strScan(ret,"T.C. Kimlik No alanına girdiğiniz değer geçerli bir T.C. Kimlik Numarası değildir",1,strLen(Ret)))
{
info(Ex.ToString());
erOccured = true;
}
}
if (!erOccured)
info(strFmt("%1",s));
}
1- Visual Studio'ya girip Class Library tipinde yeni bir C# projesi oluşturun.
2- Proje adındayken sağ klik Add service reference ile Address kısmına https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL, Namespace kısmına Sorgula yazarak GO butonuna basarak servis referansını ekleyin.
3- Projenizi Add to AOT ile AOT'a ekleyin.
4- Projenin properylerine girip
Debug Target = No
Deploy to Client = Yes
Deploy to EP = No
Deploy to Server = Yes
Deploy to SSRS = No
yapın.
5. Deploy yapıp tüm AX clientleri kapatın. Deploy esnasındaki mesajda tüm clientler kapatılmadıkça deploy işleminin tamamlanmayacağı yazıyor. Sanırım blog yazarı da bu yüzden clientları resetleyin diye uyarıyor.
Bu da benim örnek Jobum:
//Metin Emre, 2.10.2014
static void TCKimlikTest(Args _args)
{
CLRObject clientType;
TCKimlik.Sorgula.KPSPublicSoapClient cl;
System.Exception ex;
boolean s,erOccured;
System.Exception e;
str ret;
new InteropPermission(InteropKind::ClrInterop).assert();
try
{
clientType = CLRInterop::getType("TCKimlik.Sorgula.KPSPublicSoapClient");
cl = AifUtil::createServiceClient(clientType);
s = cl.TCKimlikNoDogrula(11111111111,"METİN","EMRE",1999);
}
catch(Exception::CLRError)
{
Ex=CLRInterop::getLastException();
ret = Ex.ToString();
if (!strScan(ret,"T.C. Kimlik No alanına girdiğiniz değer geçerli bir T.C. Kimlik Numarası değildir",1,strLen(Ret)))
{
info(Ex.ToString());
erOccured = true;
}
}
if (!erOccured)
info(strFmt("%1",s));
}
29 Eylül 2014 Pazartesi
AX 2012 - R3 Kurulum
Ö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.
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.
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...
8 Ağustos 2014 Cuma
AX 2012 - CIL oluşturma esnasında XPPIL hatası
Açıklama: CIL generation: The given key was not present in the dictionary.
Yol: \XppIL
Satır: 1
Yöntem/Özellik adı: XppIL
Teşhis kodu: Err:351
Data Dictionary'i senkronize edin, hataları temizleyin.
AOS down yapın. Bu klasördeki alt klasörler hariç tüm dosyaları silin:
C:\Program Files\Microsoft Dynamics AX\60\Server\AX2012R2_Dev\bin\XppIL
Yol: \XppIL
Satır: 1
Yöntem/Özellik adı: XppIL
Teşhis kodu: Err:351
Data Dictionary'i senkronize edin, hataları temizleyin.
AOS down yapın. Bu klasördeki alt klasörler hariç tüm dosyaları silin:
C:\Program Files\Microsoft Dynamics AX\60\Server\AX2012R2_Dev\bin\XppIL
5 Ağustos 2014 Salı
AX 2012 - Forma default dimension eklemek
Nasıl yapıldığını anlamak için LedgerJournalTable formuna bakılabilir.
DimensionDefault EDTsi ile tabloya eklediğimiz alana DimensionAttributeValueSet tablosunun RecId alanıyla bir relation ekliyoruz.
Forma bir tab sayfası ekleyip adını tabFinancialDimensions yapıyoruz ve aşağıdaki property ayarlarını yapıyoruz:
AutoDeclaration = true
caption = @SYS101181
HideIfEmpty = No
NeedPermission = Manual
Formun classDeclaration metoduna aşağıdaki tanımlamayı yapıyoruz:
DimensionDefaultingController dimensionDefaultingController;
Formun init metoduna aşağıdaki kodları yazıyoruz:
public void init()
{
boolean allowEdit = true;
super();
dimensionDefaultingController = DimensionDefaultingController::constructInTabWithValues(false, true, allowEdit, 0, this, tabFinancialDimensions, "@SYS101181");
dimensionDefaultingController.parmAttributeValueSetDataSource(MyTable_ds, fieldStr(MyTable, DefaultDimension));
dimensionDefaultingController.parmValidateBlockedForManualEntry(true);
}
Tab sayfası kontrolüne bu metodu ekliyoruz:
public void pageActivated()
{
dimensionDefaultingController.pageActivated();
super();
}
Tablo data source metodlarını aşağıdaki gibi güncelliyoruz:
public void delete()
{
super();
DimensionDefaultingController.deleted();
}
public void write()
{
ttsBegin;
DimensionDefaultingController.writing();
super();
ttsCommit;
}
public int active()
{
int ret;
ret = super();
DimensionDefaultingController.activated();
return ret;
}
DimensionDefault EDTsi ile tabloya eklediğimiz alana DimensionAttributeValueSet tablosunun RecId alanıyla bir relation ekliyoruz.
Forma bir tab sayfası ekleyip adını tabFinancialDimensions yapıyoruz ve aşağıdaki property ayarlarını yapıyoruz:
AutoDeclaration = true
caption = @SYS101181
HideIfEmpty = No
NeedPermission = Manual
Formun classDeclaration metoduna aşağıdaki tanımlamayı yapıyoruz:
DimensionDefaultingController dimensionDefaultingController;
Formun init metoduna aşağıdaki kodları yazıyoruz:
public void init()
{
boolean allowEdit = true;
super();
dimensionDefaultingController = DimensionDefaultingController::constructInTabWithValues(false, true, allowEdit, 0, this, tabFinancialDimensions, "@SYS101181");
dimensionDefaultingController.parmAttributeValueSetDataSource(MyTable_ds, fieldStr(MyTable, DefaultDimension));
dimensionDefaultingController.parmValidateBlockedForManualEntry(true);
}
Tab sayfası kontrolüne bu metodu ekliyoruz:
public void pageActivated()
{
dimensionDefaultingController.pageActivated();
super();
}
Tablo data source metodlarını aşağıdaki gibi güncelliyoruz:
public void delete()
{
super();
DimensionDefaultingController.deleted();
}
public void write()
{
ttsBegin;
DimensionDefaultingController.writing();
super();
ttsCommit;
}
public int active()
{
int ret;
ret = super();
DimensionDefaultingController.activated();
return ret;
}
4 Ağustos 2014 Pazartesi
AX 2012 - SSRS ile sıfır yerine boşluk göstermek
Field yerine (örnekte PurchPrice) aşağıdaki gibi bir IIF fonksiyonu kullanabilirsiniz:
=IIF(Fields!PurchPrice.Value = 0 ,"",Fields!PurchPrice.Value)
=IIF(Fields!PurchPrice.Value = 0 ,"",Fields!PurchPrice.Value)
17 Temmuz 2014 Perşembe
AX 2012 - SSRS Report Geliştirirken Visual Studio Tablo Penceresi Kaybolursa?
View->Report Data
AX 2012 - VendInvoiceInfoTable Yeni Eklediğim Alanın Değeri Güncellemede Kayboluyor
VendInvoiceInfoTable tablosuna yeni bir alan ekledim. VendEditInvoice formu ile kaydı güncellemek istediğimde tabloya yeni eklediğim alanın içinin boş geldiğini gördüm. Uzun uğraşlar sonunda bu formun aslında kaydı yeni bir kayda kopyaladığını ve bu işlem esnasında beni alanımı da atladığını farkettim. Axapta kaydı kopyalarken copyFromHeader isimli tablo metodunu kullanıyor. Araya kendi satırımı ekledim:
this.VendorRequestedWorkerEmail = _header.VendorRequestedWorkerEmail;
//benim yeni alanım
this.myNewField = _header.myNewField;
sorun düzeldi. Bu tablonun satır tablosu VendInvoiceInfoLine da aynı şekilde çalışıyor.
this.VendorRequestedWorkerEmail = _header.VendorRequestedWorkerEmail;
//benim yeni alanım
this.myNewField = _header.myNewField;
sorun düzeldi. Bu tablonun satır tablosu VendInvoiceInfoLine da aynı şekilde çalışıyor.
Etiketler:
2012,
alan,
ax,
AXAPTA,
field,
güncellenme,
sorun,
vendinvoiceinfotable,
yeni
AX - 2012 TypeId Yerine Ne Geldi?
AX 2012'de TypeId fonksiyonunun çalışmadığını göreceksiniz. AX 2012'de bunun yerine enumlar için EnumStr, diğer veri tipleri için de ExtendedTypeStr kullanabilirsiniz.
11 Temmuz 2014 Cuma
AX 2012 - SSRS RDP Rapora Seçili Kayıtları Göndermek
SSRS DP Class parm metod olarak tablo ve container kabul etmiyor. Forumlarda biraz araştırdım ve str tipi veri göndermenin tavsiye edildiğini gördüm. Ancak bu çok da iyi bir yaklaşım değildi. En sonunda doğru metodun mevcut AX 2012 raporları içinde zaten bulunduğunu öğrendim. Linkte verdiğim PDF dosyasında çek raporunda bunun kullanıldığı anlatılıyordu. ChequeDP ve ChequeController classlarını inceleyerek aşağıdaki raporu yazdım:
Controller class:
class declaration:
class myController extends SrsReportRunController
{
#define.ReportName('myreport.Report')
myTMPTable myTMPTable;
}
public static void main(Args _args)
{
SysLastValue SysLastValue;
myController controller = new myController();
controller.parmReportName(#ReportName);
controller.parmArgs(_args);
controller.DeleteTmpData();
controller.init();
controller.startOperation();
}
protected void prePromptModifyContract()
{
SrsTmpTblMarshallerContract contract = this.parmReportContract().parmRdpContract() as SrsTmpTblMarshallerContract;
new SRSReportRunPermission().assert();
contract.parmTmpTableDataRecId(SRSTmpTblMarshaller::SendTmpTblToDataProvider(myTMPTable));
}
public void init()
{
FormDataSource ds;
TransDate transDate;
VendTrans vendTrans;
if (!this.parmArgs() ||
!this.parmArgs().record() ||
this.parmArgs().dataset() != tableNum(VendTrans))
throw error("Rapor uygun bir parametreyle çağrılmalıdır!..");
ds = this.parmArgs().record().dataSource();
vendTrans = ds.getFirst(1);
transDate = vendTrans.transDate;
PaymentReceipt.VendAccount = vendTrans.AccountNum;
for (vendTrans = ds.getFirst(1); vendTrans != null; vendTrans = ds.getNext())
{
myTMPTable.Date = vendTrans.TransDate;
...
myTMPTable.insert();
}
}
DP Class:
// <ETG - memre > GN: T: 11.07.2014 A:
[SRSReportParameterAttribute(classStr(SrsTmpTblMarshallerContract))]
public class mpDP extends SRSReportDataProviderBase
{
myTMPTAble myTMPTable;
}
private void initTmpTable()
{
SrsTmpTblMarshallerContract contract = this.parmDataContract() as SrsTmpTblMarshallerContract;
new SRSReportRunPermission().assert();
myTMPTable = SRSTmpTblMarshaller::getTmpTbl(contract.parmTmpTableDataRecId());
SRSTmpTblMarshaller::deleteTmpTblData(contract.parmTmpTableDataRecId());
CodeAccessPermission::revertAssert();
}
public void processReport()
{
CompanyInfo Company;
VendTable vendTable;
AmountMST amount;
TempStr NumtoTxt;
LedgerJournalTrans LedgerTrans;
this.initTmpTable();
...
}
Controller class:
class declaration:
class myController extends SrsReportRunController
{
#define.ReportName('myreport.Report')
myTMPTable myTMPTable;
}
public static void main(Args _args)
{
SysLastValue SysLastValue;
myController controller = new myController();
controller.parmReportName(#ReportName);
controller.parmArgs(_args);
controller.DeleteTmpData();
controller.init();
controller.startOperation();
}
protected void prePromptModifyContract()
{
SrsTmpTblMarshallerContract contract = this.parmReportContract().parmRdpContract() as SrsTmpTblMarshallerContract;
new SRSReportRunPermission().assert();
contract.parmTmpTableDataRecId(SRSTmpTblMarshaller::SendTmpTblToDataProvider(myTMPTable));
}
public void init()
{
FormDataSource ds;
TransDate transDate;
VendTrans vendTrans;
if (!this.parmArgs() ||
!this.parmArgs().record() ||
this.parmArgs().dataset() != tableNum(VendTrans))
throw error("Rapor uygun bir parametreyle çağrılmalıdır!..");
ds = this.parmArgs().record().dataSource();
vendTrans = ds.getFirst(1);
transDate = vendTrans.transDate;
PaymentReceipt.VendAccount = vendTrans.AccountNum;
for (vendTrans = ds.getFirst(1); vendTrans != null; vendTrans = ds.getNext())
{
myTMPTable.Date = vendTrans.TransDate;
...
myTMPTable.insert();
}
}
DP Class:
// <ETG - memre > GN: T: 11.07.2014 A:
[SRSReportParameterAttribute(classStr(SrsTmpTblMarshallerContract))]
public class mpDP extends SRSReportDataProviderBase
{
myTMPTAble myTMPTable;
}
private void initTmpTable()
{
SrsTmpTblMarshallerContract contract = this.parmDataContract() as SrsTmpTblMarshallerContract;
new SRSReportRunPermission().assert();
myTMPTable = SRSTmpTblMarshaller::getTmpTbl(contract.parmTmpTableDataRecId());
SRSTmpTblMarshaller::deleteTmpTblData(contract.parmTmpTableDataRecId());
CodeAccessPermission::revertAssert();
}
public void processReport()
{
CompanyInfo Company;
VendTable vendTable;
AmountMST amount;
TempStr NumtoTxt;
LedgerJournalTrans LedgerTrans;
this.initTmpTable();
...
}
2 Temmuz 2014 Çarşamba
AX 2012 - Bir forma ledger dimension (muhasebe boyutu) için segmented entry kontrol eklemek
Direk eklediğinizde lookup vs.. düzgün çalışmadığını göreceksiniz. Yapmanız gerekenler aşağıdaki Microsoft linkinde:
http://msdn.microsoft.com/en-us/library/hh300644.aspx
http://msdn.microsoft.com/en-us/library/hh300644.aspx
25 Haziran 2014 Çarşamba
AX 2012 - Form datasını yenilemek
Çağırdığınız bir alt rutin ekrandaki datayı yeniliyor. Formda data yenilenmiyor. Bunu çözmek için önce research, sonra refresh metodlarını çağırmanız en uygun yoldur. Research mevcut query filtrelerinizi bozmaz ve true parametresiyle çağırdığınızda önceki kayda konumlanır:
LedgerJournalTrans_DS.research(true);
LedgerJournalTrans_DS.refresh();
Çağırdığınız rutin bir SysOperation class rutiniyse ve ekran halen yenilenmiyorsa controller classda bunu yapmayı unutmayın:
controller.parmExecutionMode(SysOperationExecutionMode::Asynchronous);
Aksi takdirde classın işi bitmeden research ve refresh çalıştırmış ve dataları yenilememiş olursunuz.
LedgerJournalTrans_DS.research(true);
LedgerJournalTrans_DS.refresh();
Çağırdığınız rutin bir SysOperation class rutiniyse ve ekran halen yenilenmiyorsa controller classda bunu yapmayı unutmayın:
controller.parmExecutionMode(SysOperationExecutionMode::Asynchronous);
Aksi takdirde classın işi bitmeden research ve refresh çalıştırmış ve dataları yenilememiş olursunuz.
24 Haziran 2014 Salı
AX 2012 - Default dimension
//http://axvuongbao.blogspot.com.tr/2013/08/how-to-create-default-dimension-from-x.html
public static DimensionDefault CreateDefaultDim(Container _a,Container _v)
{
DimensionAttributeValueSetStorage valueSetStorage = new DimensionAttributeValueSetStorage();
DimensionDefault result;
int i;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue dimensionAttributeValue;
//_attr is dimension name in table DimensionAttribute
container conAttr = _a;
container conValue = _v;
boolean _createIfNotFound = true;
str dimValue;
for (i = 1; i <= conLen(conAttr); i++)
{
dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));
if (dimensionAttribute.RecId == 0)
{
continue;
}
dimValue = conPeek(conValue,i);
if (dimValue != "")
{
// _createIfNotFound is "true". A dimensionAttributeValue record will be created if not found.
dimensionAttributeValue=
dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,_createIfNotFound);
// Add the dimensionAttibuteValue to the default dimension
valueSetStorage.addItem(dimensionAttributeValue);
}
}
result = valueSetStorage.save();
return result;
}
Kullanımı:
LedgerJournalTrans.DefaultDimension = MyUtility::CreateDefaultDim("[Contract],[Project]","[0001],[MyBigProject]")
Eğer Unable to return DimensionAttributeValue record for ... gibi bir hata alırsanız sistemde kayıtlı olmayan bir dimension value değerine kombinasyon oluşturmaya çalışıyorsunuz demektir.
public static DimensionDefault CreateDefaultDim(Container _a,Container _v)
{
DimensionAttributeValueSetStorage valueSetStorage = new DimensionAttributeValueSetStorage();
DimensionDefault result;
int i;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue dimensionAttributeValue;
//_attr is dimension name in table DimensionAttribute
container conAttr = _a;
container conValue = _v;
boolean _createIfNotFound = true;
str dimValue;
for (i = 1; i <= conLen(conAttr); i++)
{
dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));
if (dimensionAttribute.RecId == 0)
{
continue;
}
dimValue = conPeek(conValue,i);
if (dimValue != "")
{
// _createIfNotFound is "true". A dimensionAttributeValue record will be created if not found.
dimensionAttributeValue=
dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,_createIfNotFound);
// Add the dimensionAttibuteValue to the default dimension
valueSetStorage.addItem(dimensionAttributeValue);
}
}
result = valueSetStorage.save();
return result;
}
Kullanımı:
LedgerJournalTrans.DefaultDimension = MyUtility::CreateDefaultDim("[Contract],[Project]","[0001],[MyBigProject]")
Eğer Unable to return DimensionAttributeValue record for ... gibi bir hata alırsanız sistemde kayıtlı olmayan bir dimension value değerine kombinasyon oluşturmaya çalışıyorsunuz demektir.
20 Haziran 2014 Cuma
AX 2012 - Query strfmt ile tarih value değeri vermek
Query'de strfmt ile tarih value değeri vermek isterseniz Date2StrXpp fonksiyonunu kullanmalısınız:
...
QBR2.value(strFmt(' ( TransDate >= %1 )' , Date2StrXpp(TransDate) ));
...
...
QBR2.value(strFmt(' ( TransDate >= %1 )' , Date2StrXpp(TransDate) ));
...
17 Haziran 2014 Salı
AX 2012 RDP class parametreleri validate method, gruplama ve etiket ekleme
Class Declaration:
[
DataContractAttribute,
SysOperationGroupAttribute("DateGroup", "Tarih aralığı", "1", FormArrangeMethod::Vertical),
SysOperationGroupAttribute("Other", "Diğer filtreler", "1", FormArrangeMethod::Vertical)
]
class myContract implements SysOperationValidatable
{
...
}
Parm metod:
[DataMemberAttribute('StartDate'),
SysOperationGroupMemberAttribute("DateGroup"),
SysOperationDisplayOrderAttribute("1")]
public StartDate parmStartDate(StartDate _StartDate = startDate)
{
startDate = _StartDate;
return StartDate;
}
Validate metodu:
public boolean validate()
{
boolean isValid = true;
if ( !endDate || !StartDate)
isValid = checkfailed("İlk/Son tarih girmelisiniz!..");
return isValid;
}
[
DataContractAttribute,
SysOperationGroupAttribute("DateGroup", "Tarih aralığı", "1", FormArrangeMethod::Vertical),
SysOperationGroupAttribute("Other", "Diğer filtreler", "1", FormArrangeMethod::Vertical)
]
class myContract implements SysOperationValidatable
{
...
}
Parm metod:
[DataMemberAttribute('StartDate'),
SysOperationGroupMemberAttribute("DateGroup"),
SysOperationDisplayOrderAttribute("1")]
public StartDate parmStartDate(StartDate _StartDate = startDate)
{
startDate = _StartDate;
return StartDate;
}
Validate metodu:
public boolean validate()
{
boolean isValid = true;
if ( !endDate || !StartDate)
isValid = checkfailed("İlk/Son tarih girmelisiniz!..");
return isValid;
}
AX 2012 RDP ile SSRS oluştururken Query ekleme
Data provider class a aşağıdaki query attribute yi ekleyin:
[
SRSReportQueryAttribute (querystr(Cust)),
SRSReportParameterAttribute(classstr(myReportContract))
]
class myReportDP extends SRSReportDataProviderBase
{
...
}
Query'i böyle alın:
[SysEntryPointAttribute(false)]
public void processReport()
{
QueryRun qRun;
Query query;
...
query = this.parmQuery();
...
Eğer select query butonu görmek istiyorsanız SSRS rapor dizayn ekranında Dynamics Filter property değerini true yapmayı unutmayın.
[
SRSReportQueryAttribute (querystr(Cust)),
SRSReportParameterAttribute(classstr(myReportContract))
]
class myReportDP extends SRSReportDataProviderBase
{
...
}
Query'i böyle alın:
[SysEntryPointAttribute(false)]
public void processReport()
{
QueryRun qRun;
Query query;
...
query = this.parmQuery();
...
Eğer select query butonu görmek istiyorsanız SSRS rapor dizayn ekranında Dynamics Filter property değerini true yapmayı unutmayın.
AX - 2012 Sysoperation class örneği
Contract Class:
classDeclaration metodu:
[DataContractAttribute]
class myTestContract
{
TransDate transDate;
str packedQuery;
LedgerJournalId JournalId;
}
Diğer metodlar:
//------ Query almak için -------------
public Query getQuery()
{
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
//---------- bir parm metod örneği --------------
[DataMemberAttribute
, SysOperationControlVisibilityAttribute(false)]
public LedgerJournalId parmJournalId(LedgerJournalId _JournalId = JournalId)
{
JournalId = _JournalId;
return JournalId;
}
//--------------------- parmQuery ile bir query çağır ----------------
[DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', querystr(myQuery))
]
public str parmQuery(str _packedQuery = packedQuery)
{
packedQuery = _packedQuery;
return packedQuery;
}
//-------------- SetQuery ile query ver -----------------------
public void setQuery(Query _query)
{
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
DataService Class:
ClassDeclaration metodu:
class myDataService
{
}
Batch job metodu:
[SysEntryPointAttribute]
public void Go(myContract _contract)
{
QueryRun qRun;
Query query;
QueryBuildDataSource QBDS;
QueryBuildRange QBR,QBR2;
CustTable CustTable;
LedgerJournalId JournalId;
TransDate PaymDate;
LedgerJournalTrans journalTrans;
JournalId = _contract.parmJournalId();
query = _contract.getQuery();
QBDS = query.dataSourceTable(tablenum(CustTable));
QBR = QBDS.findRange(fieldnum(CustTable,CustAccount));
if (!QBR)
QBR = QBDS.addRange(fieldnum(CustTable,CustAccount));
QBR.value(queryValue("000001"));
qRun = new QueryRun(query);
while(qRun.next())
{
CustTable = qRun.get(tableNum(CustTable));
...
}
Controller Class:
class declaration:
class MyController extends SysOperationServiceController
{
}
public static MyController newFromArgs(Args _args)
{
MyController controller;
MyContract contract;
LedgerJournalTable LedgerJournalTable;
if ( !_args || !_args.caller() )
throw error("This class needs parameter!..");
ledgerJournalTable = _args.caller().ledgerJournalTable();
controller = new ETGVendAdvanceReqController();
controller.initializeFromArgs(_args);
contract = Controller.getDataContractObject("_contract");
contract.parmPaymDate(today());
contract.parmJournalId(ledgerJournalTable.JournalNum);
return Controller;
}
public static void main(Args _args)
{
MyController controller;
controller = MyController::newFromArgs(_args);
controller.parmExecutionMode(SysOperationExecutionMode::Asynchronous);
controller.startOperation();
}
Menu item parametreleri:
Object - MyController
ObjectType - class
Parameters - MyDataService.Go
classDeclaration metodu:
[DataContractAttribute]
class myTestContract
{
TransDate transDate;
str packedQuery;
LedgerJournalId JournalId;
}
Diğer metodlar:
//------ Query almak için -------------
public Query getQuery()
{
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
//---------- bir parm metod örneği --------------
[DataMemberAttribute
, SysOperationControlVisibilityAttribute(false)]
public LedgerJournalId parmJournalId(LedgerJournalId _JournalId = JournalId)
{
JournalId = _JournalId;
return JournalId;
}
//--------------------- parmQuery ile bir query çağır ----------------
[DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', querystr(myQuery))
]
public str parmQuery(str _packedQuery = packedQuery)
{
packedQuery = _packedQuery;
return packedQuery;
}
//-------------- SetQuery ile query ver -----------------------
public void setQuery(Query _query)
{
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
DataService Class:
ClassDeclaration metodu:
class myDataService
{
}
Batch job metodu:
[SysEntryPointAttribute]
public void Go(myContract _contract)
{
QueryRun qRun;
Query query;
QueryBuildDataSource QBDS;
QueryBuildRange QBR,QBR2;
CustTable CustTable;
LedgerJournalId JournalId;
TransDate PaymDate;
LedgerJournalTrans journalTrans;
JournalId = _contract.parmJournalId();
query = _contract.getQuery();
QBDS = query.dataSourceTable(tablenum(CustTable));
QBR = QBDS.findRange(fieldnum(CustTable,CustAccount));
if (!QBR)
QBR = QBDS.addRange(fieldnum(CustTable,CustAccount));
QBR.value(queryValue("000001"));
qRun = new QueryRun(query);
while(qRun.next())
{
CustTable = qRun.get(tableNum(CustTable));
...
}
Controller Class:
class declaration:
class MyController extends SysOperationServiceController
{
}
public static MyController newFromArgs(Args _args)
{
MyController controller;
MyContract contract;
LedgerJournalTable LedgerJournalTable;
if ( !_args || !_args.caller() )
throw error("This class needs parameter!..");
ledgerJournalTable = _args.caller().ledgerJournalTable();
controller = new ETGVendAdvanceReqController();
controller.initializeFromArgs(_args);
contract = Controller.getDataContractObject("_contract");
contract.parmPaymDate(today());
contract.parmJournalId(ledgerJournalTable.JournalNum);
return Controller;
}
public static void main(Args _args)
{
MyController controller;
controller = MyController::newFromArgs(_args);
controller.parmExecutionMode(SysOperationExecutionMode::Asynchronous);
controller.startOperation();
}
Menu item parametreleri:
Object - MyController
ObjectType - class
Parameters - MyDataService.Go
AX 2012 - LedgerJournalTrans Tablosunda Tedarikçi/Müşteri Hesabı Nasıl Alınır, Yazılır?
Bu bilgi ledgerDimension alanında saklanıyor. Yazarken:
LedgerJournalTrans.LedgerDimension = DimensionStorage::getDynamicAccount(myVendAccount, LedgerJournalACType::Vend);
Okurken tablonun AccountDisplay veya accountNameFind metodlarına bakabilirsiniz veya:
DimensionStorage::ledgerDimension2AccountNum(ledgerJournalTrans.OffsetLedgerDimension)
DimensionStorage::ledgerDimension2AccountNum(ledgerJournalTrans.LedgerDimension)
CustTable::findByLedgerDimension(ledgerJournalTrans.LedgerDimension) VendTable::findByLedgerDimension(ledgerJournalTrans.LedgerDimension)
LedgerJournalTrans.LedgerDimension = DimensionStorage::getDynamicAccount(myVendAccount, LedgerJournalACType::Vend);
Okurken tablonun AccountDisplay veya accountNameFind metodlarına bakabilirsiniz veya:
DimensionStorage::ledgerDimension2AccountNum(ledgerJournalTrans.OffsetLedgerDimension)
DimensionStorage::ledgerDimension2AccountNum(ledgerJournalTrans.LedgerDimension)
CustTable::findByLedgerDimension(ledgerJournalTrans.LedgerDimension) VendTable::findByLedgerDimension(ledgerJournalTrans.LedgerDimension)
4 Nisan 2014 Cuma
AX 2012 RDP (Report Data Provider) Oluşturma
Data Provider class:
------------Class Declaration-------------------
[SRSReportParameterAttribute(classStr(myCustInvoicePrintContract))]
class myCustInvoicePrintDP extends SRSReportDataProviderbase
{
CustInvoicePrintTMP InvoicePrint;
CustInvoicePrintTransTMP InvoicePrintTrans;
CustInvoicePrintTaxTMP InvoicePrintTax;
CustInvoicePrintFootTMP InvoicePrintFoot;
RecId RecId;
}
-----------------SSRS için tablo metodları---------------------------
[SRSReportDataSetAttribute(tableStr(CustInvoicePrintTMP))]
public CustInvoicePrintTMP getCustInvoicePrint()
{
select * from InvoicePrint;
return InvoicePrint;
}
[SRSReportDataSetAttribute(tableStr(CustInvoicePrintTransTMP))]
public CustInvoicePrintTransTMP getCustInvoicePrintTrans()
{
select * from InvoicePrintTrans;
return InvoicePrintTrans;
}
------------------GetParameter metodu--------------------------------
private void getReportParameters()
{
myCustInvoicePrintContract Contract = this.parmDataContract();
if (Contract)
{
RecId = Contract.parmRecordId();
}
}
------------------- Datanın doldurulduğu processReport metodu--------
[SysEntryPointAttribute(false)]
public void processReport()
{
CustInvoiceJour InvoiceJour;
CustInvoiceTrans InvoiceTrans;
TaxTrans taxTrans;
TaxOnItem taxOnItem;
TaxGroupData taxGroupData;
AmountMST Tax;
this.getReportParameters();
InvoiceJour = CustInvoiceJour::findRecId(RecId);
InvoicePrint.InvoiceDate = InvoiceJour.InvoiceDate;
InvoicePrint.InvoiceName = InvoiceJour.invoiceName();
InvoicePrint.TaxOfficeName_TR = CustTable::find(InvoiceJour.InvoiceAccount).TaxOfficeName_TR;
...
InvoicePrint.insert();
while select InvoiceTrans where
InvoiceTrans.SalesId == InvoiceJour.SalesId && InvoiceTrans.InvoiceId == InvoiceJour.InvoiceId &&
InvoiceTrans.InvoiceDate == InvoiceJour.InvoiceDate && InvoiceTrans.numberSequenceGroup == InvoiceJour.numberSequenceGroup
{
select taxOnItem
where taxOnItem.TaxItemGroup == InvoiceTrans.TaxItemGroup
join taxGroupData
where taxGroupData.TaxCode == taxOnItem.TaxCode &&
taxGroupData.TaxGroup == InvoiceTrans.TaxGroup;
InvoicePrintTrans.TaxValue = TaxData::find(TaxOnItem.TaxCode, InvoiceTrans.InvoiceDate, 0).TaxValue;
InvoicePrintTrans.Qty = InvoiceTrans.Qty;
...
InvoicePrintTrans.insert();
Tax = Tax::calcTaxAmount(InvoiceTrans.TaxGroup,taxOnItem.TaxItemGroup,InvoiceTrans.InvoiceDate,
InvoiceTrans.CurrencyCode,InvoiceTrans.LineAmount,TaxModuleType::Sales);
...
InvoicePrintTax.insert();
}
}
...
}
Controller class:
--------------Class Declaration------------------
class myCustInvoicePrintController extends SrsReportRunController
{
#define.ReportName('CustInvoicePrint.Report')
myCustInvoicePrintContract contract;
CustInvoiceJour custInvoiceJour;
}
parametreyi al
protected void prePromptModifyContract()
{
if (this.parmArgs() &&
this.parmArgs().record() &&
this.parmArgs().dataset() == tableNum(CustInvoiceJour))
{
custInvoiceJour = this.parmArgs().record();
}
if (!Contract)
{
Contract = this.parmReportContract().parmRdpContract();
}
contract.parmRecordId(custInvoiceJour.RecId);
super();
}
public static myCustInvoicePrintController construct(Args _args)
{
myCustInvoicePrintController controller = new myCustInvoicePrintController();
controller.parmArgs(_args);
return controller;
}
public static void main(Args _args)
{
SysLastValue SysLastValue;
myCustInvoicePrintController controller = new myCustInvoicePrintController();
controller.parmReportName(#ReportName);
controller.parmArgs(_args);
if(CSReportPrint::find(SysUserInfo::find().RecId,CSReportType::Invoice1).PrinterName)
{
controller.parmReportContract().parmPrintSettings().printMediumType(SRSPrintMediumType::Printer);
controller.parmReportContract().parmPrintSettings().printerName(CSReportPrint::find(SysUserInfo::find().RecId,CSReportType::Invoice1).PrinterName);
}
controller.parmShowDialog(false); //ekranda diyalog gösterme
controller.startOperation();
}
Contract class:
---------------class declaration---------------------------
[DataContractAttribute]
class myCustInvoicePrintContract
{
RecId recordId;
}parametreyi al
[DataMemberAttribute('RecordId')]
public recId parmRecordId(recId _recordId = recordId)
{
recordId = _recordId;
return recordId;
}
------------Class Declaration-------------------
[SRSReportParameterAttribute(classStr(myCustInvoicePrintContract))]
class myCustInvoicePrintDP extends SRSReportDataProviderbase
{
CustInvoicePrintTMP InvoicePrint;
CustInvoicePrintTransTMP InvoicePrintTrans;
CustInvoicePrintTaxTMP InvoicePrintTax;
CustInvoicePrintFootTMP InvoicePrintFoot;
RecId RecId;
}
-----------------SSRS için tablo metodları---------------------------
[SRSReportDataSetAttribute(tableStr(CustInvoicePrintTMP))]
public CustInvoicePrintTMP getCustInvoicePrint()
{
select * from InvoicePrint;
return InvoicePrint;
}
[SRSReportDataSetAttribute(tableStr(CustInvoicePrintTransTMP))]
public CustInvoicePrintTransTMP getCustInvoicePrintTrans()
{
select * from InvoicePrintTrans;
return InvoicePrintTrans;
}
------------------GetParameter metodu--------------------------------
private void getReportParameters()
{
myCustInvoicePrintContract Contract = this.parmDataContract();
if (Contract)
{
RecId = Contract.parmRecordId();
}
}
------------------- Datanın doldurulduğu processReport metodu--------
[SysEntryPointAttribute(false)]
public void processReport()
{
CustInvoiceJour InvoiceJour;
CustInvoiceTrans InvoiceTrans;
TaxTrans taxTrans;
TaxOnItem taxOnItem;
TaxGroupData taxGroupData;
AmountMST Tax;
this.getReportParameters();
InvoiceJour = CustInvoiceJour::findRecId(RecId);
InvoicePrint.InvoiceDate = InvoiceJour.InvoiceDate;
InvoicePrint.InvoiceName = InvoiceJour.invoiceName();
InvoicePrint.TaxOfficeName_TR = CustTable::find(InvoiceJour.InvoiceAccount).TaxOfficeName_TR;
...
InvoicePrint.insert();
while select InvoiceTrans where
InvoiceTrans.SalesId == InvoiceJour.SalesId && InvoiceTrans.InvoiceId == InvoiceJour.InvoiceId &&
InvoiceTrans.InvoiceDate == InvoiceJour.InvoiceDate && InvoiceTrans.numberSequenceGroup == InvoiceJour.numberSequenceGroup
{
select taxOnItem
where taxOnItem.TaxItemGroup == InvoiceTrans.TaxItemGroup
join taxGroupData
where taxGroupData.TaxCode == taxOnItem.TaxCode &&
taxGroupData.TaxGroup == InvoiceTrans.TaxGroup;
InvoicePrintTrans.TaxValue = TaxData::find(TaxOnItem.TaxCode, InvoiceTrans.InvoiceDate, 0).TaxValue;
InvoicePrintTrans.Qty = InvoiceTrans.Qty;
...
InvoicePrintTrans.insert();
Tax = Tax::calcTaxAmount(InvoiceTrans.TaxGroup,taxOnItem.TaxItemGroup,InvoiceTrans.InvoiceDate,
InvoiceTrans.CurrencyCode,InvoiceTrans.LineAmount,TaxModuleType::Sales);
...
InvoicePrintTax.insert();
}
}
...
}
Controller class:
--------------Class Declaration------------------
class myCustInvoicePrintController extends SrsReportRunController
{
#define.ReportName('CustInvoicePrint.Report')
myCustInvoicePrintContract contract;
CustInvoiceJour custInvoiceJour;
}
parametreyi al
protected void prePromptModifyContract()
{
if (this.parmArgs() &&
this.parmArgs().record() &&
this.parmArgs().dataset() == tableNum(CustInvoiceJour))
{
custInvoiceJour = this.parmArgs().record();
}
if (!Contract)
{
Contract = this.parmReportContract().parmRdpContract();
}
contract.parmRecordId(custInvoiceJour.RecId);
super();
}
public static myCustInvoicePrintController construct(Args _args)
{
myCustInvoicePrintController controller = new myCustInvoicePrintController();
controller.parmArgs(_args);
return controller;
}
public static void main(Args _args)
{
SysLastValue SysLastValue;
myCustInvoicePrintController controller = new myCustInvoicePrintController();
controller.parmReportName(#ReportName);
controller.parmArgs(_args);
if(CSReportPrint::find(SysUserInfo::find().RecId,CSReportType::Invoice1).PrinterName)
{
controller.parmReportContract().parmPrintSettings().printMediumType(SRSPrintMediumType::Printer);
controller.parmReportContract().parmPrintSettings().printerName(CSReportPrint::find(SysUserInfo::find().RecId,CSReportType::Invoice1).PrinterName);
}
controller.parmShowDialog(false); //ekranda diyalog gösterme
controller.startOperation();
}
Contract class:
---------------class declaration---------------------------
[DataContractAttribute]
class myCustInvoicePrintContract
{
RecId recordId;
}parametreyi al
[DataMemberAttribute('RecordId')]
public recId parmRecordId(recId _recordId = recordId)
{
recordId = _recordId;
return recordId;
}
10 Mart 2014 Pazartesi
AXAPTA - Evrak satırlarında KDV oranları ve tutarlarını bulmak
while select InvoiceTrans where
InvoiceTrans.SalesId == InvoiceJour.SalesId && InvoiceTrans.InvoiceId == InvoiceJour.InvoiceId &&
InvoiceTrans.InvoiceDate == InvoiceJour.InvoiceDate && InvoiceTrans.numberSequenceGroup == InvoiceJour.numberSequenceGroup
{
InvoicePrintTrans.Name = InvoiceTrans.Name;
select taxOnItem
where taxOnItem.TaxItemGroup == InvoiceTrans.TaxItemGroup
join taxGroupData
where taxGroupData.TaxCode == taxOnItem.TaxCode &&
taxGroupData.TaxGroup == InvoiceTrans.TaxGroup;
TaxValue = TaxData::find(TaxOnItem.TaxCode, InvoiceTrans.InvoiceDate, 0).TaxValue;
Tax = Tax::calcTaxAmount(InvoiceTrans.TaxGroup,taxOnItem.TaxItemGroup,InvoiceTrans.InvoiceDate,
InvoiceTrans.CurrencyCode,InvoiceTrans.LineAmount,TaxModuleType::Sales);
info(strFmt("KDV oranı %1 KDV tutarı",TaxValue,Tax));
}
13 Şubat 2014 Perşembe
AXAPTA - Bir classdan türeyen herhangi bir classı string adıyla çağırmak
Üç yolu varmış:
1- classFactory.createClass(className2Id('MyClass'))
2- test1 test;
DictClass d;
d = new DictClass(className2Id("test1"));
test = d.makeObject(222);
test.MyTest();
3. Sadece AX 2012 için extension framework . Bunu daha sonra inceleyeceğim.
1- classFactory.createClass(className2Id('MyClass'))
2- test1 test;
DictClass d;
d = new DictClass(className2Id("test1"));
test = d.makeObject(222);
test.MyTest();
3. Sadece AX 2012 için extension framework . Bunu daha sonra inceleyeceğim.
4 Şubat 2014 Salı
AX 2012 - Şirket logosu
mylogo = FormLetter::companyLogo();
AX 2012 - RDP class'ı Axapta tarafında test etme
SSRS report için geliştirdiğiniz RDP classlarını AX tarafında nasıl test edersiniz?
DGHCreditDetailsDP dp = new DGHCreditDetailsDP();
DGHCreditDetailsDC dc = new DGHCreditDetailsDC();
Query q;
dc.parmTransDate(str2Date("28.12.2013",123));
q = dp.parmQuery();
q.dataSourceTable(tableNum(BankAccountTrans)).addRange(Fieldnum(BankAccountTrans,accountid)).value("102 02 034 002");
dp.parmDataContract(dc);
dp.processReport();
DGHCreditDetailsDP dp = new DGHCreditDetailsDP();
DGHCreditDetailsDC dc = new DGHCreditDetailsDC();
Query q;
dc.parmTransDate(str2Date("28.12.2013",123));
q = dp.parmQuery();
q.dataSourceTable(tableNum(BankAccountTrans)).addRange(Fieldnum(BankAccountTrans,accountid)).value("102 02 034 002");
dp.parmDataContract(dc);
dp.processReport();
6 Ocak 2014 Pazartesi
AX 2012 - SSRS rapor ile PDF çıktısı alma
AX 2012 ile PDF rapor oluşturma için Martin Drab'ın blog sayfasını kullandım:
void CreatePDF(Str60 _Subject,Notes _Body)
{
MYReportPurchController controller;
MYReportPurchContract rdpContract = new MyReportPurchContract();
SRSPrintDestinationSettings settings;
Args args = new args();
str fileName;
args.record(this);
controller = MYReportPurchController::construct(args);
// Define report and report design to use
controller.parmReportName(ssrsReportStr(EtgPurchOrderForm,PrecisionDesign1));
// Use execution mode appropriate to your situation
controller.parmExecutionMode(SysOperationExecutionMode::Synchronous);
// Suppress report dialog
// Explicitly provide all required parameters
controller.parmReportContract().parmRdpContract(rdpContract);
//rdpContract.
// Change print settings as needed
settings = controller.parmReportContract().parmPrintSettings();
settings.overwriteFile(true);
settings.printMediumType(SRSPrintMediumType::File);
settings.fileFormat(SRSReportFileFormat::PDF);
//settings.
#WinAPI
fileName = WinApi::getTempPath() +this.PurchOrderDocNum+".PDF";
settings.fileName(fileName);
// Execute the report
controller.parmShowDialog(false);
controller.startOperation();
}
Veya seçili kayıtları RDP rapordan PDF olarak mail gönderme:
SMAServiceOrderTable serviceOrder;
MultiSelectionHelper helper;
FormRun caller = _args.caller();
FormDataSource SMAServiceOrderTable_DS;
SRSPrintDestinationSettings settings;
ETGServiceReportContract contract = new ETGServiceReportContract();
SrsReportRunController controller;
Filename fileName;
int counter;
SysMailer mailer = new SysMailer();
SysEmailParameters parameters = SysEmailParameters::find();
Dialog dialog;
DialogField field;
Email email;
dialog = new Dialog("Servis Raporu Gönderme");
field = dialog.addField(ExtendedTypeStr(email));
dialog.run();
if (!dialog.closedOK())
return;
email = field.value();
if (email == "")
throw error("Bir mail adresi girmelisiniz!..");
SMAServiceOrderTable_DS = caller.dataSource();
helper = MultiSelectionHelper::createFromCaller(caller);
if (parameters.SMTPRelayServerName)
{
mailer.SMTPRelayServer(parameters.SMTPRelayServerName,
parameters.SMTPPortNumber,
parameters.SMTPUserName,
SysEmailParameters::password(),
parameters.NTLM);
}
else
{
mailer.SMTPRelayServer(parameters.SMTPServerIPAddress,
parameters.SMTPPortNumber,
parameters.SMTPUserName,
SysEmailParameters::password(),
parameters.NTLM);
}
mailer.fromAddress('noreply@sinbo.com.tr');
mailer.tos().appendAddress(email);
mailer.htmlBody('<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">Sayın Yetkili,<br><br> Servis raporu kopyanız ektedir.<br><br>Saygılarımızla,<br><br><br>Sinbo');
mailer.subject('Sinbo Servis Raporu');
mailer.bodyCharSet("Windows-1254");
helper.createQueryRanges(SMAServiceOrderTable_DS.queryBuildDataSource(),fieldStr(SMAServiceOrderTable,RecId));
serviceOrder = helper.getFirst();
while(serviceOrder)
{
controller = new SrsReportRunController();
controller.parmReportName(ssrsReportStr(ETGServiceReport, Report));
contract = controller.parmReportContract().parmRdpContract();
controller.parmReportContract().parmPrintSettings().printMediumType(SRSPrintMediumType::Screen);
controller.parmShowDialog(false);
contract.parmServiceOrderId(serviceOrder.ServiceOrderId);
counter++;
fileName = WinApi::getTempPath() + strFmt("Servis Raporu %1.PDF",counter);
settings = controller.parmReportContract().parmPrintSettings();
settings.overwriteFile(true);
settings.printMediumType(SRSPrintMediumType::File);
settings.fileFormat(SRSReportFileFormat::PDF);
settings.fileName(fileName);
controller.startOperation();
mailer.attachments().add(fileName);
serviceOrder = helper.getNext();
}
if (counter == 0)
return;
infolog.clear();
mailer.sendMail();
void CreatePDF(Str60 _Subject,Notes _Body)
{
MYReportPurchController controller;
MYReportPurchContract rdpContract = new MyReportPurchContract();
SRSPrintDestinationSettings settings;
Args args = new args();
str fileName;
args.record(this);
controller = MYReportPurchController::construct(args);
// Define report and report design to use
controller.parmReportName(ssrsReportStr(EtgPurchOrderForm,PrecisionDesign1));
// Use execution mode appropriate to your situation
controller.parmExecutionMode(SysOperationExecutionMode::Synchronous);
// Suppress report dialog
// Explicitly provide all required parameters
controller.parmReportContract().parmRdpContract(rdpContract);
//rdpContract.
// Change print settings as needed
settings = controller.parmReportContract().parmPrintSettings();
settings.overwriteFile(true);
settings.printMediumType(SRSPrintMediumType::File);
settings.fileFormat(SRSReportFileFormat::PDF);
//settings.
#WinAPI
fileName = WinApi::getTempPath() +this.PurchOrderDocNum+".PDF";
settings.fileName(fileName);
// Execute the report
controller.parmShowDialog(false);
controller.startOperation();
}
Veya seçili kayıtları RDP rapordan PDF olarak mail gönderme:
SMAServiceOrderTable serviceOrder;
MultiSelectionHelper helper;
FormRun caller = _args.caller();
FormDataSource SMAServiceOrderTable_DS;
SRSPrintDestinationSettings settings;
ETGServiceReportContract contract = new ETGServiceReportContract();
SrsReportRunController controller;
Filename fileName;
int counter;
SysMailer mailer = new SysMailer();
SysEmailParameters parameters = SysEmailParameters::find();
Dialog dialog;
DialogField field;
Email email;
dialog = new Dialog("Servis Raporu Gönderme");
field = dialog.addField(ExtendedTypeStr(email));
dialog.run();
if (!dialog.closedOK())
return;
email = field.value();
if (email == "")
throw error("Bir mail adresi girmelisiniz!..");
SMAServiceOrderTable_DS = caller.dataSource();
helper = MultiSelectionHelper::createFromCaller(caller);
if (parameters.SMTPRelayServerName)
{
mailer.SMTPRelayServer(parameters.SMTPRelayServerName,
parameters.SMTPPortNumber,
parameters.SMTPUserName,
SysEmailParameters::password(),
parameters.NTLM);
}
else
{
mailer.SMTPRelayServer(parameters.SMTPServerIPAddress,
parameters.SMTPPortNumber,
parameters.SMTPUserName,
SysEmailParameters::password(),
parameters.NTLM);
}
mailer.fromAddress('noreply@sinbo.com.tr');
mailer.tos().appendAddress(email);
mailer.htmlBody('<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">Sayın Yetkili,<br><br> Servis raporu kopyanız ektedir.<br><br>Saygılarımızla,<br><br><br>Sinbo');
mailer.subject('Sinbo Servis Raporu');
mailer.bodyCharSet("Windows-1254");
helper.createQueryRanges(SMAServiceOrderTable_DS.queryBuildDataSource(),fieldStr(SMAServiceOrderTable,RecId));
serviceOrder = helper.getFirst();
while(serviceOrder)
{
controller = new SrsReportRunController();
controller.parmReportName(ssrsReportStr(ETGServiceReport, Report));
contract = controller.parmReportContract().parmRdpContract();
controller.parmReportContract().parmPrintSettings().printMediumType(SRSPrintMediumType::Screen);
controller.parmShowDialog(false);
contract.parmServiceOrderId(serviceOrder.ServiceOrderId);
counter++;
fileName = WinApi::getTempPath() + strFmt("Servis Raporu %1.PDF",counter);
settings = controller.parmReportContract().parmPrintSettings();
settings.overwriteFile(true);
settings.printMediumType(SRSPrintMediumType::File);
settings.fileFormat(SRSReportFileFormat::PDF);
settings.fileName(fileName);
controller.startOperation();
mailer.attachments().add(fileName);
serviceOrder = helper.getNext();
}
if (counter == 0)
return;
infolog.clear();
mailer.sendMail();
AXAPTA - Email gönderme
private void SendMail2(str _FileName,Str60 _Subject,Notes _Body)
{
str Toaddress;
System.Net.Mail.MailMessage Msg = new System.Net.Mail.MailMessage();
System.Net.Mail.MailAddress fromMail;
System.Net.Mail.MailAddressCollection toadrr;
System.Net.Mail.SmtpClient smCL = new System.Net.Mail.SmtpClient();
System.Net.NetworkCredential credential;
str bodygrd,sSmtpServer;
CLRObject exc;
CLRObject innerExc;
CLRObject clrExcMessage;
str strError;
SysEmailParameters EmailParm;
str pass;
System.Net.Mail.AttachmentCollection mailAttachementCollection;
System.Net.Mail.Attachment mailAttachment;
;
toaddress="test@hotmail.com";
EmailParm = SysEmailParameters::find();
pass = SysEmailParameters::password();
credential = new System.Net.NetworkCredential(EmailParm.SMTPUserName,pass);
fromMail = new System.Net.Mail.MailAddress(EmailParm.SMTPUserName);
new InteropPermission(InteropKind::ClrInterop).assert();
try
{
Msg.set_From(fromMail);
toadrr = Msg.get_To();
toadrr.Add(new System.Net.Mail.MailAddress(toaddress));
Msg.set_Subject(_Subject);
Msg.set_Body(_body);
Msg.set_IsBodyHtml(true);
sSmtpServer = EmailParm.SMTPRelayServerName;
smCL.set_Host(sSmtpServer);
mailAttachementCollection = msg.get_Attachments();
mailAttachment = new System.Net.Mail.Attachment(_fileName);
mailAttachementCollection.Add(mailAttachment);
smCL.set_Port(EmailParm.SMTPPortNumber);
smCL.set_EnableSsl(true);
smCL.set_Credentials(credential);
smCL.Send(Msg);
} catch( Exception::CLRError )
{
exc = CLRInterop::getLastException();
if( exc )
{
clrExcMessage = exc.get_Message();
innerExc = exc.get_InnerException();
while(innerExc != null)
{
clrExcMessage = innerExc.get_Message();
innerExc = innerExc.get_InnerException();
}
strError = CLRInterop::getAnyTypeForObject( clrExcMessage );
throw error(strError);
}
}
}
{
str Toaddress;
System.Net.Mail.MailMessage Msg = new System.Net.Mail.MailMessage();
System.Net.Mail.MailAddress fromMail;
System.Net.Mail.MailAddressCollection toadrr;
System.Net.Mail.SmtpClient smCL = new System.Net.Mail.SmtpClient();
System.Net.NetworkCredential credential;
str bodygrd,sSmtpServer;
CLRObject exc;
CLRObject innerExc;
CLRObject clrExcMessage;
str strError;
SysEmailParameters EmailParm;
str pass;
System.Net.Mail.AttachmentCollection mailAttachementCollection;
System.Net.Mail.Attachment mailAttachment;
;
toaddress="test@hotmail.com";
EmailParm = SysEmailParameters::find();
pass = SysEmailParameters::password();
credential = new System.Net.NetworkCredential(EmailParm.SMTPUserName,pass);
fromMail = new System.Net.Mail.MailAddress(EmailParm.SMTPUserName);
new InteropPermission(InteropKind::ClrInterop).assert();
try
{
Msg.set_From(fromMail);
toadrr = Msg.get_To();
toadrr.Add(new System.Net.Mail.MailAddress(toaddress));
Msg.set_Subject(_Subject);
Msg.set_Body(_body);
Msg.set_IsBodyHtml(true);
sSmtpServer = EmailParm.SMTPRelayServerName;
smCL.set_Host(sSmtpServer);
mailAttachementCollection = msg.get_Attachments();
mailAttachment = new System.Net.Mail.Attachment(_fileName);
mailAttachementCollection.Add(mailAttachment);
smCL.set_Port(EmailParm.SMTPPortNumber);
smCL.set_EnableSsl(true);
smCL.set_Credentials(credential);
smCL.Send(Msg);
} catch( Exception::CLRError )
{
exc = CLRInterop::getLastException();
if( exc )
{
clrExcMessage = exc.get_Message();
innerExc = exc.get_InnerException();
while(innerExc != null)
{
clrExcMessage = innerExc.get_Message();
innerExc = innerExc.get_InnerException();
}
strError = CLRInterop::getAnyTypeForObject( clrExcMessage );
throw error(strError);
}
}
}
3 Ocak 2014 Cuma
AXAPTA - Birden fazla alış siparişinin bazı satırlarını birleştirip PurchEditLines formunda göstermek
Args args = new Args();
PurchFormLetter purchFormLetter;
purchTable purchTable;
VendReceiptsListTrans ListTrans;
PurchParmLine purchParmLine;
PurchParmTable purchParmTable;
Object dialog;
vendReceiptsListJour Jour;
boolean err;
VendPackingSlipTrans PackingTrans;
;
select purchTable where purchTable.PurchId == this.PurchId; //select first purchtable record
//-------------- prepare purchformletter class -----
purchFormLetter = PurchFormLetter::construct(DocumentStatus::PackingSlip);
purchFormLetter.parmSourceTable(purchTable);
purchFormLetter.initLinesQuery();
purchformletter.createParmUpdate();
purchFormLetter.transDate(this.PackingSlipDate);
// purchformletter.documentNum(
purchformletter.chooseLines();
//--------------- add other purchtable records -----
while select OrigpurchId from ListTrans
group by ListTrans.OrigPurchId
where ListTrans.ReceiptsListId == this.ReceiptsListId && ListTrans.OrigPurchId != this.PurchId
{
select purchTable where purchTable.PurchId == ListTrans.OrigPurchId;
purchformletter.updateQueryAndChooseLines(purchTable);
}
//---------------- delete unnecessary purchase lines --------------------
select firstonly forupdate purchParmLine
where purchParmLine.ParmId == purchformletter.parmId();
if (purchParmLine.RecId == 0)
{
box::stop("There isn't any purchline applicable");
return;
}
// box::warning("111");
ttsbegin;
while select forupdate purchParmLine
where purchParmLine.ParmId == purchformletter.parmId()
{
select firstonly ListTrans where ListTrans.ReceiptsListId == this.ReceiptsListId && ListTrans.OrigPurchId == purchParmLine.OrigPurchId &&
ListTrans.ItemId == purchParmLine.ItemId && purchParmLine.InventTransId == ListTrans.InventTransId;
// info(strfmt("%1 %2",purchparmline.ItemId,listtrans.ItemId));
//---eğer bu sipariş satırı giriş listesinde yoksa sil-------------
if (ListTrans.RecId == 0)
{
// info("---sil---");
purchParmLine.delete();
continue;
}
//----miktarı giriş listesinden al----------------------------------
purchParmLine.ReceiveNow = ListTrans.PurchQty;
purchParmLine.InventNow = ListTrans.PurchQty;
// purchParmLine.modifiedReceiveNow();
purchParmLine.setQty(DocumentStatus::PackingSlip, false, true);
purchParmLine.setLineAmount();
purchParmLine.update();
}
update_recordset purchParmTable setting num = this.packingSlipId,
TransDate = this.PackingSlipDate,
DocumentDate = this.PackingSlipDate
where purchParmTable.ParmId == purchformletter.parmId();
ttscommit;
if (this.packingSlipId)
purchformletter.reArrange(true); //------------ merge purchases like push rearrange button at purcheditlines form ----
dialog = purchformletter.dialog();
dialog.run() ;
dialog.wait();
if (dialog.closedOk())
{
purchFormLetter.proforma(false);
purchFormLetter.printFormLetter(true);
purchFormLetter.specQty(PurchUpdate::ReceiveNow);
purchFormLetter.progressHide();
purchformletter.run();
select firstonly PackingTrans join ListTrans
where PackingTrans.purchId == ListTrans.OrigPurchId &&
ListTrans.ReceiptsListId == this.ReceiptsListId;
if (PackingTrans.RecId != 0)
{
ttsbegin;
update_recordset Jour setting VendReceiptsListJourStatus = DTVendReceiptsListJourStatus::PackingSlip
where Jour.RecId == this.RecId;
ttscommit;
}
}
PurchFormLetter purchFormLetter;
purchTable purchTable;
VendReceiptsListTrans ListTrans;
PurchParmLine purchParmLine;
PurchParmTable purchParmTable;
Object dialog;
vendReceiptsListJour Jour;
boolean err;
VendPackingSlipTrans PackingTrans;
;
select purchTable where purchTable.PurchId == this.PurchId; //select first purchtable record
//-------------- prepare purchformletter class -----
purchFormLetter = PurchFormLetter::construct(DocumentStatus::PackingSlip);
purchFormLetter.parmSourceTable(purchTable);
purchFormLetter.initLinesQuery();
purchformletter.createParmUpdate();
purchFormLetter.transDate(this.PackingSlipDate);
// purchformletter.documentNum(
purchformletter.chooseLines();
//--------------- add other purchtable records -----
while select OrigpurchId from ListTrans
group by ListTrans.OrigPurchId
where ListTrans.ReceiptsListId == this.ReceiptsListId && ListTrans.OrigPurchId != this.PurchId
{
select purchTable where purchTable.PurchId == ListTrans.OrigPurchId;
purchformletter.updateQueryAndChooseLines(purchTable);
}
//---------------- delete unnecessary purchase lines --------------------
select firstonly forupdate purchParmLine
where purchParmLine.ParmId == purchformletter.parmId();
if (purchParmLine.RecId == 0)
{
box::stop("There isn't any purchline applicable");
return;
}
// box::warning("111");
ttsbegin;
while select forupdate purchParmLine
where purchParmLine.ParmId == purchformletter.parmId()
{
select firstonly ListTrans where ListTrans.ReceiptsListId == this.ReceiptsListId && ListTrans.OrigPurchId == purchParmLine.OrigPurchId &&
ListTrans.ItemId == purchParmLine.ItemId && purchParmLine.InventTransId == ListTrans.InventTransId;
// info(strfmt("%1 %2",purchparmline.ItemId,listtrans.ItemId));
//---eğer bu sipariş satırı giriş listesinde yoksa sil-------------
if (ListTrans.RecId == 0)
{
// info("---sil---");
purchParmLine.delete();
continue;
}
//----miktarı giriş listesinden al----------------------------------
purchParmLine.ReceiveNow = ListTrans.PurchQty;
purchParmLine.InventNow = ListTrans.PurchQty;
// purchParmLine.modifiedReceiveNow();
purchParmLine.setQty(DocumentStatus::PackingSlip, false, true);
purchParmLine.setLineAmount();
purchParmLine.update();
}
update_recordset purchParmTable setting num = this.packingSlipId,
TransDate = this.PackingSlipDate,
DocumentDate = this.PackingSlipDate
where purchParmTable.ParmId == purchformletter.parmId();
ttscommit;
if (this.packingSlipId)
purchformletter.reArrange(true); //------------ merge purchases like push rearrange button at purcheditlines form ----
dialog = purchformletter.dialog();
dialog.run() ;
dialog.wait();
if (dialog.closedOk())
{
purchFormLetter.proforma(false);
purchFormLetter.printFormLetter(true);
purchFormLetter.specQty(PurchUpdate::ReceiveNow);
purchFormLetter.progressHide();
purchformletter.run();
select firstonly PackingTrans join ListTrans
where PackingTrans.purchId == ListTrans.OrigPurchId &&
ListTrans.ReceiptsListId == this.ReceiptsListId;
if (PackingTrans.RecId != 0)
{
ttsbegin;
update_recordset Jour setting VendReceiptsListJourStatus = DTVendReceiptsListJourStatus::PackingSlip
where Jour.RecId == this.RecId;
ttscommit;
}
}
Etiketler:
ax,
AXAPTA,
birden,
birleştir,
fazla,
form,
getir,
purcheditlines,
purchformletter,
purchtable,
sipariş
Kaydol:
Kayıtlar (Atom)