# Native Code > برنامه نویسی در Delphi > توسعه نرم افزارهای تحت شبکه >  اتوماسیون اداری-گردش کار

## program103

سلام
می خوام یه برنامه بنویسم که روند کار یه مجموعه را paperless کنه که گردش کار رو هم شامل می شه . تقریبا یه برنامه اتوماسیون اداری به همراه گردش کار هست. حالا چند تا سوال:
1. برنامه کلاینت سرور هست. من با دلفی بخوام بنویسم باید یه برنامه واسه کلاینت ها و یکی واسه سرور باشه؟؟ همه یه نوع عملیات رو انجام میدهند و بانک sql server  هم که روی سرور هست و داده ها در اون مجتمع هست. آیا باز هم باید نسخه سرور برنامه متفاوت باشه؟
2.اطلاعاتم درباره برنامه ای که  قراره تحت شبکه اجرا بشه کمه. واسه عدم همزمانی باید چکار کنم. آیا این که من بانکم sql server  باشه و یه exe از برنامم روی همه کلاینت ها باشه کافیه و برنامه خوب عمل میکنه؟؟
3.این برنامه با ASP.Net نوشته بشه راحتتر هست یا دلفی؟(میدونم اینجا تالار دلفی هست ولی نمیدونم سوالم رو کجا بپرسم که هم دلفی کار ها بخونند هم ASP کار ها) اگر کسی میدونه لطفا راهنمایی کنه.

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

----------


## program103

یه نکته که لازمه بگم اینه که برنامه تحت شبکه LAN قراره کار کنه و کلاینتها هم 5-6 تا بیشتر نیستند.
لطفا یکی راهنمایی کنه

----------


## Mask

> ه مجموعه را paperless کنه


اول بفرمایید این یعنی چی؟

----------


## program103

> اول بفرمایید این یعنی چی؟


paperless  یعنی حذف کاغذ. همه کارهای مجموعه اتوماته بشه. همون اتوماسیون  :لبخند:

----------


## Mask

> 1. برنامه کلاینت سرور هست. من با دلفی بخوام بنویسم باید یه برنامه واسه کلاینت ها و یکی واسه سرور باشه؟؟


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



> اطلاعاتم درباره برنامه ای که قراره تحت شبکه اجرا بشه کمه. واسه عدم همزمانی باید چکار کنم. آیا این که من بانکم sql server باشه و یه exe از برنامم روی همه کلاینت ها باشه کافیه و برنامه خوب عمل میکنه؟؟


اینجا بازم موضوع قبل مطرحه. اگه فقط کار با بانک اطلاعاتیه برنامه sql server همه مدیریتها رو انجام میده وگرنه ...




> 3.این برنامه با ASP.Net نوشته بشه راحتتر هست یا دلفی؟(میدونم اینجا تالار دلفی هست ولی نمیدونم سوالم رو کجا بپرسم که هم دلفی کار ها بخونند هم ASP کار ها) اگر کسی میدونه لطفا راهنمایی کنه.


این سوال زیاد معنی و مفهومی نداره. از من که با دلفی کار میکنم و این زبان رو یاد گرفتم ، بپرسند ، مسلما میگم دلفی و از اون بنده خدایی که ASP کار کرده میگه ...




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


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

----------


## program103

آقا یا خانم gold بابت پاسختون ممنون.
چند تا نکته رو می خواستم بگم. 
در پاسخ به سوال اول: برنامه من گردش کار اسناد تصویری و متنی رو قراره پیاده سازی کنه که تو یه شبه شبکه(workgroup)قراره اجرا بشه و کارش هم شبیه به همه اتوماسیون های اداری هست. کاربران کارتابل داشته باشند و اجازه ارجاع اسناد داده بشه و کارهایی از این دست. متوجه منظورتون نشدم. منظورتون از کارهای کنترلی چیه؟؟
در پاسخ به سوال دوم هم حق با شماست ولی من توضیح داده بودم می خوام کسایی جواب بدند که هم دلفی کار کرده باشند و هم ای اس پی که کامل واقف باشند به هر دو زبان.
و آخرین سوال هم میدونم زمان میگیره ولی به هر حال باید از یه جایی شروع کرد. حالا از دوستانی که کار کردند راهنمایی می خوام واسه مقاله یا کتابی که روان و واضح توضیح داده باشه.
بازم ممنون. از دوستان اگر کسی اطلاعاتی داره لطفا پاسخ بده.

----------


## tiphooo

دوست عزیز اگر برنامه شما قرار نیست تحت web اجرا بشه نیازی به ASP نیست و اگر قراراه کاربران در منزل هم بتوانند در منزل هم کارتابل خود را ببینند و با نامه ها جواب بدهند یا نامه جدید ایجاد کنند به نظر من با #C و ASP این کار راحت تر است و با دلفی مشکلات زیادی خواهی داشت چون مباحث برنامه های تحت وب در اینجا یک مقدار پیچیده هستند (البته به دلیل عدم وجود منابع فارسی نه کارایی خود دلفی ) ولی اگر برنامه تحت شبکه محلی قرار است اجرا شود دلفی بهترین گزینه است و نیازی به دو برنامه نیست (کلاینت و سرور) یک برنامه کافیست . مشکل همزمانی را هم نفهمیدم منظورتان چیست .
در کل در برنامه های تحت وب اگر بتوانید Interface شما ویندوزی باشد و ارتباطات شما فقط WebBase باشد . اکثر برنامه  نویسان وب کار معمولا این کار را نمی کنند و همه چیز را تحت وب پیاده سازی می کنند و در این حالت طراحی اینترقیس تحت وب مشکل خواهد بود و به نوعی برنامه نویسانی که به کامپوننت عادت دارند به شدت اذیت می شوند.
شما قبل از هر چیز به نظر من باید با سازمان مربوطه بر سر وب و ویندوزبودن برنامه به توافق رسیده و بعد میزان تسلط خود را در هر کدام بسنجید و در کل هیچکدام به قابلیتهای زبان های برنامه نویسی بر نمی گردد و به قابلیت شما بر می گردد معمولا با تمام زبانهای رایج همه کار می شه کرد بستگی به برنامه نویسش داره

----------


## program103

> دوست عزیز اگر برنامه شما قرار نیست تحت web اجرا بشه نیازی به ASP نیست و اگر قراراه کاربران در منزل هم بتوانند در منزل هم کارتابل خود را ببینند و با نامه ها جواب بدهند یا نامه جدید ایجاد کنند به نظر من با #C و ASP این کار راحت تر است و با دلفی مشکلات زیادی خواهی داشت چون مباحث برنامه های تحت وب در اینجا یک مقدار پیچیده هستند (البته به دلیل عدم وجود منابع فارسی نه کارایی خود دلفی ) ولی اگر برنامه تحت شبکه محلی قرار است اجرا شود دلفی بهترین گزینه است و نیازی به دو برنامه نیست (کلاینت و سرور) یک برنامه کافیست . مشکل همزمانی را هم نفهمیدم منظورتان چیست .
> در کل در برنامه های تحت وب اگر بتوانید Interface شما ویندوزی باشد و ارتباطات شما فقط WebBase باشد . اکثر برنامه  نویسان وب کار معمولا این کار را نمی کنند و همه چیز را تحت وب پیاده سازی می کنند و در این حالت طراحی اینترقیس تحت وب مشکل خواهد بود و به نوعی برنامه نویسانی که به کامپوننت عادت دارند به شدت اذیت می شوند.
> شما قبل از هر چیز به نظر من باید با سازمان مربوطه بر سر وب و ویندوزبودن برنامه به توافق رسیده و بعد میزان تسلط خود را در هر کدام بسنجید و در کل هیچکدام به قابلیتهای زبان های برنامه نویسی بر نمی گردد و به قابلیت شما بر می گردد معمولا با تمام زبانهای رایج همه کار می شه کرد بستگی به برنامه نویسش داره


tiphooo عزیز ممنون از راهنماییتون. برنامه من قراره تحت یه شبکه داخلی اجرا بشه و قرار نیست کاربران از خونه به نامه ها جواب بدهند. پس دلفی بهترین گزینه هست. و نیازی به دو برنامه کلاینت و سرور هم نداره. تا اینجا درسته؟؟
بحث همزمانی هم منظور اینکه کلاینت ها همزمان یک سند را ویرایش  کنند. با این چی کار کنم؟؟ قبلا تو همین سایت خوندم که وقتی کاربری داره یک سند را ویرایش می کنه باید دیتابیس قفل(lock) بشه. میشه راهنمایی کنید؟؟

----------


## tiphooo

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

----------


## program103

