• 0
زكيري عبد العالي

التطبيقات متعددة الطبقات N-tier طريقة Data Access --> Business --> PresentationI

سؤال

مقدمة :

ان تسيير قاعدة البيانات باستخدام برمجة OOP يعد من ابرز الطرق التي اصبحت شائعة منذو فترة .

فمبرمجين الجافا يستعملون هده الطريقة في محيط برمجه اسمه STRUTS والدي هو أكثر طلبا من معضم الزبائن حاليا مع أدوات HIBERNATE اما برمجي الدوت نت لهم أداة مشابهة أيضا والكل يصب في قالب واحد هو بما يسمي MVC2 او 3-TIER

.

لكن نحن مبرمجي الدلفي لم يسبق لنا ان شاهدنا مشاريع او دروس تتحدث عن هذه الطريقه و بهذا المفهوه حيث حينما نسمع البرمجة متعددت الطبقات نتصور مباشرةا انه مشروع client/server

*-فماهي هده الطريقة

*-ما فائدتها

*- ومتى نستعملها

*-كيف نستعملها في الدلفي و البريسم .

تعريف :

محمد شاآر محمود وهيب البياتي

هي عبارة عن نموذج منطقي لهيكل تطبيقي ذو ثلاث طبقات منفصل البرمجة حيث تتخاطب هذه الاخيرة مع بعضها البعض الكل يشترك لانشاء مشروع واحد , تكون هده الطبقات مرتبة ومتسلسلة وهي

1 طبقة العرض

وهذا هو المستوى الأعلى من التطبيق. طبقة العرض تعرض المعلومات المتعلقة بالخدمات مثل تصفح البضائع، وشراء، ومحتويات عربة التسوق. وتتصل بالطبقات الأخرى عن طريق إخراج النتائج إلى طبقة المتصفح / العميل وجميع الطبقات الأخرى في الشبكة.

2/ طبقة التطبيق (منطق الأعمال / طبقة المنطق)

طبقة المنطق انسحبت من طبقة العرض، باعتبارها طبقة خاصة بها، وتتحكم بوظيفة التطبيق عن طريق أداء معالجة تفصيلية.

3/ طبقة البيانات

هذه الطبقة تتكون من خوادم قاعدة البيانات. هنا يتم تخزين المعلومات واسترجاعها. هذه الطبقة تحتفظ بالبيانات محايدة ومستقلة من خوادم التطبيقات أو منطق الأعمال. إعطاء البيانات الطبقة الخاصة بها يسهم في تحسين الأداء وتطويره.

ما فائدتها

1- فصل المعالجات على المعطيات

2-التقليل من حجم الملف التنفيدي للمشروع وبدالك السرعة في التنفيد

3-من 1 نتأكد من وجود السرية والامن في المعطياة

4-يمكن وضع كل قسم في سرفر منقصل وهدا يوقينا من تراكم المعطيات في جهاز واحد

5-الصيانة تكون سهلة , فمثلا عند تغيير قاعدة البيانات من اوراكل الى اسكل سرفر يتم التغيير الا على مستوى "طبقة البيانات"

6-السماح بدمج عدة لغات برمجة اي يمكن ان يكون في فريق البرمجة مبرمج دلفي فبي و سي شارب وبهدا الطبقات الثلاثة تكون بثلاث لغات

7-الطبقة الاولى يمكن ان تكون عبارة عن

*- موقع واب

*-برنامج winform

*-برنامج على الموبايل

.......

دون تغيير الطبقات الاخرى

ومتى نستعملها

نستعمل هذه الطريقة حينما يطلب منا تحقيق مشروع درسة بطريقة UML

طريقة مريز لا نتفع هنا ابدا

حمل هنا السورس كود

3-Tier.rar

تم تعديل بواسطه زكيري عبد العالي
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

33 إجابة على هذا السؤال .

  • 0

سنقوم اولا بانشاء قاعدة البيانات باسم

