PDA

View Full Version : سوال: تعیین نوع فیلد در query



hamid_14
دوشنبه 09 دی 1392, 19:51 عصر
سلام
تو کوئری زیر فیلد های f1 و f2 از نوع float هستن تا اینجا درسته اما وقتی رو query فیلد هامو اضافه میکنم یعنی همون Fields Editor و add all fields دیگه حال بحالی میشه بعضی وقت ها خوبه تا یک دفعه ارور میده که باید مجدد فیلد total پاک و دوباره اضافه کنم.البته بیشتر وقتی اینطوری میشه که اطلاعات فیلد خالی بشه.خواهش میکنم راهنمائی کنید خیلی گیرم.
بانکم sqlite هست و از کامپوننت fdquery از مجموعه firedac استفاده میکنم.


select a.ID,(Select IFNULL(SUM(b.f1) - SUM(b.f2),0) From table1 b) as Total
From table1 a


متن ارور

fdquery1:Type mismatch for field 'Total',expecting: Float actual:LargeInt.

benyaminrahimi
دوشنبه 09 دی 1392, 21:33 عصر
شاید با تابع cast مشکلت حل شه

cast( sum(a) as float)

یوسف زالی
دوشنبه 09 دی 1392, 23:18 عصر
SUM(b.f1) - SUM(b.f2)

درست نیست که هر دو رو با هم در تابع نال بگذارید. باید هر کدوم رو جداجدا بگذارید.

hamid_14
سه شنبه 10 دی 1392, 00:08 صبح
از cast استفاده کردم این بار متن ارور این شد:

fdquery1:Type mismatch for field 'Total',expecting: Float actual:WideString

و برای هر یک جدا از تابع نال استفاده کردم ولی باز همون ارور اول میده

یوسف زالی
سه شنبه 10 دی 1392, 10:51 صبح
من برای ارور نگفتم؛ کلی بود. برای اصلاح ارور باید یک بار فیلد ها رو پاک کرده دوباره اد کنید.

hamid_14
سه شنبه 10 دی 1392, 12:44 عصر
بله متوجه شدم , مشکل همینه وقتی پاک میکنم و دوباره اد, درست میشه ولی دوباره که فیلد خالی میشه باز همون ارور میده.

starting
چهارشنبه 02 بهمن 1392, 11:41 صبح
به جای اینکه sub-query را در قسمت Projection قرار بدین بیارش در قسمت FROM تا عمل ضرب دکارتی صورت بگیره. احتمالا با Performance بهتری هم مواجه خواهید شد:

select a.ID, b.total
From table1 a, (Select IFNULL(SUM(b.f1), 0) - IFNULL(SUM(b.f2),0) as Total From table1 as b) b

یوسف زالی
چهارشنبه 02 بهمن 1392, 12:53 عصر
به جای اینکه sub-query را در قسمت Projection قرار بدین بیارش در قسمت FROM تا عمل ضرب دکارتی صورت بگیره.

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

starting
چهارشنبه 02 بهمن 1392, 14:05 عصر
اصلا یه کار دیگه میشه کرد. قرار هست یک مقدار ثابت در یک فیلدی به نام Total برای تمام سطرهای جدول نشون داده بشه دیگه.
میشه ابتدا نتیجه را داخل یک متغیر بریزیم سپس از نام اون متغیر در کوئری استفاده کنیم.

به این صورت:

declare @total float = 0;
set @total = (Select IFNULL(SUM(f1), 0) - IFNULL(SUM(f2),0) From table1);

select ID, @total as total
From table1;

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

بنظرتون اینکار چطوره؟

hamid_14
پنج شنبه 03 بهمن 1392, 00:29 صبح
با همین کار مشکل حل شد مرسی