PDA

View Full Version : جابه جا کردن سطر و ستون اطلاعات خوانده شده از جدول sql در دیتاگرید



CSharpLovers
شنبه 16 مهر 1401, 13:24 عصر
سلام خدمت همه دوستان عزیز.
یک جدول در دیتا بیس داریم که اطلاعات تست کالاها در اون ذخیره میشه. (تصویر پیوست)
به این صورت که برای یک کالا چند تست انجام میشه که تعدادشون برای هر کالا متفاوت هست . مثلا یک کالا ممکنه رنگ و اندازه اش تست بشه . کالای دیگری رنگ و وزن . چون تعداد آیتمهای تست مشخص نیست پس نمیشه در جدول دیتابیس مشخص کرد و باید اطلاعات به صورت ردیفی ثبت بشن با این آیتمها :
کد آیتم - آیتم مورد تست - نتیجه - شخص تست کننده - توضیحات
154052
حالا برای دیدن نتایج در یک صفحه و گزارش گیری باید اطلاعات به صورت ستونی باشند. یعنی یه جورایی باید جای سطرها و ستونها جا به جا بشه و به این صورت که دیتاگریدی که نتایج رو نشون میده به این صورت باشه که یک ستون آیتم رنگ رو نشون بده - یک ستون آیتم استحکام - یک ستون آیتم وزن - و در پایین ستونها جمع امتیازها حاصل بشه .
چطور باید این کار انجام بشه ؟ یه جورایی باید اطلاعات از جدول استخراج بشن و فیلتر بشن و به صورت ذکر شده در دیتاگرید نمایش داده شوند.
وقتی به گزارش نگاه میکنیم میبینیم ستون رنگ این امتیازها رو داره و بقیه آیتمها هم همین طور. و در نهایت همه امتیازها با هم جمع بشه برای یک کالا.
اگر دوستان نظری هم در مورد ثبت اولیه و طراحی جدول در دیتابیس دارند که اطلاعات باید طور دیگری ثبت بشه بفرمایید .
سی شارپ 2019 - SQL 2014 - Entity Framework

Mahmoud.Afrad
شنبه 16 مهر 1401, 14:35 عصر
در مورد pivot جستجو کنید.

mazoolagh
شنبه 16 مهر 1401, 16:56 عصر
سلام و روز خوش

این 2 تاپیک رو هم ببینین، البته باید با pivoting آشنا باشین:

https://barnamenevis.org/showthread.php?570758-%D8%A8%D8%B1%DA%AF%D8%B1%D8%AF%D8%A7%D9%86%D8%AF%D 9%86-%D8%B3%D8%B7%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-%D8%B3%D8%AA%D9%88%D9%86%D9%87%D8%A7

https://barnamenevis.org/showthread.php?570840-%D8%AC%D8%A7%D8%A8%D8%AC%D8%A7%D8%A6%DB%8C-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF%D9%87%D8%A7-%D9%88-%D9%81%DB%8C%D9%84%D8%AF%D9%87%D8%A7-%D9%87%D9%85%D8%A7%D9%86%D9%86%D8%AF-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%B6%D9%85%DB%8C%D9%85%D9%87

CSharpLovers
شنبه 16 مهر 1401, 18:17 عصر
از کامپوننت Telerik میشه استفاده کرد برای این کار ؟ کدوم نسخه ؟
با وجود این کامپوننت باز هم باید از پیوت در دیتابیس استفاده کرد؟

mazoolagh
یک شنبه 17 مهر 1401, 10:44 صبح
هم telerik و هم devexpress کمپوننت pivot grid دارن.
نه دیگه، نیازی نیست کوئری رو خودتون طراحی کنین ولی گرید رو باید تنظیم بشه - دمو دارن هر دوشون که میتونین اونها رو ببینین.

جدای از اینها، devexpress یک vertical grid هم داره که مشخصه از اسمش چجوری نمایش میده.