DB_test

و التي تحتوي على الجدول التالي

Perso

و الدي بدوره يتكون من الحقول التالية كمثال سهل لتطبيق

ID_Perso

Nom_Perso

Prenom_Perso

Age_Perso

هذا المثال بالدفي 2010:

post-1034-1218391621_thumb.jpg

post-1034-12682206539681_thumb.jpg

post-1034-12682206681011_thumb.jpg

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

افتح مشروع جديد به تطبيق جديد من نوع Package1.bpl غير الاسم الى Common.bpl

ثم غير اسم المشروع Package1.dproj الى 3Tier.dproj

post-1034-12679138041999_thumb.jpg

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نظيف تطبيقين جديدين بعد ذلك الاول باسم Interfaces و الاخر باسم Dal

post-1034-12679143031561_thumb.jpg

post-1034-12679149326462_thumb.jpg

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لم يبقى الا اضافة خدمت الويب و تطبيق الواجهة .

الهدف من خدمت الويب هي : امكانية التخاطب بين الطبقات حتى ولو كانت لغة برمجة طبقت العرض ليست دلفي .

في البداية نكون تطبيق الدلفي win32 و بعدها سنضيف تطبيق اخر ويب حيث لا يوجد فرق بينهما الهذف هو استعلال خدمت الويب فقط و عرض الناتج للمستعمل

تكون الهكلة العامه للمشروع كما موضح في الصورة .

نكرر العملية الموجودة في الصورة 5 مرات اي لكل مشروع .

post-1034-12679166430141_thumb.jpg

post-1034-12679595660007_thumb.jpg

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

كتابة الكود

1- التطبق الاول Common

نجد فيه كل ما هو مشترك في الطبقات .

نضيف الى هذا المشروع الوحدة Uperso و التي تحتوي على الصنف او الكلاس Tperso و ايض الحقول التي نريد عرضها في كل مرة نردي عرض الفرد perso من القاعدة .

unit Uperso;

interface

type
Tperso = class
Private
public
Property ID_Perso: integer;
Property Nom_Perso: string;
Property Prenom_Perso: string;
Property Age_Perso: integer;


end;

implementation

end.

نحد تعريف الحقول ثم نضغط على الازرار الثلاثة مع بعض ctrl+Maj+C

لنتحصل في الاخير على الصنف و جميع الوظاءف التي تسمح لنا بالوصول الى الحقول .

الناتج

unit Uperso;

interface

type
Tperso = class
Private
FAge_Perso: integer;
FPrenom_Perso: string;
FNom_Perso: string;
FID_Perso: integer;
procedure SetAge_Perso(const Value: integer);
procedure SetID_Perso(const Value: integer);
procedure SetNom_Perso(const Value: string);
procedure SetPrenom_Perso(const Value: string);
public
Property ID_Perso: integer read FID_Perso write SetID_Perso;
Property Nom_Perso: string read FNom_Perso write SetNom_Perso;
Property Prenom_Perso: string read FPrenom_Perso write SetPrenom_Perso;
Property Age_Perso: integer read FAge_Perso write SetAge_Perso;


end;

implementation

{ Tperso }

procedure Tperso.SetAge_Perso(const Value: integer);
begin
FAge_Perso := Value;
end;

procedure Tperso.SetID_Perso(const Value: integer);
begin
FID_Perso := Value;
end;

procedure Tperso.SetNom_Perso(const Value: string);
begin
FNom_Perso := Value;
end;

procedure Tperso.SetPrenom_Perso(const Value: string);
begin
FPrenom_Perso := Value;
end;

end.

post-1034-12679608623302_thumb.jpg

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

و الان سنقوم بانشاء الكلاس UPersoCollection.pas و التي سترث من الكلاس TLIS

unit UPersoCollection;

interface

uses Classes;

type
TpersoCollection <TPerso> = class (TList)

