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

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;
}


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)

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.

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();

...
}