27 Ağustos 2019 Salı

InventTrans'a update işleminden sonra yeniden hesaplama yapılmalı (ReCalc) | Dynamics Ax

İnventTrans'ta update işlemi yaptıktan sonra InventSum'ı Eldeki'nin doğru çalışması için hesaplatmak gerekiyor. Tek bir kayıtta çalıştıracaksanız;

static void MAA_ReCalc_InventSumReCalcItem(Args _args)
{
    InventSumRecalcItem InventSumRecalcItem;
    ;
    InventSumRecalcItem = new InventSumRecalcItem("GUB0021", true, checkfix::Fix );
    InventSumRecalcItem.updatenow();
}
Bütün madde kartlarında çalıştırmak için;

static void MAA_ReCalc_IInventSumRecalcAllItems(Args _args)
{  
 InventTable InventTable;
   InventSumRecalcItem InventSumRecalcItem;
   ;
 
   while select InventTable
     where (InventTable.ItemType == ItemType::Item) || (InventTable.ItemType == ItemType::BOM)
   {
     InventSumRecalcItem = new InventSumRecalcItem(InventTable.ItemId, true, checkfix::fix);
     InventSumRecalcItem.updatenow();
   }
}

26 Ağustos 2019 Pazartesi

Enum'a göre display alan | Dynamics Ax

Enum değerine göre display alanın aşağıdaki gibi örnek bir kodla değiştiğini görebilirsiniz
display name LastTransAccountName ()
{
    ;
    if(this.LastTransACType == LedgerJournalACType::Cust)
        return custTable::find(this.LastTransAccount).Name;

    if(this.LastTransACType == LedgerJournalACType::Vend)
        return VendTable::find(this.LastTransAccount).Name;

    if(this.LastTransACType == LedgerJournalACType::Bank)
        return BankAccountTable::find(this.LastTransAccount).Name;

     if(this.LastTransACType == LedgerJournalACType::Ledger) // maa
        return BankAccountTable::find(this.LastTransAccount).Name;

    return "";

}

Örnek rapor | Dynamics Ax

Tarih itibariyle çek durum sorgusu

Örneğin sizden çeklerin durumunu tarih filtreli şekilde hesaplayıp raporlanmasını istenildiğinde.
Bir tablo oluşturup girilen tarihe göre hesaplama yaptırabilirsiniz.


DRT_ETGChequeHistoryByDates adında bir tablo oluşturuyoruz ve istenilen alanları ekliyoruz.
Sonrasında bunu oluşturduğumuz formun datasource'una ekliyoruz. Resimde olduğu gibi tarihi filtreleyebileceğimiz tarih alanı ve hesaplama yapabileceğimiz butonu ekliyoruz.


Formun methods'una hesaplama yaptıracağımız kodu yazıyoruz.




