PDA

View Full Version : سوال: تغییرنام اطلاعات دی بی گرید



amirkazem
چهارشنبه 19 فروردین 1394, 00:49 صبح
باسلام خدمت اساتیدبزرگوار
سوال:
رکوردهای موجوددریکی ازستونهای دی بی گریدراچه جوری می تونیم تغییرنام بدهیم؟
واضح ترعرض کنم که:
دریک dbgride ستونی داریم که نوع داده مربوط به آن ستون درجدول مربوطه ازنوع yes/no یا false/trueهست.ودرزمان اجرای کوئری مربوطه اطلاعات یارکوردهای همین ستون هم به صورت ( yes/no یا false/true) نمایش داده میشن.
حالااگربخواهیم تمام این ( yes/no یا false/true)های موجوددرDBGridرابه کلمات فارسی مثلاً (بلی/خیر ویا دارد/ندارد) تغییربدیم چه کدی بایدبنویسیم؟
دوستان محبت بفرماییدراهنمایی کنید.
موفق باشیم

pezhvakco
چهارشنبه 19 فروردین 1394, 12:41 عصر
بهتر به این است که این کار را در هنگام خواندن داده ها از پایگاه داده انجام دهید

SELECT (Case When Column_Name = 1 Then 'بله'
Else 'خیر' End) AS Exr1
FROM [dbo].Table01

amirkazem
چهارشنبه 19 فروردین 1394, 23:50 عصر
سلام جناب pezhvakco
میشه لطف کنیدیه مثال بزنید.

pezhvakco
پنج شنبه 20 فروردین 1394, 09:04 صبح
میشه لطف کنیدیه مثال بزنید.
مثال همون است که نوشتم.
برای زمانی که می خوای اطلاعات را از پایگاه داده خوانده و در جدول نمایش بدهیند یک کد دستور نوشتین
=>
و من نوشتم شما در همون کد دستور می تونی مقدار ستون مورد نظر را برای نمایش تغییر بدی

SELECT [id]
,[Code]
,[name]
,(Case When Col01 = 1 Then 'بله'
Else 'خیر' End) AS Expr1
FROM [dbo].[Table01]

یوسف زالی
پنج شنبه 20 فروردین 1394, 14:58 عصر
این روش بنا به دلایل متفاوتی درست نیست.
شما باید برای فیلدی که می خواهید این اتفاق بیفته رویداد OnGetText ست کنید.
در همین سایت نمونه هاش زیاده.
در این رویداد شما با توجه به شرایط متن نمایش داده شده رو تغییر می دید.
کوئری هاتون بصورت استاندارد باقی می مونند، حجم رشته های انتقالی کمتر می شه، دستتون روی شرط گذاشتن در سمت دلفی بازتره، و ..

pezhvakco
شنبه 22 فروردین 1394, 17:35 عصر
سپاس از راهنمایی تون
در ادامه، اگه میشه بیش تر راهنمایی داشته باشیند

1)کوئری هاتون بصورت استاندارد باقی می مونند
2)حجم رشته های انتقالی کمتر می شه
3)دستتون روی شرط گذاشتن در سمت دلفی بازتره
1) استاندارد کجا

2)حجم رشته انتقالی از کجا به کجا

3)چه جور شرطی برای داده های پایگاه داده است که بهتره اون رو بیرون از کد نویسی های پایگاه داده نوشت و ابزار پایگاه داده به نسبت دلفی توانایی کمتری دارند .

اگه درهنگام فراخوانی کد دستور خواندن داده ها از پایگاه داده، برای ستون یک نام مستعار جایگزین کنیم بهتره یا پس از انجام کار دوباره با دستور شرطی کار رو با دلفی انجام دهیم .

یوسف زالی
شنبه 22 فروردین 1394, 19:38 عصر
جواب همه سوال ها رو بصورت یک مطلب می دم،