private
{ Déclarations privées }
public
constructor Create;
end;

implementation

constructor TPersoCollection.Create;
begin
inherited Create;
end;

end.

الهدف من هده الكلاس هو انشاء شئ OBJECT من نوع قائمة اشياء وهي النتاجة عن الكلاس الاولة طبعا اي قاءمة PERSO

post-1034-12679968009659_thumb.jpg

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

التطبيق الثاني Interfaces.dproj

و الذي يحتوي على وحدة UpersoManager.pas

و الكلاس IpersoManager

لعمل GID

اتوماتكيا في الدلفي نقوم بالضغط على

ctrl + Maj + G

اذا هي عبارة عن انترفاس بها وظيفة شرطا تسمح يمنادات و الحصول على سلسلة التسجيلات

الان نقوم باضافة مكتبه المشروع الاول بالطريقة التالي

unit UpersoManager;

interface

// uses UpersoCollection
type
IpersoManager = interface
['{016D14C4-5020-46EA-B3EE-1AF2997BC48F}']
// function FetchAll(): TPersoCollection;
end;

implementation

end.

كما تلاحضون انه لم يستطع التعرف على TPersoCollection و الموجودة في التطبيق الاول common و هذا هو المطلوب لاننا نريد ان نعمل على ناتج كمبايل المشروع االول وليس السورس الكود .

ولعمل هذا التعريف نقوم بمايلي لا حض الصورة

post-1034-1267967671934_thumb.jpg

post-1034-12679969005751_thumb.jpg

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

3- التطبيق DAl و هو الذي يمثل الطبقة الثانية اي كل ما يتعلق بالعمليات على القاعدة من اضافة و تغيير و حذف ...الخ

1-نضيف المكتبتين الخاصة بالمشروع الاول و الثاني Interfaces.dll Common.dll

2- نكتب السورس في الكلاس UpersoDAL

unit UpersoDAL;

interface

uses
ADODB, DB,SysUtils, UPerso, UPersoCollection,UpersoManager, AppConfig;

type
TPersoDAL = class (TInterfacedObject,IpersoManager)

private
{ Déclarations privées }
public
constructor Create;
function FetchAll(): TPersoCollection;
end;

implementation

constructor TPersoDAL.Create;
begin
inherited Create;

end;

function GetFromQuery(iQuery: TADOQuery): TPerso;
var
item: TPerso;
begin
item := TPerso.Create();
item.ID_Perso :=iQuery.FieldByName('ID_Perso').AsInteger;
item.Nom_Perso :=iQuery.FieldByName('Nom_Perso').AsString;
item.Prenom_Perso :=iQuery.FieldByName('Prenom_Perso').AsString;
item.Age_Perso := iQuery.FieldByName('Age_Perso').AsInteger;
result := item;
end;

function TPersoDAL.FetchAll(): TPersoCollection;
var
items: TPersoCollection;
item: TPerso;
conn: TADOConnection;
Query: TADOQuery;
begin
try
items := TPersoCollection.Create();
conn := TADOConnection.Create(nil);
Query := TADOQuery.Create(nil);

conn.ConnectionString := cConnectionString;
Query.Connection:= conn;
Try
conn.Open();
except on e:exception do
End;

Query.SQL.Text := cSQLFetchAll;
try
Query.Open();
while not (Query.Eof) do
begin
items.Add(GetFromQuery(Query));
Query.Next;
end;
except on e:exception do
End;

finally
result := items;
Query.Close;
conn.Close;
Query.free;
conn.free;
//items.free;
end;
end;

end.

نضيف و حدة اخري نضع فيها جميع الثوابت ونسميها AppConfig.pas

unit AppConfig;

interface

Const
cSQLFetchAll = 'SELECT * FROM Perso ';
cConnectionString ='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB_test;Data Source=ZEKIRI-PC\SQLEXPRESS';
implementation

end.

