PDA

View Full Version : حرفه ای: ریختن اطلاعات Data Table در جدولی دیگر



mortezasar
شنبه 17 فروردین 1392, 19:53 عصر
سلام دوستان من میخوام اطلاعاتی که از یک جدولم استخراج کردم رو بریزم تویه یک data table بعد اون دیتا تیبل رو بریزم توی یک جدول دیگه آیا این کار شدنی هستش !
من تا ریختن اطلاعات توی دیتا تیبل رو انجام دادم و وقتی که برنامه رو تریس می کنم اطلاعاتم درست توی دیتا تیبل هست اما میخوام اطلاعات توی دیتا تیبل رو بریزم توی جدول اگه میشه کمک کنید
اگر راهی دیگه ای هم هست که اطلاعات سلکت شده از یک جدول رو بریزه توی جدول دیگه لطفا بگید
:تشویق:

C#‎_best_Programmer
شنبه 17 فروردین 1392, 21:24 عصر
مارو دست انداختی یا واقعا....

veniz2008
شنبه 17 فروردین 1392, 21:28 عصر
سلام.
بله میتونید مستقیما داده های جدول1 رو درون جدول2 بریزید.

INSERT INTO Tbl2 Select * from Tbl1
میتونید شرط هم به کوئری بالا اضافه کنید تا رکوردهای خاصی به جدول2 اضافه بشن.
نکته : حواستون باشه که اگر فیلد Identity در جدول 2 دارید اونو قلم بگیرید (فیلدهای جدولتون رو ذکر کیند ولی اسم فیلد identity رو نیارید چون identity خودش پر میشه و شما نباید بهش مقدار بدید).
موفق باشید.

mortezasar
شنبه 17 فروردین 1392, 23:52 عصر
سلام نیازی نیست فیلد ها رو ذکر کنم

mortezasar
شنبه 17 فروردین 1392, 23:54 عصر
مارو دست انداختی یا واقعا....
سلام نخیر دوست عزیز ما همچین جسارتی نمی کنیم هدف از انجام اینکار گزارش گیری بر اساس پارامتر های خاص در کریستال هست و طریقه کارش اینه که اطلاعاتی که بر اساس دلخواه سلکت شده میریزم توی یک جدول و سپس اون جدول رو میارم تو گزارش گیری بعد گزارش دوباره اون جدول اطلاعات پاک میشه
موفق باشی دوست عزیز

veniz2008
شنبه 17 فروردین 1392, 23:59 عصر
سلام نیازی نیست فیلد ها رو ذکر کنم
جملتون سوالی هست یا یه جمله کامله؟
یعنی منظورتون اینه که اگر فیلد identity داشته باشید باز هم نیازی به ذکر نام فیلدها(به جز فیلد identity ) نیست؟

mortezasar
یک شنبه 18 فروردین 1392, 00:05 صبح
میشه یک مثال با دو جدول و مثلا با 4 رکورد بزنی ممنون
هنوز دقیق مطلب رو نگرفتم

veniz2008
یک شنبه 18 فروردین 1392, 00:18 صبح
دو جدول با نام های Tbl1 و Tbl2 با فیلدهای یکسان داریم. (فیلد UserID از نوع int و identity ، فیلد UName از نوع Nvarchar ، فیلد UFamily از نوع Nvarchar و Address هم از نوع Nvarchar ). در جدول دوم دقیقا همین فیلدها رو داریم و فقط یه عدد 2 به اخر هر فیلد اضافه کنید تا با فیلدهای جدول1 متمایز بشن.
حالا اگر بخوایم که رکوردهای جدول1 رو در جدول2 درج کنیم نباید Insert خالی بنویسیم چون فیلد Identity رو هم در نظر میگیره در صورتیکه این فیلد بصورت خودکار توسط sql مقدار دهی میشه. شما باید اینطوری بنویسید:

INSERT INTO Tbl2 (UName2,Ufamily2,UAddress2) SELECT (UName,UFamily,UAddress) FROM Tbl1

