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

صنع موقع ويب بالدلفي DataSnap/REST HTML5/jQuery

سؤال

السلام عليكم 

لقد كتبت في السابق دروسا حول كيفية صنع مواقع الويب بالدلفي ولحد الان كانت هده الطرق غير كافيه لعمل موقع ينافس .net اة jsp 

مع انه يوجد ادوت تسمح بتشغيل تطبيقاتك على سطح المكتب و احسنها هي http://www.unigui.com  مثال https://www.youtube.com/watch?v=oMAoauGHh28

لكن مع ضهور html 5 css3 بالاضافة الى التطور الكبير على الجافا سكريبت و التحسينات على Datasnap  اضن انه حان الوقت لانتقال الى برمجة الويب بالدلفي و ساشرح لكم كيف

مواضيع سابقة

• CGI
•ISAPI
• تصميم مواق الواب بالتفنية الجديدة net
Objet COM ASP
• مقدمة في IntraWeb
• لغة Delphi.net_Asp.net
Web Services •
هناك موضوع سابق تحدث فيه اخي على نجد فيه الشرح لبعض الامور 

 • التطبيقات المتعددة الطبقات datasnap الطريقة 3

نبدا ان شاء الله 

Résultat de recherche d'images pour "architecture MVC"

الطريقة التي ساطرحها هي معتمدة اساسا على ثلاثة طبقات حيث جيث نجد المودل و كنترولر في جزء من المشروع نسميه ب API او Backend و الجزء الثاني نجد فيه طبقة العرض View و نسميها UI او Frontend.

Résultat de recherche d'images pour "web api architecture"

ادا نجد في مشروعينا تطبيقين 

- تطبيق DataSnap/REST ISAPI

- تطبيق Html5/Js

1- DataSnap/REST ISAPI

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

NewProject.png

بعدها نتحصل على ما في الصورة التالية لا يهمنا ما يوجد في كل من imag/css/js/..

المهم هو الوحدة ServerMethodsUnit1 حيث نقوم باستبدال الكود بوضيفة واحدة هي 

unit ServerMethodsUnit1;
interface
uses System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth;
type
{$METHODINFO ON}
  TServerMethods1 = class(TComponent)
  private
    { Private declarations }
  public
    { Public declarations }
    function HelloWorld(): string;
  end;
{$METHODINFO OFF}
implementation
function TServerMethods1.HelloWorld(): string;
begin
  Result := 'Hello World';
end;

end.

بعد عمليه COMPILE نتحصل على ملف Delphi.dll

CompileProject.png

لقد انهينا التطبيق الدي سيشتغلى على السرفر و لتجربته يجب علينا اضافته الى IIS ادا السؤال كيف يتم اصدار DataSnap الى IIS 

الجواب :

1- نقوم بانشاء تطبيق IIS

IIS_Web_Site.png

 

2- نقوم بتغير Pool كي يقوم بتشغيل win32

IIS_Web_Site_Pool.png

3- نقوم باضافة ملف Delphi.dell الناتج عن مشروعنا الى قاءمة ISAPI بالطريقة التالية 

ISAPI.png

4- نقوم بتفعيل ISAPI 

isapi_active.png

5- نضيف delphi.dll الى قاءمة default للموقع

Website_FirstDoc.png

6- نقوم بكتابه  عنوان الابي على الهوست فايل 

host_file.png

النتيجه :

عند كتابة http://delphi_backend.net على النتصفح نلاحض  Server Functions عند النقر عليها ثم على  TServerMethods1  سنجد الوضيفه التي كتبناها و عند تنفيد الامر نتحصل على كلمة  Hello World على شكل JSON  لاحض الصورة 

web_method_HelloWord.png

ارجو من الله اني وفقت في شرح الخطوة االولى ان لم يكن هناك اسالة ساباشر في الخطة التالية 

شكرا 

 

 

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

شارك هذا الرد


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

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

  • 0

عودة مباركة أخي زكريا

 

استعملت web service للتجواب مع العملاء

طريقة ذكية ولكن هل هي بقوة الجافا و ASP