void calculate()
{
    LedgerJournalTrans      LTrans,LTrans2;
    LedgerJournalTable      LTable;
    DRT_ETGChequeHistoryByDates ETGchequeHistoryByDate;
    BankChequeTable         BankChequeTable;
    int                     chequeNum = 0;
    ETGBankChequeHistory    ChequeHistory;
    ;
    ttsbegin;
    delete_from ETGchequeHistoryByDate;

    while select BankChequeTable
        where BankChequeTable.AmountMST != 0
    {
        select maxof(ChequeTransNum) from LTrans
            where LTrans.BankChequeNum      == BankChequeTable.ChequeNum
                   && LTrans.TransDate          <= fromDate.dateValue()
                exists join LTable
                    where LTable.JournalNum == LTrans.JournalNum
                    &&    LTable.Posted;



        if (Ltrans && Ltrans.ChequeTransNum >= 0)
        {
            select firstonly LTrans2
                where LTrans2.BankChequeNum      == BankChequeTable.ChequeNum
                &&    LTrans2.ChequeTransNum     == LTrans.ChequeTransNum
                &&    LTrans2.TransDate          <=  fromDate.dateValue();

            ETGchequeHistoryByDate.clear();
            ETGchequeHistoryByDate.ChequeNum               = BankChequeTable.ChequeNum;
            ETGchequeHistoryByDate.CiroPayment             = BankChequeTable.ETGCiroPayment;
            ETGchequeHistoryByDate.LastTransACTypeOffset   = LTrans2.OffsetAccountType;
            ETGchequeHistoryByDate.LastTransAccountOffset  = LTrans2.OffsetAccount;


            select firstonly ChequeHistory
                where ChequeHistory.ChequeNum           == BankChequeTable.ChequeNum
                &&    ChequeHistory.RefJournalVoucher   == LTrans2.Voucher
                &&    ChequeHistory.TransDate           <=  fromDate.dateValue() ;



           if (ChequeHistory)
                {
                    ETGchequeHistoryByDate.LastTransACType       = LTrans2.AccountType;
                    ETGchequeHistoryByDate.LastTransAccount      = ChequeHistory.LastTransAccountNum ;//LTrans2.AccountNum;
                }

            else
                {
                     if(CompanyInfo::Find().DataAreaId == "TRS")
                     {
                      ETGchequeHistoryByDate.LastTransAccount    = LTrans2.OffsetAccount;//BankChequeTable.LastTransAccount; //Çek Tablosundan almak için
                      ETGchequeHistoryByDate.LastTransACType     = LTrans2.OffsetAccountType;//BankChequeTable.LastTransACType; //Çek Tablosundan almak için
                    }

                    else
                    {
                      ETGchequeHistoryByDate.LastTransAccount    = BankChequeTable.LastTransAccount; //Çek Tablosundan almak için
                      ETGchequeHistoryByDate.LastTransACType     = BankChequeTable.LastTransACType;//BankChequeTable.LastTransACType; //Çek Tablosundan almak için
                    }
               }

                    ETGchequeHistoryByDate.DocumentStatus      = LTrans2.TransactionTxtType;
                    ETGchequeHistoryByDate.ChequePrintedNum    = BankChequeTable.ChequePrintedNum;
                    ETGchequeHistoryByDate.DueDate             = BankChequeTable.DueDate;
                    ETGchequeHistoryByDate.FromDate            = fromdate.dateValue();
                    ETGchequeHistoryByDate.AmountMST           = BankChequeTable.AmountMST;
                    ETGchequeHistoryByDate.AccountID           = BankChequeTable.AccountID;
                    ETGchequeHistoryByDate.CurrencyCode        = BankChequeTable.CurrencyCode;
                    ETGchequeHistoryByDate.AmountCur           = BankChequeTable.AmountCur;
                    ETGchequeHistoryByDate.ETGChequeType       = BankChequeTable.ETGChequeType;
                    ETGchequeHistoryByDate.Customer            = BankChequeTable.Customer;

                    ETGchequeHistoryByDate.Drawer                   = BankChequeTable.Drawer; //MAA
                    ETGchequeHistoryByDate.ETGCentralBankBranchCode = BankChequeTable.ETGCentralBankBranchCode;
                    ETGchequeHistoryByDate.ETGCentralBankCode       = BankChequeTable.ETGCentralBankCode;


                     ETGchequeHistoryByDate.insert();

                     if (     BankChequeTable.ChequeNum == "CEK_030248" // Gelmesini istemediniz çek varsa bu şekilde belirtebilirsiniz.
                           || BankChequeTable.ChequeNum == "CEK_028932"
                           || BankChequeTable.ChequeNum == "CEK_029017"
                           || BankChequeTable.ChequeNum == "CEK_029088"
                           || BankChequeTable.ChequeNum == "CEK_029064"
                           || BankChequeTable.ChequeNum == "CEK_028922"
                           || BankChequeTable.ChequeNum == "CEK_029059"
                           || BankChequeTable.ChequeNum == "CEK_029151"
                           || BankChequeTable.ChequeNum == "CEK_029162")
                  {
                     ETGchequeHistoryByDate.delete();
                  }

       }
       else
       continue;

    }


    ttscommit;

    DRT_ETGChequeHistoryByDates_ds.executeQuery();
    info("Hesaplama Tamamlandı");

}