CSharpLovers
یک شنبه 17 مهر 1401, 21:41 عصر
مشکلی که هست اینکه تعداد آیتمهای ما ثابت نیستند.
در یک تست چند نفر شرکت دارند و اسمشون به تعداد آیتمهای مورد تست در جدول تکرار میشه .
یعنی ممکنه برای یک محصول 3 آیتم تعریف بشه و برای محصول دیگری 5 آیتم و تعداد افراد به صورت 3 بار یا 5 بار تکراری میشه .
و مجبوریم که اطلاعات رو به صورت سطر به سطر در جدول ثبت کنیم چون تعداد آیتمها مشخص نیست . که میشه تصویر زیر
154055
اگر میشه در خود سی شارپ دیتا گرید رو فیلتر کرد و اطلاعات با فرمت زیر باشند که عالیه و امکان چاپ هم با فرمت دو جدول زیر باشه در استیمول سافت
کامپوننت هم نباشه خوب خیلی بهتره.


تست کننده
رنگ
استحکام
وزن


احمدی
5
4
4


کریمی
4
4
3


بهرامی
3
5
5



و برای محصول دیگر


تست کننده
رنگ
استحکام
وزن
حجم
کارکرد


احمدی
5
4
4
4
5


کریمی
4
4
3
5
5


بهرامی
3
5
5
4
3




ممنون از اساتید عزیز.

ROSTAM2
دوشنبه 18 مهر 1401, 09:59 صبح
سلام.
بنظرم بجای این کار توی طراحی جدول تغییر ایجاد کن بسته به گروهبندی های مورد نیاز مثلا برای آیتم ها و دفعات تست یک جدول و برای کسانی که در مراحل تست شرکت دارند یک جدول مجزا ایجاد کنید و بین جدولها ارتباط برقرار کنید. تا توی نمایش اطلاعات اینطور به زحمت نیفتید.

CSharpLovers
دوشنبه 18 مهر 1401, 17:43 عصر
این هم نظر خوبیه . جدول کارشناسان رو از تست و آیتمها جدا میکنیم و دو جدول تشکیل میشه و با Id های خودشون به هم مربوطند.
حالا مسئله اینجاست که به نظرتون چطور برای تست یک کالا نتیجه رو که میشه جمع امتیازات برای هر آیتم در یک دیتاگرید نشون بدیم که از همون هم گزارش تهیه کنیم ؟
اگر بشه دیتا گرید رو فیلتر کرد و ردیفهایی که آیتم تکراری دارند رو با هم یکی کرد و امتیازها رو هم باهم جمع کنیم و در یک ردیف نمایش بدیم کار حله .
دوستان اگر کدش رو میدونند لطفا راهنمایی کنند .
یعنی یک دیتا گرید در فرم باشه که همه نتایج اون تست رو بیاره و یک دیتاگرید دیگه فقط آیتمها و جمع امتیازات رو نشون بده .
تصویر زیر :
154059

ROSTAM2
دوشنبه 18 مهر 1401, 19:26 عصر
در مورد هر فیلد توضیح بده که چی هستن مخصوصا ItemCode, TestId و TestSubId

و TestResult ؟!

ROSTAM2
دوشنبه 18 مهر 1401, 19:49 عصر
جدول هایی که من پیسنهاد می کنم به این ترتیبه:

1- جدول موارد تست شونده بنام Items با فیلد های ID, ItemName, Details

2- جدول فرآیند تست بنام Test Processes با فیلدهای ID, ItemId, Process, ProcessNumber, TestResult

3- جدول گروه کارشناسی بنام Experts group با فیلدهای ID, ItemId, ProcessId, ExpertsId

4- جدول اطلاعات کارشناسان و متخصصان بنام Experts با فیلدهای الزامی ID, Name, Family و فیلد های اختیاری از اطلاعات دیگر کارشناس که به ما مربوط نیست و به شرکت مربوطه.

همه این جداول می تونن از طریق آی دی هاشون با هم ارتباط داشته باشن برای ExpertsId گروه کارشناسا هم ی فیلد باشه که بشه تعدادی آی دی کارشناس در اون جا داد و اطلاعات رو طبق ای دی از جدول کارشناسان یا همون Experts فرا خوانی کرد.