على كل حال أنا متابع

 

 

0

شارك هذا الرد


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

اهلا اخي احمد 

انا في الحقيقة متوقف عن الدلفي منذوا اكثر من 5 سنوات لان الدلفي كان ضعيفا في برمجه الويب عكس ما يطلبه عملي كنت مبرمج ASP.NET  و منذوا 3 سنوات استعمل نفس هذه الطريقة لكن بواسطة WEP API

ASPWebapi.png

اي اتحصل في الطبقه الاولى على Dll وبعد اضافتها في IIS على مستوى السرفر نستعمل jquery او الجافا سكربت او حتي الفروم ورك  Angularjs  في التحكم في واجهة المستعمل اما عن المكونات فاني استعمل لحد الان كل من  bootstrap و للروسومات البيانية highcharts .

اذا استطعنا عمل GET وPOST بتمرير ابجكت على مستوى Datasnap و الاتصال ب قاعد البيانات دزن مشاكل فقول على بركه الله دلفي اصبح ينافس JSP ASP في صنع المواقع 

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

شارك هذا الرد


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

2- Html5 / Js

في هذا الجزء سنقوم بعمل مشروع ويب بسيط يقوم باضهار رسالة Hello Word و التي يرسلها له الجزء الاول Datasnap ,و لتخاطب معه سنسعمل اوامر ajax عن طريق jquery فنبدا ان شاء الله 

1- نضيف مشروع جديد نسميه DelphiFrontend حيث به

- مجلد  سنضع كل ملفات الجافا سكربت هنا 

- img للصور 

- css للانماط 

- ملف html نسميه Index.html 

web config سيضاف اتوماتكيا عن التغير في IIS  لاحض الصورة 

Frontend.png

نكتب في ملف index.html الكود التلي 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
      <!--jquery Lib-->
    <script type="text/javascript" src="js/lib/jquery/jquery-2.1.3.min.js"></script>
    <script type="text/javascript" src="js/common.js"></script>
  </head>
  <body>
  </body>
</html>

ساضع في المجد LIB كل ما نجتاجه من js 

و نكتب في common.js الكود التالي 

$fronted = {};
$fronted.host = "http://delphibackend.net//DelphiBackend.dll/datasnap/rest/TServerMethods1/";
$fronted.SERVICE =
 {
  helloword_method_url         : $fronted.host + "HelloWorld",
 };

/*======================================================================
   Service Web Metod
 ======================================================================*/
function HelloWorld()
{
 $.ajax($fronted.SERVICE.helloword_method_url, { method: 'GET', xhrFields: { withCredentials: false } })
 .success(function (data) {
  alert(JSON.parse(data).result[0]);
 })
 .fail( function(xhr, textStatus, errorThrown) {
 });
}

HelloWorld()

الشرح 

انشات ابجكت fronted$ من نوع  globale 

به الخاصية host التي نجد فيها مسار الوضيفة التي نريد طلبها 

http://delphibackend.net/DelphiBackend.dll/datasnap/rest/TServerMethods1/HelloWorld

لو كتبنا هدا على النتصفح لاعطان النتيجه التاليه  {"result":["Hello World"]}

ادا URL لهذا العميل هو مركب من http://delphibackend.net/ و هو عنوان موقعنا الخاص بالجزء الاول 

+ الكلمة /datasnap/rest/ 

+ اسم الوحدة التي كتبنا فيها مختلف الوضاءف TServerMethods1

+ اسم الوضيفة 

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

2- الان سنضيف موقعنا على IIS 

بمثل ما قمنا به في المرة الاولى لكن لا نغير ولا شيء في POOL

نتحصل على 

Frontend_IIS.png

الان نتاكد من ان كلا الموقعين من نوع Authentication  Anonymous

نضيف الموع على الهوست 

 

Frontend_host.png

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

شارك هذا الرد


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

نقوم بطلب الموقع على المتصفح 

http://delphifrontend.net/index.html

النتبجه لاتعمل هناك رسالة خطأ

Frontend_error.png