Sonrasında bu hesaplamayı buton ile çağırmak için, eklediğimiz butonun click'ine aşağıdaki kodu yazıyoruz.
Rapor bu şekilde ilgili tablolardan kayıtları alıyor ve raporu oluşturuyor.

void clicked()
{
    element.calculate();
}

Kasa borç bakiye tanımlama | Dynamics Ax

Kasa hesaplarının eksi(-)'ye düşmemesi için,

Genel muhasebe hesabı
100.01.001
100.02.001
100.03.001
100.04.001

Genel Muhasebe > Hesap planı ayrıntıları
Bakiye kontrolü alanı : Borç olarak seçildiğinde kasayı eksi(-)'ye düşürmeyecektir.



24 Haziran 2019 Pazartesi

InventItemPrice tablosuna kayıt hk.

Direkt olarak deftere nakil ederken;

Örn:



Şeklinde hata alırsanız;

Aşağıdaki alanların tikini kaldırın.



21 Haziran 2019 Cuma

Veri tabanı günlüğü > logları aktifleştirme | Dynamics Ax

 Logları aktifleştirme

Veri tabanı günlüğünde logları aktifleştirmek için aşağıdaki adımlardan bunu yapabilirsiniz.
Uygulama Tümleştirme Çerçevesi > Administration > Kurulum > Veritabanı günlükleri




İleri ve son dedikten sonra hangi şirketi seçtiyseniz ilgili şirket için aktifleşecektir.

31 Mayıs 2019 Cuma

ChangeCompany X++

Changecompany kullanımı; bir şirket üzerindeyken belirlediğiniz farklı şirketlerden de data çekmenizde yardımcı olur. Aşağıdaki örneği inceleyebilirsiniz.


static void MAA__EInvoiceActiveCustVendParties_2(Args _args) 
{
    EInvoiceActiveCustVendParties   EInvoiceActiveCustVendParties;
    CustTable                       custTable;
    VendTable                       vendTable;

    ttsBegin;

    ChangeCompany("TRS")
    {
        EInvoiceActiveCustVendParties = null;

        while select forUpdate EInvoiceActiveCustVendParties
        {
            custTable = CustTable::find(EInvoiceActiveCustVendParties.CustAccount);
            if(custTable.TaxNumberType_TR == TaxNumberType_TR::TCIdentityID)
            {
                EInvoiceActiveCustVendParties.FirstName = custTable.FirstName;
                EInvoiceActiveCustVendParties.LastName  = custTable.LastName;
                EInvoiceActiveCustVendParties.Update();
            }

            vendTable = VendTable::find(EInvoiceActiveCustVendParties.VendAccount);
            if(vendTable.TaxNumberType_TR == TaxNumberType_TR::TCIdentityID)
            {
                EInvoiceActiveCustVendParties.FirstName = vendTable.FirstName;
                EInvoiceActiveCustVendParties.LastName  = vendTable.LastName;
                EInvoiceActiveCustVendParties.Update();
            }
        }
    }

    ChangeCompany("TAS")
    {
        EInvoiceActiveCustVendParties = null;

        while select forUpdate EInvoiceActiveCustVendParties
        {
            custTable = CustTable::find(EInvoiceActiveCustVendParties.CustAccount);
            if(custTable.TaxNumberType_TR == TaxNumberType_TR::TCIdentityID)
            {
                EInvoiceActiveCustVendParties.FirstName = custTable.FirstName;
                EInvoiceActiveCustVendParties.LastName  = custTable.LastName;
                EInvoiceActiveCustVendParties.Update();
            }

            vendTable = VendTable::find(EInvoiceActiveCustVendParties.VendAccount);
            if(vendTable.TaxNumberType_TR == TaxNumberType_TR::TCIdentityID)
            {
                EInvoiceActiveCustVendParties.FirstName = vendTable.FirstName;
                EInvoiceActiveCustVendParties.LastName  = vendTable.LastName;
                EInvoiceActiveCustVendParties.Update();
            }
        }
    }

    ttsCommit;
}

