PDA

View Full Version : سوال: تهیه لیستی از محصولات (یه پرس و جو)



farzadkamali
دوشنبه 22 دی 1393, 19:37 عصر
با سلام

دوجدول زیر رو که یکی محصولات و دیگری گزارش فروش است رو در نظر بگیرید.

products(pid,pname,qty,buyprice,saleprice,minimums tandard)
SaleReport(invoiceNo,pid,saleqty,saleprice,discoun t,profit,date)

invoiceNo و pid در جدول دوم هر دو باهم کلید اصلی هستند.
حالا سوال اصلی : مطلوب است لیستی از کد و نام کل محصولات به همراه تعداد موجودی و تعداد فروش در ماه قبل و درصد سود کالا به شرطی که minimumstandard>qty باشه. یعنی موجودی کالا از حد استاندارد کمتر باشه.
آیا میشه این مثال رو در قالب یه دستور sql حل کرد؟ چه راه هایی پیشنهاد میدید؟
نکته : از کامپوننت solarcalendar آقای خرسندی برای تاریخ استفاده می کنم. دلفی xe4 و sql 2008

این یه گزارش از کالاهایی هست که کم داریم و فروشنده باید خریداری کنه. (درصد سود و تعداد فروش در ماه قبل برای اینه که فروشنده هنگام خرید کالا، این دو فاکتور رو در نظر داشته باشه)

farzadkamali
سه شنبه 23 دی 1393, 10:44 صبح
با سلام خدمت دوستان. خودم مشکل رو حل کردم. راه کاری که من رفتم رو اینجا میزارم شاید به درد کس دیگری خورد.
من دو تا view در sql ایجاد کردم و در دلفی با یه کوئری این دو view رو جوین کردم. البته احتمال زیاد میشه از view استفاده نکرد و از select های تو در تو استفاده کرد و یا اینکه از یه view استفاده کرد. اما خب من کارم این جوری راه افتاد و دیگه سراغ بقیه روش ها نرفتم.
یه view از جدول گزارش فروش که در واقع لیستی از محصولات فروخته شده و تاریخ اونا رو برمی گردونه. (البته با group by)


SELECT Pid, SUM(saleqty) AS saleqty, date
FROM dbo.SaleReport
GROUP BY Pid, date

و یک view دوم از جدول محصولات که فقط میاد محصولاتی رو نشون میده که موجودیشون از حد استاندارد کمتر شده.(این view رو میشه ایجاد نکرد و توی همون کوئری بنویسیم.)


SELECT Pid, Pname, place, buyprice, saleprice, qty, minimumstandard, source
FROM dbo.products
WHERE (minimumstandard >= qty)

و در آخر یه کوئری در دلفی و جوین کردن این دو view .


module.queryBuyList.SQL.Text:='select * from productsview1 left join saleqtylistview on '+
'productsview1.pid=saleqtylistview.pid and ' +
'SUBSTRING(Date, 6, 2) ='+ inttostr(strtoint(Copy(Trim(date.caption), 6, 2))-1);
module.ReportBuyList.ShowReport();


البته صد در صد راه های دیگه و شاید ساده تری هم وجود داره. اگر دوستان راه دیگه به ذهنشون رسید یا فکر میکنن که من لقمه رو دور گردنم پیچوندم، خوشحال میشم اگر راه حل خودشون رو بیان کنن.(برای ارتقاء اطلاعات خودم)