ممنون از لطفتون. 
من سایت رو زیر و رو کردم ولی یه سری مسائل واسم مبهمه هنوز.
1.برنامه من به گفته خودتون نیاز به دو نسخه کلاینت و سرور نداره. تو یک workgroup کوچیک هم قراره اجرا بشه. حالا واسه امنیت اطلاعاتم باید چکار کنم؟؟
یه تاپیک خوندم تو سایت که نوشته بود از Active Directory استفاده کنید. من که برنامم تحت یه نیمچه شبکه می خواد اجرا بشه چی؟؟؟
برای دسترسی کاربرام چکار باید بکنم؟؟

----------


## tiphooo

دیتابیس برنامه شما قراره که بر روی سرور باشه و کلاینتها توسط برنامه شما به آن وصل شوند پس نوع شبکه داخلی شما ربطی به برنامه ندارد اینکه domain باشد یا workGroup کلاینتها از طریق یک کانکشن به سرور وصل می شوند و در مورد بحث امنیت و کنترل دسترسی اینکه :
کنترل امنیت برنامه کاملا دست شماست و با تعریف سطوح دسترسی برای هر کاربر یا گروه کاربران شما باید محدوده فعالیت هر کاربر را مشخص کنید . البته در اتوماسیون علاوه بر کنترل سطوح دسترسی شما باید کنترل سطوح ارجاعات را نیز در نظر بگیرید مثلا اینکه هر کاربر به چه کسانی می تواند نامه بدهد به عنوان مثال یک اقدامگر نمی تواند مستقیم به مدیر عامل نامه بزند. شما باید گروههای کاربری تعریف کنید که هر کدام بتوانند به صورت محدود و در حوزه فعالیت خودشان نامه ها را ببینند و یا به نامه ها جواب بدهند شما قبل از هر چیز باید چارت سازمانی اداره یا شرکت مورد نظر را پیاده سازی کنید و سلسله مراتب نامه نگاری را مشخص کنید . تعریف چارت سازمانی یکی از بخشهای اولیه طراحی این سیستم است.
و با تعریف هر کاربر باید مشخص کنید که این کاربر در کجای این چارت سازمانی قرار می گیرد و معمولا لایه های بالاتر می توانند به تمام لایه های هم سطح و یا زیر دست نامه بزنند ولی لایه های پائین دست فقط به یک لایه بالاتر خود می توانند نامه بزنند مثلا اگر قرار است نامه ارجاع داده شود شما با توجه به اینکه کاربر در چه سطحی قرار دارد باید فقط لیست کاربرانی که در یک سطح بالاتر و یا سطوح پائین تر و هم سطح هستند نمایش دهید تا کاربر یکی از آنها را انتخاب کند
و برای نمایش کارتابل هم فقط نامه هایی را نمایش دهید که به این کاربر ارجاع داده شده و از نمایش سایر نامه ها جلوگیری کنید 
البته اینکه هر کاربر و یا سطح کاربری به چه کسانی می تواند نامه بزند را باید دست Admin سیستم بدهید شاید جایی بخواهد تا دو سطح و یا بیشتر را دسترسی بدهد
در کل اینکه خودتان را درگیر اصطلاحات عجیب و غریب نکنید شما قرار است یک برنامه ساده تحت شبکه در دلفی پیاده سازی کنید و نیاز به مکانیزم خاصی ندارید تعداد نامه های ارسالی و دریافتی توسط هر کاربر به قدری کم است (کمتر از 100 یا 200 نامه در روز) که اینجا اصلا بحث سرعت هم مطرح نخواهد بود
و اینکه در صورتی که قرار است فایل نامه ها را نیز ذخیره کنید در ابتدای کار مشخص کنید که می خواهید در دیتابیس ذخیره شود و یا بر روی فولدری در شبکه
هر کدام از این دو روش جای بحث دارند
سوالی بود بگودید تا جواب بدهم

----------


## program103

> کنترل امنیت برنامه کاملا دست شماست و با تعریف سطوح دسترسی برای هر کاربر یا گروه کاربران شما باید محدوده فعالیت هر کاربر را مشخص کنید . البته در اتوماسیون علاوه بر کنترل سطوح دسترسی شما باید کنترل سطوح ارجاعات را نیز در نظر بگیرید مثلا اینکه هر کاربر به چه کسانی می تواند نامه بدهد به عنوان مثال یک اقدامگر نمی تواند مستقیم به مدیر عامل نامه بزند. شما باید گروههای کاربری تعریف کنید که هر کدام بتوانند به صورت محدود و در حوزه فعالیت خودشان نامه ها را ببینند و یا به نامه ها جواب بدهند شما قبل از هر چیز باید چارت سازمانی اداره یا شرکت مورد نظر را پیاده سازی کنید و سلسله مراتب نامه نگاری را مشخص کنید . تعریف چارت سازمانی یکی از بخشهای اولیه طراحی این سیستم است.
> و با تعریف هر کاربر باید مشخص کنید که این کاربر در کجای این چارت سازمانی قرار می گیرد و معمولا لایه های بالاتر می توانند به تمام لایه های هم سطح و یا زیر دست نامه بزنند ولی لایه های پائین دست فقط به یک لایه بالاتر خود می توانند نامه بزنند مثلا اگر قرار است نامه ارجاع داده شود شما با توجه به اینکه کاربر در چه سطحی قرار دارد باید فقط لیست کاربرانی که در یک سطح بالاتر و یا سطوح پائین تر و هم سطح هستند نمایش دهید تا کاربر یکی از آنها را انتخاب کند
> و برای نمایش کارتابل هم فقط نامه هایی را نمایش دهید که به این کاربر ارجاع داده شده و از نمایش سایر نامه ها جلوگیری کنید 
> البته اینکه هر کاربر و یا سطح کاربری به چه کسانی می تواند نامه بزند را باید دست Admin سیستم بدهید شاید جایی بخواهد تا دو سطح و یا بیشتر را دسترسی بدهد


مشکل من در پیاده سازی این سلسله مراتب امنیتی هست. از لحاظ تحلیل دیتا بیسی مشکل پیدا کردم. ببینید این سازمان یه مجموعه کوچیک هست که همه کارمندان که کمتر از 7-8 تا هستند می توانند با هم در تعامل و نامه نگاری باشند.ولی میزان دسترسی به برنامه براشون یکسان نیست. یعنی مثلا مدیر مالی به بخش مالی برنامه دسترسی داره و نه به بخش مثلا مشترکین. و یه admin دارم که به کل بخش ها دسترسی داره و همه چی زیر نظر او هست. حالا من میخوام هر فرم، یا خاصیت رو امکان دسترسی براش بذارم. یعنی عملیات اصلی برنامه مثل insert-delete-update-fullcontrol رو برا هر جدول و فرم محدود کنم و امکان دسترسی براش بذارم. چطور باید بانکش رو ایجاد کنم. تو برنامه چطور پیادش کنم؟؟ از role ها و user های sql server  باید استفاده کنم؟؟ 
من دفعه اولم هست که می خوام دسترسی تو برنلمه به این شکل پیاده کنم واسه همین گیج شدم.لطف می کنید که راهنمایی می کنید.ممنون

----------


## tiphooo

شما نیازی نیست از user های SQlServer استفاده کنید و جوابگوی شما هم نخواهد بود 
ساده ترین راه برای مورد شما این است که یک جدول برای فرمهایتان در نطر بگیرید
با مقادیر کد فرم ، نام فرم
ویک جدول هم برای کاربران با مقادیر کد کاربر ، نام کاربر ، کلمه عبور
یک جدول دیگر برای دسترسی لازم دارید با مقادیر
کد فرم ، کد کاربر ، امکان اضافه ، امکان حذف ، امکان نمایش ، امکان ویرایش 
در جدول اول برای هر فرمی که در برنامه ایجاد کردید یک کد اختصاص دهید (مثلا کد را در Tag فرم قرار دهید از یک عددی شروع کنید و به ازاء هر فرم یک واحد اضافه کنید) حال این کد با عنوان فرم ایجاد شده را به صورت دستی در دیتابیس قرار دهید
فرم پر کردن اطلاعات کاربران هم فکر نکنم کار مشکلی باشد که بخواهم توضیح بدهم
یک فرم هم برای دسترسی در برنامه تعریف کنید که دو جدول کاربران و فرمها را در کنار هم قرار داده و با انتخاب کاربر اسامی فرمها نمایش داده شود
اگر قرار است که کاربری به یک فرم همه دسترسی ها را داشته باشد 
کد فرم و کد کاربر و برای هر دسترسی یک مقدار (صفر و یک ) وارد کنید
مثلا 
کد فرم                 کد کاربر                 اضافه                   حذف                  ویرایش              نمایش
100                          1                        1                       1                         1                     1
ولی صفر و یک کردن این دسترسی ها را در فرمتان با CheckBoc طراحی کنید بهتر است
حال در زمان فراخوانی هر فرم Tag فرم و کد کاربر را با جدول دسترسی مقایسه کنید و در برنامه مشخص کنید مثلا اگر دکمه اضافه طراحی کرده اید اگر مقدار اضافه 1 است آن دکمه را Enable و در غیر اینصورت Disable کنید
راه حل های دیگری هم وجود دارد که من بخ سادترین شکل آن برای برنامه شما و با توجه به اینکه تجربه قبلی در این زمینه نداشتید این راه رو توصیه می کنم قطعا اگر این رو پیاده سازی کنید خودتان راه حلهای بهتر را خودبخود یاد خواهید گرفت الیته نه اینکه این راه حل بد باشد بلکه ممکن است در جای دیگری مجبور به تغییرات باشید ولی در اینجا جواب می دهد

