PDA

View Full Version : بروزرسانی فرمهای باز بعد از تغییر دیتابیس در یکی از فرمها



jamal_ch
سه شنبه 06 مرداد 1394, 07:37 صبح
سلام و عرض ادب خدمت همه دوستان عزیزم

من تو برنامم احتیاج به این دارم که کاربر بتونه یک جدول رو تو دیتابیس تغییر بده(فیلد اضافه کنه) و به موازات اون فرم درج و به روزرسانی و نمایش هم تغییر کنه
به عبارتی یک فیلد به جدول مورد نظر اضافه میکنه بعد به ازای اون فیلد تو فرم هام یک تکس باکس اضافه میشه و اطلاعات رو به اون فیلد اضافه میکنه و تو گرید ویو که مسول نمایش است این فیلد اضافه میشه و هم در فرم به روز رسانی تکس باکس مورد نظر میاد

حالا میخوام بدونم چطر یک فیلد به جدول اضافه کنم و چطور اونو توفرم هام هم اضافه بشه
اگه سوالی بود یا گنگ توضیح دادم بگید؟
با تشکر و احترام

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

Mahmoud Zaad
سه شنبه 06 مرداد 1394, 13:21 عصر
سلام
نیازی نیست جدول های دیتابیس شما تغییر کنه، با استفاده از دیتاگریدویو در تب سایر موارد به راحتی میشه اینو پیاده سازی کرد. چون تغییر در فرم ها داستان داره.
به روش طراحی بانکهای اطلاعاتی عمل کنید. یعنی یه جدول جدید تو دیتابیس خودتون بسازید که شامل id, نام پارامتر، نوع پارامتر و احیاناً توضیحات باشه. بعد یک فرم طراحی کنید که مدیر پارامترهای مورد نظرش رو تعریف کنه یعنی هر پارامتری که تعریف شد یه رکورد به این جدول insert کنید. همینطور یه جدول دیگه طراحی کنید برای نگهداری مقادیری که بعداً پزشک ها وارد می کنند. شامل id جدول پارامترها، مقدار، کد بیمار. حالا در تب سایر موارد در فرم یه دیتاگریدویو قرار می دید که ستون های کد پارامتر (مخفی)، نام پارامتر، مقدار رو داشته باشه. در این دیتاگریدویو دو ستون اولی رو از جدول پارامترها سلکت می کنید و ستون مقدار هم که خالی هست و بعداً کاربر باید پر کنه. حالا هنگام ذخیره سازی، کل این دیتاگریدویو (یا ردیفهایی که مقدار دارند) رو توی جدول دوم ذخیره می کنید. هر جا گنگ بود بگید تا توضیح بدم.

jamal_ch
سه شنبه 06 مرداد 1394, 18:16 عصر
خیلی ممنون از راهنمای خوبتون فقط الان یک سوال برام میمونه

اگه خوب فهمیده باشم باید به شکل زیر بشه؟

اگر جدول اصلی بیمار رو tblbymar در نظر بگیریم که شامل id بیمار و بقیه مشخصات بیمار است
جدول پامتر ها که مدیر اضافه میکند tblnewparameter شامل id, نام پارامتر، نوع پارامتر , توضیحات
و جدول مقادیر جدید برای هر بیمار tblotherparamaterbymar میباشد که شامل , idtblbymar, idtblnewparameter, parametervalue
میباشد
حال برای هر بیمار ممکن است چند سطر در tblotherparamaterbymar وجود داشته باشد
رابطه یک به چند سوال
من میخوام مشخصات بیمار از جدول tblbymar و تمام پارمتر های این بیمار از جدول tblotherparamaterbymar در یک سطر گریدویو یا اکسل یا report viewr نمایش بدم باید چیکار کنم

Mahmoud Zaad
سه شنبه 06 مرداد 1394, 18:53 عصر
بله طراحی جدول ها درسته. برای نمایش به نظرم نمایش در یک سطر صحیح نیست چون فیلدها به مرور اضافه میشن یعنی مثلاً اگه دیروز ما سه تا پارامتر تعریفی داشته باشیم برای بیمار الف که دیروز مراجعه کرده باید سه ستون ایجاد بشه و اگه امروز دو تا پارامتر دیگه اضافه کنیم بیماری که امروز مراجعه میکنه دارای 5پارامتر هست یعنی این بیمار نیاز به 5 ستون داره و ... (البته میشه برای بیمار اولی این ستون ها رو خالی رد کرد ولی اگه تعداد پارامترها زیاد بشه کاربر باید یکسره در حال اسکرول باشه. فکر می کنم جالب نشه.
چاره کار گروه بندی هست مثلاً در گریدهای تلریک این خاصیت هست یعنی فیلدهای جدول مستر یکبار آورده میشه (tblbymar) و فیلدهای جدول دیتیل (tblotherparamaterbymar) به تعداد لازم تکرار میشه. یا حتی می تونید یه userControl بسازید برای اینکار. در نرم افزارهای گزارش ساز هم که مشکلی نیست با گروه بندی یا subReport مشکل حل میشه.

jamal_ch
چهارشنبه 07 مرداد 1394, 07:50 صبح
سلام بازم ممنون که پیگر هستید
باید حتما بتونم در یک ردیف بیارم برای یک کار خاص میخوام یک سری نمودار و معدل گیری رو بوسیله نرم افزار spss (Statistical package for social science) که بتونیم تحقیقات در مورد سرطان داشته باشیم این برنامه الان رو یک کلینیک بزرگ تو مشهد داره کار میکنه میخواییم این تحلیل اماری رو به دانشگاه انتقال بدیم اسکرول بودنش اصلا مهم نیست راهی است که بشه در یک سطر نشون داد یک کتاب در مورد سرطان پستان با استفاده از داده های همین نرم افزار نوشته شده حالا میخواهیم جامع و تکمیلش کنیم تا بتونیم پارامترهای زیادی رو برسی کنیم و نتایج دقیقی رو نشون بدیم

Mahmoud Zaad
چهارشنبه 07 مرداد 1394, 08:50 صبح
خب کار دیگه ای که میشه انجام داد: با اطلاعات این لینک (http://www.w3schools.com/sql/sql_alter.asp) میشه روی دیتابیس تغییرات ایجاد کرد یعنی فیلد جدید اضافه و کم کرد. پس مشکل اضافه کردن فیلد به جدول قبلی شما حل میشه.
می مونه فهمیدن اینکه چه فیلدهایی اضافه شدن؟ برای اینکار باید همون جدول tblnewparameter رو داشته باشید. یعنی وقتی مدیر میخواد فیلد جدید تعریف کنه از یه طرف یه فیلد جدید به جدول اصلی بیمار اضافه می شه و از طرف دیگه یه رکود به جدول tblnewparameter هم اضافه میشه. به شرطی که نام انگلیسی فیلد اصلی با اسمی که تو جدول tblnewparameter اضافه می کنید برابر باشند و قاعدتاً تکراری هم نباید باشه.
حالا یه userControl میسازید که شامل یک لیبل یک تکست باکس و یه پراپرتی برای نام فیلد هست. و در تب مورد نظر یک flowLayoutPanel هم قرار می دید.
خب در تب مربوطه در فرم برنامه، اول یه سلکت از جدول tblnewparameter انجام می دید و پارامترهای تعریفی رو پیدا می کنید و به ازای هر ردیف در این جدول یک نمونه از یوزر کنترل بالا رو توی flowLayoutPanel اضافه می کنید به طوریکه تکستِ لیبل همون نام فیلد و پراپرتی که برای یوزر کنترل تعریف کردید همون اسم فیلد در جدول tblnewparameter هست.
برای ذخیره سازی اطلاعات ورودی، تعداد یوزر کنترل ها همون تعداد ستونهایی هست که کاربر تعریف کرده همینطور اسم ستون های دیتابیس رو هم که داریم پس کافیه یک کوئری insert بنویسیم و عملیات ثبت رو انجام بدیم.

jamal_ch
چهارشنبه 07 مرداد 1394, 09:13 صبح
ممنون
تا حالا با flowLayoutPanelو usercontrol کار نکردم برم انجام بدم ببینم چی میشه
نظر تون راجب راه زیر چیه
مستقیم تو جدول بیمار تغییر نمیدم وجدول tblotherparamaterbymar ستون اضافه میکنم این جدول در ابتدا فقط یک ستون دارد اون هم id بیمار است و ستون های بعدی رو مدیر اضافه میکند و بااستفاده از یک view با جدول بیمار جویین میکنم اینجوری ارتباط یک به یک میشه
و جدول بیمار که مهم هم است تغییر نمیکنه ؟

Mahmoud Zaad
چهارشنبه 07 مرداد 1394, 09:30 صبح
flowLayoutPanel مثل پنل هست با این تفاوت که یه خاصیت FlowDirection داره (برای چیدمان کنترل ها : از بالا به پایین، از پایین به بالا، از چپ به راست، از راست به چپ) یعنی کنترل هایی که داخلش قرار میگیرن بر اساس این چیدمان پشت سر هم قرار می گیرند یه ویژگی جالبی هم که داره اگه یکی از اینها رو حذف کنید یا مخفی کنید جای اون کنترل خالی نمی مونه و بقیه کنترل ها میان جای خالی رو پر می کنن.
تا بعد از ظهر یه نمونه قرار میدم.

این روشی هم که گفتید مشکلی نداره.

مهرداد صفا
چهارشنبه 07 مرداد 1394, 10:12 صبح
سلام.
اگر قصد داشته باشید سناریو اول رو پیاده کنید و از دو یا سه جدول برای ذخیره اطلاعات استفاده کنید، باید برای کوئری گرفتن از pivot query استفاده کنید تا داده ها رو در یک رکورد داشته باشید که البته update کردن جدول هم مراحل خودش رو داره که در کل از نظر من نیازی نیست خودتون رو درگیر این پیچیدگی کنید، مگر اینکه پارامتر هایی که توسط کاربر اضافه میشه مختص به یک بیمار باشه. یعنی هر بیماری چند پارامتر مختص به خودش رو داره که اکثرا بین بیماران غیر مشترک هستند و اگر قرار باشه همشون رو در یک جدول ذخیره کنیم تعداد فیلد های بلااستفاده زیاد شده و باعث وجود سربار در اطلاعات میشه و کاربری رو هم سخت تر می کنه. در این صورت بهتره که از همین روش داینامیک برای ایجاد فیلدها استفاده کنید.
در غیر این صورت می تونید با همون یک جدول کار رو ادامه بدید و به طور مستقیم ستونهای جدول رو تغییر بدید. میتونید در سمت APPLICATION بعد از اینکه کاربر یک ستون اضافه کرد یک رویداد رو هم fire کنید و در سایر فرمها این رویداد رو هندل کنید و متناسب با ستون های جدول، فیلدهای فرم رو اضافه کنید. از SqlDependecy هم میتونید برای با خبر شدن از تغییرات استفاده کنید.
برای گرفتن ستون های جدول هم میتونید از Sys.Columns استفاده کنید.

Mahmoud Zaad
چهارشنبه 07 مرداد 1394, 11:37 صبح
این یک نمونه در مورد userControl و افزوده آن به flowLayoutPanel
133693

Mahmoud.Afrad
چهارشنبه 07 مرداد 1394, 11:42 صبح
jamal_ch (http://barnamenevis.org/member.php?94552-jamal_ch) اینکه میخواهید پارامترهای یک شخص همه در یک سطر باشند، همه در یک فیلد باشند یا در فیلدهای مجزا؟ اگر میتونی یک عکس از چیزی که میخوای بزار.

jamal_ch
چهارشنبه 07 مرداد 1394, 12:24 عصر
jamal_ch (http://barnamenevis.org/member.php?94552-jamal_ch) اینکه میخواهید پارامترهای یک شخص همه در یک سطر باشند، همه در یک فیلد باشند یا در فیلدهای مجزا؟ اگر میتونی یک عکس از چیزی که میخوای بزار.

سلام در فیلد های مجزا
ولی این فیلد ها توسط پزشکان افزوده میشود وتعداد ان امکان دارد با توجه به شرایط هر بیمار تغییر کند

133696

قسمت سایر موارد برای هر بیمار متفاوت است ولی من میخوام
قسمت سایر موارد به صورت یک سطر نمایش داده شود
133697

jamal_ch
چهارشنبه 07 مرداد 1394, 12:33 عصر
این یک نمونه در مورد userControl و افزوده آن به flowLayoutPanel
133693

سلام
ممنون دقیقا همون چیزی است که میخوام
مشکل ثبت و ویرایش با این کنترل حل میشه
چطوری تو select نام فارسی فیلد ها رو در کنترل (گرید ویو یا .. اضافه کنم)
به عنوان مثال یک فیلد به جدول اضافه میشه که نام فیلد(جنس) در دیتابیس میشه jens
حالا تو برنامه و تو گریدم اگه select کنم اسم فیلدم میشه jens در صورتی که میخوام نام فارسی نمایش داده بشه جنس

jamal_ch
چهارشنبه 07 مرداد 1394, 12:48 عصر
سلام.
اگر قصد داشته باشید سناریو اول رو پیاده کنید و از دو یا سه جدول برای ذخیره اطلاعات استفاده کنید، باید برای کوئری گرفتن از pivot query استفاده کنید تا داده ها رو در یک رکورد داشته باشید که البته update کردن جدول هم مراحل خودش رو داره که در کل از نظر من نیازی نیست خودتون رو درگیر این پیچیدگی کنید، مگر اینکه پارامتر هایی که توسط کاربر اضافه میشه مختص به یک بیمار باشه. یعنی هر بیماری چند پارامتر مختص به خودش رو داره که اکثرا بین بیماران غیر مشترک هستند و اگر قرار باشه همشون رو در یک جدول ذخیره کنیم تعداد فیلد های بلااستفاده زیاد شده و باعث وجود سربار در اطلاعات میشه و کاربری رو هم سخت تر می کنه. در این صورت بهتره که از همین روش داینامیک برای ایجاد فیلدها استفاده کنید.
در غیر این صورت می تونید با همون یک جدول کار رو ادامه بدید و به طور مستقیم ستونهای جدول رو تغییر بدید. میتونید در سمت APPLICATION بعد از اینکه کاربر یک ستون اضافه کرد یک رویداد رو هم fire کنید و در سایر فرمها این رویداد رو هندل کنید و متناسب با ستون های جدول، فیلدهای فرم رو اضافه کنید. از SqlDependecy هم میتونید برای با خبر شدن از تغییرات استفاده کنید.
برای گرفتن ستون های جدول هم میتونید از Sys.Columns استفاده کنید.
ببینید امکان داره یک سری فیلد ها مشترک باشه و یک سری خاص خاص به اصطلاح واکنشی که بدن به داروهای شیمی درمانی نشون میده متفاوت است و این است کار منو سخت کرده
منظور تون درست متوجه نشدم اما با توجه به توضیحات میشه راهی به کار برد که از افزونگی داده ها جلوگیری کرد چون در روش اول افزونگی داده نداریم ولی نمیدونم چطور در یک سطر نتایج رو به اضافه مشخصات بیمار نمایش بدم
روش اول که در یک جدول پارمتر ها تعریف میشود و در جدول بعدی فقط برای هر بیمار پارامتر های مورد نیاز ذخیره میشه بشه استفاده کرد بهتره ولی ارتباط یک به چند میشه که من میخوام این چند سطر برای هر بیمار به اضافه مشخصات اصلی بیمار در یک سطر نمایش بدهم

روش دوم افزونگی داده داریم ولی مشکل خاصی نداره

Mahmoud Zaad
چهارشنبه 07 مرداد 1394, 12:51 عصر
شما توی جدول tblnewparameter یک نام فیلد فارسی دارید که برای نمایش استفاده میشه و یک نام فیلد انگلیسی که دقیقاً با نام ستون در جدول اصلی برابر هست. یعنی کاربر موقع تعریف پارامتر هم باید نام فارسی وارد کنه هم نام انگلیسی. توی جدول اصلی هم که مشکلی نیست و مثل سابق عمل میشه یعنی خاصیت HeaderText در ستون مورد نظر در دیتاگریدویو رو تنظیم می کنید.

jamal_ch
چهارشنبه 07 مرداد 1394, 13:07 عصر
شما توی جدول tblnewparameter یک نام فیلد فارسی دارید که برای نمایش استفاده میشه و یک نام فیلد انگلیسی که دقیقاً با نام ستون در جدول اصلی برابر هست. یعنی کاربر موقع تعریف پارامتر هم باید نام فارسی وارد کنه هم نام انگلیسی. توی جدول اصلی هم که مشکلی نیست و مثل سابق عمل میشه یعنی خاصیت HeaderText در ستون مورد نظر در دیتاگریدویو رو تنظیم می کنید.
چیزی که میگید کاملا درسته یعنی هم نام فارسی داریم هم نام انگلیسی و تو select چطور میشه استفاده کرد

چون تعداد ستون ها متغیره باید select all استفاده کنم وقتی میخواد بایند بشه تو گرید ویو من اطلاعی ندارم چه ستون هایی وجود دارد
مگر اینکه بیام یک datatabel استفاده کنم و تو اون بیام تک تک ستون ها رو به نام فارسی تغییر بدم به صورت مستقیم به نظرم راهی وجود نداره البته به نظر من

Mahmoud Zaad
چهارشنبه 07 مرداد 1394, 14:17 عصر
من الان امکان تست ندارم شما تست کنید ببینید می تونید فیلد نام انگلیسی در جدول tblnewparameter رو با فیلد Column_Name در sys.columns جوین کنید.

*************ویرایش

به نظر نمیرسه روش بالا جواب بده.
ظاهراً باید از همون دیتاتیبل استفاده کنید یعنی کل ردیفها از جدول tblnewparameter رو بخونید و مقدار فارسی رو به جای عنوان ستون قرار بدید. چون اسم ستونها در هر دو جدول یکی هست مشکلی هم پیش نمیاد.

SqlDataAdapter da = new SqlDataAdapter("SELECT paramEnName, paramFaName From tblnewparameter ", cn);

DataTable dt = new DataTable();
da.Fill(dt);

foreach (DataRow row in dt.Rows)
{
string _columnName = row["paramEnName"].ToString();
string _headerText = row["paramFaName"].ToString();
dataGridView1.Columns[_columnName].HeaderText = _headerText;
}

jamal_ch
پنج شنبه 08 مرداد 1394, 08:28 صبح
من الان امکان تست ندارم شما تست کنید ببینید می تونید فیلد نام انگلیسی در جدول tblnewparameter رو با فیلد Column_Name در sys.columns جوین کنید.

*************ویرایش

به نظر نمیرسه روش بالا جواب بده.
ظاهراً باید از همون دیتاتیبل استفاده کنید یعنی کل ردیفها از جدول tblnewparameter رو بخونید و مقدار فارسی رو به جای عنوان ستون قرار بدید. چون اسم ستونها در هر دو جدول یکی هست مشکلی هم پیش نمیاد.

سلام
ممنون که پیگیر بودید
من روش sys.columns تست کردم نتونستم چیزی سر در بیارم یعنی نشد حالا میرم سراغ پیاده سازی بازم متشکرم
اگه لطف کنید و یک ایمیل برام بفرستید ممنون میشم
jamal.chenaran@Gmail.com (jama.chenaran@Gmail.com)

Mahmoud.Afrad
پنج شنبه 08 مرداد 1394, 10:14 صبح
اگر بخواهی همه پارامترها رو در یک فیلد نمایش بدی خیلی راحت میتونی از FOR XML استفاده کنید.
http://stackoverflow.com/questions/23513394/how-to-merge-rows-into-single-column-using-for-xml-path-in-sql
http://stackoverflow.com/questions/16684743/concatenate-multiple-rows-in-one-row

اگر هم اصرار داری هر پارامتر در فیلد مجزا باشه بایست از dynamic query استفاده کنی که احتمال (خطر) sql injection توش هست.