CSharpLovers
دوشنبه 18 مهر 1401, 23:42 عصر
تشکر صمیمانه از همکاری دوستان عزیزم دارم .
برای ثبت اطلاعات دو تا جدول داریم که از طریق کلید اصلی به هم مربوطند.
جدول Test که مشخصات کلی یک آزمایش درونش ثبت میشه مثل :
TestId,testName,ProductName,TestDate و ...
جدول TestSub که آزمایشها درونش ثبت میشه و شامل :
TestSubId : آی دی هر ردیف این جدول برای ثبت و دسترسی و آپدیت و دلیت و ...
TestId : که در جدول اصلی یعنی Test کلید اصلی هست برای ارتباط با جدول TestSub
ItemCode : کد آیتم مورد آزمایش هست مثل رنگ و استحکام و وزن و ... که متغیر هستند برای محصولات مختلف . یعنی جدای این دو جدول یک جدول دیگه هست که ابتدا آزمایشات اونجا تعریف میشه و تعیین میشه که چه آیتمهایی دارند و بعد در جدول TestSub فراخوانی میشن توسط یک دیتاگرید و آزمایشات پس از ثبت نتایج که همون TestResault هستند در دو جدول Test و TestSub ثبت میشن.
مثل فاکتور در برنامه حسابداری که یک جدول داریم برای نام مشتری و تاریخ و مبلغ و ... و یک جدول داریم برای ثبت اقلام فاکتور . اینجا به جای اقلام فاکتور این آیتمها هستند با این تفاوت که اقلام فاکتور از قبل به عنوان کالا تعریف شدند ولی آیتمهای ما در هر آزمایش به صورت جداگانه تعریف میشن و ثبت میشن.
Property : نام آیتمها هست
TestResault : نتیجه تست یا امتیاز که هر تست کننده به اون آیتم میده.
Des : توضیحات اضافی هست .
منتها چون برای یک آزمایش ممکنه 3 آیتم باشه و برای آزمایش دیگه 5 آیتم یا کمتر یا بیشتر نمیتونیم جدول رو طوری طراحی کنیم که نوع آیتمها در بالای هر ستون باشند و نتیجه تست هر تست کننده در پایینش ثبت بشه که این طوری دیگه مشکلی نبود . پس مجبور شدیم جدول TestSub رو طوری طراحی کنیم که هر آزمایش هر چند تا آیتم داشته باشه ، نتیجه تست بیاد در جدول TestSub سطر به سطر ثبت بشه.
در فرم گزارش نتایج تست به این شکل هست که دیتا گرید شماره یک میاد اطلاعات کلی مربوط به تست که در جدول Test هست رو نشون میده مثل تاریخ و نام کلی تست و اسم محصول و ...
و وقتی روی هر ردیف که مربوط به یک آزمایش هست کلیک میشه در دیتا گرید شماره دو اطلاعات اون تست که با فیلد Id مرتبط هست نمایش داده میشه شامل شخص تست کننده و آیتم و کد آیتم و نتیجه تست که میشه تصویر زیر :
154061
ولی میخوام نتیجه رو بشه به صورت زیر نمایش داد حالا یا توسط یک دیتاتیبل واسط و اتصالش به دیتا گرید سوم یا فیلتر خود دیتا گرید و ... که بیاد مثلا اگر در یک تست 4 نفر شرکت دارند اسم هرکس در یک ردیف از دیتا گرید بیاد و عنوان ستونها بشه آیتمهای مورد تست و در زیر هر ستون نتایج نمایش داده بشن و در نهایت نتایجه جمع زده بشن و مشخص بشه که امتیاز رنگ این محصول شده مثلا 12 امتیاز استحکامش شده 13 و الی آخر حالا اگر 10 تا آیتم هم باشند به همین شکل .


تست کننده
رنگ
استحکام
وزن
حجم
کارکرد


احمدی
5
4
4
4
5


کریمی
4
4
3
5
5


بهرامی
3
5
5
4
3


نتایج
12
13
12
13
13



اگر خوب توضیح داده باشم باید متوجه مشکل شده باشید. اگر تعداد آیتمها ثابت بودند مثلا مثل همین جدول قبلی یعنی 5 تا خوب 5 تا ستون در دیتابیس تعریف میکردیم با نامهای Property1 تا Property5 تا و هر آیتمی حالا اگر عنوانهاشون هم متفاوت بود در این 5 ستون ثبت میشدند و نام آیتمها رو با کد نویسی در برنامه میدادیم به هدر دیتا گرید .