mortezasar
یک شنبه 18 فروردین 1392, 00:24 صبح
دو جدول با نام های Tbl1 و Tbl2 با فیلدهای یکسان داریم. (فیلد UserID از نوع int و identity ، فیلد UName از نوع Nvarchar ، فیلد UFamily از نوع Nvarchar و Address هم از نوع Nvarchar ). در جدول دوم دقیقا همین فیلدها رو داریم و فقط یه عدد 2 به اخر هر فیلد اضافه کنید تا با فیلدهای جدول1 متمایز بشن.
حالا اگر بخوایم که رکوردهای جدول1 رو در جدول2 درج کنیم نباید Insert خالی بنویسیم چون فیلد Identity رو هم در نظر میگیره در صورتیکه این فیلد بصورت خودکار توسط sql مقدار دهی میشه. شما باید اینطوری بنویسید:

INSERT INTO Tbl2 (UName2,Ufamily2,UAddress2) SELECT (UName,UFamily,UAddress) FROM Tbl1
مرسی دوست عزیز از راهنماییت تشکر

veniz2008
یک شنبه 18 فروردین 1392, 00:27 صبح
شما الان در کوئری که نوشتید گفتید که قصد دارید 3 فیلد uname و ufam و uid رو مقدار دهی کنید.
سوال اینجاست: آیا تعداد ستون هایی که از Select شما بدست میاد 3 تا هست؟. اگر خروجی Select شما 3 ستون داره که متناظر با سه ستون موجود در insert هست هیچ مشکلی نیست و درسته.

mortezasar
یک شنبه 18 فروردین 1392, 13:20 عصر
سلام دیتا تیبل رو ارسال می کنم اما از تمام اطلاعات گزارش تهیه میشه نه اون فیلد های خاص مثلا اگه بزنم بر اساس شماره همه اطلاعات جدولم تو گزارشم میاد نه اون کد خاص

veniz2008
یک شنبه 18 فروردین 1392, 16:45 عصر
سلام دیتا تیبل رو ارسال می کنم اما از تمام اطلاعات گزارش تهیه میشه نه اون فیلد های خاص مثلا اگه بزنم بر اساس شماره همه اطلاعات جدولم تو گزارشم میاد نه اون کد خاص
من Reset کردم.
من تا الان فکر کردم میخوای دیتا تیبل رو بریزی داخل جدول دیتابیس. دوست من مفهومی که از جدول میاد تو ذهن آدم با Data Table فرق میکنه. بهتر نبود بگی یه دیتاتیبل رو بریزیم توی یه دیتاتیبل دیگه؟
دقیق بگو چی میخوای.
select نهایی شما میخوای چطور باشه؟

mortezasar
یک شنبه 18 فروردین 1392, 17:58 عصر
سلام ببینید دوستان من توی کریستال میخوام بر اساس یک فیلد گزارش گیری کنم مثلا کد شخص حالا وقتی اطلاعاتم رو سلکت می کنم درست سلکت میشه اما وقتی توی کریستال ریپورت فراخوانی میکنم اطلاعات کل جدول رو واسم میاره تو گزارش نه اونایی که منت سلکت کردم خیلی گشتم اما به نتیجه نرسیدم بعضی جاها خوندم گه اگه اطلاعات سلکت شده از جدول رو بریزی توی یک جدول دیگه و اون اطلاعات رو پرینت بگیری میشه در آخر هم اطلاعات جدول رو پاک می کنی میشه مثل یک جدول تمپ که اطلاعات میاد توش پرینت گرفته میشه و بعد از پرینت اطلاعات جدول تمپ پاک میشه

tooraj_azizi_1035
یک شنبه 18 فروردین 1392, 18:31 عصر
می تونی از متد CopyToDataTable استفاده کنی:

// Bind the System.Windows.Forms.DataGridView object
// to the System.Windows.Forms.BindingSource object.
dataGridView.DataSource = bindingSource;

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable orders = ds.Tables["SalesOrderHeader"];