نعم لانه يجب علينا ان نقول للجزء الاول datasnap و الذي ساسميه من الان API لسرعت الشرح نعم يجب علينا ان نقول ل API ان الموقع الدي سيطلب منك الخدمة هو delphifrontend. كما يمكن ان نقول ايضا انك ستخدم جميع المواضع التي تطلبك 

يتم ذلك باضافة الكود التالي في الوحدة WebModuleUnit1

اي تغيير الوضيفة TWebModule1.WebModuleBeforeDispatch

procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
   Response.SetCustomHeader('Access-Control-Allow-Origin', '*');
  if Trim(Request.GetFieldByName('Access-Control-Request-Headers')) <> '' then
  begin
    Response.SetCustomHeader('Access-Control-Allow-Headers',
      Request.GetFieldByName('Access-Control-Request-Headers'));
    Handled := True;
  end;

  if FServerFunctionInvokerAction <> nil then
    FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;

ملاحضة عند عمل كومبيل يجب توقيف POOL DelphiBackend ليتم انشاء Dll الجديد .

 

Frontend_result.png

لقد قمت بوضع السورس كود مع بعض التغييرات + css + صورة 

ان شاء الله ساكمل الدرس بعمل تمرير ابجكت او قاءمة ابجكت من Api الى الجافا سكربت ثم نقوم بعرض النتيجة في جدول html.

ثم نحول الجدول الى Dbgrid الدي يقدمه Bootstrap و الذي يسما datatable

شكرا 

MyFirstWebApp.zip

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

شارك هذا الرد


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

السلام عليكم 

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

1- سنحاول الان عرض قاءمة في جدول كمثال قاءمة مستعملين اي الرقم الاسم اللقب ... و هي خصاءص لكلاس نسميها مثلا Tuser و هكذا تكون الوحدة User كمايلي 

unit User;
interface
type
{$METHODINFO ON}
  TUser = class
  private
    LastName: string;
    Id: integer;
    FirstName: string;
    Login: string;
    procedure SetFirstName(const Value: string);
    procedure SetId(const Value: integer);
    procedure SetLastName(const Value: string);
    procedure SetLogin(const Value: string);
    { Private declarations }
  public
    { Public declarations }
    Property mId: integer read Id write SetId;
    Property mLogin : string read Login write SetLogin;
    Property mFirstName : string read FirstName write SetFirstName;
    Property mLastName : string read LastName write SetLastName;

  end;
{$METHODINFO OFF}
implementation

{ TUser }

procedure TUser.SetFirstName(const Value: string);
begin
  FirstName := Value;
end;

procedure TUser.SetId(const Value: integer);
begin
  Id := Value;
end;

procedure TUser.SetLastName(const Value: string);
begin
  LastName := Value;
end;

procedure TUser.SetLogin(const Value: string);
begin
  Login := Value;
end;
end.

نقوم بحفض هدا الملف في مجلد نسميه Models و هكذا نجمع كل المودلات في هذا المجلد 

2- اتذكرون الوحدة التي كتبنا فيها الويب متود  Hello و التي قام الدلفي بتسميها ServerMethodsUnit1  سننقلها الى مجلد جديد اسمه Controllers و نغير اسمها الى ProjectController  مثلا. هنا نقوم وضع جميع ويب متود الخاصة بالمشروع 

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

TProjectController = class(TComponent)
  private
    { Private declarations }
  public
    { Public declarations }
    function GetUserList(): TList<TUser>;
  end;
{$METHODINFO OFF}
implementation
function TProjectController.GetUserList(): TList<TUser>;
var mUser : TUser;
begin
      Result:= TList<TUser>.Create;
      mUser := TUser.Create;
      mUser.mId:=1;
      mUser.mLogin:='zekiriAbd';
      mUser.mFirstName:='Zekiri';
      mUser.mLastName:='Abdelali';
      Result.Add(mUser);

      mUser := TUser.Create;
      mUser.mId:=2;
      mUser.mLogin:='MohamedNA';
      mUser.mFirstName:='Mohamed';
      mUser.mLastName:='Nassman';
      Result.Add(mUser);

      mUser := TUser.Create;
      mUser.mId:=3;
      mUser.mLogin:='AliW';
      mUser.mFirstName:='Ali';
      mUser.mLastName:='AlWi';
      Result.Add(mUser);
