12 Ağustos 2015 Çarşamba

AX 2009 - Rapor ekrana sığmadığında çıkan mesajdan kurtulmak

Axapta rapor aldığınızda eğer rapor sayfaya sığmazsa sizi uyarır. Eğer bu mesaj canınızı sıkıyorsa, raporun init metoduna şunu yazın:


this.printJobSettings().suppressScalingMessage(true);



Bunu tüm raporlar için de  yapmanın bir yolu varmış. SysReportRun sınıfının Run metoduna super() çağrısından önce bu satırı ekleyin:


if(this.printJobSettings())
this.printJobSettings().suppressScalingMessage(true);

5 Ağustos 2015 Çarşamba

AX 2009 - TC kimlik no sorgulama ile örnek web servisi kullanımı

Daha önce AX 2012 için yazdığım örneğini bu sefer de 2009 için yazdım. Servisi yazarken Microsoft'un ilgili white page sayfasından faydalandım. White page artık olmayan bir servis için yazılmış ama yine de işimi gördü.

Öncelikle AOT->References->Servis başvurusu ekle çalıştırın:

WSDL URL kısmına https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL yazın.

Ben .NET kodu ad alanına TCSorgula yazdım. Başvuru adı kısmında da aynen otomatik yazılan TCSorgula değerini değiştirmeden bıraktım.

Daha sonra aşağıdaki metodu yazdım:

public server static boolean Sorgula(Int64 _TCKimlikNo,str _ad,str _soyad, int _dogumYili, boolean _interActive = false)
{
    TCSorgula.KPSPublicSoapClient  cl;
    boolean ret;
    System.Exception                      ex;

    str st;
    ;
    try
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        cl = new TCSorgula.KPSPublicSoapClient("KPSPublicSoap");
        ret = cl.TCKimlikNoDogrula(_TCKimlikNo,_ad,_soyad,_dogumYili);
        CodeAccessPermission::revertAssert();
    }
    catch(Exception::CLRError)
    {
        exceptionTextFallThrough();
    }
    if (_interActive)
    {
        if (ret)
            info("TC kimlik doğrulandı!..");
        else
            warning("TC kimlik doğrulanamadı!..");
    }
    return ret;
}



Kodu çalıştırmak için yazdığım job:

static void TCKimlikTest(Args _args)
{
    ;
    TCKimlik::Sorgula(11111111111,"METİN","EMRE",1911,true);
}

  
 TC kimlik doğrulama servisi isim veya doğum tarihi hatalı olduğunda false değeri döndürürken TC kimlikno hatalı olduğu durumlarda nedense exception atıyor. AX 2012 ile bu exception dönüş değeri içinde "T.C. Kimlik No alanına girdiğiniz değer geçerli bir T.C. Kimlik Numarası değildir" değerini kontrol ederek hatalı kimlik no mu yoksa başka bir hata mı döndüğünü kontrol edebiliyordum. 2009 ile malesef bunu başaramadım. Yani ya TC kimlikno düzgün ya da hatalı veya servis çalışmıyor şeklinde bilgi alabiliyorum.

Eğer VS kurulu değilse oluşturulmuş servisi yapılandırmak için .NET framework SDK'yı indirebilirsiniz.

22 Temmuz 2015 Çarşamba

20 Temmuz 2015 Pazartesi

AXAPTA - Stok rezervasyonu kaldırma ve ekleme

Volkan Şişman'dan öğrendiğim bu kodla stok rezervasyonu kaldırabilir ve ekleyebilirsiniz:



InventUpd_Reservation       invUpdReservation;
...
//rezervasyon kaldır
invUpdReservation = InventUpd_Reservation::newInventDim(InventMovement::construct(invTrans,InventMovSubType::None),myInventDim,200,false);
            invUpdReservation.updateNow();

...
//rezervasyon ekle
          invUpdReservation = InventUpd_Reservation::newInventDim(InventMovement::construct(invTrans,InventMovSubType::None),myInventDim,400,false);
            invUpdReservation.updateNow();


Ya da:

//rezervasyon ekle
     InventUpd_Reservation::updateReserveBuffer(journalTrans, journalTrans.Qty);

//rezervasyon kaldır
     InventUpd_Reservation::updateReserveBuffer(journalTrans, abs(journalTrans.Qty));