الان نقوم بعملية بسيطة هدفها هو عند عمل كومبال لتطبيق الطبقة المحددة يقوم الدلفي بعمل كمبايل لجميع تطبيقات الطبقات السابقة

post-1034-1267995650029_thumb.jpg

post-1034-12680370190939_thumb.jpg

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تطبيق خدمت الواب

وهو عبارة عن همزة وصل بين طبقة العرض و طبقة DAL .

حيث نجد فيه كل الوضائف التي استعملناها في في طبقة DAL.

اذن سنكتب الكود الان نفتح الوحدة ServiceWebIntf

و نضيف السطر

    function FetchAll(): TPersoCollection; stdcall;

unit ServiceWebIntf;

interface

uses InvokeRegistry, Types, XSBuiltIns, UpersoCollection;

type
IServiceWeb = interface(IInvokable)
['{CF6B87A7-2C0F-47E2-A136-A41F3E8F4549}']
function FetchAll(): TPersoCollection; stdcall;
end;

implementation

initialization

InvRegistry.RegisterInterface(TypeInfo(IServiceWeb));

en

نفتح الوحدة ServiceWebImpl

من هذاا التعريف

  TServiceWeb = class(TInvokableClass, IServiceWeb)

نجد ان الكلاس مرتبطة بالانترفيس معناه بجب علينا اعادة كتابة الوضيف بنفس الشكل

unit ServiceWebImpl;
interface
uses InvokeRegistry, Types, XSBuiltIns, ServiceWebIntf,
UpersoCollection,UpersoDAL;

type

{ TServiceWeb }
TServiceWeb = class(TInvokableClass, IServiceWeb)
private
public
function FetchAll(): TPersoCollection; stdcall;
end;

implementation


{ TServiceWeb }

function TServiceWeb.FetchAll(): TPersoCollection;
var
Manager : TPersoDAL;
begin
TRY
Manager:=TPersoDAL.Create();
Result:= Manager.FetchAll();
FINALLY
Manager.Free;
END;
end;

initialization
{ les classes invocables doivent être recensées }
InvRegistry.RegisterInvokableClass(TServiceWeb);
end.

قمنا بانشاء شئ من نوع TPersoDAL و قمنا باستدعاء الوضيفة FetchAll و الناتج نضعه في Result

post-1034-12679973530104_thumb.jpg

post-1034-12680748946287_thumb.jpg

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ..

كيف الاحوال الاخ عبد العالي. درس جميل جدا .

اعجبتني فكرة التعامل عن طريق http بين الطبقات.

ماذا تحتاج كمساعدة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اهلا اخي امين بارك الله فيك

لم يبقى الى علي و طلال ليكتمل الفريق .

المشكلة هى :

1-اني اريد ربط مكونات DB اي dbgrid ...dbedit... الخ بالابجكت مثل ما يمكن عمله بالدوت نت .

وجدت فكرة لكن اريد ان ان اتأكد من انه لا توجد طرق احسن .


procedure TForm1.Button1Click(Sender: TObject);
var
cFacadeF: PersoFacades;
vPersoCollection: PersoCollection;
i:integer;
begin
cFacadeF := PersoFacades.Create();
vPersoCollection := PersoCollection.Create();
TRY
vPersoCollection:=cFacadeF.FetchAll();
CharegInDataSet(vPersoCollection);
FINALLY
cFacadeF.Free;
vPersoCollection.Free;
END;
end;
//*****************************************************************************
procedure TForm1.CharegInDataSet(iPersoCollection:PersoCollection);
var
ClientDataSetimport : TClientDataSet;
I:integer;
vperso:perso;
begin
ClientDataSetimport :=TClientDataSet.Create(nil);
ClientDataSetimport.FieldDefs.Add('ID_Perso',ftInteger,0,false);
ClientDataSetimport.FieldDefs.Add('Nom_Perso',ftString,30,false);
ClientDataSetimport.FieldDefs.Add('Prenom_Perso',ftString,30,false);
ClientDataSetimport.FieldDefs.Add('Age_Perso',ftInteger,0,false);
ClientDataSetimport.CreateDataSet;
vperso:=perso.Create();
//*************************************************
for I := 0 to iPersoCollection.Count - 1 do
begin
vperso:=iPersoCollection.Items[I];

