View Full Version : اجرای دستورات SQL روی فیلد های Calculated
mojtaba_z
دوشنبه 26 فروردین 1387, 09:17 صبح
سلام
در ADOQuery چند فیلد Calculated ایجاد کردم و توی یک DBGrid نمایش میدم. حالا میخوام با استفاده از SQL و Like ، روی فیلد های Calculated فیلتر کنم. ولی وقتی دستور ADOQuery1.ExecSQL رو اجرا میکنم پیغام خطا میده؟
farhad110
دوشنبه 26 فروردین 1387, 09:45 صبح
سلام. execsql برای زمانی هست که کوئری recordset ی رو به عنوان نتیجه برنمی گردونه. متد open رو فراخوانی کنید
Amir_Safideh
دوشنبه 26 فروردین 1387, 10:03 صبح
در ADOQuery چند فیلد Calculated ایجاد کردم و توی یک DBGrid نمایش میدم. حالا میخوام با استفاده از SQL و Like ، روی فیلد های Calculated فیلتر کنم. ولی وقتی دستور ADOQuery1.ExecSQL رو اجرا میکنم پیغام خطا میده؟
دوست عزیز تا اونجا که من میدونم روی فیلدهای Calculated نمیشه فیلتری انجام داده چون جزو واقعی دیتاست شما نیست و شما اونها رو ایجاد کردید . در مورد دستورات اس کیو ال هم همین مسئله مصداق پیدا میکنه مطمئنا شما نمیتونید دستور Select بنویسید برای فیلدهای Calculated چون اونها وجود خارجی ندارند . حتی زمانی که شما دیتاست خودتون رو توی یک فایل ذخیره میکنید فقط فیلدهائی که Select شدند ذخیره میشن و فیلدهای Calculated ذخیره نخواهند شد . بهتره اگر میخواهید روشون فیلتری انجام بدی اونها رو در ADOQuery خودتون ایجاد کنید .
-----------------
موفق باشید .
----------------
برای برگرداندن نام خلیج فارس به نقشه ماهواره ای و آنلاین گوگل ارت نیاز به 1 میلیون امضا داریم. به عنوان یک ایرانی خواهشمندم روی لینک آبی زیر کلیک کرده و برای حذف نام خلیج عربی آنرا امضا نمایید. کار سختی نیست http://www.petitiononline.com/sos02082/petition.html این پیام را برای تمامی دوستانتان ارسال نمایید
mojtaba_z
دوشنبه 26 فروردین 1387, 10:07 صبح
سلام
من این کد رو اجرا کردم :
ADOQuery1.SQL.Text := 'Select * from Person Where Name Like '+ QuotedStr('%Ali%') ; ;
ADOQuery1.Open ;
ولی پیغام خطای زیر رو میده :
Project Project1.exe raised exception class EOleExecption With message 'parameter Name has no default value'. Process Stoped. Use Step or Run to continue
mojtaba_z
دوشنبه 26 فروردین 1387, 10:11 صبح
بهتره اگر میخواهید روشون فیلتری انجام بدی اونها رو در ADOQuery خودتون ایجاد کنید .
یعنی چیکار باید انجام بدم ؟ اگه ممکنه یک کمی بیشتر توضیح بدید
Amir_Safideh
دوشنبه 26 فروردین 1387, 10:34 صبح
شما فرمودید که من میخوام روی فیلدهای Calculated فیلتر انجام بدم . خوب شما باید اون فیلدها رو در قسمت SQL مربوط به ADOQuery بنویسید تا بتونید روش فیلتری انجام بدید .
در مثالی که در بالا آوردید آیا فیلد Name همون فیلد Calculated هستش که میفرمائید یا خیر؟
-----------
موفق باشید .
mojtaba_z
دوشنبه 26 فروردین 1387, 11:43 صبح
در مثالی که در بالا آوردید آیا فیلد Name همون فیلد Calculated هستش که میفرمائید یا خیر؟
بله. فیلد Name از نوع Calculated میباشد
Amir_Safideh
دوشنبه 26 فروردین 1387, 12:39 عصر
بله. فیلد Name از نوع Calculated میباشد
خوب در اینصورت اون ارور شما طبیعیته . و کاری که میتونید بکنید اینه که اون فیلد رو در خود دستور Select که در ADOQurey مینویسید اضافه کنید و توی خود کوئری اون رو ایجاد کنید تا بتونید روی اون فیلتر انجام بدید . فقط نمیدونم که محاسباتی که روی این فیلد Calculated انجام دادید چی هست وگرنه بهتر میتونستم کمکت کنم که چطور اون رو در دستور Select اضافه کنید . شما همون محاسباتی رو که در برنامه برای ساخت این فیلد انجام میدید رو در دستور Select پیاده سازی کنید . اگر هم نمیدونید که چطور این کار رو بکنید دقیقا محاسباتی رو که برای این کار لازم دارید رو بفرمائید تا در صورت توان کمک کنیم .
--------------
موفق باشید .
mojtaba_z
دوشنبه 26 فروردین 1387, 12:48 عصر
گفتید که :
فیلد رو در خود دستور Select که در ADOQurey مینویسید اضافه کنید و توی خود کوئری اون رو ایجاد کنید
این کار رو چطوری انجام بدم ؟
Amir_Safideh
دوشنبه 26 فروردین 1387, 14:44 عصر
دوست عزیز شما پست قبلی من رو دقیق نخوندید من اونجا گفته بودم که اگر هم نمیدونید که چطور این کار رو باید بکنبد دراونصورت باید یه توضیح در مورد این بدید که این فیلد Calculated چه کار باید بکنه . تا من ندونم که از این فیلد چی میخوائد که نمیتونم چیزی بگم . شما بفرمائید که این فیلد چه کار باید بکنه تا اگر تونستم کمکت کنم . اگر هم علاوه بر توضیح در مورد این فیلد اگر کدی رو هم که برای این فیلد Calculated نوشتید رو بزارید بهتره . منتظر توضیحتون هستم .
------------
موفق باشید .
mojtaba_z
دوشنبه 26 فروردین 1387, 15:46 عصر
نقل قول:
تا من ندونم که از این فیلد چی میخوائد که نمیتونم چیزی بگم . شما بفرمائید که این فیلد چه کار باید بکنه تا اگر تونستم کمکت کنم . اگر هم علاوه بر توضیح در مورد این فیلد اگر کدی رو هم که برای این فیلد Calculated نوشتید رو بزارید بهتره
سلام
من توی دیتابیس چند تا فیلد دارم که فیلد Date1 از نوع تاریخ میلادی ، فیلد Size1 از نوع عددی ، فیلد Price1 از نوع عددی و ... میباشد.
حالا توی ADOQuery سه تا فیلد از نوع رشته ای برای فیلد های فوق از نوع Calculated با نام های Date1_St , Size1_St , Price1_St ایجاد کردم و در قسمت OnCalculate رویداد آن کدهایی رونوشتم تا مقادیر فیلد های اصلی رو به String تبدیل کنه ، فیلد تاریخ رو به تاریخ شمسی تبدیل کنه ، فیلد Price1_St رو سه رقم سه رقم جدا کنه ، فیلد Size1 که میتواند اعداد 1 و2 و 3 باشد بجای آن در فیلد Size1_St مقادیر کوچک و متوسط و بزرگ را قرار دهد و توی فیلد های متناظر بریزه.
و اما اصل مطلب اینه که میخوام روی هر فیلد عملیات فیلتر رو انجام بدم که نمیشه !؟
یعنی روی فیلد تاریخ شمسی بتوان فیلتر کرد. روی فیلد Size1_St بتوان با مقادیر کوچک و بزرگ و متوسط فیلتر نمود و ...
Amir_Safideh
دوشنبه 26 فروردین 1387, 16:37 عصر
فیلد Price1_St رو سه رقم سه رقم جدا کنه
برای این کار یه روش خیلی ساده تر هست و اصلا نیازی به اینکار نیست . در Fields Editor مربوط به ADOQuery فیلد مورد نظر رو با یک کلیک انتخاب کن و در قسمت Properties خاصیت DisplayFormat رو برابر با 00.###,###,### قرار بده . به همین راحتی کار انجام میشه . ولی اگر میخواهید این فیلد رو با فرمت استرینگ و همچنین جدا شده ببینید این دستورشه :
Select LTrim(Convert(Char(20),Price1_St,1))As Price_St
From Table1
فیلد Size1 که میتواند اعداد 1 و2 و 3 باشد بجای آن در فیلد Size1_St مقادیر کوچک و متوسط و بزرگ را قرار دهد و توی فیلد های متناظر بریزه.
در مورد Size1_St هم این کد رو اضافه کنید :
Select LTrim(Convert(Char(20),Price1_St,1))As Price_St,(Case When Size1 = 1 Then N'Big' When Size1_St = 2 Then
N'Medium' When Size1_St = 3 Then N'Larg'End)As Size1_St
From Table1
فقط به جای کلمات انگلیسی که من نوشتم معادل فارسی رو بنویس .
فیلد تاریخ رو به تاریخ شمسی تبدیل کنه
خوب این مورد یه کم مشکل شد . برای تبدیل تاریخ میلادی به شمسی در دستور سلکت فکر میکنم که تابعی وجود نداره که خدمتتون عرض کنم . بهتره بود که تاریخ شمسی رو به صورت فیزیکی در جدولتون ذخیره میکردید . اگر هم تمایلی به ذخیره فیزیکی تاریخ شمسی در جدولتون ندارید همون فیلد Calculated گزینه خوبیه میتونید همون این فیلد رو Calculated در نظر بگیرید و هنگامی که میخواهید روی تاریخ شمسی فیلتر انجام بدید در اون زمان محدوده مورد نظر زمانی خودت رو دوباره به تاریخ میلادی تبدیل کنی و حالا فیلتر رو روی تاریخ میلادی انجام بدی امیدوارم متوجه این قسمت شده باشی . یه مثال میزنم مثلا میخوای فیلتر رو بین دو تاریخ 01/01/1386 تا 21/10/1386 انجام بدی حالا شما این دوتا تاریخ رو با توابعی که داری به میلادی تبدیل کن مثلا معالش میشه 01/01/2007 و 21/10/2007 حالا شما فیلتر رو با این دوتارخ میلادی بر روی فیلد تاریخ میلادی انجام بده نتیجه فرقی نخواهد کرد .
------------------
موفق باشید .
mojtaba_z
سه شنبه 27 فروردین 1387, 15:07 عصر
سلام
ممنون از راهنمایی شما.
در مورد اول یعنی سه رقم سه رقم جدا کردن، 2 تا مشکل هست :
1- اگر از فیلد عددی Price1 استفاده کنم میتونم سه رقم سه رقم جدا کنم ولی مشکل اینجا ایجاد میشه که اونوقت نمیتونم همانند String ها اونها رو فیلتر کنم (Like %500%) ؟
2- اگر از فیلد Price1_St که از نوع String هست استفاده کنم ، نمیتونم سه رقم سه رقم جدا کنم ولی میتونم اونها رو فیلتر کنم (Like %500%) ؟
در مورد دوم هم چون مقادیر فیلد Calculated هستند در موقع فیلتر کردن پیغام خطا میده ؟
در مورد سوم هم با استفاده از تابع تبدیل تاریخ میلادی به شمسی این کار رو انجام دادم ولی دوباره مشکل من سر فیلتر کردن تاریخ هست ؟یعنی یک EditBox دارم که کاربر با زدن هر کلید، روی ADOQuery عمل فیلتر رو انجام میده مثلا با زدن عدد 86 ، در فیلد تاریخ ، همه رکورد هایی که تاریخ آنها شامل عدد 86 میباشد رو فیلتر میکنه.
Amir_Safideh
سه شنبه 27 فروردین 1387, 15:33 عصر
2- اگر از فیلد Price1_St که از نوع String هست استفاده کنم ، نمیتونم سه رقم سه رقم جدا کنم ولی میتونم اونها رو فیلتر کنم (Like %500%) ؟
در پست قبلی من این کد رو به شما دادم :
Select LTrim(Convert(Char(20),Price1_St,1))As Price_St
From Table1
شما نوع داده ی فیلد Price1_St رو اگر از نوع Money بگیرید بعد زمانی که این کوئری رو اجرا کنید میبینید که خروجی این کوئری هم به صورت String هست و هم سه رقم سه رقم جدا شده . من فکر میکنم که این کد مشکلی نداشته باشه و میتونی به کوئریت اضافش کنی .
در مورد دوم هم چون مقادیر فیلد Calculated هستند در موقع فیلتر کردن پیغام خطا میده ؟
من نفهمیدم منظور شما از مورد دوم چی هستش ؟
در مورد سوم هم با استفاده از تابع تبدیل تاریخ میلادی به شمسی این کار رو انجام دادم ولی دوباره مشکل من سر فیلتر کردن تاریخ هست ؟یعنی یک EditBox دارم که کاربر با زدن هر کلید، روی ADOQuery عمل فیلتر رو انجام میده مثلا با زدن عدد 86 ، در فیلد تاریخ ، همه رکورد هایی که تاریخ آنها شامل عدد 86 میباشد رو فیلتر میکنه.
در اینصورت بهتره که خروجی کوئری رو در یک جدول موقت ذخیره کنی و تمام فیلترهات رو روی جدول موقت انجام بدی . بی دردسر تر از همه همین روشه .
-------------
موفق باشید .
mojtaba_z
سه شنبه 27 فروردین 1387, 16:04 عصر
در اینصورت بهتره که خروجی کوئری رو در یک جدول موقت ذخیره کنی و تمام فیلترهات رو روی جدول موقت انجام بدی . بی دردسر تر از همه همین روشه .
جدول موقت رو چطوری ایجاد کنم ؟ همچنین چطوری خروجی کوئری که شامل فیلد های Calculated هست رو توی جدول موقت بریزم ؟
اگر این کار رو بکنم آیا جدول موقت جدید دارای فیلد هایی از نوع Data هستند ؟
Amir_Safideh
سه شنبه 27 فروردین 1387, 16:33 عصر
شما لطف کنید و Select کامل ADOQuery خودتون رو بزارید اینجا تا طبق اون بگم که چطور باید جدول رو بسازید .
---------------
موفق باشید .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.