تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
برمجة نواة برنامج محاسبي من الصفر
#1
السلام عليكم ورحمة الله وبركاته ..

ملاحظة : (أرجو عدم إضافة ردود في الموضوع وفي حالة إضافة رد يرجى حذفه) لنبقى في تسلسل حتى ننتهي من بذرة البرنامج ويصبح جاهز لتقوم بتطويره لما يناسب توجهاتك وتضيف عليه ما تراه مناسباً لك.. 
(وأعتذر عن أي أخطاء أملائية سأقع بها نتيجة السرعة واغتنام الوقت الذي سيتاح لي كي أقوم على تنفيذ هذا البرنامج معكم وسيكون من الصعب مراجعة كل الكتابات لأعود وأصحح)
=====
هذه بداية لصناعة برنامج محاسبي من الصفر ..
قد يأخذ وقت أطول من المتوقع (بسبب الشغل) ولكن بإذن الله سأحاول أن أكمله  كلما سنحت لي الفرصة ووجدت وقت لذلك..

===
أهم شيء في برنامج الحسابات هو قاعدة البيانات ..
فكلما كانت أكثر اتقانا وشمولاً كلما أصبح بالامكان تطوير البرنامج وقتما تشاء وبدون الحاجة للرجوع للخلف لتعدل كل شي في البرنامج كلما خطر على بالك شيء جديد.

فقبل تصميم أي جدول في قاعدة البيانات يجب أن نعرف ماذا سيحوي هذا الجدول من الحقول ولماذا ؟؟ وماذا سنستفيد من كل حقل في النوافذ المشروع.
===
باللامكان أن نصنع قاعدة بيانات جاهزة ونموذجية بآكسس .. ونستخدمها في برنامجنا ..
وبالامكان أن نصنع هذه القاعدة من خلال الكود من داخل برنامجنا (سأعتمد هنا على DAO3.6 في أغلب عملي على المشروع وقد أضطر لـ ADO للتقارير الطباعة إن أضررت أو وصلنا لها لاحقاً وبقي في العمر بقية) ..
===
أي برنامج محاسبي يولي أهمية كبرى للجداول الاتي ستخزن فيها البيانات وهي تقريباً :
- جدول دليل الحسابات : وهو يحتوي على وصف للحسابات : مسمياتها ورقمها وتنصيفها وأين تقفل.. (ملاحظة : ليس فيه حقل لتخزين رصيد كل حساب لماذا ؟؟ سنعرف لاحقاً)
- جدول دليل المواد : وهو يحتوي على تفاصيل المواد (مسمياتها رقمها، مسمى الوحدة، .... سعر الوحدة، تكلفتها، هل يوجد ضريبة مضافة على الوحدة (كم نسبة الضريبة) .. إلخ ،، 
- جدول معلومات بأسماء الزبائن -- كذلك الموردين ..
- جدول معلومات بالحسابات المصرفية (أن أردت التفصيل-- أو تتركها بدون تفصيل في البرنامج (لسريتها) كما تحب).
- جدول لمبيعات المواد(يفصل فيه المواد التي تم بيعها ضكمن قيد المبيعات والذي سيسجل في دفتر اليومية).
- جدول لقيود اليومية.
- جدول لمردودات المبيعات للمواد()
- جدول للمشتريات للمواد ()
- جدول لمردودات المشتريات للمواد()
- بإمكاننا دمج الجداول الأربعة(السابقة) في جدول وحيد ونضيف عليه عمود يفصل نوع العملية (وهو الأفضل- فربما تصدر عملياات أخرى مستقبلاً  فلا نحتاج لعمل جدول جديد بل نضيف اسم العملية في العمود وتبقى باقي التفاصيل كما هي) والفلترة تكون بحسب نوع العملية (فربما نسجلها كـ إعدام مواد تالفة - مسروقة-منتهية الصلاحية-)
- جدول لصلاحيات المستخدمين (سنتركها لاخر خطوة - فلا فائدة منها لبرنامج بدائي - بل تجد ميزتها عندما يتكامل البرنامج - وعندها تحدد صلاحيات فوق كل زر أو نافذة تسمح فيها الدخول عليها أو لا - أو تسمح فقط بالقراءة - أو الكتابة).
-- جداول متنوعة سنتعرف عليها في حينها ..

==
لن يتم الربط بين الجداول بأي علاقات -- فالربط يكون برمجياً في نص البرنامج والنوافذ هي من ستقوم بعرض الرابيط بينها وليس كل من دخل لقاعدة البيانات يستطيع معرفة كل الجداول المرتبطة من جدول واحد.
===
سنتعتمد في برنامجنا التبسيط لأبعد حدود ..
بحيث أننا تقريباً لن نسمح لمستخدم البرنامج أن يخطأ في تنفيذ أي عملية.. يكفينا أن يكون يعرف ويقرأ حتى يستخدم البرنامج وليس محاسباً مختصاً.
سنجعل البرنامج استطالة وتمددا لحواسنا وقدراتها الذهنية والغيبية (لأننا في النهاية إن سنحت لنا الفرصة سنضيف جداول للمراقبة نعرف من عدل على القيود ومتى عدل وكيف كانت القيود قبل وبعد التعديل(لنستنتج هل عدل بغرض التمويه والسرقة أم عدل للتصحيح (مع أنه من الخطأ أن نسمح بتعديل قيد محاسبي (فالتعديل الصحيح يكون بقيد عكسي) ولكن سنسمح هنا كخطوة في التعليم كـ خطوة برمجية بالتعديل من صلاحيات المدراء وليس للمحاسبين (سنفترض حسن النية وأن التعديل آني وفي لحظة الخطأ وليس بعد حين)).. 
سنجعل العنصر الاساسي بعد تكوبن قاعدة البيانات في البرنامج يعتمد على الماوس لأبعد حد ممكن (لتسريع أي عملية قد يحتاجها المرء) طبعاً سنضيف عليها خصائص البحث بالأحرف والكلمات لتسريع العثور على النتائج المطلوبة -- 
===
بعد الانتهاء من قاعدة البيانات (برمجياً) سنبدأ بتصميم نوافذ المشروع نافذة نافذة ..
ولكن عملنا على تصميم الجداول يكون مع كل نافذة سنصمم لها ما يناسبها من جداول ..
===
الملفات التي سيتم ارفاقها قد نقوم بحذفها لاحقاً .. لنضيف مكانها نسخة أحدث منها ..
لأننا سنعتمد على صناعة البرنامج بشكل مفهرس (يعني اصدار 0.01   ومع كل تعديل في نهاية الاعمال اليومية نجعل الاصدار 0.02 وهكذا لنميز عملنا ونحفظ نسخة عن السابق إّذا أردنا الرجوع لها لاحقاً ) فما عدلناه لاحقاً - لن يضيع مستقبلاً لأنه سيبقى لدينا النسخة الأقدم منه محفوظة كـ خطوة من خطوات التنفيذ.
===
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
الرد }}}
تم الشكر بواسطة: نهى علي , نهى علي
#2
شكرآ لك أخي الكريم 
جعله الله في ميزان اعمالك
الرد }}}
تم الشكر بواسطة:
#3
السلام عليكم ورحمة الله وبركاته 

بعد حمد الله والثناء عليه والصلاة والسلام على خير الخلق والأنام سيدنا محمد صلى الله عليه وسلم .. 

اليوم نبتدأ بالعمل على المشروع الجديد ..
كما هي العادة بكل مشروع جديد - نفتح برنامج VB.6.0  ويخيرنا بفتح مشروع (نختار تنفيذي قياسي   - Standard exe )
فيفتح بنافذة رقم واحد :

بما أن مشروعنا يتعلق ببرنامج حسابات نطلب إضافة (Mdi Form)  (تجدها في القوائم الرئيسية قائمة Project)
نجعل الفورم الاول تابع لهذا الفورم من خلال الخاصية (mdiChild) نجعلها True  (تجدها في نافذة خصائص الفورم الأول)

نذهب لخصائص المشروع الرئيسي (Project Properties)  (تجدها في القوائم الرئيسية قائمة Project)
وتستطيع الوصول إليها أيضاً من (نافذة المشاريع اللي هي : Project Project1)
نختار من نافذة بدء المشروع(Startup Object)  نختار الفورم الأب الجديد والذي هو (MDIForm1)  ثم نضغط (Ok)
وذلك ليصبح إقلاع المشروع من نافذة الفورم الأب .. الأم .. الحاوي (اللي بدك ياه..سميه كما تشاء)

نختار الـ from1   اسم جديد وليكن frmMain1  يعني الفورم الرئيسي ..
---------------------------------------------------------------------------------
توضيح : سنجعل هكذا نهجنا في كل التسميات ستكون تعبيرية عن كل شيء سيحمل اسماً :
بداية التسمية frm ثم اسم يعبر عن وظيفة النافذة . (تسميات النوافذ)

cmd   بداية لتسميات الأزرار (الأوامر) .
txt  بداية لتسميات مربعات الادخال(التكسات).

الاسم : نعني به الاسم البرمجي (Name)  
التسمية : نعني بها الاسم الظاهري (Caption)
------------------------------------------------------
نختار تسمية جديدة لمشروعنا  وليكن مثلاً  (TA_Accountant V:XXX)

نقم أيضاً بإضافة (مودل جديد لتخزين الأكواد العامة فيه والتي لا تخص النوافذ بل مرجع لكل المشروع متى احتجنا إليها)
سنقوم بإضافة أكثر من (مودل) لذا سنعمد لتسمية كل مودل بحسب وظيفته .
الان نضيف مودل جديد يتعلق بقواعد البيانات والعمليات عليها وليكن اسمه (ModuleDataBase1)   (تجدها في القوائم الرئيسية في قائمة Project)
-----------------------------------------------------
نقم الان بتعريف عدة مكتبات سنحتاجها في عملنا على قواعدج البيانات :
وذلك من الخاصية (References .. )      (تجدها في القوائم الرئيسية في قائمة Project)
نحدد المكتبات التالية ونضغ OK   :
Microsoft DAO 3.6 Object Library     '   للعمل على قواعد البيانات 
Microsoft Scripting Runtime            '    للعمل على الملفات
-----------------------------------------------------
نفتح المودل ونفم بكتابة فيه بعض التعريفات :
- تعريف كائن مكتبة السكربتات.
- تعريف تعريف متغير نصي لحفظ مسار قاعدة البيانات فيه.
- متغير يعبر عن محرك العمل على قواعد البيانات مع بعض المتغيرات لصناعة جداول جديدة.

وذلك من خلال الكود التالي :
PHP كود :
'===============================
تعريف كائن مكتبة السكربتات
Public Fs As New FileSystemObject
'===============================
تعرف متغير كـ مسار لقاعدة بيانات المشروع الحالية
Public MyDataPath As String
'==============================
تعاريف خاصة بكائنات التحكم بقاعدة البيانات
Public db As DAO.Database       ' تعريف محرك التحكم بقاعدة البيانات
Dim Ws  As DAO.Workspace     ' 
تعريف ورقة عمل لانشاء قاعدة جديدة
Dim TBL1 
As DAO.TableDef    ' تعريف كائن كـ جدول في قاعدة البيانات
Dim F1 As DAO.Field         ' 
تعريف كائن كـ حقل في جدول من قاعدة البيانات
'============================= 

فما سنتخدمه في أ يمكان بالمشروع عرفناه كـ متغير عام  بـ (Public)
وما سنستخدمه كـ متغير خاص وضمن نافذة المودل فقط عرفناه كـ متغير خاص ولا يمكن رؤيته خارج المودل بـ (Dim).
----------------------
توضيح : بإمكاننا أن نكتب في كل كتلة (Procedure) من الكود كامل الكود الذي نحتاجه وبالتفصيل
ولكن لن نفعل ذلك وسنحاول قدر الامكان أن نجعل برنامجنا من حيث الكود أكثر احترافية وسنختصر قدر المستطاع
لأننا سنحاول على عمل كتل أكواد عامة سنستدعيها لتنفذ أمر ما كلما أحتجنا إليها بدون الحاجة لكتابة كامل الكود الذي بداخلها كل مرة.
وسيتضح أسلوبنا وبساطته أثناء عملنا على المشروع ..
----------------------
نجعل برنامجنا يبني مجلد جديد لنضع فيه قاعدة البيانات وليكن اسمه (Data)  من خلال الكائن (Fs) وكوده :
PHP كود :
' للتحقق من وجود مجلد لحفظ قاعدة البيانات فيها بجانب التطبيق وإلا صنعه
    If Fs.FolderExists(App.Path & "\Data") = False Then
       Fs.CreateFolder App.Path & "\Data"
    End If 