ClientDataSetimport.Append;
ClientDataSetimport.FieldByName('ID_Perso').value:=vperso.ID_Perso;
ClientDataSetimport.FieldByName('Nom_Perso').value:=vperso.Nom_Perso;
ClientDataSetimport.FieldByName('Prenom_Perso').value:=vperso.Prenom_Perso;
ClientDataSetimport.FieldByName('Age_Perso').value:=vperso.Age_Perso;
ClientDataSetimport.Post;
end;
//*********************************************************
ClientDataSetimport.Open;
DataSource1.DataSet:=ClientDataSetimport;
DBGrid1.DataSource:=DataSource1;
DBNavigator1.DataSource:=DataSource1;
end;

2- تجربت استغلال خدمت الواب بواسطة لغة اخرى مثل الجافا او الدوت نت هذا طبعا بعد الانتهاء من وضع الكود اليوم ان شاء الله .

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الطبقة الاخيرة : طبقة العرض

في هذه الطبقة نقوم بانشاء تطبيق win32 ثم بعد ان نتحصل على نتيجة جيدة نضيف تطبيق ويب بالدلفي و الدوت نت و الجافا ان شاء الله .

كما اننا قمنا الى بعملية واحدة هي عرض البيانت الموجودة في الجدول perso فقط و سنضيف بحول الله كل العمليا ت القاعدة ان شاء الله .

اذن الخلاصة هي

طبقه العرض (تطبق AppWin32.dproj او تطبق/web_jee/ web_delphi / web_net) ---> بقوم باستغلال خدمت الويب و التي بدرها تتخاطب مع ------> الطبقتين المتبقيتين

اذن ننشأ الواجهة الممثل في الشكل ثم نقوم بانشاء client service web بالطريقة التالية :

post-1034-12680772441138_thumb.jpg

post-1034-12680799121281_thumb.jpg

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

انا نوعا ما متأخر عليك في التفكير اخي عبد العالي ما انني اعاني من مشكلة في النظر الى الاكواد على صفحات الويب. اذا كان بالامكان ان تراسني بالود الذي انجزته حاليا و اسم النسخة التي تعم عليها كي استطيع ان اتابع معك اللية او غدا.

كسؤال لماذا PersoCollection ترث من TList و ليس من TDataSet؟ لان الربط سيكون اسهل مع DataSource

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نعم اخي امين هذا ماقمت به في المرة الاولى و اثتها من clientdataset و لكن قلت بما اني اريد ان ان استخدم الطبقتين في خدمت الوب اردت انه عند انشاء client service web يكون عام ليس خاص بالدلفي .

و اعتقد ان TLIST اعم وهذه الفكرة طبعا للنقاش .

بارك الله فيك على المتابعة .

نحن في السكيب ان اردت الدخول .

النسخة

delphi 2010

sqlserver

IIS

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0


uses IServiceWeb1;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
service: IServiceWeb1.IServiceWeb;
list: Tlist;
begin
service := GetIServiceWeb;
list := Tlist.Create;
list := (Tlist)(service.FetchAll);
showmessage(list.Count);
end;

عند النقر على الزر نكتب الكود

وهنا تضهر الاشكالية ارجو المساعدة بارك الله فيكم

اضن ان المشكلة ف يكون الكلاسات المستعملت ليس من نوع Serializable

في الدزت نت او البريسم نكتب


type
[Serializable]
TpersoCollection = class (TList, ISerializable)

و في الجافا نكتب


public class TpersoCollection {
}
public class TpersoCollection extends TList implements Serializable {
...
}