// Query the SalesOrderHeader table for orders placed
// after August 8, 2001.
IEnumerable<DataRow> query =
from order in orders.AsEnumerable()
where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable<DataRow>();

// Bind the table to a System.Windows.Forms.BindingSource object,
// which acts as a proxy for a System.Windows.Forms.DataGridView object.
bindingSource.DataSource = boundTable;

veniz2008
یک شنبه 18 فروردین 1392, 19:24 عصر
سلام ببینید دوستان من توی کریستال میخوام بر اساس یک فیلد گزارش گیری کنم مثلا کد شخص حالا وقتی اطلاعاتم رو سلکت می کنم درست سلکت میشه اما وقتی توی کریستال ریپورت فراخوانی میکنم اطلاعات کل جدول رو واسم میاره تو گزارش نه اونایی که منت سلکت کردم خیلی گشتم اما به نتیجه نرسیدم بعضی جاها خوندم گه اگه اطلاعات سلکت شده از جدول رو بریزی توی یک جدول دیگه و اون اطلاعات رو پرینت بگیری میشه در آخر هم اطلاعات جدول رو پاک می کنی میشه مثل یک جدول تمپ که اطلاعات میاد توش پرینت گرفته میشه و بعد از پرینت اطلاعات جدول تمپ پاک میشه
چرا همون دیتاتیبل اول شما نتیجه مورد دلخواه نیست؟ (منظورم اینه همون کوئری اولی که می زنید به جای همه رکوردها چرا همون یک شخص خاص رو برنمی گردونید و داخل دیتاتیبل نمی ریزید؟).
کدی رو که باهاش دیتاتیبل رو پر میکنید و به ReportDocument نسبت میدید رو اینجا بذارید تا ببینیم مشکل کار از کجاست.

mortezasar
یک شنبه 18 فروردین 1392, 23:01 عصر
من توی کریستال جدولم رو آوردم و دونه دونه فیلد های جدولم رو روی فرمم درگ کردم میخوام ببینم آیا این کار که مشکلی ایجاد نمی کنه یا کارم درست بوده و آیا اینکه روش کار همینه ؟

veniz2008
یک شنبه 18 فروردین 1392, 23:02 عصر
ظاهر کد که درسته و مشکلی نداره. فقط اینکه شما جستجو رو براساس rostaname انجام دادید. آیا rostaname کلید جدول شما هست؟(یا اگر کلید نیست آیا مطمئنید که برای هر rostaname فقط یک رکورد وجود داره؟).
راستی کدهای بخش try شما رو قدری اصلاح کردم و کدهای کوتاه تر و امن تری ساختم.
هیچوقت مستقیما در کوئری هاتون ورودی ندید (همین کاری که کردید و مستقیما textbox رو وارد کردید) چون براحتی میشه کدهاتون رو هک کرد.

try
{
SqlConnection conn1 = new SqlConnection("Data Source=(local);Initial Catalog=SHNASNAME_FARHANGI_TEST;Integrated Security=True");
SqlDataAdapter da = new SqlDataAdapter("select * from Table_masjed where rostaname = @rostaname" , conn1);
da.SelectCommand.Parameters.AddWithValue("@rostaname", vazbana.Trim());
DataTable dt = new DataTable();
da.Fill(dt);
ReportDocument RD = new ReportDocument();
RD.FileName = "ReportMas.rpt";
RD.SetDataSource(dt);
crv1.ReportSource = RD;
crv1.Show();
}
در مورد سوال بالا هم توضیح اینکه یک دیتاست بسازید و جدولتون رو بهش اضافه کنید. در فایل کریستال خودتون هم اون دیتاست رو که شامل جدولتون هست انتخاب و جدول رو به کریستال اضافه کنید. مراحل رو که دنبال کنید خودش ستون ها رو میسازه و نیازی نیست که شما ستون رو درگ کنید.

