مشاهدة النسخة كاملة : أشياء لا أحبها عند برمجة قواعد البيانات
shagrouni
05-03-2010, 11:34 PM
السلام عليكم،
توجد بعض الأمور التي شخصيا لا أحبها عند التعامل مع قواعد البيانات،
ولن أتوسع في شرح الأسباب.
بسم الله نبدأ:
1- البارادوكس Paradox
وجدت أن اكسيس أفضل منها بكثير من حيث المتانة والاعتمادية والمرونة والسرعة.
2
- BDE
أو Borland Database Engine أي محرك بورلاند لقواعد البيانات، فهو ذو تصميم
قديم بمفاهيم قديمة، وسبق وأن تم الاعلان عن وقف الدعم له.
3- متحكمات البيانات Dataware controls أي كل المتحكمات التي تأتي تحت باب
Data Controls مثل DBEdit و DBGrid و DBLookupListBox ..إلى آخر القائمة.
هذه المتحكمات المقصود منها إيجاد رابط مباشر بين ما يحدث في قاعدة البيانات
وما يعرض على الشاشة للمستخدم، وهذا رائع بالفعل من حيث تسهيل البرمجة
وتصميم التطبيق بصريا وبسرعة. ولكن فقط عندما يكون التطبيق صغير الحجم ،
فإذا كبر التطبيق واستطرد فإن هذه المتحكمات ستكون شرا أكثر منها خيرا.
كيف ذلك؟
صعوبة السيطرة على التوليف=الكود لأنه سيكون أقل تنظيما بسبب توزعه على
مناولات الأحداث الخاصة بـ Dataset مثل BeforeInsert ، BeforeDelete .
وبالتالي مراجعة ومعاينة شروط الإدخال و العرض ستكون أصعب. أيضا، ستجد نفسك
مقيدا أكثر عند عمليات الترقية أو الصيانة أو المراجعة وإزالة الأعطال،
كما أن هذه المتحكمات تكون حساسة جدا أمام أي تغيير يتم على مستوى قاعدة
البيانات إذا تم تعديل حقل أو جدول.
أيضا فإن متحكمات البيانات سوف تتعارض مع مبادئ تصميم التطبيق بالمنحى
للكائن OOD، ومبادئ فصل العرض عن المنطقيات وعن خزن البيانات.
في فيجوال ستوديو 2005، تم استحداث أسلوب غير مباشر لربط متحكمات البيانات،
وذلك بربطها بكينونات objects من صنعك وتحدد لكل متحكم الكينونة التي
يتبعها والخاصية التي ترتبط به في تلك الكينونة، كما تحدد المنهجيات Methods
في هذه الكينونة التي تقوم بعمليات مناولة البيانات من جلب وتخزين وإلغاء.
فالمتحكمات هنا ليست مرتبطة ارتباطا مباشرا مع جداول قاعدة البيانات،
بل مع الكينونات التي تكون كوسيط بينها و بين جداول قاعدة البيانات.
هذا حل جميل، يسمح لك باعتماد المنحى للكائن وفصل عناصر التطبيق وإدخال
ما شئت من نقاط فحص وتحكم في البيانات، دون أن تخسر مزايا عرض البيانات آليا
من خلال هذه المتحكمات.
أتمنى أن أرى مثل هذا الحل في دلفي.
4- استخدام عمليات مثل: Edit و Addو Post و Filterو Indexالتي تكون
تابعة ل Dataset.
هذه عمليات من موروثات بدايات محركات قواعد البيانات المكتبية القديمة
مثل dBase وبارادوكس،التي تم تصميمها عل أساس أن البيانات موجودة في نفس
الجهاز الذي يحوي التطبيق، وأن المحركات لا تدعم مفاهيم SQL ، وعندما كان الربط
مع خوادم قواعد البيانات غير وارد.
أنا أفضل أن أختصر هذه الأمور وأتعامل مع البيانات مباشرة بواسطة جمل SQL
في كل عمليات مناولة البيانات.
5
- مكونات قواعد البيانات مرئية على النماذج forms في وقت التصميم حتى لو
كان نموذج Datamodule . إذا احتجت لأي مكون أقوم بإنشائه عبر التوليف
- في وحدة غير وحدة الفورم-، فيقوم بالوظيفة التي أردت له القيام بها ثم أقوم
بإتلافه بعد انتهاء الغرض منه.
هذه بعض مما لا أحب التعامل مع عند برمجة تطبيقات قواعد البيانات. قد يقول
القائل وما ذا تركت؟ لكن صدقوني كل تسهيل برمجي يتم تقديمه تكون مقابله قيود
أكثر على حرية حركتك.
عموما، أعلم أنه توجد الكثير من النقاط السابقة ينقصها التوضيح أو الاستفاضة،
كما أعلم أن الكثيرين قد لا يوافقونني على بعض ما قلته؛ لذا أتمنى تبادل الرأي والمناقشة.
nabilkeb
06-03-2010, 07:34 PM
السلام عليكم أخي:
و الله أكيد أن هناك من لا يوافقونك الرأي كليا ، على الأقل و بكل إختصار أقول : لكل مقام مقال .
أما موضوع bde و البارادوكس ، لعلك تقرأ بعد البحث رأي بعض الأحبة الأعضاء .
كل تسهيل برمجي يتم تقديمه تكون مقابله قيود
أكثر على حرية حركتك هل يعني هذا أنه عليا الإستغناء على كل تسهيل و أبحث عن الأصعب في كل حالة و ظرف؟
هل أحب أن أستعمل من الأدوات ما يفي بكل الغرض و بدون أي عيب وفي ساعة واحدة ، أم ألجأ إلى أصعب الأمور و طول الوقت من الأجل الوصول إلى نفس الغاية ؟ أمن الحكمة هذا الخيار ؟
shagrouni
06-03-2010, 09:27 PM
السلام عليكم
نعم يا سيدي، الحكمة أن تصل إلى غرضك بأسرع ما يمكن وبأقل عوائق.
فإذا كان البرنامج الذي أنا بصدده صغير الحجم، أو أن الأمر يتطلب توريده اليوم قبل غد،
فالخيار هو أن أستخدم أسهل وأسرع ما بيدي من أدوات، و هنا تأتي روعة متحكمات البيانات
في دلفي، فأنجز العمل في سويعات دون أن حرفا برمجيا.
لكن إذا كبر البرنامج وتشعب وطالت مدة استخدامه وبالتالي توالت عمليات تطويره وصيانته،
فإن هذه المتحكمات ستكون عائقا.
جرب أن يكون لديك قاعدة بيانات بأكثر من 30 جدول رئيسي –وليس مساعد- وتطبيقات Client/Server
على نفس قاعدة البيانات.
حرب أن تتضمن تطبيقاتك وحدات اختبار Unit Tests .
جرب أن تعتمد في هذه التطبيقات على مفاهيم المنحى للكائن Object Oriented في تصميم مكونات
الأعمال فيها.
ثم جرب أن يكون لديك الكثير من الشروط و القيود التي يجب تنفيذها على كثير من الحقول قبل وبعد
عرض البيانات أو إدخالها أو تحديثها أو إلغاؤها.
أنا أحترم تجارب الأعضاء وأرائهم، ولكن أيضا أنا لي تجاربي، بعضها موجع و بعضها كالبلسم الشافي،
لا أقول إني جرّبت البارادوكس ولكني انغمست فيها حتى نخاعها، ولا أقول إني لعبت بمتحكمات البيانات قليلا؛
ولكني حاصل في شباكها حتى هذه اللحظة في برامج ضخمة آمل أن أجد الوقت لمراجعتها و تغييرها.
أنا بطبعي براغماتي = مصلحي فيما يخص البرمجة، ولا أحب التعقيد وتطويل الحبال في برنامج لا يستأهل
أكثر من ساعة كما تفضلت، وكما أنا أشرت: " فقط عندما يكون التطبيق صغير الحجم " .
ولكن مع كبر حجم التطبيق فلا بد من تعب قليل وبعض التعقيد في سبيل سهولة وراحة بال على المدى الطويل.
.
nabilkeb
06-03-2010, 09:58 PM
إذن و على خبرتك و قلة معرفتي و تجربتي ، لكننا نتفق أن لكل مقام مقال .
أما طرحك لماتكره أثناء برمجة قواعد البيانات لابد أن يكون الطرح منهجي و منطقي ، أقصد أنه لابد من ذكر محاسن ما تكره ، و فوائده و عائداته و ما قدمت لك بساطته من راحة و كسب للوقت ، كل هذا جدير جدا أن يذكر و يستحسن ، و لا بأس حينها من ذكر العيوب أثناء تصميم البرامج الضخمة ، لأنك و كمبرمج أكيد أنك لن ترمج ما هو صعب و ضخم و معقد فحسب فأكيد أنت بحاجة أحيانا لتصميم برامج سهلة و بسيطة و لن تكون من الحكمة أن تنتهج في تصميمها نفس ما تنتهجه مع غيرها .
لأن كل من تنقصه الخبرة و يقرأ لك رأيك هذا فستشوش أفكاره و يتعقد عليه الأمر و هو يبحث عن بدائل ربما لن يحتاج إليها .
و ختاما بالتوفيق أخي الكريم لك و لنا جميعا.
B.M.AbdelAziZ
07-03-2010, 11:31 AM
السلام عليكم ورحمة الله
اخي خالد الشقروني كونك ذوخبرة ولك باع بالامر نظرتك تختلف عن نظرة شخص أخر
ضف ان البرمجة اسلوب وفلسفة تختلف من شخص لاخر وهذا من الاشياء التي احبها بدلفي عكس لغات/بيئات تطوير اخرى حيث المبرمح/المطور مقيد نوعا ما باسلوب يملي عليه بطريقة غير مباشرة
البارادوكس Paradox
وجدت أن اكسيس أفضل منها بكثير
قواعد البيانات ليس Paradox و Access فقط، دلفي يدعم تقريبا كل قواعد البيانات الموجودة
والتي لا يدعمها الباب مفتوح للمبرمج/المطور ان يضيف الدعم بنفسه
هل جربت مثلا Firebird ؟
BDE سبق وأن تم الاعلان عن وقف الدعم له
صحيح، مع ذلك لا يزال موجود بدلفي 2010 و قريبا بدلفي 2011
والاهم منذ اصدارات دلفي القديمة هناك بدائل اخرى غيره للتعامل مع قواعد البيانات
shagrouni
08-03-2010, 02:33 AM
مهلا مهلا مهلا
أولا السلام عليكم
يبدو أن الإخوة فهموا موضوعي بشكل مختلف عما أردت طرحه، أو أني لم أوفق في توضيح ما أقصد.
لذلك ****كم لا تفهموني بسرعة.
أولا، إن دلفي هي هوائي التي أتنفسه منذ الإصدار الأول وما زلت أتنفسها حتى الآن. ولا نية قريبة لي بتنفس هواء غير هواها.
ثانيا، أن متحكمات البيانات و تقنيات التعامل مع قواعد البيانات بأنواعها؛ هي إحدى أهم المزايا الظاهرة في دلفي، وهي إحدى مصادر قوتها التي جذبت إليها الكثير سواء مبتدئين أو متمرسين من بيئات تطوير أخرى. إن فكرة أن تقوم بصريا بتصميم وتنفيذ برنامج قواعد بيانات من الألف إلى الياء من شاشة الإدخال وفحص البيانات وعرضها في جداول ووضعها في تقارير سردية وإحصائية ورسومية ثم معاينة طباعتها واستخراجها ورقيا ، كل ذلك دون كتابة تعليمة برمجية واحدة، وفي فترة زمنية قصيرة جدا ؛ هي في حد ذاتها إعجاز عبقري.
لا أحد ينكر هذا، وكلنا استفدنا من هذه المزايا وجعلتنا في المقدمة مقارنة بغيرنا الذين اعتمدوا بيئات تطوير أخرى.
ثالثا: عندما أقول أن هواي مع هذا دون ذاك، فهذا ليس انتقاصا لدلفي، دلفي تجعل أمامك كل الخيارات مفتوحة، لتنتقي منها ما يناسبك، وحتى إن لم تعجبك كلها فهي تسمح لك - بل تشجعك من خلال روعة تصميمها - أن تخترع ما يناسبك.
فتفضيلي لبيئة دلفي مثلا لا يعني أن أفضل كل شيء فيها ، كثيرون منا لا يحبذون استخدام المكون DBGrid ويفضلون استخدام بدائل أخرى من طرف ثالث مثل QuantumGrid ، أنا شخصيا قمت بصنع بديل خاص بي، الروعة أن تسمح لك هذه البيئة بذلك.
رابعا: ما عرضته كان نتاج تجربتي الشخصية مع تطبيقات الأعمال التي تعاملت معها و التي كبرت وتشعبت بحيث أصبحت عبئا علي عند صيانتها وتعديلها، والتي دفعتني إلى الاستغناء عن متحكمات البيانات في كثير منها، حتى أكسب هامشا أكير من الحرية والتحكم.
خامسا: إن ما طرحته هو رأي شخصي ذاتي غير موضوعي بالضرورة، وقد قدمت لذلك فقلت: "الأمور التي شخصيا لا أحبها".
- لم أقل أن متحكمات البيانات في دلفي سيئة بل قلت: وأقتبس: " وهذا رائع بالفعل من حيث تسهيل البرمجة وتصميم التطبيق بصريا وبسرعة. ولكن فقط عندما يكون التطبيق صغير الحجم ."
يبدو أن اللبس نشأ عند قلت أنه عندما يكبر المشروع و يتشابك فإن متحكمات البيانات تكون غير مناسبة، هنا لا أعني أنها لن تشتغل أو ستكون فيها مشاكل في حد ذاتها، لا، ما عنيته أن فلسفة التصميم القائمة عليها – وضع متحكمات بيانات على نموذج الشاشة - تفرض عليك قيودا تمنع فلسفة تصميم أخرى أكثر أريحية في المشاريع الكبيرة. وهذا الأمر لا يخصّ دلفي فقط ولكنه أمر عام يشمل بيئات التطوير الأخرى التي بها متحكمات بيانات.
@الأخ nabilkeb : نحن هنا في منتدى، بطبيعته أن نضع أرائنا فيه عفو الخاطر ، ولست بالضرورة أن أكون ملزما بإتباع منهجية أكاديمية صارمة، تفرض علي الاستفاضة في المقدمات والنتائج و المزايا و العيوب.
"لأن كل من تنقصه الخبرة و يقرأ لك رأيك هذا فستشوش أفكاره و يتعقد عليه الأمر وهو يبحث عن بدائل ربما لن يحتاج إليها"
معك حق، وآسف للجميع.
@الأخ ramijz : أنا أيضا لدي برنامج بقاعدة بيانات اكسيس يتشارك بها عدد من المستخدمين، واعتمدت فيه على متحكمات البيانات التي ذكرتها ولا يزال البرنامج يعمل منذ عشر سنين ولا مشاكل.
@ B.M.AbdelAziZ: أخي، خجلي منك يغلب رغبتي في التعليق على مشاركتك التي شرفتني. ولكن أحاول:
- " ذو خبرة ولك باع ": في المشاريع الفاشلة نعم، في البرمجة تعلمت أن الخبرة تكون في مجال دون آخر ، وشخصيا تتلمذت عند أناس كانوا تلاميذ لدي.
- البارادوكس، لا أرى لها علاقة بدلفي وهي غير محسوبة عليه شأنها شأن أي قاعدة بيانات أخرى تدعمها دلفي. صحيح أن أول إصدارة لدلفي كانت هي قاعدة البيانات الافتراضية، ولكني لم أنظر إليها قط على أنها قطعة من دلفي.
- <هل جربت مثلا Firebird> لا لم أجربها حديثا، وأنا مهتم بجانب Embedded فيها.
- بالنسبة لـ BDE أعلم أنه ليس البديل الوحيد، ما قصدته وقف التطوير به واستبداله بـ DbExpress وأظن أن الدعم المتبقي له هو أن يتماشى مع اليونيكود و بيئة 64 للحفاظ على توافقية مع العدد الكبير من التطبيقات التي تستخدمه.
شكرا على سعة صدركم
محمد نسمان
13-05-2010, 02:26 PM
أخ خالد، أنا معك في كلامك في أول ثلاث نقاط، وبصراحة كنت من أشد المعجبين بعملية الربط المباشر Data Aware controls، عند بداية تعلمي للدلفي لكن مع مرور الوقت وجدت ان السهولة تضيع علي الكثير من المرونة، ومنذ حوالي أربع سنوات لم أعد استخدمها ما عدا DBgrid ومشتقاته.
أيضاً الباردوكس كانت خيار جيد مع دلفي 1 و2، وكانت سابقة في زمانها لكن لا أنصح اي احد في استخدماها في البرامج ما عدا للتعليم حيث يوجد لها اكثر عدد من المقالات على الانترنت، ولكنها تعلم برمجة سيئة لإعتمادها بشكل اساسي على مفهوم Local database، فمثلاً هناك الكثير ممن يستخدمون FindNext, Locate مع قواعد بيانات مثل Sql server وهذا اعتبره مصيبة.
أذكر قبل حوالي 5 سنوات أو أكثر قمت ببرمجة برنامج بشكل سريع واستخدمت به Data Aware controls للسرعة وايضاً Locate مع Sql server وعند تشغليه من خلال شبكة بحوالي 12 جهاز وبعد زيادة حجمة البيانات، أصبح هناك بطئ شديد في البرنامج واكتشفت ان المشكلة في Locate، حيث انها تقوم بجلب جميع البيانات من السيرفر ومن ثم تقوم بالبحث، طبعاً هي مخصصة للعمل مع باردوكس لان كل البيانات تكون موجودة في الذاكرة لذا تكون سريعة جداً في التعامل معه.
ومنذ حوالي 5 سنوات بدات بتغير طريقتي في التعامل مع قواعد البيانات فأصبحت لا استخدم TTable واخواتها الا في حالات نادرة واستخدم فقط TQuery ومشتقاتها.أيضاً ابتعدت عن كل طرق مكونات قواعد البيانات الموجودة مع دلفي، واستبدلتها بالمكونات الخاصة ب DevArt مثل MyDac,ODac, SDac، فحصلت على سرعة كبيرة وايضاً عدم الحاجة لوجود مكتبات للعمل مع قواعد البيانات الا في حالات خاصة.
بالنسبة للنقطة 4 فأنا أستخدم جمل Insert, Update, Delete بكثرة مباشرة وحتى بدون استخدام مكونات بل بتنفيذ الأمر من خلال الكونكشن مثل TmyConnection.ExeSql
لكني ايضا استخدم TmyQuery.append or TMyQuery.edit وPost ايضاً حيث ان جميع مكونات DevArt تقوم بتوليد جمل Insert,Update,Delete في وضع التصميم وتسمح لي بالتحكم بها بالشكل المراد وايضاً بإستخدام المعاملات parametrized queries.
اما النقطة الخامسة فهناك جزء كبير من الكود Bussiness Logic اضعه ضمن DataModule ووحدات أخرى ضمن Classes، واقوم بإنشاء المكونات برمجية، لكن ايضاً استخدم المكونات الجاهز مثل Tquery من على النماذج لتسهيل العمل وخاصة احيانا لعرض البيانات ضمن DBGrid او تقرير لنتيجة الإستفسار الموجودة.
أيضاً أرد ان اضيف نقطة جديدة وهي إستخدام جمل Sql بدون معاملات مثل
qry1.SQL.Text := 'select * from mytable where name = ' + Edit1.Text + ' and city = ' + Edit2.Text;
بدلاً من
qry1.SQL.Text := 'select * from mytable where name = :n and city = :c';
qry1.ParamByName('n').AsString := Edit1.Text;
qry2.ParamByName('c').AsString := Edit2.Text;
حيث أن الصيغة الثانية اطول من الناحية البرمجية لكنها أسرع في التنفيذ بشكل كبير خاصة مع تكرار نفس الإستفسار
والمشكلة الثانية لو تعود المبرمج على هذه الطريقة في برمجة الويب فسيصبح موقع مستودع خصب لل Sql Injection.
وفي الختام، لا أعتبر أن هناك طريقة واحدة للبرمجة هي الصحيحة أو الأفضل، لكن يجب دائما أن يتعود المبرمج على تطبيق طرق جديدة ومحاولة القراءة ولو بلغات أخرى حتى يتسنه له البرمجة بطريقة ماهرة وليس البرمجة من اجل تشغيل البرنامج
shagrouni
13-05-2010, 04:04 PM
السلام عليكم
أخي محمد
بالنسبة لعرض التسجيلات أنا استخدم مكون ٍStringGrid عبر إجرائية تقوم بقراءة Dataset وتحويلها
لمصفوفة أو TStrings ثم تمريرها ل StringGrid . وذلك حتى أتخلص من احتياجي ل DBGrid .
أحب دائما أن لا يكون للشاشات أية علاقة بتفاصيل قاعدة البيانات.
أنا أيضا لا أستخدم الباراميتر في جمل SQL فهي تشوش علي مقروئية الكود. و أتمنى لو يكون لدلفي
نفس خاصية C# عند صياغة متغير نصي قد يمتد لعدة أسطر مثلا باستخدام العلامة @ قيل النص:
string s;
s = @"SELECT fld1, fld2, fld3
FROM MyTable
WHERE fld1 = 2";
بدلا من
S := ‘SELECT fld1, fld2, fld3 ’ +
‘FROM MyTable ‘ +
‘WHERE fld1 = 2’;
SQL Injection هي مشكلة حتى في التطبيقات المكتبية، أنا أقوم بفحص القيمة قبل وضعها في جملة SQL
لمعالجة العلامات أو الكلمات المشبوهة.
جمل Edit Post أستخدمهم في البرامج والأدوات السريعة الخارجية (أدوات مطبخ داخلي) لمراجعة وصيانة قواعد البيانات الخاصة بالتطبيقات، ولكن في التطبيقات نفسها أستخدم إجرائيات مثل:
SQLUpdate(const TableName: string; AValues: TStringList; sWhere: string);
فأقوم بتمرير اسم الجدول و أسماء الحقول وقيمها وجملة الشرط. وتقوم الإجرائية بصياغة جملة SQL وتنفيذها.
طبعا هذه الأمور تكون جيدة في التطبيقات الكبيرة ولكن يوجد مبرمجون مهووسون يطبقونها بدون داع
حتى في البرامج الصغيرة، لذا يجب مراعاة التناسب بين الجهد المبذول و الفائدة المرجوة.
محمد نسمان
13-05-2010, 11:30 PM
بالنسبة لعرض التسجيلات أنا استخدم مكون ٍStringGrid عبر إجرائية تقوم بقراءة Dataset وتحويلها
لمصفوفة أو TStrings ثم تمريرها ل StringGrid . وذلك حتى أتخلص من احتياجي ل DBGrid .
أحب دائما أن لا يكون للشاشات أية علاقة بتفاصيل قاعدة البيانات.
بصراحة أستخدمه فقط في حالات نادرة، في كثير من الأحيان أقوم بإستخدام جدول في الذاكرة مثل VirtualTable أو TClientDataset لعرض البيانات ضمن ال DBGrid، وبذلك أتخلص من إتصاله بقاعدة البيانات ولكن أحصل على مميزات كثيرة بدون الحاجة لكتابة مزيد من الكود، وخاصة إنني لا أستخدم ال DBGrid نفسه ولكن مكونات من شركات أخرى بها مميزات كثيرة من الموجود مع ehLib أو InfoPower لان بهم دعم RTL.
أنا أيضا لا أستخدم الباراميتر في جمل SQL فهي تشوش علي مقروئية الكود
لا أعتقد بها مشكلة في المقروئيةـ لكن الميزة الأساسية هي السرعة Performace بشكل كبير ، فعند إستخدامكم القيم مع الجملة بشكل مباشر فإنك تنهك السيرفر في عمليات ترجمة الجمل في كل مرةـ عكس عند إستخدام البارميتر فإنه يترجم الجملة مرة واحدة وفرق السرعة واضح في الحالتين خاصة عندما تقوم بتنفيذ المئات أو الالاف منها في برنامجك ويكون البرنامج موزع على العديد من المستخدمين.
أما بالنسبة لرمز @ Verbatim character، فإن بيئة التطوير تقوم بشيء مشابه حيث هي تقوم بإغلاق اخر السطر ووضع علامة + بشكل تلقائي، لكن هذا أعتقد مع دلفي 2006 وما بعد.
أيضاً مشكلة ال Verbatim character، هي انه يتم التعامل مع بكل المسافات المتروكة مثلا
s = @"Hello
World";
فسوف يتم تمرير الجملة بكل المسافات التي قبل كلمة World، وهذا فيه .زيادة في البيانات المرسلة للسيرفر بدون داعي ;)
أنا تمثل عندي ال DataModule مكتبة كبيرة أستخدمها مع جميع البرامج للدوال الجاهزة التي اضيف كل فترة وفترة وجميعها مكتوبة ال SQL ولا أعتقد إني أستخدم مكون يعتمد على TTable في برامج، وحتى ال ComboBox اقوم بتعبئتها في وقت التنفيذ ولا تكون مرتبطة مع أي مكون لقواعد البيانات
ghostdz
14-05-2010, 06:02 AM
السلام عليكم
بارك الله فيكم على هذا النقاش و المعلومات القيمة
أضيف معلومة بسيطة بخصوص جمل SQL
يفضل أن تكون جمل sql موجودة في دوال بقاعدة البيانات (stored procedure أو query) حيث تكون سريعة لأن قاعدة البيانات تكون قد حددت مسار التنفيذ الأسرع (schema execution) سلفا وليس في مرحلة التنفيذ
shagrouni
20-07-2010, 09:40 PM
السلام عليكم
@محمد نسمان
(لكن الميزة الأساسية ( في Parameters) هي السرعة Performace بشكل كبير)
معلومة جديدة بالنسبة لي. بالرغم أنها أساسية. شكرا جزيلا لك.
kachwahed
20-07-2010, 10:06 PM
السلام عليكم
أعتقد بخصوص المكونات الأصلية أن الأمر معها ليس سيء لهذه الدرجة طالما السورس متوفر والتعديل ممكن
مثال بسيط حول أمر مزعج بخصوص النمط TDBEdit عند ربطه مع حقل يحمل عملة نقدية...
باختصار... تداركت الأمر بالتعديل في أصل النمط بشيء مثل:
TDBEdit = class(DBCtrls.TDBEdit)
private
procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
end;
...
procedure TDBEdit.CMEnter(var Message: TCMEnter);
begin
inherited;
if (Trim(Self.Text) <> '') and (not Self.ReadOnly) then
Self.Text := FormatFloat('#.##', StrToCurrency(Self.Text));
Self.SelectAll;
end;
وقس على ذلك بقية المكونات :)...
talal
06-08-2010, 09:42 PM
السلام عليكم ورحمةالله وبركاته
اتمنى ان لايكون النقاش قد انتهى , لان الموضوع مهم لمن يريد ان يقدم برنامجا قويا ومتماسكا .
كما قال الاخ خالد الشقروني عندما يكون البرنامج بسيط يمكن استخدام مكونات الربط . اما اذا كان المشروع ضخم هل يحبذ استخدام هذه المكونات DBEDIT,وغيرها
في هذه الصورة هل استخدام مكونات الربط محبذ . لااعتقد .لان المشاكل ستظهر بالجملة والبطء في البرنامج. فقررت استخدام EDIT ,COMBOBOX,وSTORED PROCEDURES, كي تحل المشاكل
وكي يكون البرنامج معتمد على SQLprocedure TForm3.btn11Click(Sender: TObject);
var
proctrans:TADOStoredProc;
d2:TDate;
begin
Form3.ColumnGrid1.FocusCell(1,1) ;
img6.Visible:=false;
img2.Visible:=false;
image2.Visible:=false;
d2:= EncodeDate(YearOf(DateTimePicker1.date),MonthOf(Da teTimePicker1.date),DayOf(DateTimePicker1.date));
if edt1.Text ='' then
begin
IF Trim(edt2.Text) ='' THEN BEGIN img6.Visible:=true;EXIT; END;
IF Trim(edt3.Text) ='' THEN BEGIN img2.Visible:=true;EXIT; END;
IF Trim(edt5.Text) ='' THEN BEGIN image2.Visible:=true;EXIT; END;
//IF Trim(edt28.Text) ='' THEN BEGIN img3.Visible:=true;EXIT; END;
try
DM.ADOConnection1.BeginTrans;
proctrans :=TADOStoredProc.Create(nil);
proctrans.Connection:=DM.ADOConnection1 ;
proctrans.ProcedureName :='addfact';
proctrans.Parameters.Refresh;
proctrans.Parameters.ParamByName('@id_artical').Va lue := edt22.text;
proctrans.Parameters.ParamByName('@artical').Value := edt2.text;
proctrans.Parameters.ParamByName('@id_mos').Value := edt26.text;
proctrans.Parameters.ParamByName('@id_dealer').Val ue := edt23.text;
proctrans.Parameters.ParamByName('@dealer').Value := edt3.text;
proctrans.Parameters.ParamByName('@id_c_t').Value := edt24.text;
proctrans.Parameters.ParamByName('@com_tra').Value := edt4.text;
proctrans.Parameters.ParamByName('@date_it').Value := d2;
proctrans.Parameters.ParamByName('@set_hold').Valu e := edt16.Text;
proctrans.Parameters.ParamByName('@id_card').Value := ColumnGrid1.Columns[1].Rows[1];
///////////////////////////////////////////////////
if DM.Qryselectkind.Fields.FieldByName('id').Value =1 then
begin
proctrans.Parameters.ParamByName('@quant').Value := ColumnGrid1.Columns[2].Rows[1];
proctrans.Parameters.ParamByName('@quant2').Value := '0';
end;
////////////////////////
if DM.Qryselectkind.Fields.FieldByName('id').Value =2 then
begin
proctrans.Parameters.ParamByName('@quant').Value := '0';
proctrans.Parameters.ParamByName('@quant2').Value := ColumnGrid1.Columns[2].Rows[1];
end;
//////////////////////////
if DM.Qryselectkind.Fields.FieldByName('id').Value =3 then
begin
proctrans.Parameters.ParamByName('@quant').Value := '0';
proctrans.Parameters.ParamByName('@quant2').Value := ColumnGrid1.Columns[2].Rows[1];
end;
/////////////////////////
if DM.Qryselectkind.Fields.FieldByName('id').Value =4 then
begin
proctrans.Parameters.ParamByName('@quant').Value := ColumnGrid1.Columns[2].Rows[1];
proctrans.Parameters.ParamByName('@quant2').Value := '0';
end;
////////////////////////////
if DM.Qryselectkind.Fields.FieldByName('id').Value =5 then
begin
proctrans.Parameters.ParamByName('@quant').Value := ColumnGrid1.Columns[2].Rows[1];
proctrans.Parameters.ParamByName('@quant2').Value := '0';
end;
////////////////////////
if DM.Qryselectkind.Fields.FieldByName('id').Value =6 then
begin
proctrans.Parameters.ParamByName('@quant').Value := '0';
proctrans.Parameters.ParamByName('@quant2').Value := ColumnGrid1.Columns[2].Rows[1];
end;
proctrans.Parameters.ParamByName('@solaf').Value := ColumnGrid1.Columns[3].Rows[1];
proctrans.Parameters.ParamByName('@sal').Value := edt10.Text;
proctrans.Parameters.ParamByName('@sal_d').Value := edt11.Text;
proctrans.Parameters.ParamByName('@sum_sal').Value := ColumnGrid1.Columns[5].Rows[1];
proctrans.Parameters.ParamByName('@tagr').Value := edt13.Text;
proctrans.Parameters.ParamByName('@taq_tah').Value := edt14.Text;
proctrans.Parameters.ParamByName('@tag_mor').Value := edt15.Text;
proctrans.Parameters.ParamByName('@sal1').Value := Form3.ColumnGrid1.Columns[6].Rows[1];
proctrans.Parameters.ParamByName('@taq_tah2').Valu e := edt18.Text;
proctrans.Parameters.ParamByName('@taq_mor2').Valu e := edt19.Text;
proctrans.Parameters.ParamByName('@sum_s').Value := edt20.Text;
proctrans.Parameters.ParamByName('@sum_ala').Value := edt21.Text;
proctrans.Parameters.ParamByName('@id_iteam').Valu e := edt25.Text;
proctrans.Parameters.ParamByName('@iteam').Value := edt5.Text;
proctrans.Parameters.ParamByName('@drivern').Value := edt27.Text;
proctrans.Parameters.ParamByName('@Tel1').Value := 'NO';
proctrans.Parameters.ParamByName('@id_kind').Value := EDT32.text;
proctrans.Parameters.ParamByName('@kind_H').Value := cbb1.text;
proctrans.Parameters.ParamByName('@id_chahen').Val ue :=edt34.text;
proctrans.Parameters.ParamByName('@card_driver').V alue := 'NO';
proctrans.Parameters.ParamByName('@id_numcar').Val ue := edt35.Text;
proctrans.Parameters.ParamByName('@number_car').va lue := edt7.Text;
proctrans.Parameters.ParamByName('@id_store').Valu e := EDT33.text;
proctrans.Parameters.ParamByName('@name_store').Va lue := cbb2.text;
proctrans.Parameters.ParamByName('@tabriz').Value :=ColumnGrid1.Columns[4].Rows[1];
proctrans.Parameters.ParamByName('@chahen').Value := cbb3.text;
proctrans.Parameters.ParamByName('@id_dele2').Valu e := EDT30.text;
proctrans.Parameters.ParamByName('@name_dele2').Va lue := edt28.text;
proctrans.Parameters.ParamByName('@notec_add').Val ue :=ColumnGrid1.Columns[7].Rows[1];
proctrans.Prepared:=True;
try
proctrans.ExecProc;
finally
proctrans.Free;
end;
if dm.ADOConnection1.InTransaction then begin dm.ADOConnection1.CommitTrans;
if chk4.Checked=false then
begin
edt2.Clear;
edt22.Clear;
end;
if chk6.Checked=false then
begin
edt3.Clear;
edt23.Clear;
end;
if chk3.Checked=false then
begin
edt28.Clear;
edt30.Clear;
edt10.Clear;
ColumnGrid1.Columns[5].Rows[1]:='';
ColumnGrid1.Columns[6].Rows[1]:='';
end;
if chk2.Checked=false then
begin
edt5.Clear;
edt13.Clear;
edt25.Clear;
end;
begin
edt1.Clear;
ColumnGrid1.Columns[7].Rows[1]:='';
edt7.Clear;
edt4.Clear;
edt27.Clear;
// edt28.Clear;
ColumnGrid1.Columns[1].Rows[1]:='';
ColumnGrid1.Columns[2].Rows[1]:='';
ColumnGrid1.Columns[3].Rows[1]:='';
ColumnGrid1.Columns[4].Rows[1]:='';
edt11.Clear;
edt14.Clear;
edt15.Clear;
edt16.Clear;
edt18.Clear;
edt19.Clear;
end;
begin
if EDT2.Enabled =False then
begin
if EDT5.Enabled =False then
begin
if EDT3.Enabled =False then
begin
if edt28.Enabled =false then
begin
edt7.SetFocus;
end else begin
edt28.SetFocus;
end;
end else begin
EDT3.SetFocus;
end;
end else begin
EDT5.SetFocus;
end;
end else begin
EDT2.SetFocus;
end;
end;
end;
sumsto;
// pb1.Position:=100;
except
on E:exception do begin
if DM.ADOConnection1.InTransaction then
DM.ADOConnection1.RollbackTrans;
MsgText := 'حدث خطأ أثناء محاولة حفظ البيانات'
+ #13#10 + E.Message;
ShowMessage(MsgText);
// pb1.Visible:=False;
end;
end;
end else begin
case
Application.MessageBox('هذه الوثيقة بحاجة الى تعديل , هل تريد التعديل',
'تنبيه', MB_YESNO + MB_ICONQUESTION) of
IDYES:
begin
btn7.Click;
end;
IDNO:
begin
end;
end;
end;
// pb1.Visible:=False;
end;
2014
2015
laoubi_adel
12-08-2011, 02:00 AM
لا تنس اخي الكريم ان البارادوكس يدعم اكثر من 3 مليار تسجيلة وهو محمي بشكل افضل من الاكسيس
اذن فلا تخلط علينا الامور
vBulletin® , Copyright ©2008-2012