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

4 Ocak 2017 Çarşamba

AXAPTA - Tabloları eşitle

İş arkadaşımın internetten bulduğu kod, kaynağını bilmiyorum ama birçok durumda işe yarıyor:

    Dictionary              dict;
    int                     idx, lastIdx, totalTables;
    TableId                 tableId;
    Application             application;
    SysOperationProgress    progress;
    StackBase               errorStack;
    ErrorTxt                errorTxt;
    ;

    application = new Application();
    dict = new Dictionary();
    totalTables = dict.tableCnt();
    progress = new SysOperationProgress();
    progress.setTotal(totalTables);
    progress.setCaption("@SYS90206");
    errorStack = new StackBase(Types::String);

    lastIdx = 3000;
    try
    {
        for (idx = lastIdx+1; idx <= totalTables; idx++)
        {
            tableId = dict.tableCnt2Id(idx);
            progress.setText(dict.tableName(tableId));

            lastIdx = idx;
            application.dbSynchronize(tableId, false, true, false);
            progress.incCount();
        }
    }
    catch (Exception::Error)
    {
        errorTxt = strFmt("'%1' (%2) tablosunda hata var!", tableId, dict.tableName(tableId));
        errorStack.push(errorTxt);
        retry;
    }

    setPrefix("@SYS86407");
    errorTxt = errorStack.pop();
    while (errorTxt)
    {
        error(errorTxt);
        errorTxt = errorStack.pop();
    }

2 Mart 2016 Çarşamba

AXAPTA - Bir tablo alanının label değerini bulmak

Bir tablonun bir alanının label değerini bulmanın iki yolu var:

Eğer field label değerini direk extended data tipinden alıyorsa:


    if (curext()=="krc" && this.RBOInventItemGroupId == "")
        ret = checkfailed(strfmt("'%1' alanı doldurulmalıdır!..",
            new SysDictType(extendedTypeNum(RBORetailGroupId)).label()));

Eğer tabloda alana bir etiket yazıldıysa:

    if (curext()=="krc" && this.RBOInventItemGroupId == "")
        ret = checkfailed(strfmt("'%1' alanı doldurulmalıdır!..",
            new SysDictField(tablenum(WholeSalesCampaignGroup),
fieldnum(WholeSalesCampaignGroup,RBOInventItemGroupId)).label()));
 

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

15 Eylül 2014 Pazartesi

AX 2012 - Tabloya bağlı yeni bir finansal boyut tanımlama

Microsoft'un ilgili white paper  sayfasından faydalanan bir blogdan öğrendiğim bu işlem çok kolay:
1-AOT'dan DimAttribute adıyla başlayan viewlerden birini kopyala ve adı yine aynen DimAttribute ile başlasın.
2. Ana data sourcenin orijinal tablo adı ne olursa olsun adı data source adı BackingEntity olsun.
3.Viewdeki tanımlı alanların adı (orijinal isimleri farklı olabilir) şöyle olmak zorunda:
Key - Data source tablosunun Surrogate key field'ı. RecId gibi...
Value - Data source tablosunun primary key field'ı. AccountNum gibi...
Name - Açıklama alanı. Description gibi...


Bu boyutun geçerli olması için iki yol var:

AOS restart

veya

DimensionCache::clearAllScopes(); 

komutu.

29 Kasım 2011 Salı

AXAPTA Ana tablo formuna git çalışmayınca?

Bir tabloya bağlı kontrollerde tabloda ayarlanmışsa "Ana tablo formuna git" butonu otomatik olarak çalışır. Ancak kontrol sadece extended data tipine bağlıysa, çalışmaz. Bu durumda kendi Jumpref methodunuzu yazmanız gerekir.

Bu konuda Fatih Demirci'nin aşağıdaki kodundan faydalandım:

public void jumpRef()
{
EmplTable emplTable;
Args args;
MenuFunction menuFunction;
;
emplTable = EmplTable::find(this.text());
if (!emplTable)
{
return;
}
args = new Args();
args.caller(element);
args.record(emplTable);
menuFunction = new MenuFunction( menuitemdisplaystr(EmplTable),
MenuItemType::Display);
menuFunction.run(args);
}

Ancak bu kodun standart "Ana tablo formuna git" butonundan ufak bir farklılığı vardı. Ekrana sadece ilgili kaydı getiriyordu. Standarttaysa ilgili kayıt bulunuyor ve tüm kayıtlar görüntüleniyordu. Ufak bir araştırma sonrası aşağıdaki kodu yazdım. Tam standarttaki gibi çalışıyor:

public void jumpRef()
{
CustTable custTable;
Args args;
MenuFunction menuFunction;
;
args = new Args();
args.caller(element);
args.lookupfield(FieldNum(CustTable,AccountNum));
args.lookupValue(this.text());
menuFunction = new MenuFunction(MenuItemDisplayStr(custTable),MenuItemType::Display);
menuFunction.run(args);
}

24 Ağustos 2011 Çarşamba

AXAPTA Çoklu tablo ile lookup

SysTableLookup sınıfını kullanarak Axapta'nın kendi lookupunu ezip kendimize özel lookup yazabiliyoruz ve iki tabloyu birleştirebiliyoruz. Peki lookup ekranında 2. tablodan bir field göstermek istersek? Axapta standart SysTableLookup sınıfı bunu sağlamıyor. Ancak SysTableLookup'tan türetilmiş ve bunu sağlayan bir class var: SysMultiTableLookup.

Verdiğim linkten indirip kolayca kullanabilirsiniz. Aşağıda bir örnek kullanmını da verdim:


public void Agreementlookup(FormControl _formControl, str _filterStr)
{
SMAAgreementTable SMAagreementTable;
Query query = new Query();
SysMultiTableLookup sysTableLookup;
QueryBuildDataSource queryBuildDataSource = query.addDataSource(tablenum(SMAAgreementTable));
QueryBuildDataSource qbds2;
QueryBuildRange qbr;
;

qbds2=queryBuildDataSource.addDataSource(tablenum(B_AgreementCustomerTable));
qbds2.relations(true);

qbr=qbds2.addRange(fieldnum(B_AgreementCustomerTable, num));

qbr.value(strfmt('((Num == "%1") && (AccountCode == TableGroupAll::Table)) || (AccountCode == TableGroupAll::All)',
QueryValue(salesTable.CustAccount)));

sysTableLookup = SysMultiTableLookup::newParameters(_formControl,query);
sysTableLookup.addLookupfield(fieldnum(SMAAgreementTable, AgreementId),1);
sysTableLookup.addLookupfield(fieldnum(SMAAgreementTable, AgreementDescription),1);
sysTableLookup.addLookupfield(fieldnum(SMAAgreementTable, ProjId),1);
sysTableLookup.addLookupfield(fieldnum(B_AgreementCustomerTable, AccountCode),2);
sysTableLookup.addLookupfield(fieldnum(B_AgreementCustomerTable, Num),2);

sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
}

18 Ağustos 2011 Perşembe

AXAPTA "Ana tablo formuna git" kısayoluyla gönderilen değer

Bu değere args().record() metoduyla ulaşılabiliyor, ancak farklı farklı tablolardan farklı alan isimleriyle extend edilmiş değerler olunca switch case koymak pek te iyi bir çözüm değil.

FormStringControl   callerControl   = SysTableLookup::getCallerStringControl(element.args());
;
info(callercontrol.text());

Kod satırını Yakup Kirişçi'nin blogundan buldum. Standart lookup formlarında bulunan bir kodmuş. Benim çok işime yaradı. Kendisine teşekkürler...