Bu yazıda X++ ile sorgu nasıl yazılır anlatmaya çalışacağım. X++ sorguları SQL sorgularına çok benzer ama temelde birkaç fark var öncelikle TableBuffer denen bir kavram var. SQL de bir sorgu yazdığınızda direk veriyi görürsünüz ama X++ da bunun görselleştirilebilmesi için bir TableBuffer‘a ihtiyaç vardır. Temel bir sorguda kullanılan anahtar kelimeler bunlardır. Birkaç örnek yaparak açıklamaya çalışacağım.
[while] select [reverse] [firstfast]
[firstonly] [firstOnly10] [firstOnly100] [firstOnly1000]
[forupdate] [nofetch] [crosscompany]
[forcelitterals | forceplaceholders] [forcenestedloop]
[forceselectorder]
[repeatableRead] [validTimeState]
[ * | <fieldlist> from] <tablebuffer>
[ index [hint] <indexname> ]
[ group by {<field>} ]
[ order by {<field> [asc][desc]} ]
[ where <expression> ]
[ outer | exists | notexists ] join [reverse]
[ * | <fieldlist> from] <tablebuffer>
[ index <indexname> ]
[sum] [avg] [minof] [maxof] [count]
[ group by {<field>} ]
[ order by {<field> [asc][desc]} ]
[ where <expression> ]
]
<fieldlist> ::= <field> | <fieldlist> , <field>
<field> ::= fieldname | <function>(<field>)
Bir Job ile temel birkaç sorgu yazalım.
class FDDataAccess1
{
public static void main(Args _args)
{
CustTable custTable;
;
select * from custTable; // Müşteri tablosundaki tüm kayıtları seçer
info(strFmt(“1- %1 %2″, custTable.AccountNum, custTable.Currency));
select custTable; // // Müşteri tablosundaki tüm kayıtları seçer. * From a ihtiyaç duymaz
info(strFmt(“2- %1 %2″, custTable.AccountNum, custTable.Currency));
select Currency from custTable; // Müşteri tablosundaki sadece Currency alanını seçer
info(strFmt(“3- %1 %2″, custTable.AccountNum, custTable.Currency));
select reverse custTable; // Müşteri tablosundaki tüm kayıtları ters sırada seçer
info(strFmt(“4- %1 %2″, custTable.AccountNum, custTable.Currency));
select firstonly custTable; // Müşteri tablosundaki tek satır veriyi seçer
info(strFmt(“5- %1 %2″, custTable.AccountNum, custTable.Currency));
select firstonly custTable
where custTable.Currency != “TRY”; // TRY den faklı olan ilk satırı seçer.
info(strFmt(“6- %1 %2″, custTable.AccountNum, custTable.Currency));
select firstonly custTable
where custTable.Currency != “TRY” &&
custTable.CustGroup == “PROJE”;
info(strFmt(“7- %1 %2″, custTable.AccountNum, custTable.Currency));
select firstonly custTable
where custTable.Currency == “TRY” ||
custTable.CustGroup == “PROJE”;
info(strFmt(“8- %1 %2″, custTable.AccountNum, custTable.Currency)); }
}
Çalıştırdığımda bu çıktıyı veriyor.
Resim-1
Farklı bir örnek yapalım. Bu job benim eğitimlerde kullandığım bir örnek.
static void FDDataAccess2(Args _args)
{
InventTable inventTable;
InventTrans inventTrans;
;
//1. sistemimde tanımlı bütün stok kartlar (InventTable)
setprefix(“Sistemimde tanımlı bütün stok kartlar”);
while select inventTable
{
info(strFmt(“%1 %2″, inventTable.ItemId, inventTable.ItemName()));
}
//2. kaç stok kartım var
setPrefix(“kaç stok kartım var”);
select count(recId) from inventTable;
info(strFmt(“%1″, inventTable.recId));
// 3. Hareket gören stok kartlarım hangileri (sadece stok kartlarım)
setPrefix(“Hareket gören stok kartlarım”);
while select inventTable
exists join inventTrans
where inventTable.ItemId == inventTrans.ItemId
{
info(strFmt(“%1 %2 %3″, inventTable.ItemId,
inventTrans.Qty,
inventTrans.DatePhysical));
}
//4. stok kartı hareket bilgisi
setPrefix(“stok kartı hareket bilgisi”);
while select inventTable
join inventTrans
where inventTable.ItemId == inventTrans.ItemId
{
info(strFmt(“%1 %2 %3″, inventTable.ItemId,
inventTrans.Qty,
inventTrans.DatePhysical));
}
//5. Hiç hareket görmeyen stok kartlarım hangileri ve adedi
setPrefix(“Hiç hareket görmeyen stok kartlarım”);
while select inventTable
notexists join inventTrans
where inventTable.ItemId == inventTrans.ItemId
{
info(strFmt(“%1 %2 %3″, inventTable.ItemId,
inventTrans.Qty,
inventTrans.DatePhysical));
}
setPrefix(“Hiç hareket görmeyen stok kartlarımın adedi”);
select count(recId) from inventTable
notexists join inventTrans
where inventTable.ItemId == inventTrans.ItemId;
info(strFmt(“Hiç hareket görmeyen stok kartlarım : %1 adettir.”, inventTable.recId));
//6. Her bir stok kartı için en yüksek stok hareket miktarını içeren bilgi
setPrefix(“Her bir stok kartı için en yüksek stok hareket miktarını içeren bilgi”);
while select maxof(Qty)
from inventTrans
group by inventTrans.ItemId
{
info(strFmt(“%1 %2″, inventTrans.ItemId,
inventTrans.Qty));
}
}
Bu yazıda sorgu nasıl yazılır temel örneklerle anlatmaya çalıştım. Çok geniş bir konu ve çok ayrıntısı mevcut. Bunu iyi bilmek için veri tabanı yapısına ve temel SQL komutlarına hâkim olmak gerekiyor. SQL yazan birisi burada zorlanmaz. İleriki yazılarımda sorgunun diğer ayrıntılarına değinmeye devam edeceğim.
Selamlar.
www.fatihdemirci.net
TAGs: X++,Select, Azure, Azure DevOps, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365