29 Mayıs 2019 Çarşamba

Temel E-Fatura | Ticari E-Fatura

Temel kesilen faturaların sistemden reddi yapılamıyordu. 05.03.2019 tarihinden itibaren firmalar temel e-faturalar e-fatura iptal portalından , iptal talebinde bulunarak alıcı firmanın onayı ile fatura reddedilmiş/ yani iptal edilmiş oluyor. Müşterilere düzenlediğimiz faturaları yanlış düzenlersek yada iptal kararı verirsek e-fatura iptal portalından “iptal” talebinde bulunulur, müşteri reddini yapabilir.

Satıcılar tarafında ise firmalar iptal talebinde bulunacak e-imza ile reddedeceğiz. GİB’den onaylanan iptallerde, Uyumsoft’a bildirilmediği için Uyumsoft portal üzerindeki faturanın durumu eski haliyle kalacak.Sisteme giriş için bazı ayarların yapılması gerekiyor.

İptal portalı | https://portal.efatura.gov.tr/FaturaIptal/

Ayarlara aşağıdaki linkten ulaşabilirsiniz. http://efatura.gov.tr/dosyalar/kilavuzlar/%C4%B0mzalama_Araci_Kullanim_Kilavuzu.pdf

Temel Fatura
Temel e-fatura seçimi yapıp faturanızı karşı tarafa bu şekilde gönderirseniz, faturanız karşı tarafın onayını beklemeden otomatik olarak (onaylanmış/kabul edilmiş) olarak algılanır.

Ticari Fatura
Ticari e-fatura gönderdiğinizde, karşı tarafa onay ve red seçenekleri sunulur. Bu durumda firma faturayı inceleyip onaylayabilir ya da ikinci bir seçenek olarak red yanıtı verebilir.

28 Mayıs 2019 Salı

Müşteri > BankChequeTable

Aşağıdaki kodu çalıştırdığınızda müşterinin çekleriyle ilgili problem olduğunda veriler doğru girildiyse problemin gitmesini sağlar.

static void Bank_custTable (Args _args)
{
    BankChequeTable     BankChequeTable;
    CustTable           custTable;
    ;

    ttsbegin;

    while select forupdate custTable
        where custTable.Blocked != CustVendorBlocked::All
           && custTable.CreditMax > 1
    {
        select forupdate  sum(AmountMST) from BankChequeTable
            where BankChequeTable.Customer               == custTable.AccountNum
            &&    BankChequeTable.DocumentStatus         != LedgerTransTxt::RejectedToCust
            &&    BankChequeTable.DocumentStatus         != LedgerTransTxt::PaidCust
            &&    BankChequeTable.ETGCiroPayment         == NoYes::No;

        if(custTable.RiskAmount != BankChequeTable.AmountMST )
        {
            custTable.RiskAmount = BankChequeTable.AmountMST;
            custTable.update();
        }
    }

    ttscommit;
}

Müşteri kredi limitlerinin yeniden hesaplanması

Aşağıdaki kod müşteri kredi limitlerini yeniden hesaplar.


