PDA

View Full Version : جستجو در چند جدول و join کردن نتایج



radium
یک شنبه 25 بهمن 1388, 10:47 صبح
من 4 تا جدول دارم توی جدول اول اطلاعات فروشم رو ثبت میکنم.جدول دوم اطلاعات چک. در جدول سوم اطلاعات فروش نقدی و در جدول چهارم اطلاعات مشتری.
خوب حالا میخوام با استفاده از نام مشتری روی جدولا جستجو انجام بدم.
اول باید با استفاده از نام مشتری , شماره مشتری رو از جدول مشتری استخراج کنم. بعدا با استفاده ازین شماره مشتری رکوردی از جدول فروش رو برگردونم.
در این رکورد فیلدی وجود داره که نشون میده این فروش از نوع "نقدی" یا "نقدی چکی" ویا "چکی" بوده
اگر چکی بود باید به جدول چک ها مراجعه کنم و با استفاده از id که از جدول فروش برداشتم اطلاعات چک و یا چک ها رو استخراج کنم.
اگر نقدی بود به جدول فروش نقدی مراجعه کنم و اطلاعات فروش رو استخراج کنم.
و بعد همه این اطلاعات رو به کاربر نشون بدم یعنی مشخصات مشتری و مشخصات کامل فروش .



select type from sell where id =(select customerid from customer where name = " ali")




(کد من درسته تا اینجا؟)
خوب حالا فیلد نوع فروش(type) رو از جدول فروش استخراج کردیم که اگه صفر بود باید بره به جدول چک ها و مشخصات چک رو ااستخراج کنه. و اگر یک بود به جدول خریدهای نقدی مراجعه کنه.
این کار رو چطور میشه انجام داد؟ یعنی میشه شرط گذاشت واسش یا باید کار دیگه ای کنم؟
در ضمن من اطلاعات همه این جدول ها رو میخوام اینا رو چطوری نگهداری کنم؟ باید از جدول مجازی استفاده کنم؟ چطوری؟
یه سوال دیگه اینکه من چطور باید اطلاعات رو به کاربر نشون بدم؟
همه رو بعد توی یه data grid view بریزم؟
چطوری باید headertext های datagridview رو سفارشی کرد اگه بخوام با کد نویسی این کارو انجام بدم.
دوستان عزیز من با c++ کار میکردم و این تقریبا اولین برنامه نیمه سنگین من یه c# هست(یه سیستم خرید و فروش) و متاسفانه توی sql خیلی لنگ میزنم. ممنون میشم اگه راهنماییم کنید.

hamed.rezaei
یک شنبه 25 بهمن 1388, 16:18 عصر
سلام;
کدی که نوشتین و بهتره با IN یا exists بنویسین و برای ایکنه برای همه مشتری ها این نتیجه را داشته باشین باید از store procedure استفاده کنین به این صورت که اسم مشتری رو برابر با یک پارامتر قرار داده از این به بعد اسم هر کدام از مشتری ها رو وارد کنی نتیجه رو نشون میده و در برنامه ای که قراره بنویسین store procedure را پشت یک دکمه قرار می دین و پارامتر رو برابر یک تکست باکس .

create proc cash_cheque(@name varchar(20))
as
declare @c as int

select @c=type
from sell
where id IN(select customerid
from customer
where name=@name)

if @c=0 select *
from cheques
where id IN (select customerid
from customer
where name=@name) else select *
from cash
where id IN (select customerid
from customer
where name=@name)


در انتها برای اجرای store procedure ساخته شده:

exec cash_cheque 'ali'
البته این در حد دانش کم خودم بود شاید روش های بهتری هم باشه و اساتید ارایه بدن

در مورد datagrid view اگه منظورتون اسم فیلد هاست از column aliasing استفاده کنین
به این صورت:

select type [as] 'new col name' from sell

محمد سلیم آبادی
یک شنبه 25 بهمن 1388, 18:32 عصر
(کد من درسته تا اینجا؟)


در این گونه کوئری ها بهتر است از JOIN استفاده کنید تا IN. این کار باعث افزایش کارایی و خوانایی بهتر کدها میشود. به این نوع query ها میگن semi join چون Join ناقص اتفاق می افتد یعنی تنها ستون های یک جدول (راست یا چپ، که در این مورد جدول sell انتخاب میشه) انتخاب میشود (در خروجی):


select s.*
from sell s
join customer c
on s.id = c.customerid
and c.name = 'ali'

select s.*
from sell s
join custmer c
on s.id = c.customerid
where s.name = 'ali'

select s.*
from sell s
where exists
(select *
from customer c
where s.customerid = c.customerid
and c.name = 'ali')

radium
یک شنبه 25 بهمن 1388, 20:49 عصر
ممنون از راهنماییهاتون.
اگر بخوام از دستورات شرطی استفاده کنم حتما باید از store procedure استفاده کنم؟ یا مثلا میشه توی همون commandtext انجامش داد؟
ضمنا منظورم از سفارشی کردن gridview اینه که مثلا میخوام تاریخ رو به شمسی به کاربر نشون بدم در صورتیکه توی دیتا بیسم به میلادی ذخیره شده. باید چی کار کنم تا اول یه فیلد رو تغییر بدم و بعد به کاربر نشون بدمش بجای اینکه به صورت مستقیم نشونش بدم.
و اینکه چطوری باید هدر تکست های gridview رو هم تغییر بدم؟(مثلا بجای id بنویسم شماره)

hamed.rezaei
یک شنبه 25 بهمن 1388, 21:15 عصر
ممنون از راهنماییهاتون.
اگر بخوام از دستورات شرطی استفاده کنم حتما باید از store procedure استفاده کنم؟ یا مثلا میشه توی همون commandtext انجامش داد؟
ضمنا منظورم از سفارشی کردن gridview اینه که مثلا میخوام تاریخ رو به شمسی به کاربر نشون بدم در صورتیکه توی دیتا بیسم به میلادی ذخیره شده. باید چی کار کنم تا اول یه فیلد رو تغییر بدم و بعد به کاربر نشون بدمش بجای اینکه به صورت مستقیم نشونش بدم.
و اینکه چطوری باید هدر تکست های gridview رو هم تغییر بدم؟(مثلا بجای id بنویسم شماره)
بدون store procedure هم میشه
برای تاریخ من از persiancalender تو vb.net استفاده کردم یعنی وقتی کاربر تاریخ اضافه میکرد تاریخ جاری سیستم و تبدیل به شمسی بعد وارد دیتا بیس میکرد.
برای هدر تکست هم که قبلا کفتم تو دستور select بعد از اسم اصلی فیلد یک فاصله یا as بعد اسمی که تمایل دارین فرار بدین به این صورت

select id [as] 'شماره'

radium
یک شنبه 25 بهمن 1388, 21:52 عصر
بدون store procedure هم میشه
برای تاریخ من از persiancalender تو vb.net استفاده کردم یعنی وقتی کاربر تاریخ اضافه میکرد تاریخ جاری سیستم و تبدیل به شمسی بعد وارد دیتا بیس میکرد.
برای هدر تکست هم که قبلا کفتم تو دستور select بعد از اسم اصلی فیلد یک فاصله یا as بعد اسمی که تمایل دارین فرار بدین به این صورت

select id [as] 'شماره'


مرسی. من تاریخ شمسی رو از کاربر میگیرم بعد تبدیل به میلادی میکنم بعد تو دیتا بیس ذخیره میکنم.
حالا میخوام این فیلد که الان حاوی تاریخ میلادی هست رو تبدیل به شمسی کنم و بعد توی gridview نمایش بدم. میشه اینکارو کرد؟
یا اینکه مثلا یکی از فیلدام سه مقدار 0 یا 1 یا 2 رو میگیره ولی من میخوام که مثلا بجای 0 توی gridview کلمه نقدی رو نشون بده. امکان پذیر هست؟

hamed.rezaei
یک شنبه 25 بهمن 1388, 23:01 عصر
مرسی. من تاریخ شمسی رو از کاربر میگیرم بعد تبدیل به میلادی میکنم بعد تو دیتا بیس ذخیره میکنم.
حالا میخوام این فیلد که الان حاوی تاریخ میلادی هست رو تبدیل به شمسی کنم و بعد توی gridview نمایش بدم. میشه اینکارو کرد؟
یا اینکه مثلا یکی از فیلدام سه مقدار 0 یا 1 یا 2 رو میگیره ولی من میخوام که مثلا بجای 0 توی gridview کلمه نقدی رو نشون بده. امکان پذیر هست؟
نه تو برنامه من تاریخ میلادی سیستم را با استفاده ار کلاس persianclender به شمسی تبدیل میکرد بعد اون مقدار تبدیل شده را به جدول اضافه میکرد .در حقیقت datagrid محتویات جدول را میخونه مهم جدول دیتابیس است .شما در اصل insert,update,delete را روی دیتابیس sql انجام میدین بعد datagrid را update می کنین
سایت www.babrian.com ویدیو آموزشی برای اتصال به بانک داره البته برای vb.net ولی میتونی ازش الهام بگیری .با datagrid هم کار میکنه


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

CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Searched CASE expression:
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END

برای مثال:

select id,case types
when o then 'cash'
else
'chegue'
end
from sell

hamed.rezaei
یک شنبه 25 بهمن 1388, 23:07 عصر
اطلاعات کامل برای case
http://msdn.microsoft.com/en-us/library/ms181765.aspx

radium
سه شنبه 27 بهمن 1388, 01:02 صبح
مرسی واقعا.
یه سوال دیگه درباره گرید ویو ببینید من 2 تا جدول رو join میکنم. و نتیجه رو در گرید ویو نشون میدم.
خوب حالا یه رکورد رو با binding navigator انتخاب میکنم. باید چی کار کنم تا فیلدهای این رکورد رو توی چند تا textbox نشون بدم و بعد روی textbox ها عملیاتم رو انجام بدم و بعد در database ذخیره کنم؟
در ضمن چطور میشه بعضی از ستون های گرید ویو رو نشون نداد؟(مثلا هیدنشون کرد ولی توی textbox ها داشته باشمشون)

n_govahi
سه شنبه 27 بهمن 1388, 13:29 عصر
سلام دوست عزیز.من مشکلات این چنینی را همیشه با ساخت یک view و استفاده آن به جای join کردن چند table استفاده می کنم.اطلاعات من بیمه و در حجم بالاست و با این روش مشکلی نداشته ام و تغییرات جدید را همیشه در view راحت تر اعمال کرده ام.

radium
چهارشنبه 28 بهمن 1388, 11:30 صبح
سلام دوست عزیز.من مشکلات این چنینی را همیشه با ساخت یک view و استفاده آن به جای join کردن چند table استفاده می کنم.اطلاعات من بیمه و در حجم بالاست و با این روش مشکلی نداشته ام و تغییرات جدید را همیشه در view راحت تر اعمال کرده ام.
مرسی!
یه کوچولو میشه بیشتر توضیح بدید.