لكن في الدلفي كيف خبرت 6 سنوات ولم يسبق لي ان عملت هذا :blush:

post-1034-12680803173348_thumb.jpg

post-1034-12680809235746_thumb.jpg

3-Tier.rar

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سالة الخطأ هي

post-1034-12681468506913_thumb.jpg

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمة الله وبركاته

موضوع جميل والاجمل اصرارك على تطبيق n-tier بدلفي

لقد كنت اعتقد ان الامر مستحيل بدلفي لكنك قطعت شوطا مهما

طريقة جديدة اتمنى لك التوفيق اخي عبد العالي

وفقنا الله واياكم لما يحبه ويرضاه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمة الله وبركاته.

كيف الاحوال يااحباب و الله غيبة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الحمد لله رجع فريق عمل الدلفي

محمد / امين / علي / طلال / و الاستاذ ناجي

هيا بنا في مشاريع جديدة بالدلفي و نتميز بمنتدانا الغالي

الخبر ة موجودة و القدرة لم يبقى الى التنفيذ

ان شاء الله ان نجحت الفكرة سنقوم بانشاء مشروع جميل بهذه الطريقه .

و كمل مشروع الصيدليه ايضا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

درس ممتاز أخي زكيري،

لكن لي بعض الملاحظات إذا سمحت:

1. الصنف TPersoCollection حتى تستطيع إستخدامه في الويب سيرفس يجب ان يكون مشتق من نوع TRemotable، وأيضاً

2. حسب ملف ال WSDL المولد فالنوع المعرف ك Complex type هو TPersoCollection، ولا يوجد به اي حقول معرفة به حسب الأصناف القياسية للويب سيرفس.

3. لا يمكن استخدام الصنف TList لانه خاص بدلفي فقط، واعتقد لا يمكن عمل له Serlization، لكني سوف أتأكد من هذا لاحقاً.

4. عادة طبقة ال DAL تقوم بإخفاء معلومات التعامل مع قاعدة البيانات عن BOL، لذا يفضل ان لا تقوم بتمرير ADOQuery كمعامل، بل عل DAL ان تقوم بإنشائها بنفسها بشكل تلقائي وإرجاع البيانات، ايضا عند تغيريك لتقنية المستخدمة في الربط مع قاعدة البيانات من ADO الى dbExpress مثلا، سوف تضطر إلى تغيير الكود الموجود في DAL و BOL وهذا يضيع من فائدة إستخدام طبقة ال DAL في البرنامج.

5. احبذ استخدام تقنية DataSnap على الويب سيرفس لان بها مميزات اكبر لبناء برامج متعددة الطباقات وخاصة مع نسخة 2009 و2010، بالاضافة إلى أنه يمكنك استخدامها مع دلفي بريزم ايضا :).

6. ايضا لو تضع السورس كود للمشروع ملحق للمشاركة سوف يكون أسهل في التجربة من نسخه من كل المشاركات.

سوف احاول المساعدة إن شاء الله خلال الإسبوع القادم لإن هذا الإسبوع مشغول بشكل كبير جداً.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

و اخير.

استاذى الكريم محمد نسمان مرحبا بك و مسرور انا بوجودك و مشاركتة جزاك الله خيرا.

لكن لي بعض الملاحظات إذا سمحت:

بالطبع فمنك نتعلم .

الصنف TPersoCollection حتى تستطيع إستخدامه في الويب سيرفس يجب ان يكون مشتق من نوع TRemotable، وأيضاً

اعتقد انه لا نستطيع التوريث من كلاسين لهذا ايمكنك اعطاءي الانترفاس الخاصة TRemotable اي

اي كيف اكتب

  TpersoCollection = class (TList<Tperso>,iRemotable )

في حبن نجد بديل ل TLIST