end;

كما تلاحضون اني انشاءت 3 ابجكت من نوع TUser  وضعتهم في قاءمة مسترجعة عن منادات الميتود GetUserList.

3- انقل WebModuleUnit1 الى مجلد جديد نسميه مثلا Swagger

4- قمت بحدف كل المجلدات الاخرى img css ... لكن قبل الحذف احفضها في مكان ما على القرص و تاكد انها موجود نسخة منهم في المجلد \Debug لاننا نحتاجها في عرض و تجربت كل الويب متود الموجود . علما اني استعمل http://swagger.io/ في مشاريعي .net  ولست ادري ان كنا نستطيع استعمالها مع الدلفي سنرى ذلك لاحقا  

 لنتحصل على :

Api_1.png

بعد توقيف الPool و عمل كمبير للمشروع نقوم بعرض النتيجه على المتصفح 

Api_2.png

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

شارك هذا الرد


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

5- ها انتهينا من المودل و الكنترولر و لم يبقي سوى الفيو View  اي القسم الخاص بالعرض و كبعا قنا هده الطبقة ستكون بHTML5 / jQuery / CSS3  

1- قمت وضع ديف في الصفحة سمته  <div id="div_users"> هنا سنضع قاءمة المستعملين  

2- غيرت url السابق الى 

$fronted.host = "http://delphibackend.net//DelphiBackend.dll/datasnap/rest/TProjectController/";
$fronted.SERVICE =
 {
  user_list_url : $fronted.host + "GetUserList",
 };

3- وكتبت في الميتود التي ستتخاطب مع API التالي 

function GetUsers(fnOnComplete)
{
 $.ajax($fronted.SERVICE.user_list_url, { method: 'GET', xhrFields: { withCredentials: false } })
 .success(function (data) {
  var _data = JSON.parse(data);
   $fronted.Users = _data.result[0].fields.FItems;
   if (fnOnComplete) { fnOnComplete(); }
 })
 .fail( function(xhr, textStatus, errorThrown) {
 });
}

 اي بعدما استرجعت القاءمة و تحويلها الى json وضعتها في fronted.Users الابجكت 

الان سنكتب الكود الذي سيرسم لنا الجدول حيث وضعته في ملف جديد Index.js

void function index_function(undefined) {

 function InitAppWhenReady() {
  // call api
  GetUsers(function () {
  // Draw users grid
   var table = $("<table id='grid_users' cellpadding='0' cellspacing='0' class='display'></table>");
   var thead = $("<thead><tr><th>ID</th><th>Login</th><th>Name</th></tr></thead>");
   table.append(thead);
   var tbody = $("<tbody></tbody>");
   var tr;
   $.each($fronted.Users, function (i, u) {
       if( u != null){
            tr = $("<tr></tr>");
            tr.append("<td>" + u.fields.Id + "</td><td>" + u.fields.Login + "</td><td>" + u.fields.FirstName + " " + u.fields.LastName + "</td>");
            tbody.append(tr);
       }
   });
   table.append(tbody);
   $("#div_users").empty();
   $("#div_users").append(table);
   $("#grid_users").DataTable();

  }); // end GetUsers
 }

 $(document).ready(function () {
  if (document.getElementById) {
   InitAppWhenReady();
  }
 });

}.call();

اضن ان الكود سهل هو عبارة عن حلقة تكرارية لكل مستعمل في القاءة و وضعه في td 

DataTable() هدا التعليمة تسمح تحويل الجدول العادي html الى  datagrid و دلك بواسطة jquery dataTables لذلك كتب في مقدمة الملف index.html 

 

  <!--jquery Lib-->
    <script type="text/javascript" src="js/lib/jquery/jquery-2.1.3.min.js"></script>
    <script type="text/javascript" src="js/lib/jquery/dataTables.js"></script>
    <link type="text/css" rel="Stylesheet" href="js/lib/jquery/dataTables.css" />

    <script type="text/javascript" src="js/common.js"></script>
    <script type="text/javascript" src="js/index.js"></script>
    <link type="text/css" rel="Stylesheet" href="css/index.css" />

النتيجة هي front_1.png

ها قد انتهينا من المرحة الاولى وهي عملة GET في الدرس القادم سنقوم بعملية POST و بعدها مباشرة سنقوم بمثال مع استعمال قاعدم بيانات .

ارجوا ان الدرس مفهم و صحا فطوركم 

MyWebApp2_Get_ListGenericofObject.zip

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

شارك هذا الرد


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

السلام عليكم 

نلاحض ان في القائمة السابقة 3 اشخاص الهدف من المثال التالي هو اضافة شخص جديد للقاءمة و ذللك من خلال الكلاس TUser

نقوم باضافه وضيفة جديدة في API و لتكن SetUser  مع اداخل TUser و استرجاع القاءمة السابقة بالاضافة الاى هذا الاخير 

function TProjectController.SetUser(user : TUser): TList<TUser>;
var users: TList<TUser>;
begin
     users:= FillUserList();
     users.Add(user);
     Result:=users;
end;

الوضفة FillUserList هي من ترجع لنا القاءمة السابقة 

ثم نضيف المستعمل الذي مررناه في param الى هذه القاءمة و نرجعها عن طريق Result 


function FillUserList(): TList<TUser>;
var mUser : TUser;
begin
      Result:= TList<TUser>.Create;
      mUser := TUser.Create;
      mUser.mId:=1;
      mUser.mLogin:='zekiriAbd';
      mUser.mFirstName:='Zekiri';
      mUser.mLastName:='Abdelali';
      Result.Add(mUser);

      mUser := TUser.Create;
      mUser.mId:=2;
      mUser.mLogin:='MohamedNA';
      mUser.mFirstName:='Mohamed';
      mUser.mLastName:='Nassman';
      Result.Add(mUser);

      mUser := TUser.Create;
      mUser.mId:=3;
      mUser.mLogin:='AliW';
      mUser.mFirstName:='Ali';
      mUser.mLastName:='AlWi';
      Result.Add(mUser);
end;

function TProjectController.GetUserList(): TList<TUser>;
var mUser : TUser;
begin
      Result:= FillUserList();
end;

كما تلاحضون غير بعض الامور 

انتهينا من API نعمل كومبيل 

الان على مستوى html js نضيف  الوضيفة SetUser الى COMMN .JS 

function SetUser(user,fnOnComplete) {
 $.ajax($fronted.SERVICE.add_user_url, { method: 'POST', xhrFields: { withCredentials: false },
       data: JSON.stringify(user)})
       .success(function (data) {
       var _data = JSON.parse(data);
       $fronted.Users = _data.result[0].fields.FItems;
       if (fnOnComplete) { fnOnComplete(); }
  })
   .fail(function (xhr, textStatus, errorThrown) {
 });
}

كما تلاحضون اني استعملت POST و ارسلت user الجديد في param الوضيفة ثم ارسلته الى api عن طرق الخاصية data التابعة لajax 

نخزن النتيجة في fronted.Users 

$fronted.SERVICE =
 {
  user_list_url : $fronted.host + "GetUserList",
  add_user_url  : $fronted.host + "SetUser",
 };

كما تلاحضون اني اضفت url للمتود الجديد 

الان نغيير في الواجهة فنضيف في ملف index.html 

 <div>
        Id: <input id="tx_Id" type="text" ><br>
        Login: <input id="tx_Login" type="text" ><br>
        First name: <input id="tx_FirstName" type="text" ><br>
        Last name: <input id="tx_LastName" type="text" ><br>
        <input id="btn_add_user" type="button" value="Add User"><br>
  </div>

userEdit.png

$("#btn_add_user").click(function (e) {
 var _fields = {
                    LastName:$("#tx_LastName").val(),
                    Id:parseInt($("#tx_Id").val()),
                    FirstName:$("#tx_FirstName").val(),
                    Login:$("#tx_Login").val()
                 }
      var new_user = {type:"User.TUser",id:1,fields:_fields};
      SetUser(new_user ,function(){ DrawUserGrid() });
  });


  }

الكود التالي معنا عند النقر على الزر add user سنقوم ب

-1 حفض كل المعلومات الدخل عن طرق تكس بوكس في الابجكت _fields 

2- صنع ابجكت يفهمه API و ضالك باضافة type:"User.TUser"  id:1

3- نقم بطلب الوضيفة SetUser ; حيث نمرر في param الاول هذا الابجكة الذي صنعناع  و البرامتر الثاني هي callback اى عند الانتهاء من طلب الويب متود الموجودة في API فقم ب صنع الجدول DrawUserGrid

 

ملاحضة هامة عند استعما POST لست ادري لماذا دلفي يبحث عن الوضيفة بتسميتها + update 

لذلك قمت بتغيير الوضيفة على مستو API الى

 

TProjectController.updateSetUser(user : TUser): TList<TUser>;

 

 

 

demoUserEdit.avi

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

شارك هذا الرد


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

السلام علكم

مع انه لا ارى اي رد الا اني ساتابع ان شاء الله يتقبل مني 

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

function FillUserList(): TList<TUser>;
var mUser : TUser;
var COMPANYSqlProc : TADOStoredProc;
begin
      Result:= TList<TUser>.Create;
      COMPANYSqlProc := TDatabaseAccess.ExecProc('sp_Users');
      COMPANYSqlProc.Open;
      while not COMPANYSqlProc.EOF do
      begin
      mUser := TUser.Create;
      mUser.mId:= COMPANYSqlProc.FieldByName('Id').AsInteger;
      mUser.mLogin:= COMPANYSqlProc.FieldByName('Login').AsString;
      mUser.mFirstName:=COMPANYSqlProc.FieldByName('FirstName').AsString;
      mUser.mLastName:=COMPANYSqlProc.FieldByName('LastName').AsString;
      Result.Add(mUser);
      COMPANYSqlProc.Next;
      end;
      COMPANYSqlProc.Close;
end;

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

create Procedure [dbo].[sp_Users]
As
Begin
    SELECT * FROM [DbUser]	
End

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

لاننا غلق الاتصال بالقاعدة و اضافة الوحدة Data.DB, Data.Win.ADODB

2- كما تلاحضون اننا نفذنا Proc عن طريق TDatabaseAccess.ExecProc' حيث انها وضيفة من نوع Static و هي معرفة في الوحدة الجديدة التي اضفتها في المجلد الجديد Database

class function TDatabaseAccess.ExecProc(name : string) : TADOStoredProc;
var SqlProc : TADOStoredProc;
begin
    try
      SqlProc := TADOStoredProc.Create(nil);
      SqlProc.ConnectionString := 'Provider=SQLNCLI11.1;Persist Security Info=False;User ID=sa;Password=***;Initial Catalog=*****;Data Source=**********;Initial File Name="";Server SPN=""';
      SqlProc.ProcedureName := name;
      SqlProc.ExecProc();
      Result := SqlProc;
    Except On e: Exception do
      SqlProc.Close;
    end;
end;

 

 

project.png

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

شارك هذا الرد


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

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

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

 

 

MyWebApp.zip

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

شارك هذا الرد


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

سلام عليك

بارك الله فيك

إن لم تر الآن متابعا فقد يأتي بعد مدة من ينتفع بهذا

وأنا نفسي استفدت منك

 

بارك الله فيك

تم تعديل بواسطه أحمد أبو عبد البر
0

شارك هذا الرد


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

الشكر للأستاذ زكيري على المحتوى القيم ,

فعلا سيستفيد من المعلومات الكثيرين الآن وبالمستقبل.

أطيب التمنيات بالتوفيق

0

شارك هذا الرد


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

السلام عليكم 

بارك الله فيك اخي احمد 

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

0

شارك هذا الرد


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

 

0

شارك هذا الرد


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

 

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

شارك هذا الرد


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

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

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