12 Ekim 2015 Pazartesi

AXAPTA - Form kontrolüne sağ mouse popup menübar eklemek

Bunu kontrolün showContextMenu metodunu düzenleyerek yapabilirsiniz:

public int showContextMenu(int _menuHandle)
{
    int                 ret;
    int                bar1,bar2;
    PopupMenu           pMenu = PopupMenu::create(_menuHandle,element.hWnd());
    ;
        bar1 = pMenu.insertItem("Seçenek 1");
        bar2 = pMenu.insertItem("Seçenek 2");

    ret = pMenu.draw();
    switch (ret)
    {
    case -1 :
        break;
    case bar1:

...
    case bar2:
...
    default :
        break;
    }
    return ret;

}


8 Ekim 2015 Perşembe

Axapta - Dataset gönderme ve alma


Bu kodları Fatih Demirci'nin bir geliştirmesinden aldım.

Dataset gönderme:
 

    System.Data.DataTable               dataTable;
    System.Data.DataColumnCollection    dataTableColumns;
    System.Data.DataRowCollection       DataRowCollection;
    System.Data.DataRow                 tmpRow;
    System.Data.DataSet dataset = new System.Data.DataSet();
    System.Data.DataTableCollection     dataTableCollection;


    dataTable = new System.Data.DataTable();
    dataTableColumns = dataTable.get_Columns();

//satırları tanımla
    dataTableColumns.Add("ACCOUNTNO", System.Type::GetType("System.String"));
    dataTableColumns.Add("ITEMNO", System.Type::GetType("System.String"));
    dataTableColumns.Add("TOACCOUNTNUM", System.Type::GetType("System.String"));
    dataTableColumns.Add("RETURNREASONIDD", System.Type::GetType("System.String"));
    dataTableColumns.Add("QUANTITY", System.Type::GetType("System.Double"));
    dataTableColumns.Add("DESCRIPTION", System.Type::GetType("System.String"));
//bir satır al
    DataRowCollection = dataTable.get_Rows();
        tmpRow = dataTable.NewRow();
//satırı doldur
    tmpRow.set_Item("ACCOUNTNO","MU_014600");
    tmpRow.set_Item("ITEMNO","200.05.01.0306");
    tmpRow.set_Item("TOACCOUNTNUM","MU_014600");
    tmpRow.set_Item("RETURNREASONIDD","");
    tmpRow.set_Item("QUANTITY",11);
    tmpRow.set_Item("DESCRIPTION","");

    DataRowCollection.Add(tmpRow);

     dataTable.AcceptChanges();
//bu aşamada eğer karşı taraf data table istiyorsa, data table hazır
//eğer dataset istiyorsa bu data tableyi bir datasete ekle
     dataTableCollection     = dataSet.get_Tables();
     dataTableCollection.Add(datatable);
//artık dataset de hazır


Dataset alma:

    System.Data.DataTable               dataTable;
    System.Data.DataTableCollection     dataTableCollection;
    System.Data.DataColumnCollection    dataColumnCollection;
    System.Data.DataRowCollection       dataRowCollection;
    System.Data.DataRow                 dataRow;
    System.Data.DataColumn              dataColumn;
    System.Data.DataTable               returnData;
;


        dataTableCollection     = dataSet.get_Tables();
        totalTable              = dataTableCollection.get_Count();
        for(i = 0; i < totalTable; i ++)
        {
            dataTable               = dataTableCollection.get_Item(i);
            dataColumnCollection    = dataTable.get_Columns();
            DataRowCollection       = dataTable.get_Rows();
            totalRow                = dataRowCollection.get_Count();
            totalCol                = dataColumnCollection.get_Count();
            for( j = 0; j < totalRow; j ++)
            {
                dataRow         = dataRowCollection.get_Item(j);
                custAccount     = dataRow.get_Item("ACCOUNTNO");
                itemId          = dataRow.get_Item("ITEMNO");
                toCustAccount   = dataRow.get_Item("TOACCOUNTNUM");
                strtext         = dataRow.get_Item("RETURNREASONIDD");
                krc_DefectiveId = str2int64(strtext);
                strtext         = dataRow.get_Item("QUANTITY");
                _b2bdesc        = dataRow.get_Item("DESCRIPTION");
...

3 Eylül 2015 Perşembe

Axapta - Query promt "Sorgulama seç - önceden kullanılan sorgu" yu engelleme

Axapta query çalıştırıp range değerleri yüklendiğinde istediğiniz değerlerin gelmediğini görebilirsiniz. Bunun sebebi Sorgulama seç kısmında önceden kullanılan sorgu gelmesi olabilir. Bunu engellemek için QueryRun sınıfı yerine SysQueryRun sınıfını kullanmalısınız. SysQueryRun sınıfı  QueryRun sınıfının genişletilmiş halidir.

Aşağıdaki kod "önceden kullanılan sorgu" yerine "kullanılan sorgu"nun gelmesini sağlar:

mySysQueryRun.promptLoadLastUsedQuery(false);


2 Eylül 2015 Çarşamba

Axapta - Transfer emri kısmi mal kabul

Bir forum sayfasından öğrendiğim yöntemle bu gerçekten çok basit:

inventTranstransferLine.QtyReceiveNow = 50;

Daha sonra transfer emrini post ettiğinizde 50 adet miktar mal kabul yapılacaktır.

27 Ağustos 2015 Perşembe

AXAPTA - Query içeriğini bir tablo alanına saklamak ve geri getirmek

Bu örnek için Mirko Bonello'nun blogundan faydalandım.

Tablomuzda container türünde bir alan açıyoruz. Benimkisi InventTableQuery:

void createAndSaveQueryInTable()
{
  QueryRun SysqueryRun;
  ;
  if (this.InventTableQuery)
      queryRun = new SysQueryRun(this.InventTableQuery);
  else
      queryRun = new SysQueryRun(queryStr('InventTable'));
 

  qrun.promptLoadLastUsedQuery(false);
  if (queryRun.prompt())
      this.InventTableQuery = queryRun.pack();
}



QueryRun nesnesi yerine SysQueryRun nesnesini kullanıp ardından qrun.promptLoasLastUsedQuery(false) ile son kullanılan query değerlerinin gelmesini engelliyoruz ki sonra aynı benim gibi neden tüm kayıtlarda aynı query değerleri geliyor diye kafayı yemeyin... :)

AXAPTA - Text dosyaya yazmak

    TextIo           textIo;
    str              fileName;
    FileIOPermission fioPermission;
    #File
    ;
        fileName = "c:\\myfolder\\test.txt"
        fioPermission = new FileIOPermission
            (fileName ,"RW");
        fioPermission.assert();
        if (WINAPI::fileExists(fileName))
        {
            WINAPI::deleteFile(fileName);
        }
        textIo = new TextIo(fileName, #IO_WRITE);
            textIo.write("test 12");
            textIo.write("test 34");
        textIo = null;
        CodeAccessPermission::revertAssert();
    }

19 Ağustos 2015 Çarşamba

AXAPTA - Direk SQL ifadesi çalıştırma

 Bu blogda verilen örnek çok işime yaradı. Ancak bu blog ve diğer tüm bloglarda verilen örneklerde her kayıtta hep tek bir field okunmuş. Birden fazla field okumaya kalktığımda index hatası aldım. Daha sonra Microsoft'un bu sayfasında fieldların artan nümerik sırada okunması gerektiğini öğrendim ve sorunum çözülmüş oldu. Metodunuzu server tarafında çalıştırın. Yoksa yetki hatası alabilirsiniz. Insert ve delete işlemleri için de (Axapta tabloları için pek tavsiye edilebilecek bir durum olmasa da) executeQuery yerine executeUpdate metodunu kullanabilirsiniz.

public server static InventRep FillSQL(DatePhysical _DatePhysical = today())
{
    InventRep   InventRep;

    Connection      connection;
    Statement       statement;
    str             query,dateStr;
    Resultset       resultSet;

    ;

    dateStr = date2str(_DatePhysical,321,dateday::Digits2,dateseparator::None,
    datemonth::Digits2,dateseparator::None,dateyear::Digits4);

    connection = new Connection();
    statement = connection.createStatement();
    query =
        "select ITEMID,SUM(QTY)"+
        "from INVENTTRANS "+
        "where DATAAREAID='TST'"+
        "and DATEPHYSICAL <='"+dateStr+"' "+
        "group by ITEMID "+
        "having SUM(QTY) <>0";
     new SqlStatementExecutePermission(query).assert();
     resultSet = statement.executeQuery(query);
     while(resultSet.next())
     {
        //---- fieldlar mutlaka nümerik artan sırada okunmalı ------
        InventRep.ItemId = resultSet.getString(1);
        InventRep.Qty    = resultSet.getReal(2);
        InventRep.insert();
     }
     CodeAccessPermission::revertAssert();
}