فعند عمل البرنامج على الكتلة الموجود فيها هذا الكود : سيتحقق من وجود المجلد فإن لم يكن موجود سيصنعه.
-----------------------
ولنفترض بأننا سنسمي قاعدة البيانات التي سنعمل عليها هي (MyDataBase.mdb) ولنخزنها مع مسارها في المتغير الذي عرفناه في المودل والخاص بمسار قاعدة البيانات وهو (MyDataPath)  ،، ولنخزن هذا المسار في المتغير في حدث الاقلاع أو التحميل (Load) للفورم الأب من خلال الكود :
PHP كود :
Private Sub MDIForm_Load()
 
   MyDataPath App.Path "\Data\MyDataBase.mdb"
End Sub 

أصبح لدينا الان مسار مخزن في المتغير (لقاعدة بيانات غير موجودة حتى الان)..
---------------------------
أصبح بإمكاننا الان جعل البرنامج يخلق قاعدة البيانات من خلال الكود : 
PHP كود :
      Set Ws DBEngine.Workspaces(0)
 
      Set db Ws.CreateDatabase(MyDataPathdbLangGeneral ";pwd=123"dbEncrypt
ننشئ فضاء عمل - وبه ننشئ قاعدة البيانات .. في المسار المحدد ..  ونختار لها كلمة مرور ولتكن (123)، بتشفيرها الافتراضي (dbEncrypt).
--------------------------
لكن في البداية أن نتحقق من وجود هذه القاعدة في مسارها أم لاا .. فإن لا صنعها :
من خلال الكود :
PHP كود :
If Fs.FileExists(MyDataPath) = False Then
       Set Ws 
DBEngine.Workspaces(0)
 
      Set db Ws.CreateDatabase(MyDataPathdbLangGeneral ";pwd=123"dbEncrypt)

 
      db.Close
       Set db 
Nothing
    End 
If 

وبعد صنعها نقوم بإغلاقها .. ثم تفريغ الكائن (محرك DAO)..
------------------------------------------------------------------
توضيح : هكذا سيكون نهجنا في كامل المشروع ،، سنقوم بإغلاق الكائن بعد الانتهاء منه
فلن نفتح قاعدة البيانات في بداية المشروع ونغلقها عند اغلاق المشروع  .. بل سنفتحها عند الحاجة ونغلقها عند الانتهاء من الأمر نفسه ولن ننتظر حتى يبدي المستخدم رأيه بأمر حتى نغلقها بل تغلق وعند ابداء رأيه أو طلب أمر جديد تفتح لتنفذ ذلك الأمر ثم يغلقها بعد انتها الامر ..
فلن نسمح للكائن أن ينفذ أمرين متعارضين ولا حتى متكاملين ونبقى أيام نبحث عن الخطأ ولماذا حدث ونضيع وقتنا على تصحيح الأخطاء.
فالكائن لن ينفذ إلا الأمر في هذه الكتلة فقط وإن خرج لكتلة كودية ثانية سنجد هناك كائن آخر يقوم بنفس الوظيفة (للوظيفة الجديدة) ولا علاقة له بكود الكتلة الأولى.
------------------------------------------------------------------
بعد صنعنا لقاعدة بيانات فارغة أصبح بإمكاننا البدء بصنع الجداول
------------------------------------------------------------------
كود صنع جدول جديد اسمه مخزن في الكائن (qTableName) هو :
PHP كود :
   Set TBL1 db.CreateTableDef(qTableName  ' انشاء
        
    db.TableDefs.Append TBL1                   ' 
ربط
     
 أي : إنشاء جدول ثم يربط هذا الجدول بالقاعدة الموجودة.
لكن أي جدول بدون حقول هو لا شيء لذا نريد انشاء حقول داخب هذا الجدول
وإنشائ الحقول يحتاج الكود التالي :
PHP كود :
   Set F1 TBL1.CreateField(FieldNameFieldType  ' انشاء
    TBL1.Fields.Append F1                               ' 
ربط 

 FieldName : اسم الحقل
FieldType : نوع الحقل

من أجل التبسيط وعدم كتابة هذا الامر مكررا مع كل حقل جديد نختصر الأمر في بلوك(كتلة كودية ولتكن) :

PHP كود :
' انشاء حقل في جدول
Private Sub SetField(FieldName As String, Optional ByVal FieldType As DAO.DataTypeEnum = dbText)
    Set F1 = TBL1.CreateField(FieldName, FieldType)   ' 
انشاء
    TBL1
.Fields.Append F1                               ' ربط
End Sub 

فكلما أردنا اضافة حقل في الجدول نستدعي الحدث ثم نحدد اسم الحقل من خلال المتغير FieldName
وسيعطينا نوعه افتراضياً (FieldType) كـ حقل افتراضي (Optional) وإن شئنا غيرنا لغير نوع
لو أردنا صناعة حقل جديد اسمه (Name) حقل نصي يكن من خلال الكود :

PHP كود :
SetField "Name" 

ولو أردنا صناعة حقل يخزن قيمة نقدية سيبح الكود :

PHP كود :
SetField "Amount" ,dbCurrency 
أي بإمكاننا إختيار نوع البيانات التي نريد تخزين البيانات فيها بإضافة 
وهكذا في كل الحقول ..
-------------------------
توضيح : 
على الأغلب في هذا البرنامج سأختار حقول نصية لكل ما سأستخدمه حتى الحقول التي سأخزن في أرقام وتواريخ ..
وذلك لتنميط طريقة البحث(البحث بنفس الطريقة دون تعديل -- وللتحكم بالحقول وترتيب البيانات فيها بالشكل الذي نريد -- ).
------------------------
تقريباً أصبحنا جاهزين لبناء جداول البيانات ..
سنبدأ بها قريباً بإذن الله
وسنبدأ بأهم جدولين فيها :
- جدول اليوزرات : لأنه سيدخل معنا في كل ما سنمر به من عمليات في النوافذ.
- جدول دليل الحسابات : لأنه الأساس في معرفة طريقة معالجة البيانات محاسبياً وبرمجياً.
-------------------------
وإلى لقاء آخر .. والله خير معين .. والحمد لله رب العالمين..
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
الرد }}}
تم الشكر بواسطة: مصمم هاوي
#4
جهد طيب وعمل مبارك نسأل الله العظيم في هذه الأيام المباركة أن يجعله في ميزان حسناتك
إذا طُعِنتَ من الخلفِ فاعلمْ أنك في المقدمةِ
الرد }}}
تم الشكر بواسطة: Taha Okla
#5
السلام عليكم ورحمة الله وبركاته