حسب ملف ال WSDL المولد فالنوع المعرف ك Complex type هو TPersoCollection، ولا يوجد به اي حقول معرفة به حسب الأصناف القياسية للويب سيرفس.

نعم الخطأ في انه لم يستطع saop ارسال TPersoCollection كما يجب و المشكلة في Serlizationعلى ما اعتقد

. لا يمكن استخدام الصنف TList لانه خاص بدلفي فقط، واعتقد لا يمكن عمل له Serlization، لكني سوف أتأكد من هذا لاحقاً.

فما هو البديل من فضلك

المشكلة هي في Serlization

بما اني استعملت الويب سرفيس هو الذي الذي سمنحنا ابجكت بديل و ذلك حسب اللغة التي سنتعملها لان طبقت العرض ليست مرتيطة مباشرتا بDAL بل بالويب سرفيس .

عادة طبقة ال DAL تقوم بإخفاء معلومات التعامل مع قاعدة البيانات عن BOL، لذا يفضل ان لا تقوم بتمرير ADOQuery كمعامل، بل عل DAL ان تقوم بإنشائها بنفسها بشكل تلقائي وإرجاع البيانات، ايضا عند تغيريك لتقنية المستخدمة في الربط مع قاعدة البيانات من ADO الى dbExpress مثلا، سوف تضطر إلى تغيير الكود الموجود في DAL و BOL وهذا يضيع من فائدة إستخدام طبقة ال DAL في البرنامج.

صح :wacko: لكن كيف .

احبذ استخدام تقنية DataSnap على الويب سيرفس لان بها مميزات اكبر لبناء برامج متعددة الطباقات وخاصة مع نسخة 2009 و2010، بالاضافة إلى أنه يمكنك استخدامها مع دلفي بريزم ايضا

جربت ذلك لكن لم يعجبني فكرة انشاء سرفر ونداوز لكن سارى ما يمكن عمله لاحقا . لكن انا الان مصر على الويب سرفيس .

يضا لو تضع السورس كود للمشروع ملحق للمشاركة سوف يكون أسهل في التجربة من نسخه من كل المشاركات

فعلا الرابطة التى وضعتها لا نراها جيدا على العموم لقد وضعتها في بداية المشروع .

سوف احاول المساعدة إن شاء الله خلال الإسبوع القادم

انتضرك على نار. لانه كان جاري النقاش مع فريق العمل ل .net و الجافا وكانو يستهزءون بالدلفي و هذا ما جعلني اقوم بكل ما يقومون به من طرق جديدة في البرمجة .

شكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

كيف حال الجميع

شكرا على دروسك الرائعة استاذنا ذكيري , بانتظارك وبانتظار استاذنا محمد نسمان

بالتوفيق إن شاء الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ألف شكر لك استاذ ذكيري واتمنى ان نقوم بإنشاء هذه التطبيقات في المستقبل لانها ممكن جديدة علينا لنسبق اللغات الثانية ولكم جزيل الشكر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

طال الانتضار اخي محمد .

ارجوا من الله ان تكون بخير و كل اخواننا في فلسطين

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

اخيرا وجدت الحل و الحمد لله

الفكرة هي انشاء خاصية او حقل داخل كلاس من نوع arry لعناصر كلاس الاولى وبذلك يمكن عمل ارث لTRemotable للكلاس الثانية .

مثال توضيحي

اسمية الكلاس الاولى TMyclass


TMyclass = class (TRemotable)
private
FMyproperty: string;
published
property Myproperty: string read FMyproperty write FMyproperty;
end;

انشأت قاءمة ابجكة من نوع الكلاس الاولى و المتمثلة في جدول

  TArray = array of TMyclass;

انشأت الكلاس الثانبة و التئ من المفروض هى التي تكون القاءمة

TMyListOfMyclass = class(TRemotable)
private
Fitms: TArray;
published
property itms : TArray read Fitms write Fitms;
end;

service.rar

تم تعديل بواسطه زكيري عبد العالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .