# Native Code > برنامه نویسی در Delphi > مباحث عمومی دلفی و پاسکال >  برنامه‌نویسی چند لایه (Multi Tier)

## babak_delphi

در مورد این مبحث مطالبی در سایت وجود داره که اکثراً یا در محدوده زبانهایی غیر از دلفی بحث شده یا فقط در مورد مسائل تئوری برنامه نویسی چندلایه بحث شده 
به همین دلیل من با اجازه این تاپیک رو ایجاد کردم تا انشاالله در مورد مسائل مهمی در حوزه Multi tire که قبلا یا بحث نشده یا به نتیجه نرسیده در اینجا بحث بشه

خیلی ها در مورد مباحث تئوریک برنامه نویسی چند لایه اطلاعاتی دارند
ولی در مورد نحوه پیاده سازی عملی فکر میکنم خیلی کمترند افرادی که بلدند
من خودم در مورد تئوریش چیزهایی می دونم
تو همین سایت هم مطالبی هرچند اندک نوشتم
ولی در مورد نحوه پیاده سازی عملیش چیز خاصی نمی دونم
بخصوص لایه میانی
مثلا کدهای SQL رو کجا مینویسیم؟
مثلا یک فرم داریم ، یک سری اطلاعات رو از طریق Edit ها از کاربر میگیریم
با توجه به اونها ، کدٍ SQL رو ایجاد میکنیم و در قسمت SQL از ADOQuery (مثلا) قرار میدیم و بعد Open میکنیم
خب حالا اگه برنامه سه لایه باشه باید چیکار کرد؟
تا جایی که من اطلاع دارم اینجور کدها در لایه Presentation قرار نمیگیرن و در لایه Bisines نوشته میشن
حالا چطور نمیدونم و فکر میکنم اکثر کسانی که در مورد Multi Tire سوال یا مشکل دارن اگه مشکل اصلیشون هم این نباشه (که بعید میدونم) حداقل تو این قسمت هم مشکل دارند
حالا اساتید محترم اگه لطف کنند و در این مورد توضیحات بیشتری بدن و این تاپیک رو به سرانجام برسونند به خیلی ها کمک میکنند
با تشکر کارچینی.

----------


## mrm0101

بسمه تعالی 
مراحل ایجاد یک برنامه clint/server با استفاده از برنامه نویسی سه لایه (*Multi Tire*) 


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

1- استفاده از adoconnection و استفاده از کلمه عبور و رمز و ای پی سرور و ...
2- استفاده از برنامه های چند لایه 

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

در این مثال از datasnap و بانک اطلاعاتی اس کیو ال سرور استفاده شده است . 

الف : برنامه سرور 
1-یک پروژه جدید باز کنید و با عنوان سرور ذخیره نمایید 
2- به قسمت file / new / other/multitier رفته و بر روی remote data server کلیک نمایید 
3- حال یک پنجره با عنوان remote data module wizard ایجاد می شود که در قسمت CoClass Name یک نام برای سرور انتخاب نمایید . و به قسمتهای دیگر کاری نداشته باشید و ok را بزنید .
4- بلافاصله یک datamodule جدید با نام سرور (نامی که در قسمت class name انتخاب نمودید ) ایجاد می شود .
5- حال با استفاده از ado یا bde یا ... به با نک اطلاعاتی وصل شوید . مثلا با adoquery به یک جدول از یک بانک اطلاعاتی sql server وصل شده . حال adoqueryr را فعال سازید تا ارتباط برقرار شود . در پنجره مشخصات adoquery خاصیت active را true نمایید .
6- در قسمت dataacess یک DataSetProvider1 را بر روی datamoule که ایجاد کرده ایم قرار می دهیم و روی dataset در پنجره مشخصات کلیک نموده تا نام ارتباط بانک اطلاعاتی نمایان شود ( adoquer در مثال بالا)
7- پس از اطمینال از اتصال صحیح با نک اطلاعاتی پروژه را ذخیره و یک بار اجرا نمایید تا سرور در شبکه ثبت شود . 
8- توجه داشته باشید که برنامه سرور فقط محل نگهداری بانک اطلاعاتی و کنترل اتصالات و کاربران است . پس کار دیگری را انجام نمی دهیم و حال فایل اجرایی برنامه سرور را اجرا می کنم.