کوئری ها تا حد امکان باید علیرغم براورده کردن نیاز به دیتا، کمترین ارجاع، کمترین حلقه، کمترین حجم، بالاترین سرعت، منعطف ترین حالت و بهترین خوانایی رو داشته باشند.
این که شما بتونی از کوئری تون هر خروجی ای بگیری یک بحثه، این که منعطف تر عمل کنی و بهینه کار کنی بحث دیگه.
این استاندارد مصوبی نیست که براش دیتاشیت و داکیومنت اجباری بوجود بیاد، اما best practice هست.
همیشه هم نمی شه تمام این خوبی ها رو با هم داشت. بنابراین تا جایی که بشه رعایتش می کنیم.
برای مثال همین کوئری دوستمون رو در نظر بگیرید، وقتی case در بدنه اون وارد می شه درسته که از خیلی از دستورات بهتره، ولی نبودش از بودش بهتره. مخصوصا وقتی سر و کارش با رشته می افته.
این رشته ها وقتی رکوردهای خروجی بالا می ره، تاثیر زیادی روی حجم دیتای انتقالی از سمت سرور روی شبکه به سمت کلاینت داره، مخصوصا روی نت.
از طرفی نوشتن مستقیم تایتل ها و دیتا بصورت رشته ای این اشکال رو بوجود میاره که سمت کلاینت باید باهاش بصورت رشته ای طرف بشیم، بنابراین باید کدپیج درست رو رعایت کرده باشیم، مثل مواقعی که می خواهیم دیتایی رو چک کنیم و مقایسه ای انجام بدیم، حالا فرض کنید بعد از مدتی تصمیم می گیرید هر جا "خیر" بود "نه" بگذارید، در این صورت هم باید سمت دیتابیس و هم سمت کلاینت اصلاح بشه. ممکنه بگید خب میاییم براش یک جدول جدا در نظر می گیریم، که البته تن دادیم به یک join اضافی که می دونید چقدر سربار داره.
گاهی کوئری هامون خوراک کوئری های دیگه می شن، یعنی به عنوان ورودی یا فیلتر یک کوئری دیگه به کار می رن، در اونجا هم باید دوباره داستان رو برعکس پیش بریم.
این که شرط گذاری چگونه انجام بشه، و شرایط چی باشه خیلی به برنامه بستگی داره، مثلا فرض کنید که در صورتی که کاربر دسترسی خاصی رو نداشته باشه به جای بله و خیر بهش نشون بدیم که دیتای مورد نظر خارج از دسترس شماست. در این مواقع اگر سمت سرور بخواهیم کار انجام بشه، باز کوئری مون رو کند تر می کنیم.
البته قبول دارم مثالی که زدم اصلا قشنگ نبود، اما الان چیزی به ذهنم نیست.
مورد دیگه این که فرض کنید یک dblookupcombobox داشته باشیم که به یک کوئری دیگه وصله، و بخواهیم از طریق اون جدول جاری رو فیلتر کنیم، در صورت استفاده از روشی که گفته شد کار خاصی لازم نیست انجام بشه. چون در این مثال هر دو عددی هستند.
همین مورد در مواقعی که می خواهیم اعداد سه رقم سه رقم جدا باشند ولی ماهیت عددی و در نتیجه محاسباتی خودشون رو حفظ کنند هم اتفاق می افته.
آهان مثال درستش یادم اومد!
فرض کنید در مواردی مثل وضعیت چک، که حالات زیادی داره و این حالات به بیش از یک فیلد ارتباط داره، نوشتن شرط در سمت اس کیو ال اوضاع رو پیچیده می کنه، مورد وقتی بدتر می شه که بعضی از این فیلدها در جدول دیگه ای باشند، که در حال حاضر join نیست اما در سمت دلفی مثلا برای یک کار دیگه مثل کمبوباکس های فیلتر کردن، بصورت باز داریمش. خب از همون در دلفی استفاده می کنیم و چون سمت کلاینت این اتفاق می افته فشاری روی سرویس اس کیو ال نمیاد.
استفاده از این روش حسن دیگه ای هم داره و اون اینه که می تونیم به سادگی و بدون این که رفت و برگشت مجددی روی اس کیو ال داشته باشیم، شرایط رو optional کنیم. فرض کنید کاربر یک تیک داشته باشه برای این که بتونه سه رقم سه رقم جدا کنه یا نکنه، یا در مورد حسابداری، اعداد منفی رو در پرانتز بگذاره یا نگذازه، این طوری دیگه لازم نیست کوئری مجدد ران بشه. فقط کنترل مربوطه (مثلا گرید) رفرش می شه.
یا این که کاربر دستش باز باشه که کلمه ای رو که دوست داره ست کنه، مثلا برای زبان کردی یا ترکی، این طوری کوئری دیگه عوض نمی شه. join هم لازم نیست.

در مورد نام های مستعار هم اگر این نام ها انگلیسی هست، در سمت اس کیو ال بهتره انجام بشه، و اگر منظور تایتل گرید هاست، در سمت دلفی بهتره.

ret_ie
یک شنبه 23 فروردین 1394, 00:02 صبح
با سلام و احترام و تشکر از جناب You See عزیز که همیشه مطالبشون مفید و آموزندست.
راه حل پیشنهادی بنده به جناب You See نزدیک تره، یعنی سمت دلفی هست.
روی Table یا AdoTable یا هر آبجکت دیگه ای که گرید مذکور بهش وصل میشه، دوبار کلیک و یک فیلد از نوع Calculated و با نام جدید تعریف کنید و در رویداد OnCalcField بگید که اگه فلان فیلد True بود فیلد جدید رو بزار بلی و ...

یوسف زالی
یک شنبه 23 فروردین 1394, 09:51 صبح
خوشحالم که فعالیتتون رو در سایت بیشتر کردید. امیدوارم همین روال رو ادامه بدید تا سایت پویاتری داشته باشیم.

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

amirkazem
یک شنبه 23 فروردین 1394, 23:16 عصر
باسلام
ضمن تشکرازدوستان درخصوص پاسخ گویی به سوال بنده، به عرض برسونم به کمک یکی ازتاپیکهای سایت، مشکل حل شد.البته باکدزیردر رویداد (Get text):


if ADOQuery1.FieldByName('gavahi').AsBoolean thenText:='بلی'
Else
Text:='خیر'