منتديات جريت بلينز العربية Great Plains For Arab

منتديات جريت بلينز العربية Great Plains For Arab (http://www.gp4arab.com/forum/index.php)
-   مواضيع المطورين الأخرى (http://www.gp4arab.com/forum/forumdisplay.php?f=8)
-   -   تعلم كيفية كتابة الشفرة البرمجية بلغة الدكسترتي (http://www.gp4arab.com/forum/showthread.php?t=122)

humam 21-Jul-2011 03:35 PM

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

عثمان 22-Jul-2011 02:25 PM

أمضي قدمنا مشرفنا الرائع همام
وفقك الله لما يحبه ويرضاه

humam 23-Jul-2011 03:40 PM

Script Editor
 
2 مرفق
قبل البدء بكتابة الشفرة البرمجية نحتاج الى التعرف على البيئة التي سوف نعمل عليها وهذا يسهل عملية كتابة الشفرة لبدء ذلك ننقر نقرا مزدوجا على الزر Save فتفح نافذة كتابة الشفرة Script Editor كما في الشكل 1 هنا نلاحظ الاسم التقني للشفرة وتقوم DEX باعطاء هذا الاسم لذا يفضل عدم تغييره هنا الاسم مثلا:
ARB_Customer_MSTR Save Button_CHG_DUP
الاسم مكون من مقاطع الاول يمثل اسم النافذة ثم بعد ذلك اسم المصدر Resource وهنا المصدر هو الزر Save واخيرا اسم الحدث وهنا الحدث Change وهو الذي ينفذ عند نقر المستخدم على الزر. طبعا اختيار الحدث مهم جدا ويؤثر على كيفية تنفيذ الشفرة البرمجية.

نلاحظ ايضا وجود عدة ازرار سوف نمر على المفيد منها:
Compile: وهذا الزر مهم جدا وهو يعمل على التدقيق النحوي للجملة البرمجية التي تقوم بكتابتها وبعد اكمالك كتابة عبارة او مجموعة من العبارات يمكنك الضغط على هذا الزر للتاكد من العبارة تمت كتابتها بالشكل الصحيح.
اذا كانت العبارة صحيحة لا تشاهد اي رسالة ولكن اذا كان هناك خطأ سوف تظهر نافذة جديدة وهنا يوجد نوعين من الاخطاء :
Warning
Error
النوع الاول هو في الحقيقة لايعتبر خطأ برمجي ولكن النوع الثاني Error وهو يعتبر خطأ في كتابة الشفرة البرمجية من الناحية النحوية وهنا يمكن النقر بشكل مزدوج على الخلل في النافذة Compile message لكي نتقل بشكل مباشر الى موقع الخلل وتحاول اصلاح الجملة البرمجية. ثم اغلق النافذة Compile Message واضغط مرة اخرى على الزر Compile لكي تشاهد النتيجة بعد التغيير وهكذا تستمر لحين حصولك على النتيجة الصحيحة وهنا يمكنك الاستعانة بملفات المساعدة لكي تجد الطريقة الصحيحة لكتابة العبارة البرمجية.

بقي هناك نوع من الاخطاء وهو الاصعب والذي لايستطيع محرر الاخطاء اكتشافه وهو الخلل المنطقي اي تكون الجمل مكتوبة بالشكل الصحيح ولكن منطقيا تم وضعها بشكل خاطىء يمكن اكتشاف هذه الاخطاء باستخدام Test Mode وهو متاح لهذا الغرض وتتم هذه العملية كلما اكملت جزء من الشفرة تشعر بانه سوف يكون معزول عن الاجزاء الاخرى لذا عليك فحصه بواسطة test mode لان عملية اكتشاف الخلل تكون اكثر تعقيدا كلما اصبحت الشفرة اطول.
Close: ويستخدم لاغلاق نافذة الشفرة البرمجية وسوف تسأل عن حفظ الشفرة بعد قيامك بأي عملية تغيير لذا عليك اختيار موافق اذا كنت متأكد بان ما اضفته من الشفرة هو سليم.
Print: وهو لطباعة الشفرة.
Delete: وهو لمحو او حذف الشفرة البرمجية.

أحمد الغامدي 23-Jul-2011 04:03 PM

ماشاء الله
أهنيك أخي همام ... مواضيع من المواضيع المتميزة في هذا المنتدى

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

أشكرك استاذ همام

humam 23-Jul-2011 04:19 PM

4 مرفق
Names: وهو يأتي في المرتبة الاولى من ناحية الاستخدام وانا افضل استخدامه وذلك لكي لاتقع اخطاء في كتابة اسماء الجداول والنوافذ او اسماء الحقول.هنا لكي يكون هذا الجزء مفهوم يجب ان ننوه بأن عبارت الدكسترتي تستخدم بشكل مكثف الاسماء التقنية Technical Name لكل من الجداول والنوافذ والتي كما ذكرنا في المواضيع السابقة يفضل عدم استخدام فراغات بين كلماتها بل نستخدم Underscore وهنا ان هذه الاسماء عادة تكون طويلة وقد يخطأ المبرمج في كتابتها وقد تضيع الوقت في البحث عن سبب الخلل في العبارة وقد تكون العبارة مكتوبة بشكل صحيح ولكن الخلل هو ان اسم الجدول او النافذة غير صحيح ولعدم الوقوع في هذه المشاكل يفضل على المبتدئين ببرمجة الدكسترتي استخدام هذا الزر للوصول الى الاسم الصحيح للعنصر الذي يجب ان يضاف اسمه الى الشفرة.
عند النقر على الزر Name سوف تفتح النافذة Names كما في الشكل 3 وهنا تنقسم العملية الى قسمين :
الاول :يتعلق بالحصول على اسماء النماذج او النوافذ او حقول النافذة Window Fields
وهنا تكون العملية متسلسلة اي تبدأ باختيار اسم النموذج اولا ثم بعد ذلك تختار النافذة ثم بعد ذلك تختار الحقل نأخذ مثال بسيط مثلا اذا اردت ادراج الحقل الذي يمثل Customer ID في الشفرة البرمجية هنا سوف ابداء اولا بالنموذج واطبع اول ثلاث احرف من اسم النموذج وهي ARB فتنتقل مباشرة الى النموذج الخاص بالمثال (وهنا نلاحظ مرة اخرى فائدة استخدام البادئة حيث يمكنك الانتقال بسهولة الى نماذجك الخاصة بدون داع لحفظ الاسم ) وبعد ذلك اضغط الزر Window لكي احدد النافذة لانه من المحتمل ان تكون هناك اكثر من نافذة متصلة بهذا النموذج هنا سوف تلاحظ نافذة واحدة اختر هذه النافذة من القائمة كما في الشكل 4 ثم اضغط على Window Field وهنا سوف تلاحظ قائمة بأسماء الحقول وهنا سوف تكون الاسماء الظاهرة هي Display Name ونحن في الشفرة نحتاج الى الى Technical Name (في حالتنا اي Display Name هو نفس Technical Name بالنسبة الى حقول الجدول والتي استخدمناها في النافذة والان اصبحت Window Field )بعد اختيار اسم الحقل وهو ARBCUSTID كما في الشكل 5 اضغط OK لتعود الى نافذة الشفرة وقد تم نسخ Technical Name الى حافظة الوندوز وباستخدام CTRL+V يمكنك لصق اسم الحقل في مكانه المخصص ضمن الشفرة وهكذا كلما احتجت الى اسم حقل من حقول النافذة عليك القيام بالخطوات السابقة.
نفس الشيء عليك فعله عندما تحتاج الى اسم النافذة يمكنك الوصول اليه كما يلي ابداء اولا بالنموذج واطبع اول ثلاث احرف من اسم النموذج وهي ARB فتنتقل مباشرة الى النموذج الخاص بالمثال (وهنا نلاحظ مرة اخرى فائدة استخدام البادئة حيث يمكنك الانتقال بسهولة الى نماذجك الخاصة بدون داع لحفظ الاسم ) وبعد ذلك اضغط الزر Window لكي احدد النافذة لانه من المحتمل ان تكون هناك اكثر من نافذة متصلة بهذا النموذج هنا سوف تلاحظ نافذة واحدة اختر هذه النافذة من القائمة كما في الشكل 4 ثم اضغط علىOK . نسخ Technical Name الى حافظة الوندوز وباستخدام CTRL+V يمكنك لصق اسم النافذة في مكانه المخصص ضمن الشفرة وهكذا .
ونفس الشيء يمكن فعله للحصول على اسم النموذج.

ثانيا :اسماء الجداول والحقول في بعض العبارت تحتاج الى اسم الجدول او اسم الحقل في الجدول (هنا يجب ان يتذكر الجميع عندما اقول اسم الجدول او الحقل او النافذة او النموذج فالمقصود هو Technical Name ما لم اذكر غير ذلك)وللحصول على اسم جدول مثلا انقر على Name ومنها انقر على Tables سوف تلاحظ قائمة بالجداول اطبع الاحرف ARB سوف تصل الى الجدول الخاص بمثالنا ثم انقر OK لتعود الى نافذة الشفرة وقد تم نسخ اسم الجدول الى حافظة الوندوز وباستخدام CTRL+V يمكنك لصق اسم الجدول في مكانه المخصص ضمن الشفرة.
اما اذا احتجت الى اسم حقل معين من الجدول بعد تحديد الجدول كما في الخطوة السابقة انقر على Table field سوف تلاحظ قائمة بحقول هذا الجدول اختر الحقل المطلوب(مثلا ARBADDRESS1 ) ثم اختر OK عند ذلك سوف يتم نسخ اسم الحقل مع اسم الجدول. وباستخدام CTRL+V يمكنك لصق اسم الحقل في الشفرة وسوف تكون النتيجة كما يلي: ARBADDRESS1 of table ARB_Customer_MSTR لاحظ الشكل 6 .

Debug:وهو من الخيارات المهة والتي تعطيك القابليلة على تتبع تنفيذ الشفرة في مرحلة Test Mode وسوف اعود لشرح كيفية استخدام هذه الخاصية بعد كتابة الكود.

humam 23-Jul-2011 04:42 PM

اشكر كل الاخوان على مساهماتهم الطيبة وارجو ان تعود هذه المواضيع بالفائدة على كل الناطقين بلغة الضاد والله الموفق

humam 25-Jul-2011 11:32 AM

عذرا عن التأخير في التواصل مع هذا الموضوع المهم وذلك بسبب ضغط العمل وانشاء الله سوف اتابع الموضوع باقرب فرصة ممكنه

حامد 25-Jul-2011 11:42 AM

ربنا يكون بعونك أخي الحبيب

humam 26-Jul-2011 09:38 AM

الشفرة البرمجية للزر Save:
 
الشفرة البرمجية للزر Save:
انقر نقرا مزدوجا على الزر Save لفتح Script Editor واكتب العبارت التالية :

;copy from window ARB_Customer_MSTR to table ARB_Customer_MSTR
;save table ARB_Customer_MSTR

اولا. كل العبارت يجب ان تنتهي بفارزة منقوطة (; ) وعند عدم اضافة هذه الفارزة سوف تحصل على رسالة خطأ عندما تضغط على الزر Compile .

ثانيا. العبارة الاولى وهي :
Copy from window window name to table table name
تعمل هذه العبارة على نسخ محتوى كل Window Field والتي تكون قيمة الخاصية Auto Copy لها True الى Table Buffer وهنا كما ذكرنا ان سم النافذة واسم الجدول هو Technical Name وقد وصحت سابقا كيف يمكن الحصول على الاسماء الصحيحية باستخدام الزر Name .

ثالثا. تعمل العبارة الثانية :
Save Table table name
على خزن المحتويات من Table Buffer الى SQL table وهي في الحقيقة سوف تترجم الى عبارة INSERT . وهنا ايضا سوف يكون اسم الجدول هو Technical Name .

رابعا. اضغط على الزر Compile للتأكد من ان العبارت مكتوبة بالشكل الصحيح ثم اغلق Script Editor واذا سألك عن حفظ المعلومات اختر Yes .
خامسا. الخطوة التالية هي التأكد من العمل المنطقي للشفرة وسوف نستخدم Query Analyzer لفعل ذلك وهنا علينا التأكد من ان الجدول الذي كوناه بواسطة الدكسترتي تم ادراجه ضمن قاعدة البيانات ولفعل ذلك اذهب الى القائمة Debug ومنها اختر الامر Test Mode او اضغط على CTRL + T لكي تنتقل الى Test Mode وسوف تكون العملية مشابهة الى عملية الدخول الى Great Plains بعد اختيار ODBC الصحيح اختر الشركة Fabrikam وهنا يجب ان تكون عملية Login باستخدام System Administrator اي الUser ID هو Sa وذلك لاننا سوف نحتاج الى ارفاق الجدول وهذا يحتاج الى صلاحيات.
بعد ذلك اذهب الى الامر:
File > Maintenance > SQL

ثم غير Database الى TWO ثم في القائمة المنسدلة اطبع الاحرف GP4Arab سوف نتقل مباشرة الى الجدول الذي صممناه في الموضوع الاول وهنا نلاحظ الاسم المستخدم للدلالة على الجدول هو Display Name وفي الشفرة البرمجية نستخدم Technical Name وفي استخدام SQL Server tools سوف نستخدم Physical Name للجدول وهذه القواعد يجب ان تكون ثابتة في اذهننا عند التعامل مع الجداول. الان اختر الجدول ثم انقر على الازرار الاربعة وهي وضيفتها تعمل على ازالة الجدول والاجراء المخزن الخاص به اذا كان موجود سابقا ثم تعيد عملية ارفاق الجدول والاجراء المخزن مرة اخرى الى SQL Server . سوف تظهر رسالة تحذير انقر على Yes .
الان سوف نحتاج الى اضافة النافذة الى Shortcut اختر الامر ADD ثم انتقي Sales وهنا ابحث عن النافذة والتي كان Display Name لها هو Customer Maintenance في الحقيقة سوف تجد نافذتين بدل واحدة الاولى هي نافذة GP الاصلية والثانية هي نافذتنا ان تشابه Display Name سوف لايسبب اي مشاكل وذلك لان Technical Name مختلف بين النافذتين ولكن يفضل عدم استخدام نفس الاسماء وذلك لمنع الالتباس مع نوافذ GP ولكن هنا جائز لاننا في مرحلة تدريب.المهم سوف تظهر النافذة في Shortcut وبالنقر عليها سوف تفتح النافذة الان سوف نقوم بأدخل اول Record وسوف نستخدم كلمة Test لتعبئة كل الحقول لان كل الحقول هنا نصية ثم نضغط على الزر Save. بعد الضغط على الزر حفظ نلاحظ ان المعلومات لا تزال معروضة على النافذة وفي الحقيقة يجب ازالتها بعد الحفظ وللقيام بذلك سوف نقوم لاحقا باضافة عبارة لفعل ذلك ولكن هنا نحن الان بصدد فحص عملية الحفظ الان افتح Query Analyzer واختر قاعدة البيانات TWO ونفذ العبارة التالية :

SELECT * FROM ARB00101
هنا سوف نلاحظ اول Record قمنا باضفته قدم تم حفظه في الجدول بشكل سليم والى هنا ينتهي هذا الجزء سوف نعود لاحقا لتطوير الشفرة البرمجية في هذا الزر لاحقا.

humam 26-Jul-2011 10:16 AM

لكي نزيل المعلومات المعروضة في النافذة بعد نجاح عملية الحفظ نحتاج الى اضافة العبارة التالية في نهاية الشفرة البرمجية للزر Save :
;restart window
وعمل هذه العبارة هو تفريغ كل الحقول الموجودة في النافذة
الان نعمل على ادخال Record جديد ونستخدم Test1 في كل حقول النافذة ثم نضغط على الزر حفظ نلاحظ الان بعد الحفظ يتم تفريغ كل حقول النافذة.

humam 26-Jul-2011 10:34 AM

الان هناك نقطة اخرى وهي في نافذة GP الاصلية اي اقصد Customer Maintenance بعد ادخال Customer ID وعمل TAB out من هذا الحقل سوف يقوم GP بأقفال الحقل عند ذلك لايمكن للمستخدم ان يقوم بتغيير محتوى هذا الحقل الا بحذف الحقل او الضغط على زر Clear . لفعل ذلك سوف نختار الحقل ARBCUSTID في النافذة ثم نذهب الى الخصائص ونختار Script ومنها نختار Post ونعمل نقر مزدوج فتفتح نافذة Script Editor وسوف يكون اسم الشفرة هو ARB_Customer_MSTR ARBCUSTID_POST وهذا الحدث ينفذ عندما ينتقل التركيز من هذا الحقل الى الحقل التالي وهنا سوف نضع هذه العبارة البسيطة:

;lock field ARBCUSTID

وتعمل على اغلاق هذا الحقل بعد الانتقال الى الحقل الذي يليه وبتالي اصبح عمل النافذة قريب من اسلوب عمل GP.

humam 28-Jul-2011 02:18 PM

الشفرة البرمجية للزر Clear:
 
الشفرة البرمجية للزر Clear:

انقر نقرا مزدوجا على الزرClearلفتح Script Editor واكتب العبارت التالية :

;restart form


تعمل هذه العبارة على مسح كل المعلومات الظاهرة على كل نوافذ النموذج وكذلك تعديد المتغيرات الى القيم الاولية اذا كنت قد اعددت قيم اولية.
طبعا ان تنفيذ هذه العبارة سوف يؤدي ايضا الى وضع التركيز Focus عند اول حقل في النافذة طبعا هناك طريقة خاصة لاعداد Tab Sequence في الدكسترتي سوف نذكرها لاحقا بعد اكمال كتابة الكود.
هنا يجب ان يكون حاضر في الذهن ان تنفيذ العبارة السابقة سوف يؤدي كذلك الى اطلاق سلسلة من الاحداث وهي :
Pre Form
Pre Window
Pre First Field in the window
لذا اذا كنت قد وضعت كود في احد هذه الاحداث سوف يؤدي تنفيذ العبارة السابقة الى تنفيذ الحدث وبتالي تنفيذ الكود الذي وضعته.

humam 28-Jul-2011 03:25 PM

الشفرة البرمجية للزر Top of File Button:
 
1 مرفق
الشفرة البرمجية للزر Top of File Button:

انقر نقرا مزدوجا على الزر Top of File Button لفتح Script Editor واكتب العبارت التالية :
;range clear table ARB_Customer_MSTR
;clear window ARB_Customer_MSTR
;get first table ARB_Customer_MSTR
if err()=OKAY then

;copy from table ARB_Customer_MSTR to window ARB_Customer_MSTR
;lock field ARBCUSTID
elseif err()<> OKAY then
;"!warning "This record missing
;end if

هنا سوف نحتاج الى شرح بعض العبارت التي تظهر لأول مرة في الشفرة البرمجية وعمل كل منها:
نلاحظ في بداية الكود كانت العبارة Range Clear Table وهي تكون مسبوقة باسم الجدول تستخدم هذه العبارة لتفريغ Table Buffer من اي Record قد يكون موجود فيه لانه نحن في الواقع لانتعامل مع جدول SQL بشكل مباشر بل من خلال Table Buffer والذي سوف نتعلم لاحقا ما هي العبارت التي تؤدي الى ملئ هذا ال Buffer لذا من الضروري وهي تعتبر من اهم اساسيات الدكسترتي قبل استدعاء اي جدول لأي غرض من الاغراض من المهم جدا تفريغ Buffer لان عدم القيام بذلك سوف يؤدي الى اخطاء منطقية في عمل ال Module الذي تصممه وهذا ما توصلت اليه من خبرتي المتواضعة.
العبارة الثانية Clear Window وهي تأخذ اسم النافذة وهي تعمل على محو المحتويات من Window Field وهنا قد يسأل احد ما لماذا لانستخدم العبارة restart window ؟ سوف اجاوب عن هذا السؤال لاحقا ولكن اود ان اعطي للاخوان فرصة لكي يجدوا بأنفسهم اجابة لهذا السؤال؟
العبارة المهمة الاخرى وهي get first table متبوعة باسم الجدول وهي من العبارت الاساسية في الدكسترتي وهي من العبارت التي تؤدي الى ملئ Table Buffer وهي سوف تعمل على نقل اول سجل من الجدول الى Table Buffer .
العبارة التالية وهي Copy from table --- to window --- من العبارت الاساسية ايضا وهي معاكسة للعبارة التي استخدمناها في الزر حفظ وهي تعمل على نسخ البيانات من Table Buffer الى النافذة المعينة .
وبعدها عبارة Lock field وقد شرحنا سابقا عمل هذه العبارة.
العبارة الاخرى وهي warning وهي تستخدم لاظهار رسالة توضيحية للمستخدم وهنا نحاول اعطاء معلومة للمستخدم اذا لم نجد السجل المطلوب .

الان بقي العبارة الاساسية If Then Else واتوقع ان الجميع قد استخدم هذه التركيبة المنطقية سابقا وللذين لم يستخدمون هذه العبارة يمكن ايجاز عملها كما يلي :
If Condition then
;Statements
Else
;Statements

;End if
او

If Condition1 then
;Statements
Elseif Condition2 then
;Statements
End if


ببساطة عند تحقق الشرط المنطقي Condition سوف يتم تنفيذ العبارت التي تقع بعد Then واذا لم يتحقق سوف يتم تنفيذ العبارت التي تقع بعد Else . في التركيب الثاني نلاحظ وجود شرط منطقي مع عبارة Else وهنا نفس الشيء الشرط المنطقي1 Condition سوف يتم تنفيذ العبارت التي تقع بعد Then واذا لم يتحقق سوف يتم تنفيذ العبارت التي تقع بعد Elseif اذا تحقق الشرط المنطقي Codition2 واذا لم يتحقق هذا الشرط ايضا يتم مغادرة عبارة if endif بدون تنفيذ اي من العبارات المحصورة بينهما .

الان بقي ان نشرح عبارة الشرط المنطقي التي استخدمت وهي :
Err () = OKAY وعكسها Err () <> OKAY
ان هذه العبارة err() تعيد نتيجة اخر عملية تم تنفيذا على الجدول وهنا العملية التي نفذت على الجدول هي get first فأذا كان التنفيذ سليم سوف تعيد هذه الدالة الثابت OKAY للدلالة على ان السجل المطلوب موجود وتعيد قيم اخرى سوف نذكرها لاحقا و من الممكن معرفة هذه القيم من Help .

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

humam 28-Jul-2011 04:11 PM

الشفرة البرمجية للزر End of File Button:

انقر نقرا مزدوجا على الزر End of File Button لفتح Script Editor واكتب العبارت التالية :

;range clear table ARB_Customer_MSTR
;clear window ARB_Customer_MSTR
;get last table ARB_Customer_MSTR
if err()=OKAY then
;copy from table ARB_Customer_MSTR to window ARB_Customer_MSTR
;lock field ARBCUSTID
elseif err()<> OKAY then
;"warning "This record missing
;end if

الان ان الاختلاف الوحيد في هذه الشفرة هو العبارة get last table والتي تعمل على ملئ Table Buffer ولكن هذه المرة بالسجل الاخير في الجدول اما باقي العبارت فهي تعمل بنفس النسق السابق

humam 28-Jul-2011 05:08 PM

الشفرة البرمجية للزر Next Button - Toolbar:
 
1 مرفق
الشفرة البرمجية للزر Next Button - Toolbar:

انقر نقرا مزدوجا على الزر Next Button – Toolbar لفتح Script Editor واكتب العبارت التالية :


clear window ARB_Customer_MSTR;
range clear table ARB_Customer_MSTR;
get next table ARB_Customer_MSTR;
if err() <> OKAY then
range clear table ARB_Customer_MSTR;
get last table ARB_Customer_MSTR;
end if;
if err()= OKAY then
copy from table ARB_Customer_MSTR to window ARB_Customer_MSTR;
lock field ARBCUSTID;
end if;

هنا نستخدم نفس العبارت السابقة ولكن المنطق مختلف قليلا فبعد عبارت تهيئة الجدول والنافذة Clear window & Clear range استخدمنا عبارة جديدة وهي get next table وهي تعمل على ملئ ال Table Buffer بالسجل التالي للسجل الحالي وهنا بعد هذه العملية نفحص نتيجة العملية بواسطة الدالة err() فأذا لم يكن هناك سجل تالي سوف ننتقل الى السجل ا لاخير وهذا ما تقوم به عبارة If then الاولى اما اذا كان هناك سجل تالي سوف ننتقل الى عبارة if then الثانية والتي تعمل على نسخ السجل التالي او السجل الاخير الى النافذة وثم نقوم بأقفال الحقل Customer ID .

humam 28-Jul-2011 05:19 PM

الشفرة البرمجية للزر Previous Button - Toolbar:
 
1 مرفق
[overline]الشفرة البرمجية للزر Previous Button - Toolbar:[/overline]

انقر نقرا مزدوجا على الزر Previous Button - Toolbar لفتح Script Editor واكتب العبارت التالية :


clear window ARB_Customer_MSTR;
range clear table ARB_Customer_MSTR;
get prev table ARB_Customer_MSTR;
if err() <> OKAY then
range clear table ARB_Customer_MSTR;
get first table ARB_Customer_MSTR;
end if;
if err()= OKAY then
copy from table ARB_Customer_MSTR to window ARB_Customer_MSTR;
lock field ARBCUSTID;
end if;

هنا استخدمنا نفس المنطق السابق مع اختلافات بسيطة وتتلخص في استخدام العبارة get prev table لاستعادة السجل السابق فأذا لم يكن هناك سجل سابق سوف تعمل عبارة if then الاولى على الانتقال الى السجل الاول ثم بعد ذلك تعمل عبارة If then الثانية على التأكد من ان هناك سجل سابق او سجل اول فأذا كا ن كذلك سوف ننسخ المعلومات الى النافذة ونقفل الحقل Customer ID .
الى هذه النقطة يمكن استخدام Test Mode (CTRL + T ) لفحص عمل ازرار التنقل Navigation Button .
بقي لنا ان نضع الكود التي تعمل على استرجاع السجل المحدد عندما يقوم المستخدم بطباعة Customer ID ثم الانتقال خارج هذا الحقل.

Monzer Osama 29-Jul-2011 11:20 AM

جهود مباركة أخي همام ... أسأل الله لك التوفيق

humam 02-Aug-2011 09:08 AM

الشفرة البرمجية للزر Delete :
 
1 مرفق
الشفرة البرمجية للزر DELETE :

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

العبارات الثلاثة الاولى وهي Range Clear , range table ,get first تعمل مجتمعة على القيام بتحديد السجل الحالي المعروض على المستخدم في النافذة العبارة الجديدة بين هذه العبارت هي Range Table وهي تعتبر من اهم عبارت التعامل مع الجداول والاكثر استخداما وهي تعمل على ملئ Table Buffer بالسجل او السجلات المطلوبة اعتمادا على الشرط الذي يلي العبارة Where وهي تشابه تماما العبارة SELECT في SQL وفي الواقع سوف تترجم لاحقا من قبل Compiler الى عبارة SELECT عند تنفيذها بعد العبارة range table سوف يأتي اسم الجدول ثم بعد ذلك العبارة where ثم الدالة physicalname والتي تأخذ اسم الحقل (Table Field ) العائد للجدول كمحدد وتعيد Physical Name للحقل اي اسم الحقل المستخدم في جدول SQL ثم بعد ذلك نمرر قيمه الحقل والتي تأتي من Window Field المكافىء لل Table Field وهنا في هذه الحالة ان مربع النص المسمى ARBCUSTID هو ال Window Field المكافيء .ثم بعد ذلك تعمل العبارة get first على استرجاع السجل الاول في Table Buffer وفي حالتنا هذه يوجد سجل واحد فقط في Table Buffer .

المرحلة التالية هي التعرف على حالة هذا السجل لان هناك احتمالات عديدة يجب ان تأخذ بنظر الاعتبار لذا وكما قلنا انه بعد تنفيذ عبارة get first يمكن التحقق من حالة السجل على طريق فحص رسالة الخطأ التي سوف تعاد بعد تنفيذ عبارات الاسترجاع وهنا نستخدم العبارة err(table table_Name) وهي نفس العبارة المستخدمة سابقا ولكن كتبتها بصيغة اخرى وذلك لزيادة المعرفة حيث مررت Table Name كمحدد لعبارة err والتي يمكن استدعائها مباشرة مثل err() وبدون تمرير اي محدد ولكن في اي حالة يكون من الضروري تمرير المحدد ؟ هنا في حالتنا كان الامر اختياري ولكن استخدمته لتوضيح هذه النقطة وهي في حالة تنفيذك اكثر من عبارة استرجاع على جداول متعددة عند ذلك يجب ان تمرر اسم الجدول مع العبارة err() لتحدد اي جدول تريد فحص نتيجة العملية عليه واذا لم تمرر اسم الجدول واستخدمت العبارة err() سوف تقوم باعادة نتيجة العملية على اخر جدول فقط.

النقطة الجديدة الاخرى في الشفرات السابقة استخدمنا العبارة If Then لفحص حالة السجل ولكن هنا سوف نستخدم العبارة Case لاننا نريد ان نأخذ اكثر من احتمال والتركيب البرمجي للعبارة هو كما يلي :

Case Field or Expiration
In [value]
Statment1
In [value]
Statment2
Else
Stetment3
;End case

تأخذ العبارة case اسم حقل او تعبير ثم تقارن القيمة المعادة من الحقل او التعبير مع القيم الموجودة في عبارة In فأذا توافقت سوف يتم تنفيذ العبارة التي تقع بعد عبارة in مثلا اذا كان قيمة التعبير موافقة للقيمة في عبارة in الاولى سوف يتم تنفيذ العبارة Statmnet1 وهكذا واذا لم توجد قيمة موافقة للقيم المحددة في عبارت in سوف يتم تنفيذ العبارة التي تقع بعد else وهكذا ويجب ان ينتهي هذا التركيب بالعبارة end case .

humam 02-Aug-2011 09:30 AM

في مثالنا التعبير هو العبارة err(table table_name) والتي تعيد عدد من القيم اعتمادا على حالة السجل الذي تم تنفيذ عبارة get عليه فمثلا تعيد القيمة MISSING اذا كان هذا السجل غير موجود ؟طبعا هذا السيناريو يكون غريب قد يقول قائل كيف انا اعرض السجل في النافذة امام عيني ثم بعد ذلك يكون السجل محذوف ؟ نعم هذا يحصل في الحالة التالية عندما يكون البرنامج غير معد للتعامل مع بيئة متعددة المستخدمين Multiuser environment فيحصل ما يلي عندما تقوم باستعراض هذا السجل قد يقوم مستخدم ثاني باستعراضه بنفس الوقت وقد يقوم بحذفه وانت لا تزال تشاهد السجل معروض امامك في النافذة ثم تحاول حذفه فتكون النتيجة ان هذا السجل محذوف لذا تعيد العبارة القيمة MISSING القيمة المحتملة الاخرى وهي LOCK وهذه القيمة تعاد في عدد من الحالات اولا اذا كان Module مصمم للعمل مع Multiuser Environment عندما تحاول ان تستعرض سجل يستعرض حاليا من قبل مستخدم اخر سوف تعاد هذه القيمة للدلالة على ان السجل الحالي مقفل ولذا اصلا لاتستطيع مشاهدة هذا السجل اما في حالة كون البرنامج غير معد للتعامل مع اكثر من مستخدم وعندما يعرض مستخدمان او اكثر نفس السجل واذا ضغط كلاهما على زر الحذف سوف يكون فارق زمني قليل بين المستخدمين لذا سوف يقوم المستخدم الذي جهازه اسرع بالوصول اولا الى السجل ثم يقفله (لأن عملية الحذف تتطلب اقفال السجل اولا حتى اذا كان البرنامج لايدعم ال Multiuser Environment ) وبتالي سوف يظهر للمستخدم الاخر ان السجل مقفل وتعيد العبارة err القيمة LOCK . اما اذا اعادت العبارة القيمة OKAY فهي للدلة على ان السجل موجود ويمكن حذفه واخيرا اذا لم تعاد اي من القيم الثلاثة السابقة فهذا يدل على ان السجل لم يحفظ اصلا والسناريو المحتمل هو ان المستخدم ادخل السجل في النافذة والآن يريد حذفه هنا اذا كان الزر حذف مفعل وغير مغلق قد يضغط المستخدم على الزر لحذف السجل قبل حفظه اصلا في الجدول لذا وضعنا عبارة else في نهاية العبارة case لأصطياد هذه الحالة .

humam 02-Aug-2011 10:10 AM

الان كيف تعمل العبارة case :
اولا. اذا كان السجل محذوف من قبل مستخدم اخر نظهر رسالة توضيحية بذلك.
ثانيا.اذا كان السجل مقفل من قبل مستخدم اخر نظهر ايضا رسالة توضيحية بذلك.
ثالثا.اذا كان السجل متوفر الان نستخدم العبارة الجديد ask وتعمل هذه العبارة على اضهار رسالة للمستخدم وتعيد الزر الذي قام المستخدم بالضغط عليه والتركيب لهذه العبارة كما يلي :
ask (prompt, button1, button2, button3,helpindex)

هنا ان prompt سوف تأخذ النص الذي سوف يعرض على المستخدم و button يتم التعويض عنها بعبارت نصية لاسماء الازرار وعندما تريد ان تمرر زرين فقط عليك التعويض عن الزر الثالث بسلسلة نصية فارغة كما في مثالنا . القيمة المعادة من هذه العبارة قد تكون احدى القيم التالية اعتمادا الى الزر الذي ضغطه المستخدم :
ASKBUTTON1 للزر الاول
ASKBUTTON2 للزر الثاني
ASKBUTTON3 للزر الثالث
الان بعد التأكد من ان السجل موجود سوف نسأل المستخدم هل تريد الحذف ام لا فأذا كانت الاجابة بنعم سوف تعيد الدالة ask القيمة ASKBUTTON1 وهنا تعمل عبارة if then على فحص هذا الشرط فأذا كان متطابق سوف يتم تنفيذ العبارت الثلاثة وهي Range Clear , range table ,get first تعمل مجتمعة على القيام بتحديد السجل الحالي المعروض على المستخدم ثم نفحص مجددا اذا كان السجل متوفر ام لا طبعا يمكن اهمال هذا الفحص لان السجل فحص سابقا لكن لا مانع من فعل ذلك مجددا .
ثم تبدأ عملية الحذف بتنفيذ العبارة change والتي تعمل على اقفال السجل لكي لا يستطيع اي مستخدم اخر الوصول اليه ثم بعد ذلك تأتي عبارة remove table التي تعمل على حذف السجل الذي تم اختياره بواسطة العبارة range table .
ثم بعد ذلك تأتي عبارة range clear لتنظيف ال Table Buffer وهذا ضروري بعد كل استخدام لل Table Buffer ثم تأتي العبارة window restart لمسح محتويات النافذة ولاعطاء المستخدم صورة تفاعلية بأن السجل تم حذفه.
بقي هناك الكود التي تلي العبارة else للتركيب case والتي تعمل وفق المنطق التالي الذي ذكرناه سابقا (اما اذا اعادت العبارة القيمة OKAY فهي للدلة على ان السجل موجود ويمكن حذفه واخيرا اذا لم تعاد اي من القيم الثلاثة السابقة فهذا يدل على ان السجل لم يحفظ اصلا والسناريو المحتمل هو ان المستخدم ادخل السجل في النافذة والآن يريد حذفه هنا اذا كان الزر حذف مفعل وغير مغلق قد يضغط المستخدم على الزر لحذف السجل قبل حفظه اصلا في الجدول لذا وضعنا عبارة else في نهاية العبارة case لأصطياد هذه الحالة) هنا قمنا بأظهار رسالة اولا لاخبار المستخدم بأن هذا السجل لم يحفظ لذا عليه استخدام الزر clear لمسح محتويات النافذة ثم استخدمنا العبارة focus والتي تعمل علة نقل التركيز الى الزر clear لكي يكون من السهل على المستخدم الضغط عليه واخيرا تأتي عبارة range clear لتنظيف ال Table Buffer وهذا ضروري بعد كل استخدام لل Table Buffer.

humam 02-Aug-2011 10:18 AM

ملاحظة حول شفرة الزر Save
 
كما تذكرون في بدايات هذا الموضوع كتبنا الشفرة البرمجية للزر حفظ وكانت هذه الشفرة البرمجية اولية اي تحتاج الى التطوير لان الشفرة الحالية ضعيفة ويوجد هناك bugs اتمنى من المتابعين ان يحاولوا اولا ايجاد هذا الخلل ثم سوف نتابع لاحقاتطوير الكود

عثمان 02-Aug-2011 11:53 AM

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

حيا الله شعب العراق الأبي ... الشعب العبقري دون منازع... فرج الله همكم

humam 04-Aug-2011 03:35 PM

الله محييك اخي العزيز جزاك الله عني خير الجزاء على كلماتك الطيبة واتمنى ان تعود هذه المواضيع بالفائدة المرجوة منها على كل العرب والمسلمين

Monzer Osama 04-Aug-2011 03:44 PM

اقتباس:

المشاركة الأصلية كتبت بواسطة humam (المشاركة 925)
كما تذكرون في بدايات هذا الموضوع كتبنا الشفرة البرمجية للزر حفظ وكانت هذه الشفرة البرمجية اولية اي تحتاج الى التطوير لان الشفرة الحالية ضعيفة ويوجد هناك bugs اتمنى من المتابعين ان يحاولوا اولا ايجاد هذا الخلل ثم سوف نتابع لاحقاتطوير الكود

أتوقع أن الخلل في هذا هو عدم وضع كود لعملية الحفظ عند إغلاق الشاشة حيث أنه لن يتم حفظ المدخلات الا بضغط الزر ويفترض أن يتم سؤال المستخدم عن رغبة الحفظ من عدمها... هل انا محق في هذا؟؟

humam 04-Aug-2011 04:25 PM

الشفرة البرمجية للزر Save:

بالعودة الى الشفرة البرمجية في الزر Save نلاحظ انها تمتاز بالبساطة وانا كنت متقصد من ذلك لانني في البداية لااريد ان اضع شفرات معقدة نوعا ما مما يعطي انطباع سيء عند الشخص الذي يرغب في التعلم وهي كانت كافية في البداية لاعطاء صورة جديدة حيث ان المستخدم سوف يقوم بأدخل المعلومات ثم يقوم بحفضها ويلاحظ ان كل شيء يعمل بشكل جيد حيث تتم عملية مسح محتويات النافذة بعد الحفظ وعندما يعمل SELECT من SQL Server سوف يجد السجل الذي ادخله الان اين العيب في هذه الشفرة ؟ الجواب ان هذه الشفرة تعمل بشكل سليم في حالة ادخال New record ولكن عندما تحاول ان تحرر اي سجل موجود مثلا استرجع اي سجل ثم غير اسم الزبون مثلا او اي حقل ثم اضغط الزر حفظ واسترجع نفس السجل سوف تلاحظ ان التغييرات التي قمت بها لم تحفظ ؟ الخلل في الشفرة البرمجية حيث نحتاج الى تغيير المنطق الذي تعمل به الشفرة الى المنطق التالي:
اولا. سوف نقوم بعملية الحفظ كما هي ان ننسخ المحتويات من النافذة الى الجدول ثم نحفظ الجدول.
ثانيا. بعد تنفيذ عملية الحفظ سوف نستخدم الدالة err لمعرفة نتيجة عملية الحفظ هل نجحت ام لا .طبعا سوف تنجح العملية اذا كنت تحفظ هذا السجل لأول مرة ولكن عندما تحاول ان تقوم بعملية تحرير سجل موجود سوف تعاد القيمة التالية DUPLICATE ولتوضيح السبب في ذلك سوف نحتاج الى تقريب الموضوع كما يلي ان عبارة Save Table سوف تترجم لاحقا الى عبارة Insert المعروفة في SQL Server الان عندما تنفذ عملية Insert في جدول يجب ان يكون كل سجل في الجدول يمتلك قيمة فريدة لحقل او مجموعة الحقول التي تمثل Primary Key للجدول فأذا حاولت ادراج سجل جديد يمتلك نفس القيمة في حقل المفتاح الاساسي Primary Key لسجل موجود فأنك تحاول ان تكسر تكامل قاعدة البيانات وسوف يقوم SQL Server بمنعك من ذلك وهذا ما يحصل فعلا عندما تحاول ان تنفذ عبارة save table بالنسبة لسجل موجود مسبقا لذا اذا كانت القيمة المعادة هي DUPLICATE سوف نستنج ان المستخدم يحاول ان يعدل محتويات سجل موجود لذا نحتاج الى اضافة سطر برمجي قبل عبارة save table يعمل على ترجمتها الى عبارة Update المكافئة في SQL Server .

humam 04-Aug-2011 04:37 PM

اقتباس:

المشاركة الأصلية كتبت بواسطة Monzer (المشاركة 976)
أتوقع أن الخلل في هذا هو عدم وضع كود لعملية الحفظ عند إغلاق الشاشة حيث أنه لن يتم حفظ المدخلات الا بضغط الزر ويفترض أن يتم سؤال المستخدم عن رغبة الحفظ من عدمها... هل انا محق في هذا؟؟

احسنت اخي منذر على هذه الملاحظة وهذه نقطة اخرى سوف نذكر لاحقا كيفية التعامل معها.

humam 04-Aug-2011 04:44 PM

1 مرفق

ان العبارتين Copy from & save table كما وضحنا سوف تعمل على حفظ المعلومات من النافذة الى الجدول الان هناك احتمالين الاول هو نجاح عملية الحفظ لذا سوف تعيد الدالة err القيمة OKAY وبتالي سوف لايتم تنفيذ عبارة الشرط الاولى وينتقل التنفيذ مباشرة الى السطر الاخير من الشفرة وتحديدا الى العبارة restart window والتي تعمل على مسح محتويات النافذة بعد عملية الحفظ التي تمت بشكل سليم .

الان نأتي الى الاحتمال الثاني وهو ان المستخدم يحاول تعديل سجل موجود وعندما نحاول تنفيذ العبارة save سوف يحصل هناك خطأ وتعيد الدالة err قيمة الخطأ وهو DUPLICATE وبتالي سوف يتحقق شرط عبارة if then الاولى وننتقل الى مجموعة من العبارت تعمل على ما يلي:
اولا. نفرغ محتويات Table Buffer
ثانيا.تعمل عبارة range table على ملئ Table buffer بالسجل المحدد اعتمادا على قيمة حقل النافذة Customer ID .
ثالثا. تقوم العبارة change first بوظيفتين الاولى هي استرجاع السجل الاول من Table Buffer والثانية انها تهيئ الجدول ARB_Customer_MSTR للقيام بعملية تعديل محتوى احد السجلات الموجودة حاليا.

رابعا. تقوم عبارة copy from & save table بعملية حفظ التعديلات التي اجراها المستخدم على السجل وسوف تتم هذه العملية بنجاح ولكن للاحتياط وضعت بعدها عبارة if then لفحص العملية الاخيرة لانه قد يحصل هناك خلل اثناء عملية الحفظ مثلا تنقطع الشبكة وهنا ان العبارة change table خطرة نوعا ما لانها تسبب اقفال الجدول وهذا الاقفال لا يزال الا بتنفيذ عملية save ناجحة اما اذا لم تنجح عملية الحفظ لاي سبب من الاسباب سوف تعمل عبارة if then على تنفيذ العبارة release table وهي تعمل على ازلة القفل من الجدول لاننا اذا لم نفعل ذلك سوف لا يستطيع المستخدم ان يصل الى الجدول لانه سوف يكون مغلق.

yasser_bh 04-Oct-2011 10:02 AM

شكرا لك على هذا الموضوع الممتاز ... منذ فترة و انا ابحث عن مصادر لتعلم لغة الدكستري ... فأذا كانت لديك بعض المصادر (كتب، مواقع أو منتديات) فسوف نكون لك نت الممتننين لو شاركتنا إياها


شكرا

عماد زيد 04-Oct-2011 11:06 AM

السلام عليكم
الأخ همام اضطر للإنقطاع عن المنتدى بسبب لعض الظروف القاهرة.
نتمنى عودته قريباً.

humam 14-Nov-2011 06:57 PM

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

saed_adnan 25-May-2013 04:45 PM

السلام عليكم

اخي العزيز , عملت جميع الخطوات
ولكن عند قيامي بفتح الشاشة يظهر لي الخطأ التالي :

MEM_LOCK_ERROR

و بعد الضغط على OK , يظهر الخطأ التالي :

Form load failed : missing Datatype : Field 22000

ارجو المساعدة :(


جميع الأوقات بتوقيت GMT +3. الساعة الآن 12:41 PM.

Powered by vBulletin® Version 3.8.3

الموقع والمنتدى من تطوير » شركة المنذر للاستضافة والتصميم


الموقع لا يمثل أي جهة رسمية بل هو جهد شخصي يرمي الى تجميع القدرات في برنامج جريت بلينز