PDA

View Full Version : سوال: چگونگی استفاده از این کد(sql) در #C



pedramfj
چهارشنبه 28 مهر 1389, 11:22 صبح
چگونه می توانم از کد زیر استفاده کنم.
در
SqlCommand com = new SqlCommand("",con(


(http://www.barnamenevis.org/forum/showthread.php?t=254308#about)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



من می خواهم در دیتاگرید نمایش دهم.
نمی خواهم از join کردن جداول استفاده کنم.نه که نخواهم ,نمیشه.
یکی از دوستان زحمت کشید راهنمایی کرد.(واقعا ممنونم)
و یکی از دوستان هم زحمت کشید ما را منتقل کرد بخش ابزار گزارش سازی که پرنده هم پر نمیزنه.
تشکر...

Reza_Yarahmadi
چهارشنبه 28 مهر 1389, 12:18 عصر
فرقي با بقيه موارد نداره

SqlDataAdapter da = new SqlDataAdapter(@"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", conn);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;

pedramfj
چهارشنبه 28 مهر 1389, 15:18 عصر
دوست عزیز واقعا ازت ممنونم که توجه می کنی.
من از کد زیر برای خواندن از بانک و نمایش در دیتاگرید استفاده میکنم.


SqlDataReader dr;


SqlCommand com = new SqlCommand(@"With h1 as ( Select تاریخ,مبلغ کل From فاکتور Where تاریخ Between @tarikh1 AND @tarikh2 Group By تاریخ) , h2 as (Select مبلغ کل برگشتی From برگشتی Group By تاریخ )", con);


com.Parameters.AddWithValue("@tarikh1", textBox1.Text);


com.Parameters.AddWithValue("@tarikh2", textBox2.Text);



dr = com.ExecuteReader();


while (dr.Read())


{


dataGridView1.Rows.Add(new object[] { dr.GetString(0).Trim(), dr.GetInt64(1), dr.GetInt64(2) });

}; من تا حالا با SqlDataAdapter کار نکردم.کدی که من استفاده می کنم مشکلی داره؟؟
.موقع خواندن خطای زیر را میده.




Incorrect syntax near the keyword 'With.
Line 1: Incorrect syntax near ','.

Reza_Yarahmadi
چهارشنبه 28 مهر 1389, 15:32 عصر
فكر كنم به خاطر فيلد "مبلغ كل" باشه. فيلدهايي كه اسمشون از چند كلمه تشكيل ميشه بايد بصورت [مبلغ كل] بنويسيد. در ضمن بهتر اينه كه نام ستونها و جدولها رو به صورت انگليسي (يا فينگليشي) بنويسيد.
بعد از دستورات With بايد از يكي از with ها (h1 يا h2) استفاده كنيد وگرنه خطا ميده. اگر به كدي بهتون دادم دقت كنيد در آخر از هر 2 استفاده شده.

pedramfj
چهارشنبه 28 مهر 1389, 16:00 عصر
فكر كنم به خاطر فيلد "مبلغ كل" باشه. فيلدهايي كه اسمشون از چند كلمه تشكيل ميشه بايد بصورت [مبلغ كل] بنويسيد. در ضمن بهتر اينه كه نام ستونها و جدولها رو به صورت انگليسي (يا فينگليشي) بنويسيد.
بعد از دستورات With بايد از يكي از with ها (h1 يا h2) استفاده كنيد وگرنه خطا ميده. اگر به كدي بهتون دادم دقت كنيد در آخر از هر 2 استفاده شده.
نام فیلد ها را فارسی نوشتم که کد را بهتر متوجه بشید.
ببینم می توانم کاریش کنم.

pedramfj
چهارشنبه 28 مهر 1389, 16:15 عصر
بعد از دستورات With بايد از يكي از with ها (h1 يا h2) استفاده كنيد وگرنه خطا ميده. اگر به كدي بهتون دادم دقت كنيد در آخر از هر 2 استفاده شده.
متوجه نمی شوم کجا باید از h1,h2 استفاده کنم ؟
من دقیقا مثل کد شما انجام دادم.
بازم همون خطا را می دهد.

Reza_Yarahmadi
چهارشنبه 28 مهر 1389, 16:27 عصر
توي كد ابتدا h1 رو درست كرديم بعد h2 (اينها With هاي ما بود)
بعد از تعريف h2 بايد دستوري بنويسيد كه از يكي از With ها استفاده بشه (در مورد With و ساختار اون يك مقدار تحقيق كنيد دقيقا متوجه منظورم ميشيد. توي اين پست (http://barnamenevis.org/forum/showpost.php?p=1123715&postcount=8) يك مقدار توضيح دادم). توي كدي كه شما گذاشتيد بعد از تعريف h2 اصلا كدي ننوشتيد چه برسه به اينكه ازشون استفاده كنيد.
فكر كنم با تغيير اسم فيلدها و اسم جدولها در كد اوليه به راحتي بتونيد به جواب برسيد

pedramfj
چهارشنبه 28 مهر 1389, 16:54 عصر
اگر اشتباه نکنم کد به شکل زیر میشه.
h1,h2,h3 تعریف شدن

SqlDataAdapter da = new SqlDataAdapter(@"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
)
,h3 as
(
Select
SellDate
,TotalSelling - TotalBacking as Profit
From
h1 inner join h2
on
h1.SellDate = h2.BackDate")
select Profit from h3, conn);
آخرش هم از h3 استفاده شد که مبلغ مانده را حساب می کند .
حالا فقط می توان مانده را در دیتاگرید نمایش داد. درسته؟؟
برنامه هنوز همان خطا را می دهد.

Reza_Yarahmadi
چهارشنبه 28 مهر 1389, 16:59 عصر
لطف كنيد اسم فيلدهاي (بانك) زير رو بديد تا دستور دقيق رو بهتون بدم. اينطوري شما هم راحتتره متوجه روش استفاده ميشيد.
از جدول فروش: تاريخ فروش ، جمع كل
از جدول برگشت: تاريخ برگشت‌، جمع كل

pedramfj
چهارشنبه 28 مهر 1389, 17:14 عصر
لطف كنيد اسم فيلدهاي (بانك) زير رو بديد تا دستور دقيق رو بهتون بدم. اينطوري شما هم راحتتره متوجه روش استفاده ميشيد.
از جدول فروش: تاريخ فروش ، جمع كل
از جدول برگشت: تاريخ برگشت‌، جمع كل
باید ببخشید ,امروز دیگه خیلی مزاحمتون شدم, واقعا شرمنده.:خجالت:
جدول فروش : tarikh,all_price
جدول برگشت: tarikh,all_price

Reza_Yarahmadi
چهارشنبه 28 مهر 1389, 17:27 عصر
از دستور زير استفاده كنيد. فقط بخشهاي قرمز رنگ با نام جدولهاي فروش و برگشت عوض كنيد.

With h1 as
(
Select
tarikh
,Sum(all_price) as all_price
From
Selling
Group By
tarikh
)
, h2 as
(
Select
tarikh
,Sum(all_price) as all_price
From
Backing
Group By
tarikh
)
Select
tarikh as [تاريخ]
,h1.all_price - h2.all_price as [جمع كل فروش]
From
h1 inner join h2
on
h1.tarikh = h2.tarikh

pedramfj
چهارشنبه 28 مهر 1389, 17:52 عصر
واقعا ازت ممنونم.
نمی دونم با چه زبانی از شما تشکر کنم.
تشکر فراوان....:قلب:

pedramfj
چهارشنبه 28 مهر 1389, 18:01 عصر
این کل کدی هست که من استفاده می کنم.

SqlDataReader dr;
SqlCommand com = new SqlCommand(@"With h1 as
(
Select
tarikh
,Sum(all_price) as all_price
From
factor
Group By
tarikh
)
, h2 as
(
Select
tarikh
,Sum(all_price) as all_price
From
back
Group By
tarikh
)
Select
tarikh as [تاريخ]
,h1.all_price - h2.all_price as [جمع كل فروش]
From
h1 inner join h2
on
h1.tarikh = h2.tarikh", con);
com.Parameters.AddWithValue("@tarikh1", textBox1.Text);
com.Parameters.AddWithValue("@tarikh2", textBox2.Text);

dr = com.ExecuteReader();

while (dr.Read())
{


dataGridView1.Rows.Add(new object[] { dr.GetString(0).Trim(), dr.GetInt64(1), dr.GetInt64(2) });

};
بازم این خطا را میده.

Incorrect syntax near the keyword 'With'.
Line 11: Incorrect syntax near ','.

Reza_Yarahmadi
چهارشنبه 28 مهر 1389, 21:49 عصر
راستش نمیدنم مشکل شما چیه!!
نمونه ساده زیر رو نگاه کنید ، همین کد شما توش نوشته شده و بدون خطا داره کار میکنه!
ورژن SQL Server شما چیه؟

pedramfj
پنج شنبه 29 مهر 1389, 09:34 صبح
راستش نمیدنم مشکل شما چیه!!
ورژن SQL Server شما چیه؟
بازم ممنون.
sql2000

Reza_Yarahmadi
پنج شنبه 29 مهر 1389, 14:19 عصر
دستور with از 2005 به بعد کار میکنه.
از دستور زیر استفاده کنید.

Select
f.tarikh,
f.all_price - b.all_price
From
(
Select
tarikh,
Sum(all_price) as all_price
From
dbo.factor
group by
tarikh
)f
inner join
(
Select
tarikh,
Sum(all_price) as all_price
From
dbo.back
group by
tarikh
)b
on
f.tarikh = b.tarikh

pedramfj
پنج شنبه 29 مهر 1389, 15:05 عصر
بینهایت تشکر..
فقط دوتا مشکل.
1.من می خواه علاوه بر تاریخ و باقیمانده ,مبلغ فروش و مبلغ برگشتی را نمایش دهم .
2.عنوان ستون های دیتا گید هم نمی توان تغییر داد (کد خدش عنوان ستون را تعیین می کند)
بازم تشکر...

Reza_Yarahmadi
پنج شنبه 29 مهر 1389, 15:11 عصر
1.من می خواه علاوه بر تاریخ و باقیمانده ,مبلغ فروش و مبلغ برگشتی را نمایش دهم .Select اول رو به صورت زیر تغییر بدید.

Select
f.tarikh as [تاریخ],
f.all_price as [فروش],
b.all_price as [برگشتی],
f.all_price - b.all_price as [جمع کل]
From


2.عنوان ستون های دیتا گید هم نمی توان تغییر داد (کد خدش عنوان ستون را تعیین می کند)توی کد بالا به جای کلمات فارسی هر نامی بدید به عنوان سر ستون نمایش میده.

pedramfj
پنج شنبه 29 مهر 1389, 16:18 عصر
فقط یه سوال:
نمیشه کاری کرد که اگر برای مقدار برگشتی چیزی پیدا نکرد ,مقدار صفر نمایش دهد؟؟؟
اگر پیدا نکنه اصلا تاریخ آن روز را نمایش نمی دهد.
می خواهم تمام روز های انتخابی را نمایش دهد.(چه فروش بوده یا نبوده , چه برگشتی بوده یا نبوده)
تشکر فراوان.:قلب:

Reza_Yarahmadi
پنج شنبه 29 مهر 1389, 16:24 عصر
فرق زیادی بینشون نیست

SqlDataAdapter da = new SqlDataAdapter(@"Select
f.tarikh as [تاریخ],
f.all_price as [فروش],
b.all_price as [برگشتی],
f.all_price - b.all_price as [جمع کل]
From
(
Select
tarikh,
Sum(all_price) as all_price
From
dbo.factor
Where
tarikh BETWEEN @tarikh1 AND @tarikh2
group by
tarikh
)f
inner join
(
Select
tarikh,
Sum(all_price) as all_price
From
dbo.back
Where
tarikh BETWEEN @tarikh1 AND @tarikh2
group by
tarikh
)b
on
f.tarikh = b.tarikh", conn);
da.SelectCommand.Parameters.AddWithValue("@tarikh1", textBox1.Text);
da.SelectCommand.Parameters.AddWithValue("@tarikh2", textBox1.Text);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;

pedramfj
پنج شنبه 29 مهر 1389, 16:32 عصر
فقط یه سوال:
نمیشه کاری کرد که اگر برای مقدار برگشتی چیزی پیدا نکرد ,مقدار صفر نمایش دهد؟؟؟
اگر پیدا نکنه اصلا تاریخ آن روز را نمایش نمی دهد.
می خواهم تمام روز های انتخابی را نمایش دهد.(چه فروش بوده یا نبوده , چه برگشتی بوده یا نبوده)
تشکر فراوان.:قلب:
اگر در این مورد راهنمایی کنیید ممنون می شم.

Reza_Yarahmadi
پنج شنبه 29 مهر 1389, 16:58 عصر
با یک سری کلیک رشتی میشه این کار رو انجام داد!! :چشمک:
البته اگه میخواید روزهایی که نه فروش بوده نه برگشت ، توی این لیست بیاد باید توی برنامه تدبیری در نظر بگیرید که یک رکورد خالی با داشتن تاریخ درون بانک ذخیره بشه چون خروجی بر اساس تاریخ های ذخیره شده محاسبه میشه.

Select
tarikh as [تاریخ],
Sum(Recieve) as [فروش],
Sum(Back) as [برگشتی],
Sum(all_price) as [جمع کل]
From
(
Select
tarikh,
Sum(all_price) as Recieve ,
0 as Back,
Sum(all_price) as all_price
From
dbo.factor
Where
tarikh BETWEEN @tarikh1 AND @tarikh2
group by
tarikh
union all
Select
tarikh,
0 as Recieve ,
Sum(all_price) as Back ,
(Sum(all_price) * (-1)) as all_price
From
dbo.back
Where
tarikh BETWEEN @tarikh1 AND @tarikh2
group by
tarikh
) f
group by
tarikh

pedramfj
پنج شنبه 29 مهر 1389, 17:16 عصر
با یک سری کلیک رشتی میشه این کار رو انجام داد!! :چشمک:
البته اگه میخواید روزهایی که نه فروش بوده نه برگشت ، توی این لیست بیاد باید توی برنامه تدبیری در نظر بگیرید که یک رکورد خالی با داشتن تاریخ درون بانک ذخیره بشه چون خروجی بر اساس تاریخ های ذخیره شده محاسبه میشه.

Select
tarikh as [تاریخ],
Sum(Recieve) as [فروش],
Sum(Back) as [برگشتی],
Sum(all_price) as [جمع کل]
From
(
Select
tarikh,
Sum(all_price) as Recieve ,
0 as Back,
Sum(all_price) as all_price
From
dbo.factor
Where
tarikh BETWEEN @tarikh1 AND @tarikh2
group by
tarikh
union all
Select
tarikh,
0 as Recieve ,
Sum(all_price) as Back ,
(Sum(all_price) * (-1)) as all_price
From
dbo.back
Where
tarikh BETWEEN @tarikh1 AND @tarikh2
group by
tarikh
) f
group by
tarikh
ممنون.
در هر صورت فروش داره ممکن است برگشتی نداشته باشه.
برای من همینقدر کافیه که اگر فروش داشت و برگشتی نداشت بجای برگشتی صفر قرار دهد و محاسبه کند.

pedramfj
پنج شنبه 29 مهر 1389, 18:30 عصر
دوست عزیز این کد کامل هست ؟؟ یا باید در کد قبلی استفاده شود؟؟
قسمت آخر کد , من را گمراه کرده.

Reza_Yarahmadi
پنج شنبه 29 مهر 1389, 18:39 عصر
دوست عزیز این کد کامل هست ؟؟ یا باید در کد قبلی استفاده شود؟؟
این کد رو به جای قبلی استفاده کنید

pedramfj
پنج شنبه 29 مهر 1389, 18:49 عصر
دوست عزیز نمی دانم با چه زبونی تشکر کنم.
مشکل حل شد.
بینهایت تشکر..

Reza_Yarahmadi
پنج شنبه 29 مهر 1389, 19:56 عصر
این حرف رو گذاشتم آخر کار و زمانی که به خواسته خودتون رسیدید بگم.
اگر قصد دارید برنامه نویسی رو درست یاد بگیرید و اونو ادامه بدید سعی کنید تا جایی که ممکنه خودتون راه حل مشکلاتتون رو پیدا کنید. درسته که با پرسیدن سریعتر به جواب میرسید ولی اگر بعدا به مشکلی شبیه مشکل قبل بر بخورید بازم مجبورید بپرسید. بهترین راه یادگیری برنامه نویسی چیزی جز تمرین نیست.
امیدوارم از حرفهام برداشت بدی نکنید.
موفق باشید.