ب نوشتن برنامه کلاینت 
1- یک پروژه جدید با عنوان کلاینت ایجاد نموده و ذخیره نمایید . 
2- در روی فرم از قسمت datasnap یک SocketConnection1 را روی فرم قرار داه . در قسمت adress نام ip کامپیوتر سرور را وارد نمایید.(مثلا ip سرور در برنامه محل کار من 10.20.1.93 است ) . اگر ای پی سرور را نمی دانید می توانید نام کامپیوتر سرور را وارد کنید .حال در قسمت servername نام سروری را که در برنامه سرور ثبت کرده اید را انتخاب نمایید . اگه پیام خطا داده احتمالا در تنظیمات شبکه یا خود شبکه ایراد است . وقتی نام سرور را نتخاب کردید گزینه conecct از مشخصات SocketConnection1 vh را true کنید . اگر true شد یعنی ارتنباط با سرور بر قرا است .
3- حال در قسمت datascess یک ClientDataSet1 بر روی فرم قرار داده و تنظیمات زیر را انجام دهید 
A: در قسمت remote server کلیک نمایید تا نام socketConnection1 ظاهر شود .
b: در قسمت provider name کلیک کنید تا نام DataSetProvider1 ظاهر شود 
c:حال خاصیت active را true کنید .
4- حال از قسمت dataascess یک datasource1 بر روی فرم قرار دهید و خاصیت datadet آن را با نام clientdataset1ظاهر شود .
5- حال از قسمت data control یک datagrid روی فرم قرار داده و خاصیت datasource آن رو datasource 1 انتخاب کنید . می بینید که اطلاعات سرور نمایش داده می شود .

توضیحات . چون ما از SocketConnection2 استفاده می کنیدم که بر اساس tcp/ip عمل می کنید (پشتیبانی سوکت ها ) باید برنامه فعال سوکت ها فعال شود . برای این کار مرحل زیر را انجام دهید 
1- در قسمت run ویندوز دستور cmd را تایپ نمایید . 
2- پس از ورود به محیط cmd دستور مقابل را تایپ نمایید scktsrvr - install .

توضیح 2 : فرض بر این است که کلیه خوانندگان عزیز با بانک اطلاعتی و ارتباط با ان آشنایی دارند . اگر می خواهید به نتیجه برسید نامگذاری اشیاعی که بر روی فرم ها و ... می گذارید عین مثال باشد . 
امیدوارم مورد استفاده قرار گرفته باشد . 
با تشکر 
محمد رضا جهانی

----------


## babak_delphi

لطفا در مورد لایه میانی و کدهایی که در اون نوشته میشه توضیح بدین
در مورد نحوه ایجاد برنامه های multi tire در کتابها هم نوشته شده
لطفا در مورد کدهایی که در لایه میانی نوشته میشه و تفاوت برنامه Client در برنامه های Client/Server و Multi tire توضیح بدین و اینکه کدها بخصوص کدهای SQL چطور و کجا نوشته میشن

----------


## mrm0101

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

برنامه سرور واسطه بین برنامه کلاینت و بانک اطلاعاتی است . یعنی کنترل بیشتر بر کلاینت ها 

برای نوشتن دستورات اس کیو ال در کلاینت ها ابتدا شما باید در سرو.ر در dataprovider  در قسمت option  مجوز ویرایش یا حذف و افزدون و ... رکورد را به کلاینت ها بدید  (با true کردن گزینه های مورد نظر )و سپس در قسمت کلاینت در command text  دستورات اس کیو ال سرا وارد کنید . 

باز تاکید می کنم بسته به نوع دستوری که می خواهید بنویسید باید حتما در سرور مجوز این نوع دستور داده شده باشد 
نکته مهم . وقتی می خواهید از دستورات اس کیو ال سافتاده کنید در سمت سرور علاوه بر وجود مجوز در dataprovider  باید دیتا ست شما (adoquery) حتما بسته باشد
 (adoquery.active= false)
موفق باشید

----------


## delphiprog3000

سلام با اجازه دوستان.

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

