query etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
query etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

9 Ağustos 2017 Çarşamba

AX 2012 - Query'ye tek bir finansal boyut için filtre eklemek

Bunu tabloları ekleyerek yapmaya kalktığınızda bir çok tabloyu birbirine bağlamak zorunda olduğunuzu göreceksiniz. Bunu sizin yerinize yapan DimensionProvider adlı bir sınıf eklenmiş AX 2012'ye:

DimensionProvider           dimProvider = new DimensionProvider();


        dimProvider.addAttributeRangeToQuery(element.query(),element.query().dataSourceNo(1).name(),
       FieldStr(MyTable,DefaultDimension),
        DimensionComponent::DimensionAttribute,
        OMOperatingUnit::find(depRecId,OMOperatingUnitType::OMDepartment).OMOperatingUnitNumber,
            "Departmanı",true);

Bu arada Unknown type: RefRecId gibi bir hata alırsanız sebebi kullandığınız tablodaki EDT'nin yanlış olması olabilir. Benim başıma gelen durumda sorun yerel bir çözümde DefaultDimension field'ına DimensionDefault yerine RefRecId EDT kullanılmasıydı. Sizinkinde RefRecId yerine başka birşey de olabilir. AX orijinal tablosu HcmEmployment tablosunda da böyle bir bug varmış.

19 Ocak 2016 Salı

Axapta - Query'ye boyut (dimension) bazında filtre eklemek

StrFmt ile boyut bazında filtre eklemek istediğimizde dimension alanın köşeli parantezleri dimension[2] = "0001" tarzı filtre eklemek istediğimizde hata veriyor. Doğru yöntemi bir forum sayfasında buldum:


QueryBuildDataSource    qbds = query.addDataSource(tablenum(EmplTable));
...
 qbds.addRange(fieldid2Ext(fieldnum(EmplTable, Dimension),1)).value("600742");

16 Ekim 2015 Cuma

AXAPTA - Formlarda pack-unpack

ClassDeclaration metodu:

    Container   packedQuery;
    SysQueryRun qRun;
    s
tr dummy;
    #DEFINE.CurrentVersion(1)
    #LOCALMACRO.CurrentList
        dummy,
        packedQuery
    #ENDMACRO


Diğer metodlar:

container pack()
{
    ;
    dummy      = txtDummy.valuestr();
    return [#CurrentVersion,#CurrentList];
}


public boolean unpack(container _packedClass)
{
    int version = conPeek(_packedClass,1);

    switch (version)
   {
        case #CurrentVersion:
            [version,#CurrentList] = _packedClass;
            break;
        default:
            return false;
    }
    return true;
}


public void init()
{
    ;
    xSysLastValue::getLast(this);
    super();
    txtDummy(dummy);
    element.initQuery();
}


public void close()
{
    super();
    xSysLastValue::saveLast(this);
}


void initParmDefault()
{
}


private IdentifierName lastValueDesignName()
{
    return '';
}


private IdentifierName lastValueElementName()
{
    return this.name();
}


private UtilElementType lastValueType()
{
    return UtilElementType::Form;
}


private UserId lastValueUserId()
{
    return curuserid();
}


public dataAreaId lastValueDataAreaId()
{
    return curExt();
}


Bu metod zorunlu değil, ancak query kullanacaksanız buna benzer birşey yazabilirsiniz:

void initQuery()
{
  Query                q;
  QueryBuildDataSource qbds;
  QueryBuildDataSource qbds2;
  QueryBuildRange      qRange;
  ;
  if (packedQuery)
      qRun = new SysQueryRun(packedQuery);
  else
  {
      q = new query();
      qbds = q.addDataSource(tablenum(EmplTable));
      qRun = new SysQueryRun(q);
  }
  qRun.promptLoadLastUsedQuery(false);
}


Bu metod da query'nin select butonu için, yani bu da zorunlu değil:
 void clicked()
{
    ;
    super();
    if (qRun.prompt())
        packedQuery = qRun.pack();
}

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


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... :)

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

17 Haziran 2014 Salı

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.

29 Eylül 2011 Perşembe

AXAPTA Query: Boş kayıtlar, boş olmayan kayıtlar

Query Addrange methodunda value değerine = yerine farklı işaretler koymak istersek değeri tırnak içinde formatlandırmak gerekiyor. Ama bazı durumlarda bu gereksiz:

Boş olmayanları istiyorsak:
    qbds.addRange(fieldnum(custtable,name)).value(sysquery::valueNotEmptyString()) ;
Boş olanları istiyorsak:
    qbds.addRange(fieldnum(custtable,name)).value(sysquery::valueEmptyString()) ;
10000 olmayanları istiyorsak:
    qbds.addRange(fieldnum(custtable,accountnum)).value(sysquery::valueNot("10000") ) ;
Aralık:
    qbds.addRange(fieldnum(custtable,accountnum)).value(queryrange("1","10000") ) ;
Enum:
            qbds.addRange(fieldnum(B_RMARequestTable, RefType)).value(queryvalue(B_RMAReqRefType::RepairJournal));