Ya da:

//rezervasyon kaldır
InventUpd_Reservation::newInventDim(InventTrans.inventMovement(true),InventTrans.inventDim(),-InventTrans.qty,true).updateNow();

AXAPTA - Formu açık olan invent journal kaydını post etmek

Eğer böyle bir kaydı post etmeye kalkarsanız, kaydın kullanıldığını söyleyerek size izin vermeyecektir. Volkan Şişman'dan öğrendiğim bu kod parçası kullanılan kaydın da post edebilmesine izin veriyor:

InventJournalCheckPost      journalCheckPost;
JournalForm                 journalForm;

;
...
journalForm      = JournalForm::fromArgs(args);
journalCheckPost = InventJournalCheckPost::newFromForm(args,journalForm);
journalForm.runbaseMainStart();
journalCheckPost.run();
journalForm.runbaseMainEnd(journalCheckPost,false);

15 Temmuz 2015 Çarşamba

AXAPTA - InventDimExistsJoin makrosuyla InventDim tablosuyla esnek join

 InventDim tablosuyla esnek joinler yapmak için fazla kasmanıza gerek bırakmayan bir makro var:

InventDimParm       dimParm;
InventDim           dimValues,dimJoin;
;
...
//Join where ile kullanacağımız alanları dolduruyoruz
 dimvalues.wMSLocationId = inventdim.wMSLocationId;
    if (inventdim.InventSiteId)
        dimvalues.InventSiteId = inventdim.InventSiteId;
    if (inventdim.configId)
        dimvalues.configId = inventdim.configId;
 //
InventDimParm bu alanlara göre ayarlanacak
    dimparm.initFromInventDim(dimValues);

    while select lclInventSum
        where lclInventSum.ItemId == itemId && leftQty > 0
              #InventDimExistsJoin(lclInventSum.InventDimId,dimJoin,dimValues,dimParm)



İlk parametre join yapılan tablonun ilgili InventDimId alanı, ikinci parametre InventDim tablosunun tanımlanan adı, Üçüncü paremetre ile değerler gidiyor. Dördüncü paremetre de parametre tablosu. Bu tablonun değişik kullanımları da mevcut.

30 Haziran 2015 Salı

Axapta - Grid kolonunda resim görüntülemek

Örnek tablomuzda eğer RefRecId değeri dolu ise OK değilse Cancel buton resmi göstereceğiz. Bunun için tablomuza bir display method yazıyoruz:

 display ImageRes dispIsOKImg(gzrForeSightOrderLines l)
 {
   #resAppl;
   return l.RefRecId == 0 ? #ImageError : #Image_OK;
 }


Gridinize bir Window kontrol ekleyin. Örnekteki ismi LineOK olsun. Kontrolün AlignControl özelliğini No yapın. DataMethod'a display methodumuzun adı (burada dispIsOKImg), Datasource alanına da tablomuzun adını (burada gzrForeSightOrderLines) yazıyoruz. Height ve Width alanlarına da uygun değerler verin. Ben 14 yazdım. Eğer resimleriniz çok büyükse ImageMode değerini Size to fit yapabilirsiniz.

Formu çalıştırdığınızda resimlerin sık  sık yenilendiğini göreceksiniz. Bunu engellemek için resimleri formu ilk çalıştırırken yüklemek gerekir:

ClassDeclaration metodu:
ImageList                           imageList;

Init metodu:
#resAppl
imageList = new Imagelist(Imagelist::smalliconWidth(),Imagelist::smalliconHeight());
imagelist.add(new image(#Image_OK));
imagelist.add(new image(#ImageError));
LineOK.imageList(imageList);


Display metoddaki return satırını aşağıdakiyle değiştirin:

return l.RefRecId == 0 ? 1 : 0;

resAppl makrosunun içindeki imaj listesini görmek/güncellemek için AOT->Macros->ResAppl->Düzenle.

Sistemde kayıtlı tüm imaj dosyalarını görmek için Araçlar->Geliştirme araçları->Katılaştırılmış kaynaklar (Bu terim türkçeye gerçekten çok tuhaf çevrilmiş, orijinalinde Embedded resources yazıyor ki bu çok daha anlamlı, gömülü kaynaklar olmalıydı).