PDA

View Full Version : سوال: استفاده از فیلد محاسباتی در Query و نمایش آن در Grid



hamedjim
سه شنبه 25 مهر 1396, 13:59 عصر
سلام و عرض ادب خدمت دوستان.
در مورد فیلد محاسباتی سوالی داشتم که به صورت مثال مطرح می کنم.
به عنوان نمونه فرض کنید دو جدول (Table1, Table2) وجود دارند که یک Query به صورت زیر از اونها گرفته شده:


var
Query: TADOQuery;
begin
Query:= TADOQuery.Create(nil);
Query.Connection:= ADOConnection;

with Query do
begin
Close;
SQL.Clear;
SQL.Text:= 'SELECT Table1.Field1 , Table1.Field2, Table2.Field1 ' +
'FROM Table1, Table2 WHERE Table1.ID=Table2.ID';
Open;
end;
end;


برای نمایش در گرید، ما علاوه بر سه فیلد بالا، یک فیلد برای شمارش سطر و یک فیلد محاسباتی دیگه (وابسته به Table1.Field1 و Table2.Field1 ) هم خواهیم داشت.
لطفا راهنمایی کنید کدهای تعریف فیلد محاسباتی رو به چه صورت باید نوشت و نحوه نمایش این 5 فیلد در گرید به چه صورت میشه؟

یوسف زالی
سه شنبه 25 مهر 1396, 15:58 عصر
سلام.
نحوه جوین کردنتون خیلی قدیمیه، اصلاحش کنید بهتره.
فیلد محاسباتی بر مبنای فیلدهای دیگه رو در همون سلکت باید بیارید.
برای شماره سطر هم می تونید از RecNo یا توابع مشابه استفاده کنید.

hamedjim
سه شنبه 25 مهر 1396, 17:11 عصر
ممنون از جواب


سلام.
نحوه جوین کردنتون خیلی قدیمیه، اصلاحش کنید بهتره.

حق با شماست. فقط برای اینکه به ساده ترین شکل مفهوم رو برسونم به این شکل نوشتم. می خواستم نشون بدم CalcField مربوط به محاسبات مرتبط با دو تا جدول هست.



برای شماره سطر هم می تونید از RecNo یا توابع مشابه استفاده کنید.
این رو هم صرفا جهت توضیح بیشتر مساله بیان کرده بودم:گیج:



فیلد محاسباتی بر مبنای فیلدهای دیگه رو در همون سلکت باید بیارید.

دقیقا Syntax همین فیلد در SELECT مورد سوال منه.

یوسف زالی
چهارشنبه 26 مهر 1396, 11:51 صبح
حب این بیشتر برمی گرده به اس کیو ال، نه دلفی،
می تونید از روشهایی مثل این استفاده کنید:


select T1.*, T2.*, (T1.F1 + T2.F1) * T1.F2 as J1, T1.F1 -17 as J2, T1.F1 - T2.F2 +5 as J3..
from T1 join T2 on ..


بهتره اگر نام های فیلد هاتون شبیه به هم هست، برای هر کدومش یک الیاس استفاده کنید.
مثلا select T1.F1 as TF1

hamedjim
چهارشنبه 26 مهر 1396, 17:06 عصر
ممنون از راهنمایی.
اما اگه محاسبات به نحوی باشند که در کامند SQL نتونیم اون رو قرار بدیم چی؟:متفکر:
مثلا محاسبه ثانیه های بین دو زمان، یا به طور کلی محاسباتی که نیازمند یه سری توابع خود دلفی هست.

یوسف زالی
شنبه 29 مهر 1396, 15:12 عصر
اس کیو ال برای ثانیه ها هم تابع داره، ولی اگر به هر دلیلی نشد، کافیه یک فیلد محاسباتی در خود دیتاست اد کنید.
روی دیتاست دوبار کلیک کنید و فیلد های جاری رو اد کنید و سپس راست کلیک کرده یک فیلد محاسباتی اضافه کنید.
در رویداد OnCalc دیتاست، برای این فیلد مقدار تغیین کنید.

hamedjim
یک شنبه 30 مهر 1396, 23:27 عصر
با توضیحات آقا یوسف من متوجه مشکل خودم که نتونستم به درستی بیانش کنم شدم.
اما روند رو برای دوستانی که ممکنه بعدا همین سوالات رو داشته باشند توضیح میدم.

یک جدول شامل فیلدهای مختلف موجود هست. به دلیلی برای این جدول نیازمند ایجاد یک فیلد محاسباتی داریم. از طرفی به هر دلیل از Table استفاده نمی کنیم و هدف استفاده از فیلد محاسباتی در Query هست. برای این کار
1. روی Query دابل کلیک می کنیم و تمامی فیلدها رو با کلیک راست اضافه می کنیم.
2. دوباره کلیک راست می کنیم و New Field رو برای ایجاد فیلد محاسباتی انتخاب میکنیم. فیلد مورد نظر رو ایجاد می کنیم.
3. در Query و خصوصیت SQL، عبارت SELECT * FROM Query رو می نویسیم.
4. در رویداد OnCalc کدهای لازم برای مقداردهی فیلدهای محاسباتی می نویسیم.
مثلا برای اضافه کردن ستون شماره ردیف این کد:



with ADOQuery do
begin
FieldByName('RowNo').AsInteger:= RecNo;
if FieldByName('RowNo').AsInteger <0 then
FieldByName('RowNo').AsInteger:= FieldByName('RowNo').AsInteger*(-1);
end;



یا برای محاسبه فیلد مانده، این کد:


FieldByName('Remain').AsExtended:=tmpRemain + (Crd- Deb);


و .... رو می نویسیم.