static void Sales_CreditLimits(Args _args) 
{
    #OCCRetryCount
    SalesTable              salesTable;
    SalesId                 fromSalesId;
    ;

    if (_showProgess && !updateOne)
    {
        this.progressInit("@SYS59119", 0, #AviFormLetter);
        progress.setText(strfmt("@SYS26577"));
    }

    try
    {
        ttsbegin;

        update_recordset salesTable
            setting estimate = 0
            where salesTable.SalesStatus == SalesStatus::Invoiced   &&
                  salesTable.Estimate    != 0;

        while (queryRun.next())
        {
            salesTable = queryRun.get(tablenum(SalesTable));

            if (_showProgess && !updateOne)
            {
                if (fromSalesId)
                    this.progressUpdate(strfmt("@SYS59131", strfmt('%1 - %2',fromSalesId, salesTable.SalesId)));
                else
                    this.progressUpdate(strfmt("@SYS59131", salesTable.SalesId));

                fromSalesId = salesTable.SalesId;
            }

            if (salesTable.setEstimate())
                salesTable.doUpdate();
        }

        ttscommit;
    }
    catch (Exception::Error)
    {
        info("@SYS78886");
    }

    catch (Exception::Deadlock)
    {
        queryRun.reset();
        retry;
    }

    catch (Exception::UpdateConflict)
    {
        if (appl.ttsLevel() == 0)
        {
            if (xSession::currentRetryCount() >= #RetryNum)
            {
                throw Exception::UpdateConflictNotRecovered;
            }
            else
            {
                queryRun.reset();
                retry;
            }
        }
        else
        {
            throw Exception::UpdateConflict;
        }
    }
}

6 Mayıs 2019 Pazartesi

Madde kartlrında Boyutların zorunluluğu | Dynamics Ax

Madde kartlrında Boyutların zorunluluğu

Madde kartında bulunan Madde grubu alanına göre boyutların zorunlu hale gelmesinde aşağıdaki kodu PurchTabe formunun datasource'unda bulunan PurcLine'ın methods'una yazdığınızda buradaki kontroller çalışacaktır.
Böylece madde grubunda belirlediğiniz zorunlu alanlar formda boş geçilmeyecektir. Aynı kodu SalesTable için de yazabilirsiniz.
void checkDimension()
{
    ItemGroupMandSetupTable     itemGroupMandSetupTable;
    ;

    PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 1)).allowEdit(false);
    PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 1)).mandatory(false);
    PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 2)).allowEdit(false);
    PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 2)).mandatory(false);
    PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 3)).allowEdit(false);
    PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 3)).mandatory(false);
    PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 4)).allowEdit(false);
    PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 4)).mandatory(false);
    PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 5)).allowEdit(false);
    PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 5)).mandatory(false);

    while select itemGroupMandSetupTable
        where ItemGroupMandSetupTable.InventItemGroupId == InventTable::find(PurchLine.ItemId).ItemGroupId
    {
        if(itemGroupMandSetupTable.DimensionCode == SysDimension::Department)
        {
            if(!PurchLine.Dimension[1])
            {
                PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 1)).allowEdit(true);
                PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 1)).mandatory(true);
            }
        }

        if(itemGroupMandSetupTable.DimensionCode == SysDimension::Center)
        {
            if(!PurchLine.Dimension[2])
            {
                PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 2)).allowEdit(true);
                PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 2)).mandatory(true);
            }
        }

        if(itemGroupMandSetupTable.DimensionCode == SysDimension::Purpose)
        {
            if(!PurchLine.Dimension[3])
            {
                PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 3)).allowEdit(true);
                PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 3)).mandatory(true);
            }
        }

        if(itemGroupMandSetupTable.DimensionCode == SysDimension::Person)
        {
            if(!PurchLine.Dimension[4])
            {
                PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 4)).allowEdit(true);
                PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 4)).mandatory(true);
            }
        }
        if(itemGroupMandSetupTable.DimensionCode == SysDimension::Vehicle)
        {
            if(!PurchLine.Dimension[5])
            {
                PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 5)).allowEdit(true);
                PurchLine_ds.object(fieldid2ext(fieldnum(PurchLine, Dimension), 5)).mandatory(true);
            }
        }
    }
}

Total ciro

static void MAA_SalesTableTotal(Args _args) { SalesTable SalesTable; utcDateTime dateTime; dateTime ...