mortezasar
یک شنبه 18 فروردین 1392, 23:14 عصر
کلید اصلی نیست اما امکان داره برای هر rostaname چندتا اطلاعات ثبت شده باشه فرض کن میخوام اطلاعات کارکنانی که در بخش مالی یک اداره کار می کنند رو گزارش گیری کنم در تکست باکس می نویسم مالی و هر چی کاربر هستن که رکورد بخش شون برابر مالی باشه رو نشون میده امیدوارم درست توضیح داده باشم

ali_habibi1384
یک شنبه 18 فروردین 1392, 23:18 عصر
مارو دست انداختی یا واقعا....

دوست عزيز لطفا كمي مودب باشيد. يه نگاه به تاپيكهايي كه زديد بندازيد! كدومشون توش كسي رو مسخره نكرديد. وظيفه من نيست شما رو نصيحت كنم مديران سايت هستند كه بايد به شما تذكر بدن، اگر تذكر داده بودند قطعا شما اينجوري همه رو دست نمينداختي.
درستش اين بود كه پيام خصوصي بدم اما خواستم مقابله به مثل كنم تا بدونيد كسي شما رو توي سايت دست بندازه چه حسي داره. اين رفتار شما باعث ميشه يه كاربر جديد از ترس اينكه دستش نندارند قيد سايت و برنامه نويسي رو بزنه.

veniz2008
یک شنبه 18 فروردین 1392, 23:25 عصر
کلید اصلی نیست اما امکان داره برای هر rostaname چندتا اطلاعات ثبت شده باشه فرض کن میخوام اطلاعات کارکنانی که در بخش مالی یک اداره کار می کنند رو گزارش گیری کنم در تکست باکس می نویسم مالی و هر چی کاربر هستن که رکورد بخش شون برابر مالی باشه رو نشون میده امیدوارم درست توضیح داده باشم
منظور من این بود که شاید واقعا مقدار متغیر vazbana به گونه ای باشه که چندین مقدار رو برگردونه. شما مطمئنی که مقدار متغیر vazbana طوریه که تک رکورد برگردونه؟. شما یه کاری کن. اول اینکه یه عکس از داده های جدول Table_masjed بگیر و بذار و همچنین مقدار متغیر vazbana رو هم با messageBox نمایش بده که چه مقداری داخلش هست.

mortezasar
یک شنبه 18 فروردین 1392, 23:26 عصر
ظاهر کد که درسته و مشکلی نداره. فقط اینکه شما جستجو رو براساس rostaname انجام دادید. آیا rostaname کلید جدول شما هست؟(یا اگر کلید نیست آیا مطمئنید که برای هر rostaname فقط یک رکورد وجود داره؟).
راستی کدهای بخش try شما رو قدری اصلاح کردم و کدهای کوتاه تر و امن تری ساختم.
هیچوقت مستقیما در کوئری هاتون ورودی ندید (همین کاری که کردید و مستقیما textbox رو وارد کردید) چون براحتی میشه کدهاتون رو هک کرد.

try
{
SqlConnection conn1 = new SqlConnection("Data Source=(local);Initial Catalog=SHNASNAME_FARHANGI_TEST;Integrated Security=True");
SqlDataAdapter da = new SqlDataAdapter("select * from Table_masjed where rostaname = @rostaname" , conn1);
da.SelectCommand.Parameters.AddWithValue("@rostaname", vazbana.Trim());
DataTable dt = new DataTable();
da.Fill(dt);
ReportDocument RD = new ReportDocument();
RD.FileName = "ReportMas.rpt";
RD.SetDataSource(dt);
crv1.ReportSource = RD;
crv1.Show();
}
در مورد سوال بالا هم توضیح اینکه یک دیتاست بسازید و جدولتون رو بهش اضافه کنید. در فایل کریستال خودتون هم اون دیتاست رو که شامل جدولتون هست انتخاب و جدول رو به کریستال اضافه کنید. مراحل رو که دنبال کنید خودش ستون ها رو میسازه و نیازی نیست که شما ستون رو درگ کنید.
من دیتا ست رو به کریستال اضافه کردم بعد از اون جدول هام در کریستال ریپورت در پنجره databasefields جدول هام اومدن و از توی جدول هام ستون ها رو اضافه کردم ضمنا گزارشم رو در حالت ویزارد تهیه نکردم خودم طراحیش کردم و ستون های جدول رو براساس فرمی که میخواستم طراحی کردم به نظرتون میتونه مشکل از این باشه