https://barnamenevis.org/showthread.php?t=59232

همین جور که دوستمون هم توضیح داد.

لایه اولیه که همان ارتباط سرور میباشد. که از connection برای ارتباط با دیتابیس استفاده میشود که به همراه آن از اشیای مثل Adodataset ها و Provider ها استفاده میشود.

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

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

بازم اگه مشکل داشتید مطرح کنید که این بحث رو گسترش بدیم.....

در کل بحث چند لایه بسیار جالب توجه است.که از آن زیاد استفاده نمی شود.

به امید موفقیت همه شما......

----------


## babak_delphi

باز هم سوالم رو تکرار میکنم
من تئوریِ Multi Tire رو تا حدودی بلدم
سوالم اینه :
تا جایی که من اطلاع دارم(از روی مطالبی که تو همین سایت خوندم) دستورات SQL در سمت Client نوشته نمی شوند
می خواهم بدونم که این دستورات رو چطوری در لایه میانی باید نوشت
با توجه به این که معمولا متن دستور SQL از قبل بطور دقیق معلوم نیست و با توجه به درخواست کاربر مشخص و تکمیل می شوند (مثلا در فرم جستجو که با توجه به این که کاربر محدوده مورد نظر برای کدام فیلد ها را وارد کرده باشد ، در دستور SQL ای که ساخته میشه در قسمت Where ممکنه 0 تا n فیلد وجود داشته باشه)
خب حالا تکلیف این کدهای SQL ای که بصورت دینامیک تولید میشن چیه 
چون در لایه Presentation مشخص میشه که چطور باید باشن ولی در Multi Tire گفته میشه که این کدها باید در لایه Bisines باشند.

----------


## vcldeveloper

> خب حالا تکلیف این کدهای SQL ای که بصورت دینامیک تولید میشن چیه


کلاینت هر درخواستی داشته باشه، اونو برای Application Server ارسال میکنه. Application Server براساس درخواست دریافت شده کد SQL مورد نیاز را تولید میکنه و به بانک اطلاعاتی می فرسته. وقتی نتیجه از بانک اطلاعاتی برپشت داده شد، از طریق Application Server به کلاینت ارسال میشه. در معماری DataSnap که دلفی ارائه میکنه، این نقش را ClientDataSet در سمت کلاینت و DataSetProvider در سمت Application Server برعهده می گیرند.

----------


## babak_delphi

