PDA

View Full Version : جایگزاری و نمایش یک متن به جای مقدار یک فیلد



MOHSEN731
دوشنبه 15 فروردین 1384, 01:49 صبح
با سلام
چگونه می توان به جای یک مقدار در فیلد , متنی را جای آن در جدول نمایش داد مثلا مقدار یک فیلد 3 است ولی به جای 3 کلمه خدماتی را نمایش دهد
یعنی ما یک لیست متنی داریم به صورت: 1-خدماتی 2-تولیدی 3-تعاونی
حالا میخواهیم در بانک در فیلد نوع سرویس (service) , به جای عنوان هر کدام کد آن را یعنی عدد یک به جای خدماتی و دو به جای تولیدی و.. قرار دهیم ولی می خواهیم بعدا که همه رکوردها در یک dbGrid می بینیم به جای مقدار فیلد که 1و2و3 است عنوان هر کدام را از لیست بخواند و در جدول به جای مقدار , عنوان را نمایش دهد .
ممنون از راهنماییتان

vcldeveloper
دوشنبه 15 فروردین 1384, 04:05 صبح
شما می تونید از دو روش استفاده کنید:
روش اول: استفاده از فیلد LookUp. در داخل محیط دلفی برای شی جدول خودتون یک فیلد جدید از نوع LookUp ایجاد کنید. برای استفاده از فیلدهای LookUp نیاز به یک جدول LookUp هم دارید. این جدول رو می تونید در داخل بانک اطلاعاتی یا در داخل سیستم کاربر(بصورت Local ) ایجاد کنید. به این ترتیب کد موجود در فیلد مورد نظر توسط DBGrid خونده میشه و متن متناظر با اون از داخل LookUp Table دریافت شده و نمایش داده میشه.

روش دوم: در صورتی که تعداد داده های فیلد مورد نظر زیاد نیست (مثل مثال بالا در پست خودتون که فقط سه مقدار برای فیلد در نظر گرفته شده)، می تونید از رویداد OnGetText و OnSetText فیلد مورد نظر برای این کار استفاده کنید:
1- ابتدا بر روی جدول مورد نظر در دلفی دابل کلیک کنید .
2- در داخل Field Editor جدول راست کلیک کرده و گزینه Add All Fields را انتخاب کنید تا تمامی فیلدهای جدول بصورت استاتیک در دلفی تعریف شوند.
3- فیلد مورد نظر خود را انتخاب کرده و از داخل Object Inspector رویدادهای فوق را انتخاب و کدهای مربط به آنها را در Editor دلفی وارد کنید.
مثال:


procedure TForm1.ADOTable1ServiceGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
if Sender.Value = 1 then
Text := 'خدماتی'
else if sender.Value = 2 then
Text := 'تولیدی'
else
Text := 'تعاونی';

end;

procedure TForm1.ADOTable1ServiceSetText(Sender: TField; const Text: String);
begin
if Text := 'خدماتی' then
Sender.Value := 1
else if Text := 'تولیدی' then
Sender.Value := 2
else
Sender.Value := 3;
end;

برای راحتی کاربر در وارد کردن اطلاعات هم می تونید ستون فیلد مورد نظر رو از داخل DBGrid انتخاب کرده و متن های مربوط به هر مقدار رو در خصوصیت Pick List ستون مورد نظر وارد کنید:
http://img.photobucket.com/albums/v715/alitheraptr/BarnameNevis/dbGrid.jpg

MOHSEN731
دوشنبه 15 فروردین 1384, 17:56 عصر
ممنون از راهنماییتون بررسی می کنم ببینم چی میشه :flower: :flower:

مهدی کرامتی
دوشنبه 15 فروردین 1384, 21:31 عصر
من همیشه در چنین مواردی با یک Query کار رو انجام میدهم.

بفرض اینکه جدول های ما ساختاری مانند تصویر 1 داشته باشند با یک Query مانند:

SELECT Contacts.Name, Contacts.Company, Services.ServiceName
FROM Contacts INNER JOIN
Services ON Contacts.ServiceID = Services.ServiceID
میتوان نتیجه ای مانند تصویر 2 بدست آورد.

نکته: این Query رو میشه توسط یک کامپوننت AdoQuery اجرا کرد و خروجی رو بوسیله یک کامپوننت DataSource به یک Grid متصل کرد.

tik_tak
دوشنبه 06 آبان 1387, 21:31 عصر
با سلام
من سرچ کردم و جوابمم گرفتم
ولی یه سوال اگه حالتامون محدود نبود چی؟
مثلا کدگروه یکی از فیلدهای جدولمونه اگه بخوایم به جای این کد گروه ، نام گروه رو که فیلد این جدول نیست و ماله جدول معرفی گروهها ست نشون بدیم تو دی بی گرید چی ؟
یعنی این روش که اون بالا هست و گفتین ؟


روش اول: استفاده از فیلد LookUp. در داخل محیط دلفی برای شی جدول خودتون یک فیلد جدید از نوع LookUp ایجاد کنید. برای استفاده از فیلدهای LookUp نیاز به یک جدول LookUp هم دارید. این جدول رو می تونید در داخل بانک اطلاعاتی یا در داخل سیستم کاربر(بصورت Local ) ایجاد کنید. به این ترتیب کد موجود در فیلد مورد نظر توسط DBGrid خونده میشه و متن متناظر با اون از داخل LookUp Table دریافت شده و نمایش داده میشه.


من زیاد متوجه نشدم میشه بیشتر توضیح بدین !
مرسی

vcldeveloper
سه شنبه 07 آبان 1387, 01:37 صبح
من زیاد متوجه نشدم میشه بیشتر توضیح بدین !
کجاش رو متوجه نشدید؟

SYNDROME
سه شنبه 07 آبان 1387, 06:43 صبح
یک راه حل دیگر :


Select *, (Case IndexState When 1 Then 'خدماتی' When 2 Then 'اداری' End) State
From Tbl_Test

می توانید با استفاده از دستور Case در SQL هم چنین کاری را انجام دهید.
در چنین شرایطی یک فیلد ستون جدید مانند State می سازید که مقادیر داخل آن است.
فقط یک نکته : اگر مقدار IndexState را در داخل aDO تغییر دادید باید Close و Open کنید تا مقدار State هم درست شود.
موفق باشید