mortezasar
یک شنبه 18 فروردین 1392, 23:33 عصر
102506
اینم عکس از دیتا بیسم

veniz2008
یک شنبه 18 فروردین 1392, 23:49 عصر
با این عکسی که شما گذاشتید خوب باید همه رکوردها بیاد دیگه. چیز دیگه ای انتظار دارید؟.
ولی اگر مثلا براساس فیلد mas_name فیلتر رو انجام بدید یک رکورد رو میاره چون با هم متفاوت هستن.
زمانی یک رکورد برگشت داده میشه که بر روی فیلد منحصر بفرد شرط رو قرار بدید ولی در کوئری شما rostaname چنین خصوصیتی رو نداره.

mortezasar
یک شنبه 18 فروردین 1392, 23:52 عصر
نه بعضی از اطلاعات توی جدولم رو پاک کردم اما الان دوباره اطلاعات دیگه ای وارد جدولم کردم اما بازم همون جوری بود یعنی هر 3 تا رکورد رو بر می گردونه به جای یک رکورد با نام مسجد هم امتحان کرد اما بازم هر دوتا رکورد رو میاره واسم
موندم که مشکل دیگه از کجاست

veniz2008
دوشنبه 19 فروردین 1392, 10:37 صبح
مراحل اضافه کردن جدول رو به کریستال با شکل های مختلف توضیح میدم.
1. گزینه Add New Data Source رو انتخاب کنید.
102512

2. گزینه DataBase رو انتخاب و Next کنید.
102513

3. بر روی New Connection کلیک کنید.
102514

4. نام سرور رو وارد کنید. (من (local) وارد کردم ولی ممکنه سرور شما چیز دیگه ای باشه که باید نام مناسب رو وارد کنید). بعدش دیتابیس خودتون رو انتخاب و بر روی ok کلیک کنید.
102515

5. در این قسمت بایستی جدول مورد نظرتون رو تیک بزنید تا به دیتاست اضافه بشه.
102516http://barnamenevis.org/images/misc/pencil.png

veniz2008
دوشنبه 19 فروردین 1392, 10:38 صبح
با توجه به محدودیت ارسال 5 عکس در هر پست، ادامه عکس ها در این پست قرار گرفتن.
حالا از بخش Add New Item یک شی Crystal Report اضافه کنید. در مراحل بعدی با پنجره شکل 6 مواجه میشید.
6. دیتاستی که در مرحله قبل ایجاد شد رو انتخاب بر روی علامت + کنار آن کلیک کنید تا لیست جداولی رو که در مراحل قبلی اضافه کردید رو ببینید. جدول مورد نظرتون رو انتخاب و بر روی دکمه < کلیک کنید تا جدول به پنجره سمت راست منتقل بشه.
102517

7. در این مرحله، فیلد یا فیلدهای مورد نظرتون رو که دوست دارید در گزارش نمایش داده بشن رو انتخاب و با دکمه < به پنجره سمت راست منتقل کنید.
102518

دو مرحله بعدی اختیاری (optional) هستند. کلید Next رو بزنید و از اون ها گذر کنید.
8. در پایان باید یک قالب مناسب برای گزارشتون در نظر بگیرید. گزینه دلخواه رو انتخاب و Finish کنید.
102519

مراحل رو همونطور که گفتم انجام بدید تا مشکلی نداشته باشید. در مورد کدنویسی هم که راه درست رو بهتون گفتم و بهتره به اون سبک دیگه کد ننویسید.
موفق باشید.

mortezasar
دوشنبه 19 فروردین 1392, 16:20 عصر
مرسی دوست عزیز امتحان کنم خبر میدم