Mahmoud.Afrad
سه شنبه 19 مهر 1401, 02:21 صبح
جدولی مجزا برای آیتم ها و اشخاص تست کننده ایجاد کنید.
از دستور join مناسب استفاده کنید تا آیتمهایی که در تست ها اندازه گیری شده اند واکشی شوند.

کوئری pivot را به صورت داینامیک بسازید.

هر وقت تونستید جدول آخر رو بدست بیارید، جمع هر ستون رو پیگیری کنید.

CSharpLovers
سه شنبه 19 مهر 1401, 03:26 صبح
این کویری رو توی اس کیو ال نوشتم
SELECT Property, SUM (Score)
FROM tblTestOrganolepticSub where testid = 2
GROUP BY Property;
و خروجی خیلی خوبی داد . آیتمهای تست شماره دو در یک ستون لیست شدند و جمع امتیازها هم در یک ستون
چطور میتونم از این کویری در سی شارپ استفاده کنم و وصلش کنم به یک دیتاگرید؟
و testid = 2 رو از چه طریق بهش شماره تست رو بدم ؟ اینجا دستی وارد کردم. از طریق تکست باکس میشه . شما اگر پیشنهادی دارید مطرح کنید.

ROSTAM2
سه شنبه 19 مهر 1401, 07:24 صبح
154062

https://www.c-sharpcorner.com/blogs/calluse-a-sql-function-in-c-sharp1 (https://www.c-sharpcorner.com/blogs/calluse-a-sql-function-in-c-sharp1)

CSharpLovers
سه شنبه 19 مهر 1401, 23:11 عصر
یک پروسیجر در دیتابیس ایجاد کردم و کار استخراج و ارسال اطلاعات رو از طریق یک ویو انجام میده .
فقط مونده یک پارامتر براش تعریف کنم در دیتابیس و شماره آزمایش رو از داخل برنامه توسط یک تکست باکس براش بفرستم .
سی شارپ 2019 - انتتی فریم ورک - معماری سه لایه - اس کیو ال 2014
اتصال و دیتابیس به این شکل تعریف شده :
private LBSEntities db = new LBSEntities();
لطفا راهنمایی بفرمایید برای تعریف پارامتر و ارسال اون پارامتر از درون برنامه توسط یک تکست باکس
اساتید عزیز لطفا اگر زحمتی نیست کدش رو بگذارید دیگه واقعا کار به مرحله آخر رسیده ، سرگردون فرومهای خارجی نشم :چشمک:

mazoolagh
چهارشنبه 20 مهر 1401, 12:35 عصر
اون 2 تاپیک پست 3 رو دیدین؟

اونجا مشابه همین پرسش پاسخ داده شده همراه با کد کامل و توضیح؛

هم روش نرمالایز کردن دیتا اولیه آمده (در صورت لزوم و بدون نیاز به تغییر در طراحی)،
هم dynamic sql بطور کامل شرح داده شده.

CSharpLovers
جمعه 22 مهر 1401, 12:12 عصر
برای رسیدن به نتیجه نهایی دو راه وجود داره .
اول نوشتن پروسیجر داخل sql و اجرای اون از درون سی شارپ
دوم نوشتن کدهای sql داخل سی شارپ و اجرای کدها بدون پروسیجر
هر دو روش به خوبی جواب داد ولی کدوم راه بهتر هست؟

Mahmoud.Afrad
یک شنبه 24 مهر 1401, 02:59 صبح
برای رسیدن به نتیجه نهایی دو راه وجود داره .
اول نوشتن پروسیجر داخل sql و اجرای اون از درون سی شارپ
دوم نوشتن کدهای sql داخل سی شارپ و اجرای کدها بدون پروسیجر
هر دو روش به خوبی جواب داد ولی کدوم راه بهتر هست؟

وقتی از entity framework استفاده میکنید، linq query در اولویت هست مگر اینکه نتونید باهاش به نتیجه برسید.