اگر بخواهیم کدی مثل این را داشته باشیم باید چه کاری انجام بدهیم
'select * from Table1 where fld1 = '+edit1.text+' and fld2 = ' + edit2.text + ' and fld4 = ''' + edit4.text + ''''
این کد رو چطوری باید بسازیم که در لایه Presentation هیچ کد SQL نداشته باشیم؟

----------


## mrm0101

سلام 
من عرض کردم خدمتتون شما در ClientDataSet یک ایتم داره بنام commantext که شما دستورات اس کیو ال رو درون اون می نویسید 


 
ClientDataSet1.Close;
ClientDataSet1.CommandText:='select * from login where username ='+QuotedStr(edit1.text) +' and password = '+QuotedStr(edit2.text );
ClientDataSet1.Open;
if ClientDataSet1.RecordCount=0 then
MessageBox(Handle,'هیچ موردی پیدا نشد ','äÑã ÇÝÒÇÑ ÈÇÒÑÓí ',MB_OK+MB_RIGHT+MB_ICONINFORMATION );

----------


## vcldeveloper

> این کد رو چطوری باید بسازیم که در لایه Presentation هیچ کد SQL نداشته باشیم؟


توی DataSnap لایه Application Server شما یک کلاس در اختیار Client میزاره که حداقلش باید اینترفیس IAppServer را پیاده سازی کرده باشه (دلفی خودش براتون انجام میده)، شما می تونید به این کلاس متدهای مورد نظر خودتون رو اضافه کنید. Client میتونه این متدها را فراخوانی کنه و بهشون پارامتر بده. سرور هم میتونه بر اساس متد فراخوانی شده و مقادیر پارامترهای ارسال شده عملی رو انجام بده، مثلا یک کوئری از بانک بگیره، و نتیجه رو برای کلاینت ارسال کنه.
یک راهش هم اینه که مستقیما کوئری را از طریق کلاینت ارسال کنید (مثل پست 9# همین تاپیک) که در این صورت عینا همین کوئری در سمت Application Server روی بانک اجرا میشه. این روش در اکثر موارد روش جالبی نیست، چون دارید از یک معماری سه لایه استفاده دو لایه می کنید؛ در واقع بود و نبود Application Server در عمل نقشی در کار نخواهد داشت، چون کوئری مستقیما از Client روی بانک اطلاعاتی اجرا میشه.

----------


## mzjahromi

من سعی میکنم اگه وقتم اجازه بده مراحل ساخت یک برنامه نمونه کلاینت سرور رو در یک تاپیک جداگانه به صورت مرحله به مرحله توضیح بدم

----------


## hr110

> من سعی میکنم اگه وقتم اجازه بده مراحل ساخت یک برنامه نمونه کلاینت سرور رو در یک تاپیک جداگانه به صورت مرحله به مرحله توضیح بدم


لطفا در و.ی.ک.... انجام شود، متشکرم.

----------


## delphiprog3000

سلام با اجازه اساتید محترم.

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

البته با تشکر.......

----------


## babak_delphi

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



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

----------


## vcldeveloper

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


*Creating multi-tier information systems using MIDAS*

فقط بگم که MIDAS = DataSnap

----------


## حمیدرضاصادقیان

اینم یک نمونه که کامل در این زمینه توضیح داده.

----------


## babak_delphi

از آقایان کشاورز و صادقیان خیلی ممنونم
فوق العاده بود

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

----------


## mmds

سلام
راستشو بخواید چند لایه طوری که در بالا بحث شد نیست.نسبتا گسترده است ما داریم یه برنامه تحت وب می نوسیم که خیلی بزرگه و واسه یه شبکه محلی هستش .ولی زبانش C#‎ هستش .شما حتما باید لایه واسط رو بنویسید آنم کامل .
شرمنده بیشتر از این وقت نیست چون باید برگردم سر پروژه 
بای

----------


## جواد ملاولی

سلام. هر چند این تاپیک مال دو سال پیشه ولی یه سوال داشتم: آیا برنامه نویسی چند لایه فقط برای وقتیه که برنامه ی ما تحت شبکه است؟

----------


## vcldeveloper

> آیا برنامه نویسی چند لایه فقط برای وقتیه که برنامه ی ما تحت شبکه است؟


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

----------


## mahdy.asia

> بسمه تعالی 
> مراحل ایجاد یک برنامه clint/server با استفاده از برنامه نویسی سه لایه (*Multi Tire*) 
> 
> 
> برای استفاده از بانکهای اطلاعاتی در شبکه چندین راه وجود دارد 
> 
> 1- استفاده از adoconnection و استفاده از کلمه عبور و رمز و ای پی سرور و ...
> 2- استفاده از برنامه های چند لایه 
> 
> ...


من یک برنامه در دلفی 7 با روش شما ایجاد کردم مشکلی که هست من مایلم در لایه کلاینت بتوان پروسیجر هایی رو به برنامه اختصاص داد در صورتی که کامپوننت معرفی شده تنها قابلیت گرفتن دستورات اسکیوال را به صورت متنی دارد
                                                                        در صورت امکان راهنمایی کنید
                                                                         با تشکر از توجه شما

----------


## mahdy.asia

من دو تا پروسیجر در اسکیوال دارم که می بایست با پارامترهایی که از داخل برنامه می گیرد اجرا شود در این روش نام پروسیجر را در کدام لایه می بایست تنظیم کنم و چطور به برنامه اعلام کنم اکنون پروسیجر 1 را با پارمترهای a,b اجرا کن

----------


## bormohsen

یک کتاب خوب برای اولین بار در کشور چاپ شده که در آن برنامه نویسی سه لایه را توضیح داده. ضمنا یک پروژه بزرگ هم تویی این کتاب هستش که به صورت سه لایه پیاده سازی شده است. برای خواندن بخشی از کتاب و خرید می توانید به سایت WWW.HOWPRG.com مراجعه کنید

----------

