1397-12-16 20:04 ذخیره اطلاعات در دیتابیس برنامه های تو در تو
booysusa

 
با درود خدمت مهندسی شریفی گرامی
من یک برنامه نوشتم که برای مدیریت مطب هست

در این برنامه کلی آیتم هست از جمله ذخیره اطلاعات بیمار، ذخیره مشخصات آزمایشات آن ها، ذخیره گواهی ها و حساب (بدهکاری و بستانکاری) و شرحی از بیمار و اطلاعات اعضای خانواده بیمار و...

در این برنامه از UserControl به دفعات استفاده شده
برنامه من به زبان سی شارپ و دیتابیس اون SqlExpress می باشد و با و یژوال استودیو نوشتمش

حال به یک مشکل بسیار اساسی بر خوردم به دلیل اینکه تا کنون اینچنین چیزی تو در تویی ننوشته ام

برای ذخیره اطلاعات مثلا من در یک فرم نام و مشخصات بیمار را نوشته ام با زدن دکمه ثبت اطلاعات در یک رکورد در دیتابیس ذخیره می شود، ولی من در یک UserControl دیگه میرم چطور میتونم ادامه عملیات کاربر رو انجام بدم
{ در یک فرم مثلا اطلاعات اولیه هست، در یک فرم اطلاعات دانشگاهی در یک فرم اطلاعات تماس در یک فرم اطلاعات برگ های بهداشت در یک فرم اطلاعات اعضای خانواده و در یک فرم اسکن مدارک بیمار }


نشد برنامه را اینجا ارسال کنم
برنامه برای شما ارسال شده است...
1397-12-17 19:12
حاجی شریفی
مؤسس سایت
 
سلام
یک روش مناسب برای استفاده از UserControl به عنوان Page های برنامه این است که زمان new کردن UserControl ها ، اشیاء و مقدار مهم و تاثیر گذار را به آنها بدهید...

مثلا فرم اصلی میتواند کدی شبیه این داشته باشد:
class  frmMain : Form {

public void OnShowPage(UserControl page)
{
this .panel1.Controls.Clear() ;
this .panel1.Controls.Add(page) ;
}

public void OnClosePage()
{
this .panel1.Controls.Clear() ;
}


حالا یک Page من که با اطلاعات یک مشتری کار میکند میتوانید شبیه این باشد
class  UserControlPage1 : UserControl {

private readonly frmMain m_MainForm ;
//private readonly EF6DatabaseContext m_DBContext ;
private readonly int m_CustomerID ;

public UserControlPage1(
frmMain mainForm,
//EF6DatabaseContext dbContext,
int customerID)
{
this .InitializeComponent() ;
this .m_MainForm = mainForm ;
//this.m_DBContext = dbContext ;
this .m_CustomerID = customerID;

//load data for 'm_CustomerID'
}


و اگر نیاز دارم در Page بالا وبرای ادامه کار Page دیگری باز کنم میتوانم کدی شبیه این بنویسم...
class  UserControlPage1 : UserControl {

private void A_Event(object sender, EventArgs e)
{
//...
//...
//save data for 'm_CustomerID'
//...
//...
//...

var page2 = new UserControlPage2(this .m_MainForm, /*this.m_DBContext,*/ this .m_CustomerID);
this .m_MainForm.OnShowPage(page2)
}


این ایده را بگیرید و بروید به نمونه تکامل یافته و خوبش برسید، به آن معماری DI میگوییم که البته dll هایی هم برای کمک به پیاده سازی این معماری وجود دارد ...
امیدوارم مشکل تان را درست متوجه شده باشم و توانسته باشم منظورم را صحیح منتقل کنم.
موفق باشید.
1397-12-18 07:59
booysusa

 
درود
بینهایت سپاس جناب حاجی شریفی گرامی، بهتر راهم را مشخص کردید ولی هنوز در حالت نامشخصی هستم
برنامه را نوشتم ولی در ساخت و طراحی دیتابیس و چند مورد دیگر مانده ام.

چندین سوال در ذهنم هست، که از ادامه کار دلسردم کرده است، (مانند 4 ماه آخر کنکور) هرچند مطمئنم برنامه را بلاخره تمام می کنم

اول اینکه: از چه بانک اطلاعاتی برای برنامه ام استفاده کنم
اس کیو ال سرور
اس کیو ال اکسپرس
اس کیو ال کامپکت
با علم به اینکه شاید روزی برنامه قسمت بخشنامه داشت و یک مدیر یا سازنده برنامه در هاست متنی نوشت و بشود همه کسانی که این برنامه را دارند آن متن را ببینند. یا مثلا تالار گفتگویی درون برنامه در آینده برای کاربران آن تشکیل داد.

دوم اینکه: عکس ها و Wordها و pdf ها و سایر اسناد را چگونه ذخیره کنم؟ در خود بانک اطلاعاتی یا در پوشه ای کنار برنامه اصلی (بیشتر مطالبی که خواندم تاکید این بود که پوشه ای کنار برنامه ساخته شود و اطلاعات در آنجا ذخیره بشود تا از حجیم شدن بانک اطلاعاتی برنامه جلوگیری بشود)

سوم اینکه: چطور کدها را بنویسم که بشود در User Contrl از آنها استفاده کنم

چهارم اینکه: بنظرتون به همین منوال Windows Forms برم جلو یا برنامه را از نوع WPF درست کنم؟


نشد برنامه را آپلود کنم
با عرض پوزش برنامه برای شما ارسال شد
1397-12-19 02:59
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
اول اینکه: از چه بانک اطلاعاتی برای برنامه ام استفاده کنم

نسخه Compact را فراموش کنید.
بقیه نسخه ها چندان فرقی ندارند،مخصوصا که شما میتوانید بدون تغییر برنامه و کدها بین آنها سوییچ کنید.
فقط ConnectionString را هارد-کد نکنید، یعنی مستقیم در کدهای CSharp تایپ نکنید.
حتما ConnectionString را از فایل بخوانید (مانند app.config)
اگر درست انجامش دهید، بدون تغییر برنامه میتوانید الان از نسخه LocalDB استفاده کنید و بعدا از Express و بعد از Enterprise و...
چون نیاز به تغییر در کدها ندارد، فعلا اینقدر مهم نیست که فکرتان را مشغول آن کنید.

برای کارکردن در یک رایانه LocalDB یا Express انتخاب خوبی هستند.

نقل قول نوشته شده توسط: booysusa
دوم اینکه: عکس ها و Wordها و pdf ها و سایر اسناد را چگونه ذخیره کنم؟

اگر میخواهید در پوشه ذخیره کنید،باید دقت کنید که مشکل تداخل نام برایتان رخ ندهد.
درضمن امکان کارکرد تحت شبکه تان هم سخت میشود که فعلا مهم نیست.

هر کدام را بلد هستید و راحت تر هستید،همان را انجام دهید ;)

نقل قول نوشته شده توسط: booysusa
سوم اینکه: چطور کدها را بنویسم که بشود در User Contrl از آنها استفاده کنم

واقعا متوجه سوال نمیشوم ...

نقل قول نوشته شده توسط: booysusa
چهارم اینکه: بنظرتون به همین منوال Windows Forms برم جلو یا برنامه را از نوع WPF درست کنم؟

قطعا WPF انتخاب بهتری است.
جدیدتر و پیشرفته تر است و امکانات بیشتری در اختیار شما قرار میدهد.
حتی شاید بتوانید به ASP.Net فکرکنید ... !!!

ولی...!

ولی این سوال از چه چیز ناشی میشود؟
گاهی مواقع ، گاهی مواقع سوالات شبیه این از خستگی، خدایی نکرده درماندگی ، فرار و... ناشی میشود...
اصلا بهتر نیست از فلان فریم-ورک استفاده کنم؟ از فلان زبان استفاده کنم؟ از فلان محیط استفاده کنم؟...

ایراد ندارد ولی برخی اوقات این سوالات ناشی از خستگی است و اینکه در شروع هستید و به خطا میخورید و شاید دقیق نمیدانید فلان کار را چطور انجام دهید و... و....
و این ایده به نظرتان میرسد که شاید مثلا از WinForm را WPF کنم یکباره همه مشکلات حل شود و بدون آنکه کاری کنم، همه چیز خودش درست شود، کارکند، اینقدر اذیت نشوم ...

تاکید میکنم که اگر میتوانید با WPF کار کنید و WPF یاد بگیرید، بهتر است.
ولی انتظار نداشته باشید که خطاها و تردیدها و سختی ها و مشکلات و... تان یکباره ناپدید شود.
این سنگریزه ها فقط با مطالعه و پشتکار و تمرین برطرف میشود.

موفق باشید.
1397-12-19 12:20
booysusa

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

نقل قول
سوم اینکه: چطور کدها را بنویسم که بشود در User Contrl از آنها استفاده کنم

نقل قول
واقعا متوجه سوال نمیشوم ...


قبلا فایل (.sln) خدمتتان ارسال شد
من نوشتن کد افزودن مخاطب را بلدم ، ولی چون این برنامه از چندین User Control استفاده شده است ، در نوشتن چنین کدی کمی مشکل دارم، امکانش هست اون فایلی که برای شما ارسال کردم را ویرایش کنید و مثلا افزدون مخاطب جدید را به شیوه ای ساده بنویسید، منظورم این هست که مثلا همه اطلاعات را وارد کنم و سپس دکمه ثبت را بزنم همه برای یک شخص ذخیره بشوند(در تکلمم سخت هست توضیحش واقعا )

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

امیدوارم بدرستی منظورم رو رسونده باشم
1397-12-20 03:45
حاجی شریفی
مؤسس سایت
 
سلام
فرصت کمی و چند مورد را هم باید آماده تحویل کنم... اجازه دهید حداکثر تا پنجشنبه-جمعه آن مورد افزودن مخاطب تان را نگاه میکنم که چطور انجام داده اید و اصلاحش میکنم...
شاید اگر مشکلی که میگویید در "مخاطب"وجود دارد حل شود، مشکلتان با آن چهار بخش دیگر هم برطرف شود و بتوانید خودتان آنها را هم به همین منوال انجام دهید.

شاید با تغییر کوچکی حل شود
موفق باشید وشب خوش.
1397-12-20 08:53
booysusa

 
بی نهایت سپاسگزارم
1397-12-22 22:07
booysusa

 
درود بر شما مهندس شریفی گرامی

با کلی سختی و عرق ریزی کدهارو نوشتم ، می فرستم خدمتتان لطفا بررسی کنید

البته فقط کدهای اطلاعات اولیه رو نوشتم و یک صفحه دیگه هست که نمی دانم چطور صفحه هارو به هم وصل کنم
1397-12-26 20:53
booysusa

 
با درود خدمت همگی دوستان به ویژه مهندس شریفی گرامی

با راهنمایی های شما متوجه شدم در این مرحله با توجه به دانش فعلی خودم 3 راه دارم

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

راه دوم:
استفاده از Panel ها در یک فرم و وارد کردن همه عناصر در همان فرم هست و با زدن هر باتون، یک سری اطلاعات وارد کنم و در پایان دکمه ثبت را بزنم و همه اطلاعات وارد شده را باهم در دیتابیس ذخیره کنم، این کار کمی منطقی هست ولی ساخت همه فرم ها و پنل ها در یک فرم کمی غیر استاندارد و در آینده هزینه بر خواهد بود و در صورتی که فرم اصلی مشکلی برایش پیش بیایید همه پنل ها از بین خواهند رفت چون همه در فرم اصلی اطلاعات طراحی شده اند

راه سوم:
همانUser Controlها و استفاده از روش شما که هم بسیار عالی و هم درست می باشد، ولی کمی در شیوه کدنویسی دچار مشکل شدم، شیوه کدنویسی من اندکی تفاوت دارد، فایل برنامه به همراه شیوه کدنویسی من ، خدمتتان ارسال شد، در صورت امکان لطفا بررسی کنید

بجز این موارد راهی دیگه ای هم هست؟


بی نهایت سپاس
1398-01-03 01:59
حاجی شریفی
مؤسس سایت
 
سلام
سال جدید و نوروز را خدمت شما و سایر دوستان تبریک عرض میکنم.
از بابت تاخیر در پاسخ هم عضر خواهی میکنم.
----------
این سوالات بیشتر در مورد Layout بندی و چیدمان عناصر است ولی به نظر میرسد تردیدهایی در مورد شیوه ارتباط بخش ها و کدنویسی هم وجود دارد.

در مورد شیوه طرح بندی میتوانید ازبرنامه های موجود الگو برداری کنید.
داشتن منو به طرح بندی فرامین برنامه تان در یک شرایط سلسه مراتبی کمک میکند
البته بجای منو سنتی میتوانید از الگوهایی شبیه منو Start جدید Win10 هم ایده برداری کنید.
ولی در کل اگر بتوانید از UserControl ها استفاده کنید ، در شفافیت کد و تفکیک بخش ها و وظایف خیلی میتواند کمک کند.

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

نکته دیگری که در پروژه تان باید یادآوری کنم، آن است که بنظر میرسید، اطلاعات اضافه زیادی دریافت میکنید.
باید دقت که محله تحلیل قبل طراحی برنامه وجود دارد.
شما در این مرحله باید دقیق نیازمندی مشتری را استخراج کنید (حالا مشتری آشنا باشد یا نباشد فرقی ندارد)
روش های کمکی زیادی وجود دارد ولی در کل باید دقت کنید نیاز مشتری را کمتر و یا خیلی بیشتر از واقع تحلیل نکنید !

شاید در یک گفتگوی عادی شما به کارفرمایتان بگویید: میخواهید فلان دیتا را هم ذخیره کنیم؟ آن یکی دیتا چطور؟ فلان چیز را هم ذخیره کنیم؟
و جوابی که خواهید گرفت آن باشد که : خوب است، بد نیست، ضرر ندارد، نخواستیم پرش نمیکنیم!
ولی این موارد به انبوهی از فیلدها منتهی میشود که هیچگاه پر نخواهد شد و هم برنامه را برای شما و هم برای مشتری تان پیچیده میکند.
درحالیکه برنامه شما میتواند خیلی ساده تر باشد ولی باعث میشود ظاهری شبیه کنترل پنل هواپیما بویینگ پیدا کند !

برای استخراج صحیح فیلدها ضمن مصاحبه شفاهی، میتوانید از نمونه فرم ها و سربرگ های کاغذی پرشده آن مجموعه استفاده کنید تا دقیق تر مشخص شود چه فیلدهایی را استفاده کرده و نیاز دارند.
1398-01-03 11:23
booysusa

 
سپاس بیکران جناب حاجی شریفی گرامی

همچنین سال نو بر شما و خانواده محترم و سایر خوانندگان همایون باد
سال پر رونقی در کسب و کار و سرشار از تندرستی برای شما و سایر دوستان آرزومندم



نقل قول
این سوالات بیشتر در مورد Layout بندی و چیدمان عناصر است ولی به نظر میرسد تردیدهایی در مورد شیوه ارتباط بخش ها و کدنویسی هم وجود دارد.

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

قطعا اگر لطف کنید لینک های بهتری بدهید، مطالعه خواهم کرد تا با دید باز روش های بهتری استفاده کنم


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

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



نقل قول
نکته دیگری که در پروژه تان باید یادآوری کنم، آن است که بنظر میرسید، اطلاعات اضافه زیادی دریافت میکنید.

بله این برنامه دارایی کلی اطلاعات اضافی می باشد، ما برآورد می کنیم که قطعا بیشتر این موارد پر خواهند شد

ولی نگرانی اصلی اینجا هست که آیا اگر در آینده به این نتیجه رسیدیم که فیلدهای بیشتری میخواهیم یا یکسری فیلدها بلااستفاده هست و باید حذف بشوند، تکلیف دیتابیس چه میشود، مثلا با به روز رسانی برنامه و جای گذاری دیتابیس قدیمی در محل دیتابیس برنامه جدید، تکلیف انتقال اطالاعات جدید و قدیم چه میشود؟ چطور برای مشتری برنامه ای طراحی کنم که به صورت ساده انتقال اطلاعات از دیتابیس قدیمی به جدید بدهد؟ شوربختانه معمولا من بصورت دستی دیتابیس رو توی برنامه جدید می گذارم

حال با این همه نگرانی در حال پیش بردن برنامه هستم
1398-01-03 14:41
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
...لینک های بهتری بدهید...

پروژه های خوب متن-باز زیادی وجود دارد ولی شاید کمی پیچیده باشند ...

مثلا برنامه معروف MediaPortal جهت نمایش فیلم و پخش تلویزیون و.... متن-باز است و سورسش هم قابل دانلود و مشاهده است:
https://www.team-mediaportal.com

یا خود برنامه NuGet Package Explorer که برای تولید بسته های nuget است و متن-باز هم است.
https://github.com/NuGetPackageExplorer/NuGetPackageExplorer

یا برنامه قدیمی SharpDevelop که دقیق شبیه خود VisualStudio است که با CSharp نوشته شده و متن-باز است.
http://www.icsharpcode.net/OpenSource/SD/Default.aspx

و...

نقل قول نوشته شده توسط: booysusa
...کلیف دیتابیس چه میشود...

مشکلی نیست،برنامه ها مدام در حال تغییر و تکامل هستند و قطعا دیتابیس در این روند تکاملی ، تغییر میکند.
در مورد دیتابیس باید Upgrade انجام دهید.
اگر تعداد نصب کم و خاص است میتوانید یک Backup از دیتابیس اصلی بگیرید و یکراست تغییرات را در دیتابیس اصلی اعمال کنید.
یعنی بروید در دیتابیس اصلی ستونی زیاد یا کم کنید.

در مواردی که برنامه گسترده است و برای تعداد مشتریان زیادی نصب شده است، باید یک Script بروزرسانی تهیه شود.
یعنی یک فایل SQL با دستورات DDL ای شبیه این

ALTER TABLE tablename ADD newcolumn ...

ALTER TABLE tablename DROP COLUMN oldcolumn ...


یا دستوراتی که دیتای جداول قدیم را روی جداول جدید کپی کند

INSERT INTO newtable (...) SELECT ... FROM oldtable ...


چون فعلا شما قصد نصب و استفاده در یک مکان را دارید، روش اول برایتان ساده تر است.
انشاا... بعد که برنامه تان به یک ثبات نصبی رسید و چند ماه عملا کار کرد و مشکلات اش در آمد و حل شد، آنگاه میتوانید روی نصب نسخه قابل اطمینان موجود در جاهای دیگر هم کار کنید.

ولی داشتن تعداد بسیار زیاد فیلدی که هیچگاه استفاده نمیشود، هم کار شما و هم کار کاربران برنامه شما را مشکل میکند.
من که هرچه دکتر رفته ام، انقدر سرشان شلوغ بوده که به ورود اطلاعات اینچنین نمیرسیده.
حتی در برخی جاها هم که خیلی رایانه ای بودند برای تایپ دستور دکتر بجای کیبورد و دکمه و Textbox و... از قلم نوری و پد استفاده میکردند تا فقط دست-خط دکتر را به صورت تصویری ذخیره کنند .... !