PDA

View Full Version : سوال: مشکل در ایجاد گزارش ,بین دو تاریخ



pedramfj
سه شنبه 27 مهر 1389, 09:50 صبح
سلام
من یه برنامه حسابداری نوشتم.حالا می خواهم بین دو تاریخ گزارش ایجاد کنم.
یعنی از تاریخ 01/01/1389 تا 01/02/1389 که نزدیک به یک ماه میشه.
من می خواهم برای هر روز حساب کند که چقدر فروخته شده.
یعنی در یک ردیف تاریخ همان روز و مبلغ فروش را حساب کند و روز های بعدی هم به همین شکل.
من فقط می توانم برای یک روز را حساب کنم.
چگونه برای تعداد روز های بیشتر این کار را انجام دهم؟؟
من خودم با report.rdcl کار می کنم .با ابزار دیگه هم مشکلی نیست.
فقط می خواهم این کار انجام بشه.

تشکر....

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 10:51 صبح
كافيه دستور SQL رو به صورت زير بنويسيد

Select
SellDate,
Sum(TotalPrice)
From
TableName
Where
SellDate Between @Date1 AND @Date2
Group By
SellDate
SellDate تاريخ فروش
TotalPrice قيمت فروش
خروجي اين دستور : هر سطر برابر تاريخ و مبلغ فروخته شده (كل) در اون روز

pedramfj
سه شنبه 27 مهر 1389, 11:04 صبح
كافيه دستور SQL رو به صورت زير بنويسيد

Select
SellDate,
Sum(TotalPrice)
From
TableName
Where
SellDate Between @Date1 AND @Date2
Group By
SellDateSellDate تاريخ فروش
TotalPrice قيمت فروش
خروجي اين دستور : هر سطر برابر تاريخ و مبلغ فروخته شده (كل) در اون روز
دوست عزیز ممنون از توجهی که کردین.
فقط یه سوال : این اطلاعات را در کجا نمایش میدهد؟
یعنی چگونه اطلاعات را به report.rdcl بفرستم؟
یا کریستال.

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 11:14 صبح
فقط یه سوال : این اطلاعات را در کجا نمایش میدهد؟ طريقه نمايش بستگي به نياز شما داره. اگر ميخوايد فقط نمايش بديد نيازي به كريستال و ... نداره كافيه يك گريد بذاريد و توي گريد نمايش بديد. ولي اگر به امكانات بيشتري از قبيل اينكه كاربر بتونه از اطلاعات پرينت بگيره روشهاي زيادي وجود داره. توي سايت جستجو كنيد روشهاي زيادي پيدا ميكنيد.

یعنی چگونه اطلاعات را به report.rdcl بفرستم؟
یا کریستال.نحوه نمايش روي ريپورتر هم به عوامل زيادي بستگي داره. مطمئنا اگر جستجو كنيد خيلي سريعتر به جوابي كه ميخوايد ميرسيد.(چون از طريق جستجو با انواع روشها آشنا ميشيد و بهترين روش رو ميتونيد انتخاب كنيد)

pedramfj
سه شنبه 27 مهر 1389, 11:32 صبح
ببخشید ,یه سوال دیگه.
من تاریخ و قیمت را از یک جدول می خوانم واز جدول دیگه مبلغ برگشتی که من مبلغ برگشتی را باید از مبلغ فروش کم کنم و به عنوان مانده در صندوق نمایش دهم .
چگونه کاری کنم که برای هر تاریخ که مبلغ فروش را نمایش میدهد مبلغ برگشتی را هم نمایش دهد؟
واقعا ممنون.شرمنده:خجالت:

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 11:41 صبح
چگونه کاری کنم که برای هر تاریخ که مبلغ فروش را نمایش میدهد مبلغ برگشتی را هم نمایش دهد؟
با يك join ساده