----------


## program103

مجددا سلام.
از لطف شما واقعا ممنونم.ببخشید که اینقدر سوال می پرسم ولی واقعا برا نوشتن این برنامه استرس دارم و نیاز دارم یه نفر راهنماییم کنه.(اولین برنامه اجرایی من هست که دارم به تنهایی می نویسم.)
چند تا سوال دیگه دارم.
1.
exe برنامه رو باید روی همه کلاینتها کپی کنم و بانک اطلاعاتی روی sql server سرور نصب می شه و با تغییر connection string همه کلاینتها از سیستم خودشان به بانک اطلاعاتی که روی سرور هست وصل میشوند و نیازی به نصب sql server روی همه کلاینتها نیست؟؟؟ و برنامه را طوری باید بنویسم که انگار میخواد روی یه سیستم اجرا بشه. با برنامه های غیر تحت شبکه هیچ فرقی نمیکنه.درسته؟؟؟
2.



> در جدول اول برای هر فرمی که در برنامه ایجاد کردید یک کد اختصاص دهید  (مثلا کد را در Tag فرم قرار دهید از یک عددی شروع کنید و به ازاء هر فرم  یک واحد اضافه کنید) حال این کد با عنوان فرم ایجاد شده را به صورت دستی در  دیتابیس قرار دهید


میشه بگید تگ فرم منظورتون کجاست؟؟یعنی منظورتون اینه که به صورت توضیحات واسه خودم بنویسم؟؟
3.
یه سوال دیگه اینکه اگر بخوام برنامم رو شی گرا بنویسم. یعنی از کلاس ها استفاده کنم، استاد ما می گفت به ازای هر جدول در دیتا بیس یه کلاس تعریف کنید. می خوام ببینم از لحاظ عملی این درسته ؟؟
اگر این موضوع درسته که بار کدنویسی من کم نمیشه که.مثلا واسه ثبت کاربر من کد را در کلیک دکمه بنویسم یا در قالب یه کلاس. چه فرقی داره؟؟

یه توضیح بدم. من 4عمل اصلی بر روی همه جداول را با SP می نویسم. و خیلی کد تو دلفی نمیزنم.حالا برنامه را با کلاس پیاده کنم یا نه فرقی هم می کنه؟؟

----------


## barnamenevisforme

> چند تا سوال دیگه دارم.
> 1.
> exe برنامه رو باید روی همه کلاینتها کپی کنم و بانک اطلاعاتی روی sql server سرور نصب می شه و با تغییر connection string همه کلاینتها از سیستم خودشان به بانک اطلاعاتی که روی سرور هست وصل میشوند و نیازی به نصب sql server روی همه کلاینتها نیست؟؟؟ و برنامه را طوری باید بنویسم که انگار میخواد روی یه سیستم اجرا بشه. با برنامه های غیر تحت شبکه هیچ فرقی نمیکنه.درسته؟؟؟
> 2.
> میشه بگید تگ فرم منظورتون کجاست؟؟یعنی منظورتون اینه که به صورت توضیحات واسه خودم بنویسم؟؟


سلام
جواب سوال اولتون رو خودتون دادید.[,جواب سوال دوم اینکه tag مشخه ای(property)که همه کنترل ها اونو دارا هستن و میشه اشیا رو در اون نگهداری کرد و در جای نیاز از اون استفاده کنیم.یا به عبارتی این شئ رو از این طریق پاس میدیم.

ولی اینکه چکار کنیم که اگه یه وقت سرورمون رو خواستیم عوض کنیم.connectionstrin رو بر اساس اون تنظیم کنیم این یه سواله.البته یه راهش اینه که توی setting برنامه connectionstrinتعریف شده رو از نوع connectionstring به string تغییر بدیم تا سطح تغییراتش بشهuserبعد هنگام اجرای برنامه میتونیم تنظیم ها رو از کاربر بگیریم و توی این به اصطلاحconnectionstring ذخیره کنیم.ولی تویmsdnاین راه رو از لحاظ امنیتی توصیه نمیکنه.

یه سوال دیگه اینکه بعد از راه اندازی sqlserverروی سرور تنظیم های امنیتی سرور در بخش group policy باید چطور باشه؟همچنین در بخش sql server security

----------


## tiphooo

در مورد ایجاد کلاس اینکه شما نیازی به این کارها ندارید شما کلاس را زمانی ایجاد می کنید که آن کلاس وجود ندارد برای مسائل ساده ای مانند insert ,Updata معمولا کلاس و اینجور چیزها ایجاد نمی کنند
سوال اول و دومتون رو هم دوستمون جواب دادن
شما برای ذخیره connectionString چند روش دارید .
ذخیره آن را در داخل سورس برنامه کاملا فراموش کنید چون اگر اسم سرور یا دیتابیس یا پسورد عوض شود شما حتما باید برنامه را مجدد کامپایل کنید
اگر مهم نیست چه کسانی بخواهند از برنامه شما استفاده کنند یعنی از برنامه استفاده تجاری ندارید از udl استفاده کنید یعنی یک فایل text ایجاد کنید و پسوند آن را به جای txt به udl تغییر دهید حال اگر بر روی فایل ایجاد شده دو بار کلیک کنید ساخت connectionstring موجود در دلفی را همینجا می توانید انجام دهید
حال باید در دلفی در connectionstring به جای استفاده از use connection string از گزینه بالایی آن یعنی Use data Link File که udl مخخف آن است استفاده کنید و فایل ایجاد شده  (همان فایل udl)را در این قسمت انتخاب کنید حال از بیرون برنامه اجرایی می توانید connectionstring را عوض کنید به هر سرور و دیتابیس و یا انواع مختلف دیتابیس را
ولی فراموش نکنید اینجا آدرس مستقیم قرار ندهید و برای دادن آدرس فایل با استفاده از کدنویسی مثلا همیشه مسیر فایل اجرایی برنامه را بدهید.
روش دوم استفاده از ini فایلها می باشد که تقریبا شبیه همین udl است با این تفاوت که همه چیز از طریق کدنویسی است ولی می توانید مشخصات سرور و دیتابیس و ... را رمزگذاری کنید (جهت محافظت ) 
روش سوم ذخیره connectionstring در registry به صورت کد شده و یا عادی می باشد که مثلا connectionstring برنامه را داخل یک کلید خاص ذخیره کرده اید و هر بار آن را فراخوانی می کنید
بعضی از قفلهای سخت افزاری هم connectionstring را به روشهای مختلف داخل قفل سخت افزاری قرار می دهند
گزینه مناسب به نظر من رجیستری ویندوز می باشد
هر کدام از روشها که مدنظرتان بود بگوئید تا بیشتر توضیح بدهم

----------


## barnamenevisforme

سلام دوباره
در مورد تنظیمات امنیتی group policy و معرفی user به sql server هم اگه ممکنه توضیح بدید.البته درحالتی که از windows authentication استفاده کرده باشیم.
ممنون

----------


## program103

> هر کدام از روشها که مدنظرتان بود بگوئید تا بیشتر توضیح بدهم


من می خوام برنامم رو واسه یه مجموعه بنویسم پس مورد اول منتفی میشه. میمونه استفاده از ini یا رجیستری. هر کدام که خودتون به نظرتون بهتره از همه لحاظ، امنیت و... لطف کنید و توضیح دهید. ممنون

----------


## program103

tiphooo جان نمیشه توضیحاتی که گفته بودید رو زحمتشو بکشید؟؟؟
یه سوال دیگه، من برای ارسال نامه و فایل ها تو شبکه چکار باید بکنم؟؟ از Indy یا socket  باید استفاده کنم؟؟ یعنی یه نامه که قراره ارجاع داده بشه بین کلاینتها با توجه به این که همه کلاینتها از یک دیتابیس استفاده می کنند(دیتابیسی که روی سرور هست) باز هم باید از socket واسه جا به جاییش استفاده کرد؟؟
اطلاعات محدود من میگه که اولین بار که نامه یا قراردادی قراره تو برنامه وارد بشه توسط شخص اول تو دیتابیس ذخیره میشه و بعد در هر تغییر توسط کلاینتها، آپدیت میشه.درسته؟ ولی نمیدونم واسه همین آپدیت باید فایل بین برنامه من در سیستم کلاینت و دیتابیس در سرور با socket یا indy جا به جا بشه یا نه؟

----------


## program103

من به این اطلاعات نیاز دارم. اساتید محترم لطف نمیکنند راهنمایی کنند؟؟!!

----------


## BORHAN TEC

> از Indy یا socket  باید استفاده کنم؟؟


از هر روشی که دوست دارید، Indy، RemObjects SDK و ... .



> یعنی یه نامه که قراره ارجاع داده بشه بین کلاینتها با توجه به این که همه  کلاینتها از یک دیتابیس استفاده می کنند(دیتابیسی که روی سرور هست) باز هم  باید از socket واسه جا به جاییش استفاده کرد؟؟


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



> اطلاعات محدود من میگه که اولین بار که نامه یا قراردادی قراره تو برنامه  وارد بشه توسط شخص اول تو دیتابیس ذخیره میشه و بعد در هر تغییر توسط  کلاینتها، آپدیت میشه.درسته؟


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



> ولی نمیدونم واسه همین آپدیت باید فایل بین برنامه من در سیستم کلاینت و دیتابیس در سرور با socket یا indy جا به جا بشه یا نه؟


انتخاب این مورد به انتظارات شما از برنامه بستگی داره.

----------


## program103

آقای عشایری ممنون از پاسختون.



> در این صورت بهتر است که سیستم به صورت multi-tier طراحی شود و موقعی که   کاربر نامه ای را در DB ذخیره کرد این tier میانی یک پیام را به کلاینت   مربوطه ارسال کند که کلاینت متوجه شود که باید به یک نامه رسیدگی کند.


من تا حالا برنامه multi-tier ننوشتم.یادگیریش خیلی زمان میبره؟؟ میتونید یه منبع خوب معرفی کنید؟ اگر بخوام برنامه را ساده بنویسم نمیتونم برای کلاینت ها ارسال پیام داشته باشم؟؟



> باید شما یک سیستم هماهنگ سازی را با پایگاه داده مرکزی ایجاد نمایید.


میشه بیشتر توضیح بدید؟متوجه منظورتون نشدم؟

----------


## BORHAN TEC

> من تا حالا برنامه multi-tier ننوشتم.یادگیریش خیلی زمان میبره؟؟


بستگی به سطح علمی شما داره ولی DataSnap که به صورت پیش فرض در دلفی وجود دارد در نسخه های جدید خیلی ساده شده که سریع میتونید با اون آشنا بشین.



> میتونید یه منبع خوب معرفی کنید؟


مدتی پیش یکسری آموزش های گام به گام در مورد DataSnap با سرفصل های زیر در سایت Embarcadero.com قرار داده شد که سرفصل آن به شرح زیر است:
Delphi Labs: DataSnap XE: by Pawel Glowacki
***************************************
01)  Simple Calculator Service 
02)  Multitier Database Application 
03)  Server Methods Lifecycle 
04)  Testing Servers in Data Explorer 
05)  Authentication and Authorization 
06)  Transport Filters 
07)  REST Web Application 
08)  WebBroker jQueryMobile Boilerplate 
09)  jQueryMobile Web Frontend 
10)  Windows Service DataSnap Server 
11)  "Plain Old Delphi Object" Parameters 
12)  Callbacks
 