بعد حمد الله والثناء عليه والصلاة والسلام على خير الخلق والأنام سيدنا محمد وآله وصحبه وسلم.. 

أما بعد، فقد وصلنا لمرحلة صناعة جداول قاعدة البيانات وسنبدأ بها على التدريج ..
وكما أسلفنا سابقاً بأنه من أهم الجداول هي :
- جدول أسماء المستخدمين (لأنها ستكون مطلوبة معنا في كل نافذة من نوافذ البرنامج - حتى لو نستخدمها على الوجه المطلوب(لأنه لا جدوى من التشعب فيها إن لم نكن نعرف صناعة برنامج محاسبي - فبعد استكماله تبدو الحاجة ملحة لتطوير الصلاحيات ومنها نستفيد من خصائص جدول اسماء المستخدمين) ولكن نجهزها لكي نعرف ما نجهز لها من حقول في الجداول الأخرى).
- جدول دليل الحسابات : لأن البرنامج أساساً يعتمد على أسماء هذه الحسابات وطريقة تصنيفها.
=========

أولاً - جدول اسماء المستخدمين (Users) : 
جدول اليوزرات بشكل افتراضي يحتوي على عدة حقول :
1 - حقل ترقيم تسلسلي لترتيب عدد اليوزرات (ليس مهم ان وجد أو لا).
2 - حقل اسم المستخدم.
3 - حقل كلمة المرور.
4 - حقل تلميح وهو تذكير للمستخدم (على أي اساسا اختار هذه الكلمة - أجمل مدينة- أفضل دولة- اللون المفضل .. إلخ).
5 - مسمى صلاحيات اليوزر(مدير-محاسب-بائع-مدخل بيانات-مشاهد ... إلخ).
6 - رقم أو رمز لاسم المستخدم (يكن بديل عن ظهور اسم المستخدم في الفاتورة -- وفي الادارة فقط يعرف أن هذا الرمز يخص المستخدم فلان).
7 - طريقة تشفير اليوزرات ... (فليس من المعقول أن تجعل اليوزرات مرئية لمن يستطيع الاختراق - بل يفضل تشفيرها بشيفرة تكن من صنعنا ويمكننا تطوير هذه الشيفرة كما نشاء فبحسب كود معين يتغير التشفير.. واذا عكسنا الكود مثلاً يتم فك التشفير مثلاً)..