Select
SellDate,
Sum(t1.TotalPrice - t2.BuyPrice)
From
TableName t1 inner Join TableName2 t2
on
t1.ID = t2.ID
Where
t1.SellDate Between @Date1 AND @Date2
Group By
t1.SellDate
اين كدي كه نوشتم يك نمونه است ممكنه با توجه به طراحي ديتابيس شما نياز باشه تغييراتي توش بديد ولي روند كلي اون درسته

pedramfj
سه شنبه 27 مهر 1389, 15:31 عصر
با يك join ساده

Select
SellDate,
Sum(t1.TotalPrice - t2.BuyPrice)
From
TableName t1 inner Join TableName2 t2
on
t1.ID = t2.ID
Where
t1.SellDate Between @Date1 AND @Date2
Group By
t1.SellDateاين كدي كه نوشتم يك نمونه است ممكنه با توجه به طراحي ديتابيس شما نياز باشه تغييراتي توش بديد ولي روند كلي اون درسته
دوست عزیز من از این کد استفاده کردم .ولی دوتا مشکل دارم.
1.زمانی که می خواهم هم مبلغ فروش و هم مبلغ برگشتی را حساب کنم در جمع اعداد اشتباه میشه.
اگر تنها فروش را حساب کنم درست جواب می دهد ولی با هم , در جمع اشتباه میکنه.
2.اگر مبلغ برگشتی موجود نباشه یعنی در آن تاریخ فروش بوده باشه ولی برگشتی موجود نباشه اصلا آن تاریخ را حساب نمی کند.(من دو جدول را با تاریخ به هم وصل کردم).
ممنون میشم اگر راهنمایی کنید.

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 16:13 عصر
زمانی که می خواهم هم مبلغ فروش و هم مبلغ برگشتی را حساب کنم در جمع اعداد اشتباه میشه.
اگر تنها فروش را حساب کنم درست جواب می دهد ولی با هم , در جمع اشتباه میکنه.
اشتباه در جمع احتمالا به خاطر Join شماست يكبار دستور Join رو جدا امتحان كنيد ببينيد به ازا هر جنس قيمت خريد و فروش درستي رو نشون ميده يا نه.

2.اگر مبلغ برگشتی موجود نباشه یعنی در آن تاریخ فروش بوده باشه ولی برگشتی موجود نباشه اصلا آن تاریخ را حساب نمی کند.(من دو جدول را با تاریخ به هم وصل کردم).
متوجه سوالتون نميشم!! مبلغ برگشتي چيه؟
براي اينكه بهتر بشه كمكتون كرد لطفا ساختار جدول ها و چند داده نمونه اينجا بذاريد

pedramfj
سه شنبه 27 مهر 1389, 17:21 عصر
بازم ممنون.
وقتی از دستور join استفاده نمی کنم درست جواب میده.
من دوتا جدول دارم.
1 جدول فاکتور که مربوط به ثبت فاکتور است که کتاب پس از فروخته شدن در آن ثبت می شود.شامل فیلد های زیر است.
id,نام کتاب , کد کتاب ,تعداد کتاب, مبلغ روی جلد , شماره فاکتور , تاریخ, مبلغ کل
مبلغ کل=تعداد * مبلغ روی جلد
2 جدول کتاب های برگشتی که مربوط به کتاب های برگشتی است :طرف کتاب را میخره میبره ,فرداش پشیمون میشه ,میاره پس میده.شامل فیلد های زیر است.
id,کد کتاب, نام کتاب, تعداد, تاریخ , مبلغ کل
من تو این دو تا جدول تاریخ ها را با هم join کردم.
مشکل اینجاست
وقتی که در جدول فاکتور بیش از یک کتاب درج می شود (فروخته می شود).نمیتواند مبلغ کل آنها را با هم جمع کند و در مبلغ برگشتی هم اشتباه می شود (این اشتباه فقط برای همین تاریخ ها پیش می آید).در تاریخ هایی که فقط یک کتاب فروخته شده هم مبلغ فروش و هم مبلغ برگشتی را درست محاسبه می کند.
تشکر....

Reza_Yarahmadi
سه شنبه 27 مهر 1389, 21:45 عصر
اولا اختصاص دادن فیلدی که از طریق محاسبات روی فیلدهای دیگه بدیت میاد چندان جالب نیست (جمع کل) معمولا در مواردی فیلدی تخصیص میدن که برای بدست آوردنش نیاز به محاسبات سنگینی داشته باشه.

این مشکل به این خاطر پیش میاد که شما یک join دارید میزنید که به ازا هر شرط جند رکورد از 2 جدول برمیکرده و چون باعث میشه رکوردها بصورت دکارتی در هم ضرب و رکوردها اضافی درست بشن بالطبع نتیجه هم درست محاسبه نمیشه.
برای حلش میتونید به روش زیر عمل کنید.
یک جستجو روی جدول فروش بزنید و مجموع فروشهای هر روز رو بدست بیارید.
جستجوی دیگه ای روی جدول برگشتیها بزنید و مجموع برگشت های هر روز رو بدست بیارید.
حالا این دو جستجو رو با هم join کنید (بر اساس تاریخ) و مقدارهای بدست اومده از 2 دستور بالا رو از هم کم کنید. (چون دو دستور اول هر تاریخ یکبار میاد join اونها رکورد اضفی تولید نمیکنه)
چیزی شبیه کد زیر
With h1 as
(
Select
SellDate
,Sum(OnePrice * SellPrice) as TotalSelling
From
Selling
Group By
SellDate
)
, h2 as
(
Select
BackDate
,Sum(OnePrice * SellPrice) as TotalBacking
From
Backing
Group By
BackDate
)
Select
SellDate
,TotalSelling - TotalBacking as Profit
From
h1 inner join h2
on
h1.SellDate = h2.BackDate

pedramfj
چهارشنبه 28 مهر 1389, 10:20 صبح
اولا اختصاص دادن فیلدی که از طریق محاسبات روی فیلدهای دیگه بدیت میاد چندان جالب نیست (جمع کل) معمولا در مواردی فیلدی تخصیص میدن که برای بدست آوردنش نیاز به محاسبات سنگینی داشته باشه.

این مشکل به این خاطر پیش میاد که شما یک join دارید میزنید که به ازا هر شرط جند رکورد از 2 جدول برمیکرده و چون باعث میشه رکوردها بصورت دکارتی در هم ضرب و رکوردها اضافی درست بشن بالطبع نتیجه هم درست محاسبه نمیشه.
برای حلش میتونید به روش زیر عمل کنید.
یک جستجو روی جدول فروش بزنید و مجموع فروشهای هر روز رو بدست بیارید.
جستجوی دیگه ای روی جدول برگشتیها بزنید و مجموع برگشت های هر روز رو بدست بیارید.
حالا این دو جستجو رو با هم join کنید (بر اساس تاریخ) و مقدارهای بدست اومده از 2 دستور بالا رو از هم کم کنید. (چون دو دستور اول هر تاریخ یکبار میاد join اونها رکورد اضفی تولید نمیکنه)
چیزی شبیه کد زیر
With h1 as
(
Select
SellDate
,Sum(OnePrice * SellPrice) as TotalSelling
From
Selling
Group By
SellDate
)
, h2 as
(
Select
BackDate
,Sum(OnePrice * SellPrice) as TotalBacking
From
Backing
Group By
BackDate
)
Select
SellDate
,TotalSelling - TotalBacking as Profit
From
h1 inner join h2
on
h1.SellDate = h2.BackDate
واقعا ممنونم:قلب:
من به چه شکل از این کد در برنامه استفاده کنم (وجود چند select)؟؟
من این کد را داخل

SqlCommand com = new SqlCommand("کد ",con)
می نویسم .
بازم تشکر...:خجالت:

Reza_Yarahmadi
چهارشنبه 28 مهر 1389, 11:47 صبح
من به چه شکل از این کد در برنامه استفاده کنم (وجود چند select)؟؟
بهترين كار اينه كه توي يك SP بنويسيد و توي برنامه اونو صدا بزنيد. از همه نظر اينكار به صرفه تره. به جاي "كد" هم اسم SP رو بديد