CSharpLovers
دوشنبه 02 آبان 1401, 09:20 صبح
سلام خدمت دوستان.
بعد از اینکه بانک اس کیو ال رو اتچ میکنم ، به جای نمایش نام بانک ، آدرس بانک نمایش داده میشه به همراه آدرس فولدرها و نام بانک به حروف بزرگ تغییر پیدا میکنه و باعث مشکلاتی در برنامه میشه . مثلا موقع بکاپ گرفتن از بانک دچار ارور میشیم و ...
دلیل این مشکل چیه ؟
نسخه اس کیو ال Express 2014
در کل میخوام برنامه ای که با سی شارپ نوشتم رو در سیستمی دیگه نصب کنم . از اس کیو ال اکسپرس 2014 استفاده بشه و بانک به صورت خودکار اتچ بشه و برنامه بالا بیاد.
اس کیو ال رو نصب کردم . بانک رو هم اتچ کردم : به این روش که در کانکشن استرینگ تعریف کردم که در هر بار دیتابیس رو اتچ کنه به اس کیو ال. اگر شیوه بهتری در این مورد هست لطفا بفرمایید .
رشته اتصال :
data source=.\sqlexpress;AttachDbFilename=|DataDirector y|\FactoryLaboratory.mdf;integrated security=True
ولی مشکل اصلی فعلا همون نام دیتابیس هست که بعد از اتچ به صورت آدرس محل فایل نمایش داده میشه با حروف بزرگ
154115

ROSTAM2
دوشنبه 02 آبان 1401, 10:55 صبح
با سلام.
فک کنم بشه نام دیتابیس رو عوض کنی ولی بنظر من استفاده از Database Project برای نصب دیتابیس روی سرور برای مدیریت دیتابیس راحت تر باشه.

CSharpLovers
دوشنبه 02 آبان 1401, 11:07 صبح
جناب رستمی لطف میکنید در موردDatabase Project بیشتر توضیح بدید .

ROSTAM2
دوشنبه 02 آبان 1401, 11:17 صبح
SQL Server Database Project یک نمونه پروژه است مثل بقیه پروژه ها با این تفاوت که می شه ابزار مدیریت دیتابیس SQL رو براش ایجاد کرد و به سرور اضافه ش کرد.
برای اضافه کردنش به سرور از ابزار Publish استفاده می شه.

CSharpLovers
دوشنبه 02 آبان 1401, 19:12 عصر
میشه نمونه کد بگذارید در مورد پروژه ای که من میخوام انجام بدم و توضیحاتش رو دادم.

ROSTAM2
سه شنبه 03 آبان 1401, 08:46 صبح
نمونه کد نمی خواد که ی پروژه جدید از نمونه SQL Server Database Project انتخاب می کنی.
برای اضافه کردن Table و توابع یا پروسیجر و... اس.کیو.ال از Add-->New Item استفاده می کنی. بقیه اش هم که زبان SQL (https://www.w3schools.com/sql/sql_create_table.asp)باید بلد باشی.

البته برای ایجاد جدول قسمت Design داره ولی برای توابع و پروسیجر یا اسکریپت T-SQL لازم می شه.

CSharpLovers
سه شنبه 03 آبان 1401, 09:26 صبح
اکی. متوجه شدم. دیتابیس من تکمیله فقط همین داستان که اسم بانک موقع اتچ اتوماتیک به آدرس بانک تغییر پیدا میکنه کار رو خراب کرده. یعنی اگر بانک به صورت دستی اتچ بشه از داخل اس کیو ال منیجمنت مشکلی نیست و اسم بانک درست . ولی موقع اتچ اتوماتیک موقع اجرای برنامه این مشکل پیش میاد.

ROSTAM2
سه شنبه 03 آبان 1401, 11:45 صبح
برای اتچ کردن دیتابیس از این Query استفاده کن :

CREATE DATABASE MyAdventureWorks
ON (FILENAME = 'C:\MySQLServer\AdventureWorks_Data.mdf'),
(FILENAME = 'C:\MySQLServer\AdventureWorks_Log.ldf')
FOR ATTACH;


بجای MyAdventureWorks نام دیتابیس

154116 (https://learn.microsoft.com/en-us/sql/relational-databases/databases/attach-a-database?view=sql-server-ver16)