> میشه بیشتر توضیح بدید؟متوجه منظورتون نشدم؟


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

----------


## program103

در یکی از پستهای مربوط به multi-tier  یکی از دوستان برنامه چند لایه را با این لایه ها معرفی کرده بود:
Common Layer
Data Access Layer
Business Layer
Facade Layer
Presenation Layer 						
میشه توضیح بدید هر لایه چه اطلاعاتی را شامل می شود و کی برنامه شامل این لایه ها می شود.(در بعضی برنامه ها فقط سه لایه وجود دارد.)

----------


## شاهرخ عشایری

با سلام.
البته نوشتن برنامه بصورت Multi-tier و یا Multi-Layer به توسعه نرم افزار می تونه خیلی کمک کنه. درسته شاید در ابتدا خیلی وقت گیر به نظر بیاد اما مدیریت برنامه در طی توسعه اولیه و یا ثانویه و همچنین خطایابی و همینطور انتقال و استفاده مجدد رو برای برنامه نویس و تیم توسعه میسر میسازه.



> در یکی از پستهای مربوط به multi-tier  یکی از دوستان برنامه چند لایه را با این لایه ها معرفی کرده بود:
> Common Layer
> Data Access Layer
> Business Layer
> Facade Layer
> Presenation Layer                         
> میشه توضیح بدید هر لایه چه اطلاعاتی را شامل می شود و کی برنامه شامل این  لایه ها می شود.(در بعضی برنامه ها فقط سه لایه وجود دارد.)


باید خدمتتون عرض کنم که هیچ استاندارد مشخصی برای نوشتن بصورت چند لایه وجود نداره و این لایه هایی که شما نام بردید در حقیقت یک Pattern میتونه باشه.
امروزه اکثر برنامه ها رو به سه لایه تقسیم بندی میکنن.
Data Access Layer: این لایه در حقیقت ارتباط برنامه با منبع اطلاعاتی (DataBase و یا فایل اطلاعاتی) رو میسر میکنه و در اون متد و کلاسهایی گنجانده میشه که این کار رو برای ما انجام میده. توجه کنید در این لایه بایدسعی بشه تا حد ممکن از پردازش های سنگین منطقی برنامه دوری کنید. در حقیقت در این لایه فقط با بانک اطلاعاتی سرو کار دارید نه چیز دیگه.
Business Link Layer: در این لایه تصمیم گیری های برنامه و همچنین اینکه چه اطلاعاتی باید به دیتابیس ارسال بشه و همچنین از دیتابیس چه اطلاعاتی باید خونده بشه و در نهایت برقراری امنیت نرم افزار شکل خواهد گرفت.
User Interface: رابط کاربره و بین کاربر و لایه BLL ارتباط ایجاد میکنه. گاهی اوقات به اون Presentation Layer هم میگن
گاهی اوقات میشه پا رو از 3 لایه هم فراتر گذاشت و برنامه هایی حتی با 5 لایه نوشت. در اینصورت BLL رو به 3 لایه کوچکتر تقسیم میکنن که یکی از اونها همون Facade Layer (تلفظ فرانسوی: فساد) هستش.

----------


## program103

با سلام و تشکر از آقای عشایری بابت پاسخشون.



> سیستم به صورت multi-tier طراحی شود و موقعی که کاربر نامه ای را در DB  ذخیره کرد این tier میانی یک پیام را به کلاینت مربوطه ارسال کند که کلاینت  متوجه شود که باید به یک نامه رسیدگی کند


با توجه به توضیحات آقای شاهین عشایری منظور آقای شاهرخ عشایری از این لایه باید لایه Business Link Layer باشه، درسته؟؟؟
و یه سوال دیگه اینکه ما در دلفی برای هر لایه باید یک datasnap داشته باشیم؟؟ یا لایه های ما در یک unit پیاده می شوند؟ یعنی به ازای هر لایه ما یک یونیت جدا داریم یا به ازای هر لایه یک datasnap جدا؟؟
و اگر میشه به صورت روان توضیح بدید که کار datasnap چیه؟؟؟ارتباط دهنده لایه ها یا وظیفه دیگه ای داره؟؟؟
ببخشید سوال زیاد می پرسم. ولی میدونم مشکل من مشکل خیلی از برنامه نویسای میتدی هست. امیدوارم در این پست به نتایج خوبی برسیم.

----------


## BORHAN TEC

سلام  :قلب: 



> با توجه به توضیحات آقای شاهین عشایری منظور آقای شاهرخ عشایری از این لایه باید لایه Business Link Layer باشه، درسته؟؟؟


نه، ببینید همانطور که قبلاً گفتم tier با layer تفاوت داره. به عنوان مثال شاید شما در شبکه نام مدل OSI به گوشتون خورده باشه، در واقع در Multi-Layer هم همینطور است یعنی این یک حالت منطقی است. همان مدل OSI را در نظر بگیرید. در این مدل کارشناسان آمده اند و به صورت کاملاً منطقی لایه های شبکه را مشخص کرده اند در صورتی که ممکن است در حالت فیزیکی این گونه نباشد(مثلاً ممکن است که هیچ تابع خاصی برای لایه های آن نوشته نشود). 



> و یه سوال دیگه اینکه ما در دلفی برای هر لایه باید یک datasnap داشته باشیم؟؟


اصلاً اینگونه نیست. از Data Snap در برنامه های چند ردیفه استفاده می شود، هرچند که ممکن است هر ردیف از چند لایه منطقی مجزا تشکیل شده باشد. برای این که این موضوع را بهتر درک کنید پیشنهاد می کنم که مقاله زیر را از شرکت RemObjects Software مطالعه کنید تا مفهوم tier برای شما جا بیفتد:
http://www.remobjects.com/da/why-multitier.aspx
(توجه داشته باشید که این مقاله در مورد Data Abstract که یک ابزار مشابه DataSnap می باشد توضیح داده است که در کل مفهوم Multi_tier را نیز به خوبی می رساند)



> یا لایه های ما در یک unit پیاده می شوند؟


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



> یعنی به ازای هر لایه ما یک یونیت جدا داریم یا به ازای هر لایه یک datasnap جدا؟؟


DataSnap برای ساخت برنامه های چند ردیفه(Multi-Tier ) استفاده می شود و در این حوزه ارتباط محکمی با Multi-Layer ندارد.



> و اگر میشه به صورت روان توضیح بدید که کار datasnap چیه؟؟؟


باشه، سعی می کنم.

این عکس را در نظر بگیرید و خوب به آن دقت کنید:
why-multitier-1.png
در این عکس یک برنامه(مثلاً یک فایل exe) به صورت مستقیم به دیتابیس وصل شده است. این مدل معایب بسیار زیادی دارد(مثلاً امنیت پایین یکی از آنها است). توجه داشته باشید که در این عکس برنامه Client و پایگاه داده ممکن است در دو سیستم کاملاً مجزا باشند.

حال به عکس زیر با دقت نگاه کنید:
why-multitier-2.png
همانطور که می بینید در این مدل یک لایه کاملاً فیزیکی میان برنامه کلاینت و پایگاه داده وجود دارد. در این حالت برنامه client و tier میانی در دو سیستم کاملاً مجزا نصب شده اند. یکی از مهمترین کارهای ابزار هایی مثل DataSnap در این حالت برقراری ارتباط میان برنامه Client و پایگاه داده می باشد. توجه داشته باشید که این فقط یک برنامه تحت شبکه ساده نیست چون DataSnap امکانات بسیار زیاد دیگری را در اختیار ما می گذارد، به عنوان مثال می تواند عملیات اعتبار سنجی را نیز انجام دهد و اگر کاربر معتبر نباشد از فرستادن اطلاعات از پایگاه داده به او جلوگیری می شود. توجه داشته باشید که این tier میانی حتی امکانات بیشتری را نیز می تواند در اختیار ما قرار دهد. برای اینکه این موضوع را بهتر متوجه شوید سناریوی ساده زیر را در نظر بگیرید:

*سناریو:* مشتری یک برنامه می خواهد که با آن کاربران مختلف بتوانند با یک پایگاه داده ارتباط برقرار کنند. مسئله مهم اینجا است که کاربران باید سطوح دسترسی مختلفی داشته باشند، یعنی یک کاربر معمولی نباید بتواند به همه داده ها دسترسی داشته باشد و مدیر میانی سازمان هم می تواند به اطلاعات بیشتری دسترسی داشته باشد و ... . همانطور که احساس می کنید موضوع بسیار پیچیده شد. ممکن است که در این حالت سردرد بگیرید! اما توجه داشته باشید که در اینجا اگر یک tier میانی ایجاد کنید به راحتی می توانید این مسائل را کنترل کنید. همچنین شما می توانید اطلاعات مورد نیاز خود را رمزگذاری کنید و بعد به Middle-Tier بفرستید و Middle-Tier آن را رمز گشایی می کند و از آن استفاده می کند و اطلاعات رد و بدل شده میان Client و Middle-Tier اگر هم شنود شوند در بیشتر موارد غیر قابل فهم هستند ولی اگر در این برنامه از همان مدل قدیمی و منسوخ شده قبل استفاده کنید آیا می توانید چنین امنیت و سطح دسترسی ای را ایجاد کنید؟

حال به تصویر زیر نگاه کنید:
3-11-2012 8-29-38 PM.jpg
در این تصویر یک سازمان بسیار بزرگ را در نظر بگیرید که کاربران مختلفی که هر کدام یک برنامه Client را در اختیار دارند می خواهند به اطلاعات یک پایگاه داده مرکزی دسترسی داشته باشند. بگذارید که این مورد را کمی باز تر کنم و با یک مثال کاملاً عملی تشریح کنم: فرض کنید که عکس بالا مربوط به سیستم سهام عدالت می باشد و هر اداره می خواهد بتواند اطلاعات اشخاصی که در حوزه آنها است را مدیریت کند. در این حالت اداره ای که در شهرستان دماوند می باشد نباید بتواند به اطلاعات افرادی که در شهرستان دزفول هستند دسترسی داشته باشد. همانطور که در شکل بالا مشاهده می کنید این موضوع در Tier میانی کنترل شده است و کاربری که از منطقه 78 می خواهد به اطلاعات پایگاه داده دسترسی داشته باشد فقط برخی از اطلاعات افراد تحت حوزه خودش را می تواند دستکاری و مشاهده کند و کسی که در منطقه 26 می باشد نمی تواند به اطلاعات افراد منطقه 78 دسترسی داشته باشد. همچنین همانطور که در عکس مشاهده می کنید حتی می توانیم برای دسترسی کاربران به اطلاعات افراد منطقه خودشان هم فیلتر بگذاریم. (مثلاً فقط بتوانند به اطلاعات نام و نام خانوادگی و آدرس دسترسی داشته باشند.)

همانطور که قبلاً هم گفتم این Tier میانی در یک سیستم مجزا می تواند باشد(منظورم در اینجا سیستم مرکزی است). این Tier می تواند ظاهری شبیه به یک برنامه معمولی را داشته باشد. و کاربری که مدیریت آن را به عهده دارد به راحتی می تواند شرایطی را اعمال کند که به صورت فوری بر روی دسترسی هزاران کلاینت می تواند تاثیر بگذارد. مثلاً می توان کاری کرد که در روزهای تعطیلی فقط چند حوزه خاص بتوانند به اطلاعات دسترسی داشته باشند و ده ها مورد دیگر. همانطور که تا به حال متوجه شده اید با آن مدل قدیمی منسوخ شده انجام این کارها بسیار دشوار و در اکثر موارد غیرممکن است و در اینجا حتما باید از معماری چند ردیفه(Miuti-Tier) استفاده شود. در واقع می توان گفت که در این عکس از Business Rules Scripting استفاده شده است و منظور از Business Rules Scripting نیز دقیقاً همین است.

حال برای این که بیشتر متوجه اهمیت موضوع شوید سناریوی زیر را در نظر بگیرید.
سناریو: فرض کنید که در سناریوی قبل می خواهیم قابلیت Load Balancing را نیز پیاده سازی کنیم. به گونه ای که اطلاعات در پایگاه داده های مختلف ذخیره شوند و اگر یک سرور از کار افتاد اطلاعات از سرور دیگری لود شوند و فردی که پشت برنامه کلاینت نشسته است اصلاً از این موضوع خبردار نشود و در حالت کلی مجموعه کل سیستم ما بتواند به کار خودش ادامه دهد و سیستم به صورت اتوماتیک بتواند این مشکلات را تشخیص داده و کنترل کند. البته من این موضوع را در حالت بسیار کلی توضیح دادم ولی توجه داشته باشید که شما به راحتی میتوانید با DataSnap این مسائل را نیز کنترل کنید. برای درک بهتر این سناریو به تصویر زیر به دقت نگاه کنید:
failover.gif

*باز هم تاکید می کنم که اینها فقط برخی از قابلیت های DataSnap می باشند.*

در حالت کلی می توان گفت که کاربرد معماری Multi-tier و بالطبع آن DataSnap ساخت برنامه های سازمانی واقعی می باشد.  :چشمک: 




> ببخشید سوال زیاد می پرسم. ولی میدونم مشکل من مشکل خیلی از برنامه نویسای میتدی هست.


خواهش می کنم، امیدوارم که کاملاً متوجه شده باشید.
اگر باز هم سوالی است من در خدمتم.  :لبخند گشاده!: 




> امیدوارم در این پست به نتایج خوبی برسیم.


انشاالله.  :لبخند:

----------


## program103

ممنون از پاسخ دقیق و صبورانه شما. :لبخند: 
من از کل صحبتهای شما و اون لینکی که گفته بودید این نتیجه را گرفتم. نمیدونم درسته یا نه.البته قبلش بگم که گیج شدم. اگر نتیجه گیریم خیلی ناشیانه بود شما ببخشید.
یک tier تشکیل شده از مجموعه ای از کد ها و یا حتی یک exe جدا، که محدوده وظایف خاصی را دارد و به عنوان واسط بین دیتابیس و برنامه کلاینت هست. بسته به هر تحلیل در هر پروژه یک سری فعالیت ها را انجام میده. حالا این tier میتونه خودش شامل بخش های مختلفی باشه. میتونه چندین لایه را در خودش جا بده که هر لایه یک سری از وظایف tier را انجام میدهند.درسته یا حسابی خراب کردم؟؟؟ :افسرده: 

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



> یکی از مهمترین کارهای ابزار هایی مثل DataSnap در این حالت برقراری ارتباط  میان برنامه Client و پایگاه داده می باشد. توجه داشته باشید که این فقط  یک برنامه تحت شبکه ساده نیست چون DataSnap امکانات بسیار زیاد دیگری را در  اختیار ما می گذارد، به عنوان مثال می تواند عملیات اعتبار سنجی را نیز  انجام دهد و اگر کاربر معتبر نباشد از فرستادن اطلاعات از پایگاه داده به  او جلوگیری می شود.


تمام این محدودیتها و امکانات باید به صورت کلاسها و کدهای مربوطه پیاده سازی بشه دیگه؟؟درسته؟؟ به صورت wizardi که نیست؟؟؟

----------


## BORHAN TEC

> درسته یا حسابی خراب کردم؟؟؟


کاملاً درسته.  :لبخند گشاده!:  ولی به این نکته توجه داشته باشید که tier الزاماً بین دیتابیس و برنامه کلاینت نیست(معمولاً به این قسمت که بین دیتابیس و کلاینت قرار می گیره  Middle-tire میگن) ولی شما در بالا می توانید هم کلاینت و هم Middle-tier و هم مدیر بانک(DBMS یا RDBMS) را به عنوان tier در نظر بگیرید(که جمعاً می شود 3تا tier). به عبارتی برنامه نویسی چند ردیفه یا n-tier یک معماری است و شاید نتوانم یک تعریف بسیار دقیق برای آن ارائه دهم ولی با کسب تجربه در مورد برنامه نویسی چند ردیفه می توان آن را به درستی درک کرد.



> تمام این محدودیتها و امکانات باید به صورت کلاسها و کدهای مربوطه پیاده سازی بشه دیگه؟؟درسته؟؟ به صورت wizardi که نیست؟؟؟


هم کد نویسی داره و هم ویزارد ولی در نسخه های جدید تر (مثل Delphi XE2) اکثر کارها با ویزارد قابل انجام است.

----------


## program103

سلام مجدد.



> هم کد نویسی داره و هم ویزارد ولی در نسخه های جدید تر (مثل Delphi XE2) اکثر کارها با ویزارد قابل انجام است.


من یه نمونه سورس و مقاله درباره ساخت ماشین حساب ساده با datasnap xe از شما تو همین سایت دیدم. این مقاله و روند کار همین چیزی هست که باید درباره کار با datasnap یاد گرفت؟؟؟؟ و یا بهتر بگم برای کار با datasnap در برنامه ها همین روند را باید پیگیری کنیم.درسته؟؟
datasnap xe2 هم به همین صورت هست؟؟؟
این هم لینک مقاله ای که جناب شاهین عشایری زحمت کشیدند و گذاشتند.
https://barnamenevis.org/showthread.p...B3%D8%A7%D8%A8

----------


## program103

کاربر عزیز tiphooo در یکی از پاسخ های همین پست این چنین گفتند:



> شما برای ذخیره connectionString چند روش دارید .
> ذخیره آن را در داخل سورس برنامه کاملا فراموش کنید چون اگر اسم سرور یا  دیتابیس یا پسورد عوض شود شما حتما باید برنامه را مجدد کامپایل کنید
> اگر مهم نیست چه کسانی بخواهند از برنامه شما استفاده کنند یعنی از برنامه  استفاده تجاری ندارید از udl استفاده کنید یعنی یک فایل text ایجاد کنید و  پسوند آن را به جای txt به udl تغییر دهید حال اگر بر روی فایل ایجاد شده  دو بار کلیک کنید ساخت connectionstring موجود در دلفی را همینجا می توانید  انجام دهید
> حال باید در دلفی در connectionstring به جای استفاده از use connection  string از گزینه بالایی آن یعنی Use data Link File که udl مخخف آن است  استفاده کنید و فایل ایجاد شده  (همان فایل udl)را در این قسمت انتخاب کنید  حال از بیرون برنامه اجرایی می توانید connectionstring را عوض کنید به هر  سرور و دیتابیس و یا انواع مختلف دیتابیس را
> ولی فراموش نکنید اینجا آدرس مستقیم قرار ندهید و برای دادن آدرس فایل با  استفاده از کدنویسی مثلا همیشه مسیر فایل اجرایی برنامه را بدهید.
> روش دوم استفاده از ini فایلها می باشد که تقریبا شبیه همین udl است با این  تفاوت که همه چیز از طریق کدنویسی است ولی می توانید مشخصات سرور و  دیتابیس و ... را رمزگذاری کنید (جهت محافظت ) 
> روش سوم ذخیره connectionstring در registry به صورت کد شده و یا عادی می  باشد که مثلا connectionstring برنامه را داخل یک کلید خاص ذخیره کرده اید و  هر بار آن را فراخوانی می کنید
> بعضی از قفلهای سخت افزاری هم connectionstring را به روشهای مختلف داخل قفل سخت افزاری قرار می دهند
> گزینه مناسب به نظر من رجیستری ویندوز می باشد


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

----------


## tiphooo

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

----------


## program103

جناب آقای عشایری زحمت نمی کشید به دو پاسخ آخرم جواب بدید؟

----------


## Felony

> من خودم در رجیستری و به صورت کد شده ذخیره می کنم چون کلا با اضافه شدن تعداد فایلها به فایل exe مخالفم و یکی از مزایای برنامه نویسی با دلفی همین است که تمام کارها و روالهای شما در exe قرار می گیرد بنابراین ما هم باید این قاعده را رعایت کنیم
> حالا دوستان شاید روش بهتری دارند که ما هم بتوانیم استفاده کنیم


شما مفهموم Standalone بودن فایل های اجرایی تولید شده توسط دلفی رو اشتباه متوجه شدید !
نرم افزارهای بزرگی هستن که توسط کمپانی های معتبری نوشته شدن ( مثلا همین IDE دلفی ) که از هزاران فایل تشکیل شدن ، اینها معنای Standalone بودن فایل های اجرایی تولید شده توسط دلفی رو زیر سوال بردن ؟!




> جناب آقای عشایری زحمت نمی کشید به دو پاسخ آخرم جواب بدید؟


کدوم سوال ؟ همون پست شماره 31 در مورد Connection String ؟
اگر بله و اگر امنیت براتون مهم هست به شخصه اطلاعات مرتبط با CS و تنضیمات برنامه ها رو داخل یک دیتابیس پرتابل ذخیره میکنم ( اکثر اوقات SQLite ) و برای اون دیتابیس کلمه عبور تعیین میکنم و موقع اجرای برنامه تنضیمات رو از اون واکشی میکنم و بر اساس اطلاعات واکشی شده به سرور مورد نظر متصل میشم ، اگر هم خیلی خیلی امنیت مهم هست خودتون میتونید همچین بانکی بسازید و اطلاعات رو هر جور که صلاح میدونید کد کنید و داخلش ذخیره کنید ( کار چندان پیچیده ای نیست ) و چون حجم داده های ذخیره شده در این موارد کمه لازم به نگرانی در مورد سرعت واکشی اطلاعات نیست ، حتی اگر در اون مورد هم نگران بودید میشه کارهایی انجام داد .

----------


## program103

اول تشکر که پاسخ دادید.



> کدوم سوال ؟ همون پست شماره 31 در مورد Connection String ؟


هم این پست و هم پست قبلیش.



> به شخصه اطلاعات مرتبط با CS و تنضیمات برنامه ها رو داخل یک دیتابیس  پرتابل ذخیره میکنم ( اکثر اوقات SQLite ) و برای اون دیتابیس کلمه عبور  تعیین میکنم و موقع اجرای برنامه تنضیمات رو از اون واکشی میکنم و بر اساس  اطلاعات واکشی شده به سرور مورد نظر متصل میشم


منظورتون اینه که غیر از دیتابیس اصلی یه دیتابیس دیگه فقط برای ConnectionString استفاده می کنید؟؟میشه بگید علت این کار چیه  و چرا از روش های ذکر شده مثل فایل ini ویا رجیستری استفاده نمی کنید؟؟
این هم پست 30 که می خواستم جناب عشایری پاسخ بدهند.



> من یه نمونه سورس و مقاله درباره ساخت ماشین حساب ساده با datasnap xe از  شما تو همین سایت دیدم. این مقاله و روند کار همین چیزی هست که باید درباره  کار با datasnap یاد گرفت؟؟؟؟ و یا بهتر بگم برای کار با datasnap در  برنامه ها همین روند را باید پیگیری کنیم.درسته؟؟
> datasnap xe2 هم به همین صورت هست؟؟؟
> این هم لینک مقاله ای که جناب شاهین عشایری زحمت کشیدند و گذاشتند.
> https://barnamenevis.org/showthread.p...B3%D8%A7%D8%A8

----------


## Felony

> منظورتون اینه که غیر از دیتابیس اصلی یه دیتابیس دیگه فقط برای ConnectionString استفاده می کنید؟؟میشه بگید علت این کار چیه و چرا از روش های ذکر شده مثل فایل ini ویا رجیستری استفاده نمی کنید؟؟


بله ، چون اکثرا زمانی از بانک های اطلاعاتی بزرگ ( مثل SQL Server ) استفاده میشه که برنامه ای که قصد نوتشنش رو داریم حداقل در بخش بانک اطلاعاتی پیچیده و سنگین باشه ، اکثرا در این نوع نرم افزار ها امنیت مهم هست ، Registry یا فایل ini یا udl راهکارهای بسیار مقدماتی هستند که هر کسی کمی با ویندوز سر و کله زده باشه میتونه ازشون سر دربیاره و در ضمن خیلی احتمال داره که اطلاعاتشون خواسته یا ناخواسته تغییر کنه یا از بین بره و ... ، من از یک بانک اطلاعاتی پرتابل استفاده مینکم و تنظیمات نرم افزار رو داخل اون انجام میدم ، مثلا Connection String برای اتصال به سرور ، تنضیمات ظاهر نرم افزار ( مثلا عکس زمینه ، نوع تم ، رنگ و اندازه و نام فونت ها و ... ) در این بانک اطلاعاتی نگهداری میشوند که حتی اگر سرور هم در دسترس نبود UI برنامه به درستی بار بشه و کاربر بتونه توسط بخش تنضیمات به سرور متصل بشه ...

در مواردی هم که امنیت خیلی مهم باشه خودم ساختار بانک رو بر اساس نیازهایی که دارم پیاده میکنم و از بانکهای آماده مثل SQLite استفاده نمیکنم .

----------


## tiphooo

> شما مفهموم Standalone بودن فایل های اجرایی تولید شده توسط دلفی رو اشتباه متوجه شدید !
> نرم افزارهای بزرگی هستن که توسط کمپانی های معتبری نوشته شدن ( مثلا همین IDE دلفی ) که از هزاران فایل تشکیل شدن ، اینها معنای Standalone بودن فایل های اجرایی تولید شده توسط دلفی رو زیر سوال بردن ؟!
> 
> 
>  .


جناب آقای تاجیک ظاهرا شما هم مثل اینکه اصلا به صورت عملی جایی پروژه ای رو پیاده سازی نکردید شما در ایران برنامه را برای  کاربرانی با سواد کمتر از دیپلم می نویسید و تعدد فایلها کار پشتیبانی سیستم را بسیار مشکل ساز کرده و امکان سوء استفاده هم بیشتر می شود برای به روز رسانی ورژنهای جدید برنامه در سایت مشتری قطعا یک فایل بهتر از دو و یا چند فایل است و اینکه برنامه های زیادی هستند که فایلهای زیادی دارند. ما قرار نیست ویندوز رو بازنویسی کنیم بیشتر بازار نرم افزار ایران سیستمهای ERP و سایتهای طراحی شده جهت ارایه و یا فروش خدمات یا محصولات است در همین حد هم در حال حاضر مشکلات زیادی داریم که شاید این سایت هدفش تا حدودی برطرف کردن این مشکلات باشد که در تاپیکهای مختلف می توان آن را به وضوح دید
و به نظر من در جواب به پستهای مختلف باید راهکارهای عملی در ارجحیت باشد تا تئوریهای پیچیده و غیر معقول . در دانشگاههای ما تا توانستند به ما تئوریهای مختلف و معمولا منسوخ را آموزش دادند و زمانی که وارد بازار کار شدیم به عنوان یک لیسانس نرم افزار کاملا بیسواد به حساب می آمدیم ولی اگر می خواهید در مورد ساختار ریزپردازنده Z80 یک کتاب برایتان می نویسیم که مربوط به 50 سال پیش است.

----------


## Felony

> جناب آقای تاجیک ظاهرا شما هم مثل اینکه اصلا به صورت عملی جایی پروژه ای رو پیاده سازی نکردید


 :لبخند:  ( خاموشی )




> شما در ایران برنامه را برای کاربرانی با سواد کمتر از دیپلم می نویسید و تعدد فایلها کار پشتیبانی سیستم را بسیار مشکل ساز کرده و امکان سوء استفاده هم بیشتر می شود برای به روز رسانی ورژنهای جدید برنامه در سایت مشتری قطعا یک فایل بهتر از دو و یا چند فایل است و اینکه برنامه های زیادی هستند که فایلهای زیادی دارند.


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

حجم فایل اجرایی نرم افزار بدون فایل های اضافی نزدیک 18 مگابایت و همراه با فایل های دیگه نزدیک 200 مگابایت میشه ، حالا من تصمصم میگیرم از صبح شنبه تمام فایل ها رو یکی کنم و یک فایل Stanalone با حجم 200 مگابایت هر روز بزارم روی هاست شرکت تا سیستم های پزشکی سرتاسر ایران بیان هر روز با هر تغییر جزئی کل 200 مگابایت رو دانلودش کنن ( با سرعت اینترنت خوبمون ، قیمت مناسب پهنای باند هستینگ ها و ... ) ؛ خیلی جالب میشه ، نه ؟!

حالا من میام برنامه رو به تقریبا 130 فایل تقسیم میکنم و هر قسمت برنامه رو داخل یک DLL یا BPL یا ... پیاده میکنم که حجم میانگین هر کدوم از فایل ها میشه 1.5 مگابایت ، حالا هر بخشی نیاز داشت تغییر کنه تغییرش میدم و فقط همون بخش رو روی هاست میزارم ، نرم افزارها به سایت متصل میشن و در هر روز نهایتا 15 مگابایت آپدیت دریافت میکنن ( فقط فایل هایی که تغییر کردن ) .

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

----------


## BORHAN TEC

سلام
دوست عزیز اون مقاله ای که من قرار داده ام مقدمه ای بر DataSnap است. خود  DataSnap موارد زیادی را شامل می شود که مباحث مربوط به آن در حد یک کتاب  مفصل می باشد.
برای این که کار با DataSnap را یاد بگیرید در ابتدای کار مواردی را که در پست شماره 23 اشاره کردم را توصیه می کنم. البته در رابطه با DataSnap مطالب زیادی وجود دارد مثل کتب آقای Marco Cantu، کنفرانس های CodeRage و ... .
در مورد DataSnap XE2 هم باید بگویم که تغییرات آنقدر نبوده که با خواندن مطالب مربوط به DataSnap XE نتوانید آنرا در XE2 پیاده کنید، چون سازندگان دلفی همیشه سازگاری با نسخه های پیشین را سرلوحه کار خودشان قرار می دهند.



> حالا می خواستم جناب عشایری توضیح بفرمایید و راهنمایی کنید که اولا کدام  روش مناسب تر هست و اگر زحمتی نیست اون روش را یاد بدید یا راهنمایی  کنید.ممنونم.


راستش در این رابطه نمیتونم نظر قاطعی بدم. چون بسته به شرایط و ماهیت برنامه ممکنه که نیاز باشه از روش متفاوتی استفاده کرد.

در آخر هم امیدوارم که دوستان اینجا را با میدان جنگ اشتباه نگیرند. چون اینجا فقط و فقط فضایی برای یادگرفتن و یاد دادن است. :چشمک:

----------


## tiphooo

[QUOTE=[

حجم فایل اجرایی نرم افزار بدون فایل های اضافی نزدیک 18 مگابایت و همراه با فایل های دیگه نزدیک 200 مگابایت میشه ،[/QUOTE]
ابتدا با تشکر از جناب عشایری راجع به تذکرشون . 
و قابل توجه بقیه دوستانی که تازه برنامه نویسی شروع کردن ، اینکه همه برنامه ها حجمشون مثل برنامه دوستمون  218 مگابایت نیست
و این خیلی ربطی به اعتبار کمپانی ها هم نداره . در واقع بالا بودن تعداد خط برنامه قبلا در فاکس پرو معمول بود که به ازا خط بیشتر پول بیشتر می دادند . امروزه این قضیه کاملا برعکس شده 
و برنامه هایی با حجم کمتر از 10 مگابایت داریم که در کل دنیا شناخته شده هستند و کلا معمول نیست که یک برنامه (بدون در نظر گرفتن حجم دیتابیس) اینقدر سنگین باشد.

جناب آقای تاجیک خوشحال می شیم اگه راجع به برنامتون یک مقدار توضیح بیشتر بدید و اینکه این 200 مگابایت چی هست چون اگر DLL باشد که خود ویندوز اینقدر DLL ندارد و اینکه چرا روزانه دارید این DLL ها رو تغییر میدید و اینکه چرا کار رو انحصاری می کنید اگر قراره 1700 مرکز روزانه فایلهاشون به روز رسانی بشه راه حل وبی مناسبتر است برای این کار

و در آخر گذشته از شوخی در مورد نحوه به روز رسانی اتوماتیک اگر از روشی غیر از Replication (چون مطمئننا از Replication استفاده نمی کنید)استفاده می کنید خوشحال می شیم توضیح بدهید

----------


## Felony

> جناب آقای تاجیک خوشحال می شیم اگه راجع به برنامتون یک مقدار توضیح بیشتر بدید و اینکه این 200 مگابایت چی هست چون اگر DLL باشد که خود ویندوز اینقدر DLL ندارد و اینکه چرا روزانه دارید این DLL ها رو تغییر میدید و اینکه چرا کار رو انحصاری می کنید اگر قراره 1700 مرکز روزانه فایلهاشون به روز رسانی بشه راه حل وبی مناسبتر است برای این کار


در مورد جزئیات برنامه ها نمیتونم زیاد توضیح بدم ( دردسر میشه ) ؛ در برنامه اصلی که روش کار میکنم حجم خود فایل اجرایی تقریبا 7.9 مگابایت هست ولی به دلیل UI سنگین طراحی شده برای برنامه حجم خود فایل اجرایی به این مقدار رسیده ؛ برنامه تقریبا شامل 97 فرم و 160 کتابخانه دست نویس هست و جمعا نزدیک 3 میلیون خط کد ؛ DLL هایی که گفتم شامل فرمت های گزارش گیری ، فرم های گزارش گیری ، رابط های ارتباط بادستگاه های پزشکی و ... هستند .

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

از موارد دیگه ای که میشه نام برد DLL ی هست که مکانیزم هایی برای دریافت خطا هایی که در برنامه رخ میده درش پیاده کردم و خطا ها رو به 2 صورت آرشیو میکنه ، یکی به صورت Local و در شبکه محلی و یکی هم به صورت شبکه که در صورتی که سرور به اینترنت متصل بشه لیست خطا ها به سرور شرکت ارسال میشه و سیستم شرکت نرم افزاری نوشتم که این اطلاعات رو میخونه و بعد از بررسی اگر تعداد گزارششون از مراکز مختلف بیشتر از N بار بود در قسمت خاصی درجشون میکنه ؛ در زمان تست و خطایابی به این پیغام ها هم توجه میشه و در صورتی که خطا گزارش شده مشکلی رو نشون بده که از برنامه هست رفع و فایل مربوطه برای رفع خطا روی سرور قرار میگیره .

در حال حاظر هم در حال کار بر روی سیستمی هستم که بشه از شرکت از دیتابیس مراکز مختلف آمار خاصی رو استخراج کرد ؛ مثل حجم فایل Data و Log ، تاریخ ساخت و ... و اینکه بشه از راه دور یکسری Query رو روی بانک های مراکز اجرا کرد و نتیجه Query ها رو به صورت فایهای XML یا Excel در اختیار داشت ؛ چون در مواقعی بعضی ارگان ها نیاز به گزارشات و آمار های خاص دارن ؛ مثلا وزارت بهداشت آمار افراد دارای هپاتیت B بین 15 تا 25 سال در کشور رو درخواست میکنه ... 

اون 200 مگابایت مواردی هست که توضیح دادم + خیلی موارد دیگه که نمیتونم در موردشون توضیح بدم ...

ممکنه هر روز نامه ای رسمی از سمت ارگان دولتی ( وزارت بهداشت ، بیمه ارتش و نیروهای مسلح و ... ) بیاد و درخواست تغییر فرمت گزارشات یا بیمه ها یا ... رو بدن ، تمام بحث پشتیبانی نرم افزار هم توسط خود شرکت پیگیری میشه ، حالا فکر کنید 1700 مرکز تو استان های مختلف + چند مرکز تو کشورهای عراق ، افعانستان و دبی که باید تمامی اطلاعات تحویلیشون به بیمه ها و ... بر اساس آخرین تغییرات باشه ، بنابراین ممکنه هر روز تو قسمت X برنامه تغییری ایجاد بشه و نیاز باشه همه مراکز به روز رسانی بشن ، قرار نیست پرسنل شرکت این 1700 مرکز رو به صورت تلفنی یا حظوری به روز رسانی کنند ، این وظیفه بخش برنامه نویسی هست که برنامه رو به صورتی طراحی کنه که کمترین نیاز به بخش فنی و پشتیبانی داشته باشه .

از طرفی بعضی قسمت های برنامه به درخواست یکسری از مراکز براشون Customize میشه و باز هم قرار نیست به خاطر تغییر در یک یا N فرم برنامه یا ... یک نفر مثلا از تهران بره بندر عباس و برنامه رو تحویل بده و تست کنه ؛ بعد از تغییرات و تائید شدن توسط بخش تست این تغییرات بر روی سرور قرار میگیرن و فقط مرکز مورد نظر میتونه این تغییرات رو دریافت کنه و ازشون استفاده کنه .




> و در آخر گذشته از شوخی در مورد نحوه به روز رسانی اتوماتیک اگر از روشی غیر از Replication (چون مطمئننا از Replication استفاده نمی کنید)استفاده می کنید خوشحال می شیم توضیح بدهید


شوخی ؟! به روز رسانی نرم افزار چه ربطی به Replication داره ؟!




> اینکه چرا کار رو انحصاری می کنید اگر قراره 1700 مرکز روزانه فایلهاشون به روز رسانی بشه راه حل وبی مناسبتر است برای این کار


کار انحصاری هست به 1001 دلیل ...
- اولیش امنیت چون در بانک طالاعای مراکز مختلف اطلاعاتی هست که آمار سلامت و ... کشور رو میشه باهاشون تعیین کرد یا تغییر داد !
- همین الان اینقدر نرم افزار بزرگ و پیچیده هست که وقت سر خاروندن نداریم ، حالا اگر قرار باشه بحث امنیت سرورها ، امنیت سایت ها و مدیریت *** و ... هم بیافته گردن ما که هیچی ؛ بعدش هم این سیستم باید همیشه در حال کار و آنلاین باشه ، قرار نیست با مشکل پیش اومدن برای یک ISP یا ... کار یک مرکز بخوابه .
- ترجیح میدیم Desktop Application پیاده بشه چون دستمون برای تغییرات بازتره ، برای همچین نرم افزاری Web Application یعنی مرگ ؛ یعنی برای هر کاری یک Win Application بنویسی که فلان کار رو بکنه و نتیجه رو بده به برنامه ( از اتصال به دستگاه ها بگیر تا چیزهایی که نمیشه گفت ) .

موفق باشید .

----------


## aboualfazl

سلام دوستان. بحث داغ شده ها .... :D
 آقا ما که ادعایی نداریم ، حرفه ای هم کار میکنیم ، ولی هیچ ادعایی نداریم ...
دوستان ادعا کردن شما اینجا و رجز خوانی کاری رو درست نخواهد کرد ، تجربیاتتون رو در زمینه ی کاری اتون در اختیار دوستان بگذراید ، هر کی هر روشی رو دوست داشته باشه رعایت میکنه ...
مثلا من خودم *.udl رو بری کارهای خودم ، بهترین روش میدونم ...
حالا شما اگه دیتابیس portable  یا رجیستری رو پیشنهاد میکنید ، نظرتون محترمه و احترام میگذاریم...

----------