ويكون من خلال الكود : 
PHP كود :
Private Sub SetUsersTable(qTableName As String)
 
   Set TBL1 db.CreateTableDef(qTableName)
 
       
        SetField 
"Name"         ' اسم المستخدم
        SetField "Pwd"          ' 
كلمة المرور
        SetField 
"Code"         ' رقم اسم المستخدم قد يستخدم بديل عن اسمه
        SetField "explan"         ' 
توضيح أو تلميح عن كلمة المرور
        SetField 
"Privacy"      ' الصلاحيات - مدير- بائع - أي شي
        SetField "RePwdHex"     ' 
طريقة التشفير قد نستخدمها عندما ننتهي من المشروع نهائيا
        
    db
.TableDefs.Append TBL1
End Sub 

===============================
ثانياً - جدول دليل الحسابات : وهو جدول بأسماء الحسابات التي سنتعامل معها في برنامجنا.
وهو يعتبر أهم جدول قائم عليه البرنامج فكلما كان هذا الجدول أثر تخصصاً كلما سمح لنا بصنع برنامج أكثر اتقاناً وأكثر ديناميكية في تطوير البرنامج أو بعض أجزاءه متى شئنا..
-------------------------------------
توضيح : في دليل الحسابات يكون مبني على أساس هناك حساب رئيسي ثم حساب فرعي ثم فرع من الفرعي..
يمكن التفريع حسب المطلوب إذا كنت تعتمد على أداة عرض شجرة الحسابات (TreeView)..
ويمكن التوقف عند المستوى الثاني أو الثالث لنستخدم أداة الجدول (وهكذا سنعمل في هذه النسخة - مع الامكان التطوير متى شئت - لأننا سنجعل جدول الحسابات يستوعب كلا الامرين)..
-------------------------------------
فعلى الأغلب يحتوي هذا الجدول على الحقول التالي :
1 - حقل ترقيم تسلسلي (ليس بالضرورة وجوده ولكن بحسب رغبة المبرمج أو القائم على صيانة البرنامج).
2 - حقل لاسم الحساب الرئيسي (بالعربي) أو (باللاتيني)  أو كلاهما .. وهنا في مثالنا سنعمل على وجود كلاهما ..
3 - حقل لرقم الحساب الرئيسي ..
4 - حقل لاسم الحساب الفرعي(الابن)  (بالعربي) أو (باللاتيني)  أو كلاهما .. وهنا في مثالنا سنعمل على وجود كلاهما ..
5 - حقل لرقم الحساب الفرعي..
6 - حقل يبين نوع الحساب أو بطاقة حساب (أصول - نقدية - بنكي - زبائن - موردين - مصروفات - رأس المال - الشركاء -  ). كلما كان التصنيف هنا أكثر تنوعاً ودقة في أنواع الحسابات كلما كان البرنامج أكثر قدرة على معالجة القيود والكشوف المحاسبية بسلاسة وبساطة ودون الحاجة للتعقيد في الاكواد مستقبلاً .. وكلما كان بالامكان ترتيب دليل الحسابات على الوجه الذي يرضاه المحاسب ودون الحاجة لتقييد المحاسب باسلوب المبرمج(فهنا يمكن للمحاسب أن يتحرر من اسلوب المبرمج ويمكنه أن يتقيد بما تعلمه في بلده دليل الحسابات الموحد السوري أو المصري أو اليمني أو العراقي أو ... إلخ..  فالنتيجة واحدة..
7 - حقل يبين نوع امتداد الحساب (هل له فرروع أو يمكن له فروع أو أنه الحساب النهائي (الفرع الاخير الذي نتعامل معه في القيود المحسابية))
8 - حقل يبين أين يقفل كل حساب(الميزانية - المتاجرة - الأرباح والخسائر).  وهذا يسهل على المحاسب اقفال الحسابات برمجياً دون الحاجة لعمل قيود لذلك. (أو يساعده في حساب أرصدة كل حساب وهو يقفلها يدوياً في نهاية السنة المالية عند ترحيل الأرصدة لسنة مالية جديدة-- بحسب الرغبة).
9 - حقل لاسم المستخدم الذي قام بادخال اسم هذا الحساب أو حقلين ويكون الثاني لاسم الحساب الذي قام بالتعديل عليه.
10 - حقل ملاحظات أو حقلين أو ثلاثة (شيء للزوم الشيء اذا احتاج له المستخدم مستقبلاً وقد لا يحتاج له مطلقاً).

ويكون من خلال الكود :
PHP كود :
Private Sub SetAccountsTree(qTableName As String)
 
   Set TBL1 db.CreateTableDef(qTableName)
 
       
        SetField 
"NoNumeric"             ' ترقيم متزايد من أجل ترتيب الاضافات
        SetField "Num0"                                 ' 
رقم الحساب الرئيسي
        SetField 
"TreeAr0"           ' اسم الحساب الرئيسي بالعربي الأب إن وجد
        SetField "TreeEn0"           ' 
اسم الحساب الرئيسي بالاتيني الأب إن وجد
        SetField 
"Num1"                                  ' رقم الحساب الفرعي
        SetField "TreeAr1"            ' 
اسم الحساب الفرعي بالعربي الأب إن وجد
        SetField 
"TreeEn1"            ' اسم الحساب الفرعي بالاتيني الأب إن وجد
        SetField "AccCard"   ' 
نوع الحساب أصول أو مصروفات أو مشتريات، مبيعات
        SetField 
"CrOrDb"                              ' الحساب مدين أم دائن
        SetField "AccMigration"                          ' 
مكان اقفال الحساب
        SetField 
"BrType"   'Gr1            ' هل للحساب فروع وهل الفرع نهائي
        
' 0 لا يوجد فروع
        ' 
1 يوجد فرع
        
' 9 الفرع نهائي
        SetField "Note", dbMemo         ' 
ملاحظات
        
    
        SetField 
"UserCode"             ' اسم المستخدم الذي أدخل البيانات
        SetField "EUserCode"             ' 
اسم المستخدم الذي عدل البيانات
                
    db
.TableDefs.Append TBL1
    
End Sub 


-----------------------------------------
وبذا يكون كود انشاء قاعدة البيانات وفيها الجدولين السابقين هو الكود التالي :
PHP كود :
Public Sub CreatMyDataBase()
 
   On Error Resume Next
   
' اذا وجد خطأ بسطر برمجي يتجاوزه
   ' 
لن نستخدم هذا الامر في حال يتعلق بالحسابات فقط بالشكليات
   
' لأننا لن نسمح بوجود أي أخطاء بالبرنامج بل سنعالجها
   ' 
أما هنا سنفعله من أجل صناعة الجداول في كل مرة نطور فيها البرنامج وكلما أضفنا جدول جديد
   
'==================================================
   ' 
للتحقق من وجود مجلد لحفظ قاعدة البيانات فيها بجانب التطبيق وإلا صنعه
    If Fs
.FolderExists(App.Path "\Data") = False Then
       Fs
.CreateFolder App.Path "\Data"
 
   End If
 
   '=====================================================
    ' 
أمر صناعة قاعدة البيانات إن لم تكن موجودة
    If Fs
.FileExists(MyDataPath) = False Then
       Set Ws 
DBEngine.Workspaces(0)
 
      Set db Ws.CreateDatabase(MyDataPathdbLangGeneral ";pwd=123"dbEncrypt)

 
      db.Close
       Set db 
Nothing
    End 
If
 
   '=======================================================
    Set db = DBEngine.OpenDatabase(MyDataPath, False, False, ";Pwd=123")
    '
-------------------------------------------------------------
 
   SetUsersTable "Users"                             'Private Sub
    '
-------------------------------------------------------------
 
   SetAccountsTree "AccountsTree"                    'Private Sub
    '
-------------------------------------------------------------
 
   
    
'=================
    db.Close                ' 
نغلق قاعدة البيانات
    Set db 
Nothing             ' نفرغها المتغير
    '
=================
End Sub 


=====================================
ويوجد لدينا اليوم مشروع بسيط عن كل ما ذكرنا فيما سبق :
بمجرد تشغيل البرنامج يقوم بصنع قاعدة بيانات جديد وفيها الجدولين السابق ذكرهما ..

رابط التحميل من هنا

وإلى لقاء آخر .. أستودعكم الله ..
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
الرد }}}
تم الشكر بواسطة: مصمم هاوي


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم