Ax 2009 etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Ax 2009 etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
21 Şubat 2013 Perşembe
Jump related record from Info
Hi All,
We use Info to inform our clients but when we want to jump to the related record we need to use SysInfoAction class.
Here is the example code :
info(
"Information want to give ","",SysInfoAction_TableField::newBuffer(TableName::find(TablePrimaryKey))
);
Have a nice AXing.
We use Info to inform our clients but when we want to jump to the related record we need to use SysInfoAction class.
Here is the example code :
info(
"Information want to give ","",SysInfoAction_TableField::newBuffer(TableName::find(TablePrimaryKey))
);
Have a nice AXing.
Etiketler:
AX,
Ax 2009,
AX 2012,
Info,
link,
Microsoft Dynamics AX,
newBuffer,
record,
related,
SysInfoAction
17 Ocak 2013 Perşembe
Pack / Unpack Form Query
Hi All,
When we need to restore previous query ranges after executeQuery() we can use this code example below.
Container con;
con = InventSum_qr.query().pack();
InventSum_q = new Query(con);
InventSum_ds.executeQuery();
Have a nice coding.
When we need to restore previous query ranges after executeQuery() we can use this code example below.
Container con;
con = InventSum_qr.query().pack();
InventSum_q = new Query(con);
InventSum_ds.executeQuery();
Have a nice coding.
Etiketler:
AX,
Ax 2009,
Dyanmics AX,
Dynamics AX 2009,
executeQuery,
pack,
unpack
31 Ağustos 2012 Cuma
Edit method ile çoklu kayıt seçimi
Merhaba,
Grid üzerinde bulunan kayıtları işlem yapmak için seçmenin çeşitli yolları mevcut. Yollardan biri grid'e bir checkbox ekleyip seçilen kayıtları bir map ile yönetmek.
Form üzerinde değeri değiştirilebilen display alanların arkasında çalışan method tipi edit methoddur edit methodlar 3 adet parametre alırlar bunlardan ilki alanın değerinin değiştirilmek için seçilip seçilmediği set değişkeni, ikincisi gönderilen kayıt bilgisi ve son değer ise kayıt bilgisinin seçilmek üzere mi yoksa seçiminin kaldırılması için mi tıklandığı bilgisi mark değişkeni.
edit NoYes MarkRecords(boolean set,tabloAdi tabloDegiskeni,NoYes _mark)
{
if (set)
{
MarkMap.insert( tabloDegiskeni .RecId , tabloDegiskeni.stringAlan);
MarkMap.valueSet();
}
else
{
if (MarkMap.exists(PackingSlip.RecId))
{
_mark = MarkMap.lookup(PackingSlip.RecId);
}
}
return _mark;
}
classDecleration da MarkMap değişkenini tanımlıyoruz.
init() methodunda MarkMap değişkeninin Map tipini belirliyoruz
MarkMap = new Map(Types::Int64,Types::string) gibi
sonrasında istenilen yerde mapEnumerator ile MarkMap değişkenindeki değerleri listeliyoruz.
Bol AX lı günler,
Alper.
26 Temmuz 2012 Perşembe
List all tables on AX / Tüm tabloları listeleme
Hi,
If you need to list all tables on AX you need to call Global::pickTable method it will return tablenum after that you can do whatever you want.
Example :
info(tableid2name(Global::pickTable()));
Happy AXing,
Alper.
/////////////////////////////////////
Merhaba,
AX üzerinde açılmış tüm tabloları listelemek istediğinizde yapmanız gereken tek şey Global sınıfının altındaki pickTable methodunu çağırmak. Bu method seçilen tablo adının id sini size geri dönüyor. Geri dönüş değerini aldıktan sonra istediğiniz gibi değeri kullanabilirsiniz.
Örnek
info(tableid2name(Global::pickTable()));
Bol AX lı günler,
Alper.
If you need to list all tables on AX you need to call Global::pickTable method it will return tablenum after that you can do whatever you want.
Example :
info(tableid2name(Global::pickTable()));
Happy AXing,
Alper.
/////////////////////////////////////
Merhaba,
AX üzerinde açılmış tüm tabloları listelemek istediğinizde yapmanız gereken tek şey Global sınıfının altındaki pickTable methodunu çağırmak. Bu method seçilen tablo adının id sini size geri dönüyor. Geri dönüş değerini aldıktan sonra istediğiniz gibi değeri kullanabilirsiniz.
Örnek
info(tableid2name(Global::pickTable()));
Bol AX lı günler,
Alper.
24 Temmuz 2012 Salı
Coloring grid lines or cells from code / Grid alan veya satırlarını kod ile renklendirme
Hi,
We can color up grid lines by using displayOption. On forms datasource expand methods click right mouse ,select overwirte function and select displayOption.
For code example open tuttorial_Form_displayOptions form
public void displayOption(Common _common, FormRowDisplayOption _options)
{
// here's the logic which derteminates the color for this row
// In this case it will random color the lines
if (_common.recId mod 3 ==0)
{
_options.backColor( WinAPI::RGB2int( 255,0,0 ));
}
super(_common,_options);
}
With this code example if recId's mod is equal to 3 it will paint the entire row to red. But if we want to paint only one cell individually we will use
_options.affectedElementsByControl(CustTable_Name.id());
As you can see we used affectedElementsByControl method to paint only sellected control.
Happy Axing.
Alper.
////////////////////////////////////////////////////////////////////
Merhabalar,
Form üzerindeki gridlerde istenilen koşula göre renklendirme yapmak istediğimizde form veri kaynağı üzerinde bulunan displayOption methodunu ezeceğiz.
Methodu ezmek için form un altında yer alan veri kaynağının methodlarını genişletip yöntemi geçersiz kıl ı seçtikten sonra açılan listeden displayOption ı seçiyoruz.
Örnek kod olarak tuttorial_Form_displayOptions formunu kullabiliriz.
public void displayOption(Common _common, FormRowDisplayOption _options)
{
// here's the logic which derteminates the color for this row
// In this case it will random color the lines
if (_common.recId mod 3 ==0)
{
_options.backColor( WinAPI::RGB2int( 255,0,0 ));
}
super(_common,_options);
}
Bu örnekte custtable ın RecId alanının değerinin mod 3 e göre değeri 0 olduğunda kayıdın bulunduğu satırı tümüyle kırmızıya boyuyor.
Eğer tüm satırı değilde sadece tek bir alanı boyamak istersek koda alttaki satırı eklememiz yeterli.
_options.affectedElementsByControl(CustTable_Name.id());
Bu şekilde affectedElementsByControl methodunu çağırarak boyama işleminin sadece parametre olarak gönderdiğimiz CustTable_Name.id() konrolü için geçerli olduğunu belirtiyoruz.
Mutlu AXlar,
Alper.
We can color up grid lines by using displayOption. On forms datasource expand methods click right mouse ,select overwirte function and select displayOption.
For code example open tuttorial_Form_displayOptions form
public void displayOption(Common _common, FormRowDisplayOption _options)
{
// here's the logic which derteminates the color for this row
// In this case it will random color the lines
if (_common.recId mod 3 ==0)
{
_options.backColor( WinAPI::RGB2int( 255,0,0 ));
}
super(_common,_options);
}
With this code example if recId's mod is equal to 3 it will paint the entire row to red. But if we want to paint only one cell individually we will use
_options.affectedElementsByControl(CustTable_Name.id());
As you can see we used affectedElementsByControl method to paint only sellected control.
Happy Axing.
Alper.
////////////////////////////////////////////////////////////////////
Merhabalar,
Form üzerindeki gridlerde istenilen koşula göre renklendirme yapmak istediğimizde form veri kaynağı üzerinde bulunan displayOption methodunu ezeceğiz.
Methodu ezmek için form un altında yer alan veri kaynağının methodlarını genişletip yöntemi geçersiz kıl ı seçtikten sonra açılan listeden displayOption ı seçiyoruz.
Örnek kod olarak tuttorial_Form_displayOptions formunu kullabiliriz.
public void displayOption(Common _common, FormRowDisplayOption _options)
{
// here's the logic which derteminates the color for this row
// In this case it will random color the lines
if (_common.recId mod 3 ==0)
{
_options.backColor( WinAPI::RGB2int( 255,0,0 ));
}
super(_common,_options);
}
Bu örnekte custtable ın RecId alanının değerinin mod 3 e göre değeri 0 olduğunda kayıdın bulunduğu satırı tümüyle kırmızıya boyuyor.
Eğer tüm satırı değilde sadece tek bir alanı boyamak istersek koda alttaki satırı eklememiz yeterli.
_options.affectedElementsByControl(CustTable_Name.id());
Bu şekilde affectedElementsByControl methodunu çağırarak boyama işleminin sadece parametre olarak gönderdiğimiz CustTable_Name.id() konrolü için geçerli olduğunu belirtiyoruz.
Mutlu AXlar,
Alper.
1 Haziran 2012 Cuma
Working with Enum values / Enum değerleri arasında gezinmek
Hi,
To work with enum values you need to use DictEnum class. After you get the count you can do whatever you want.
Have a nice AX day,
Alper.
EnumId enumId = enumNum(SalesStatus);
DictEnum dictEnum = new DictEnum(enumId);
int count = dictEnum.values();
int counter
for(counter = 0; counter < count; counter ++)
{
// You can use the number of method exposed by DictEnum class
// dictEnum.name(counter)
// dictEnum.index2Value(counter)
// dictEnum.index2Symbol(counter)
// dictEnum.index2Label(counter)
}
Etiketler:
Ax 2009,
Axapta,
Axapta 2009,
Dict,
DictEnum,
Dynamics AX 2009,
enum,
enumnum,
index2,
index2label,
index2symbol,
index2Value,
name
28 Mayıs 2012 Pazartesi
Write methodu ile insert ve update
Merhabalar,
AX geliştirmelerinde kimi zaman eldeki verinin ilgili tabloda olup olmadığı bilgisini bilemediğimiz durumlar oluşabilir, bu tip durumlarda tablonun write() methodu kullanılabilir.
Write() methodu gelen kayıt tabloda var ise kayıdı verilen değerler ile günceller eğer yok ise tabloya kayıdı ekler.
TabloAdi tabloDegiskeni;
;
ttsbegin;
select forupdate tabloDegiskeni where tabloDegiskeni.primaryKeyfield1 == 123;
tabloDegiskeni.primaryKeyfield1 = 123;
tabloDegiskeni.field2 = "abc";
tabloDegiskeni.write();
ttscommit;
Böylelikle kayıt var mı yok mu diye koşullar yazmaya kodu uzatmaya gerek kalmadı.
Bol AX'lı günler,
Alper.
AX geliştirmelerinde kimi zaman eldeki verinin ilgili tabloda olup olmadığı bilgisini bilemediğimiz durumlar oluşabilir, bu tip durumlarda tablonun write() methodu kullanılabilir.
Write() methodu gelen kayıt tabloda var ise kayıdı verilen değerler ile günceller eğer yok ise tabloya kayıdı ekler.
TabloAdi tabloDegiskeni;
;
ttsbegin;
select forupdate tabloDegiskeni where tabloDegiskeni.primaryKeyfield1 == 123;
tabloDegiskeni.primaryKeyfield1 = 123;
tabloDegiskeni.field2 = "abc";
tabloDegiskeni.write();
ttscommit;
Böylelikle kayıt var mı yok mu diye koşullar yazmaya kodu uzatmaya gerek kalmadı.
Bol AX'lı günler,
Alper.
Etiketler:
AX,
Ax 2009,
Dynamics AX,
Dynamics AX 2009,
write
Working with RecordInsertList / RecordInsertList ile çalışmak
Hi,
When we need to insert multiple records to the database in one trip, for performance or something else we sholud use RecordInsertList class.
In example below we declare a RecordInsertList variable with table number and use add() method to add new record to the array list by using tableVariable.
After we finisheded to add new records to the RecordInsertList we call insertDatabase() method to insert record list to the database with one trip.
Have a nice coding,
Alper.
-------------------------------------
RecordInsertList ril = new RecordInsertList(tablenum(TableName));
TableName tableVariable;
;
tableVariable.field1 = "abc";
tableVariable.field2 = 123;
ril.add(tableVariable);
ril.insertDatabase();
-------------------------------------
Merhabalar,
RecordInsertList sınıfını çoklu kayıt girişlerinde her seferinde veri tabanına gidip gelinmesinin önüne geçmek ve performans kazanmak için bir liste oluşturmak için kullanıyoruz.
Bu liste sayesinde kayıtlarımızı add methodu ile listeye ekliyor ve işlemler bittikten sonra insertDatabase ile tek seferde sunucuya gönderebiliyoruz.
Bol AX' lı günler
Alper.
30 Nisan 2012 Pazartesi
Auto Logoff güncelleme
Merhaba,
AX oturumlarının işlem yapılmaması durumunda otomatik kapatılmasını istiyorsak Araçlar -> Seçenekler ekranında bulunan Genel tabı altında Otomatik kapatma alanına bir değer girmeliyiz.
Bu ekran kullanıcı bazlı çalıştığından her kullanıcı için tek tek tanım yapmak zor gelebilir, koddan hepsine yapalım desek Admin grubundakiler bunu istemeyebilir.
Bu durumdan kurtulmak için aşağıdaki kodu kullanabiliriz.
UserGroupList UserGroupList;
UserInfo UserInfo;
;
try
{
ttsbegin;
while select forupdate UserInfo
{
select * from UserGroupList
where UserGroupList.groupId == "Admin"
&& UserGroupList.userId == UserInfo.id;
if(!UserGroupList)
{
UserInfo.autoLogOff = 20;
UserInfo.update();
}
}
ttscommit;
}
catch (exception::Error)
{
throw error("Hata oluştu.");
}
Bu sayede Admin grubundakiler hariç tüm kullanıcıların Otomatik kapama seçeneğini 20 dk ile sınırlandırmış oluyoruz. İsterseniz bu kodu switch case ile kullanıcı grubu bazında farklı değerler ile çalışacak hale getirebilirsiniz.
Bol AX lı günler.
Alper.
AX oturumlarının işlem yapılmaması durumunda otomatik kapatılmasını istiyorsak Araçlar -> Seçenekler ekranında bulunan Genel tabı altında Otomatik kapatma alanına bir değer girmeliyiz.
Bu ekran kullanıcı bazlı çalıştığından her kullanıcı için tek tek tanım yapmak zor gelebilir, koddan hepsine yapalım desek Admin grubundakiler bunu istemeyebilir.
Bu durumdan kurtulmak için aşağıdaki kodu kullanabiliriz.
UserGroupList UserGroupList;
UserInfo UserInfo;
;
try
{
ttsbegin;
while select forupdate UserInfo
{
select * from UserGroupList
where UserGroupList.groupId == "Admin"
&& UserGroupList.userId == UserInfo.id;
if(!UserGroupList)
{
UserInfo.autoLogOff = 20;
UserInfo.update();
}
}
ttscommit;
}
catch (exception::Error)
{
throw error("Hata oluştu.");
}
Bu sayede Admin grubundakiler hariç tüm kullanıcıların Otomatik kapama seçeneğini 20 dk ile sınırlandırmış oluyoruz. İsterseniz bu kodu switch case ile kullanıcı grubu bazında farklı değerler ile çalışacak hale getirebilirsiniz.
Bol AX lı günler.
Alper.
26 Nisan 2012 Perşembe
ODBC ile dış veri tabanından veri almak
Merhaba,
SQL bağlantısı dış veri kaynaklarından veri almak gerektiğinde kullandığımız yöntemlerden bir tanesi. SQL bağlantısında çeşitli yöntemler mevcut ama bizim tercih ettiğimiz yöntem hem hız hemde işlemi begin commit işlemi içerisinde yapmak olduğundan ODBC olacak.
ODBC kullanmak için öncesinde sunucu üzerinde bir tanımlama yapmamız gerekiyor.
ODBCCOnnection odbccon;
Connection con;
Statement stmt;
LoginProperty loginProperty;
SqlStatementExecutePermission serverSessionQueryPermission;
ResultSet record;
str qryText;
;
qryText="Select Field1 from Table";
serverSessionQueryPermission = new SqlStatementExecutePermission(qryText);
serverSessionQueryPermission.assert();
loginProperty=new loginProperty();
loginProperty.setOther("DSN=DSN_Name;UID=UserId;PWD=password");
odbccon=new ODBCConnection(loginProperty);
odbccon.ttsbegin();
stmt = odbccon.createStatement();
record = stmt.executeQuery(qryText);
odbccon.ttscommit();
CodeAccessPermission::revertAssert();
while (record.next())
{
info(record.getString(1));
}
Bu örnek ile Table tablosundan Field1 alanını info ile ekrana basıyoruz.
SQL bağlantısı dış veri kaynaklarından veri almak gerektiğinde kullandığımız yöntemlerden bir tanesi. SQL bağlantısında çeşitli yöntemler mevcut ama bizim tercih ettiğimiz yöntem hem hız hemde işlemi begin commit işlemi içerisinde yapmak olduğundan ODBC olacak.
ODBC kullanmak için öncesinde sunucu üzerinde bir tanımlama yapmamız gerekiyor.
Windows üzerinde Control Panel (Denetim Masası) ->
Administrative Tools (Yönetimsel Araçlar) ->
Data Sources (ODBC) (Veri kaynakları (ODBC))
menü adımı ile ilgili ekranı açıyoruz. Kodda geçen "DSN_Name" kısmında kullanacağımız DSN tanımını yapıyoruz.
ODBCCOnnection odbccon;
Connection con;
Statement stmt;
LoginProperty loginProperty;
SqlStatementExecutePermission serverSessionQueryPermission;
ResultSet record;
str qryText;
;
qryText="Select Field1 from Table";
serverSessionQueryPermission = new SqlStatementExecutePermission(qryText);
serverSessionQueryPermission.assert();
loginProperty=new loginProperty();
loginProperty.setOther("DSN=DSN_Name;UID=UserId;PWD=password");
odbccon=new ODBCConnection(loginProperty);
odbccon.ttsbegin();
stmt = odbccon.createStatement();
record = stmt.executeQuery(qryText);
odbccon.ttscommit();
CodeAccessPermission::revertAssert();
while (record.next())
{
info(record.getString(1));
}
Bu örnek ile Table tablosundan Field1 alanını info ile ekrana basıyoruz.
Etiketler:
AX,
Ax 2009,
CodeAccessPermission,
DSN,
executeQuery,
loginProperty,
ODBC,
ODBCConnection,
Query,
revertAssert,
serverSessionQueryPermission,
SQL,
ttsbegin,
ttscommit
11 Nisan 2012 Çarşamba
Klasör içerisindeki dosyalarda gezinmek / Scan files in specific folder
Merhaba,
Belirli bir klasör içerisindeki dosyaların arasında gezinmek için kullanabileceğiniz kod örneğini aşağıda paylaşıyorum.
Örnekte c: altında yer alan uzantısı txt olan dosyaların isimlerini info ile ekrana basıyoruz.
Bol AX lı günler,
Alper.
str filename;
int handle;
;
[handle, filename] = WINAPI::findFirstFile(@"c:\*.txt");
while (fileName != "")
{
info(filename);
filename = WinAPI::findNextFile(handle);
}
Hi,
When you want to scan files for specific file type in a folder you can use the sample code above.
We use WinApi class for both finding first file and find next file
With this example you can list txt extended filed on c:\ folder.
Have a nice AX days,
Alper.
7 Mart 2012 Çarşamba
Grid kontrolünde seçilen kayıtlar arasında geçiş yapmak.
Merhaba,
Form üzerinde çoklu kayıt listelemek için kullandığımız Grid kontrolünde birden fazla kayıdı Ctrl tuşu ile tıklayarak, Shift ile beraber yukarı aşağı ok tuşlarıyla veya başka yollar ile de birden fazla seçim yapabiliriz.
Bu yaptığımız seçimler üzerinden işlem yapmak istersek aşağıdaki kod örneğine benzer bir kod ile veri kaynağı üzerinde seçilen kayıtlar arasında gezinti yapabilir istenilen alana, veriye ulaşmamız mümkün.
TabloAdi tabloDegiskeni;
;
for (tabloDegiskeni = TabloAdi_ds.getFirst(true) ? TabloAdi_ds.getFirst(true) : TabloAdi_ds.cursor();
//Veri kaynağının ilk kayıdına eşitse ilk kayıdı değilse üzerine konumlanmış kayıttan başlar
tabloDegiskeni;
//Değer olduğu sürece devam
tabloDegiskeni = TabloAdi.getNext()
// Bir sonraki kayıdı değişkene atıyoruz
)
{
info(tabloDegiskeni.alanAdi);
}
For döngüsü içerisinde istediğiniz işlemi yapabilirsiniz.
Bol Ax'lı günler,
Alper.
Form üzerinde çoklu kayıt listelemek için kullandığımız Grid kontrolünde birden fazla kayıdı Ctrl tuşu ile tıklayarak, Shift ile beraber yukarı aşağı ok tuşlarıyla veya başka yollar ile de birden fazla seçim yapabiliriz.
Bu yaptığımız seçimler üzerinden işlem yapmak istersek aşağıdaki kod örneğine benzer bir kod ile veri kaynağı üzerinde seçilen kayıtlar arasında gezinti yapabilir istenilen alana, veriye ulaşmamız mümkün.
TabloAdi tabloDegiskeni;
;
for (tabloDegiskeni = TabloAdi_ds.getFirst(true) ? TabloAdi_ds.getFirst(true) : TabloAdi_ds.cursor();
//Veri kaynağının ilk kayıdına eşitse ilk kayıdı değilse üzerine konumlanmış kayıttan başlar
tabloDegiskeni;
//Değer olduğu sürece devam
tabloDegiskeni = TabloAdi.getNext()
// Bir sonraki kayıdı değişkene atıyoruz
)
{
info(tabloDegiskeni.alanAdi);
}
For döngüsü içerisinde istediğiniz işlemi yapabilirsiniz.
Bol Ax'lı günler,
Alper.
15 Şubat 2012 Çarşamba
TreeControl kullanımı
Sınıflandırma yapılması istendiğinde TreeControl kullanılabilir.
Treecontrol kullanırken dikkat edilmesi gereken kontrolü eklerken hangi düğüm (node) ün altında yer alacağı bilgisine hakim olmaktır.
Bu kontrolü sağlamak için TreeItemIdx tipli değişken tanımlıyoruz ve bu değişkeni ağaca yeni kırılım eklerken hangi kontrolün altında yer alacağını belirtmek için kullanıyoruz.
Aşağıdaki kodda madde kartı içerisinde dolaşıp madde grubu bazında maddeleri listeleyen bir ağaç yapısı oluşturuyoruz.
Kırılımların daha iyi anlaşılabilmesi için kırılımlara birer resim atıyoruz.
Resimler için ImageListAllp_Help sınıfındaki açık klasörü kök öğe için, kapalı kitabı madde grubu için, açık kitabıda bu maddeler için kullanıyoruz.
#resAppl
InventTable inventTable;
TreeItemIdx item,itemGroup,root;
ItemGroupId oldItemGroup;
ImageRes imageResItem,imageResGroup,imageResRoot;
ImageListAppl_Help imageList = new ImageListAppl_Help();
;
imageResRoot = imageList.image(#ImageFolderOpen);
imageResGroup = imageList.image(#ImageHelpTOCBookClosed);
imageResItem = imageList.image(#ImageHelpTOCBookOpen);
formTreeControl.setImagelist(imageList.imageList());
root = SysFormTreeControl::addTreeItem(formTreeControl,"Maddeler",FormTreeAdd::Root,"Maddeler",imageResRoot);
while select inventTable order by ItemGroupId
{
if (!oldItemGroup)
{
oldItemGroup = inventTable.ItemGroupId;
itemGroup = SysFormTreeControl::addTreeItem(formTreeControl,inventTable.ItemGroupId,root,inventTable.ItemGroupId,imageResGroup);
}
if (oldItemGroup != inventTable.ItemGroupId)
{
SysFormTreeControl::expandTree(formTreeControl,itemGroup);
oldItemGroup = inventTable.ItemGroupId;
itemGroup = SysFormTreeControl::addTreeItem(formTreeControl,inventTable.ItemGroupId,root,inventTable.ItemGroupId,imageResGroup);
}
item = SysFormTreeControl::addTreeItem(formTreeControl,inventTable.ItemId,itemGroup,inventTable.ItemId,imageResItem);
}
SysFormTreeControl::expandTree(formTreeControl,formTreeControl.getRoot(),1);
Hepsi bu bol AX lı günler.
Alper.
Kaydol:
Kayıtlar (Atom)



