الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعدة في برنامج مخازن

بدأه roshi_xp في 25 يونيو 2008 · 6 رد · 1,215 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السادة الأفاضل أعضاء المنتدي الكرام

أقوم حالياً بعمل برنامج بسيط لإدارة المخازن يحتوي علي 6 جداول فقط , العملاء والموردين وأسماء الأصناف ووحدات القياس وشاشة الوارد والصادر

والحمد لله كله تمام ,, ما عدا شاشة الصادر من الأصناف وهي التي سيتم بيعها , المشكلة أنني أريد أن تعمل هذه الشاشة بنظام أن الكمية التي ترد أولاً لابد وأن تباع أولاً Fifo

ولا أعرف بصراحة كيفية عمل ذلك , فأرجوا المساعدة لمن يملك القدرة علي ذلك

وألف شكر لكم جميعاً

مرفق المثال للتعديل فيه

Test.rar

#2

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

#3

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

الموضوع "موش صعب" لكن "إنجازه ممل" لعدة أسباب:

1. ستحتاج على الأقل إلى جدول واحد إضافي.

2. ستحتاج إلى عمليات ربط للجداول و إنجاز عمليات خصم الكميات داخل صفقات (Transactions).

3. و الأهم أن سحب البضاعة بنظام الداخل أولاً يصرف أولاً (FIFO) هو عمل بشري أكثر من كونه عمل برمجي، بمعنى أن برنامجك سيعمل بهذا النظام و لكن ليس لديك ضمان أن ذلك يتم فعلاً على يد البائع عند صرف البضاعة الحقيقة.

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

على أية حال، هنا الفكرة العامة لإنجاز ذلك:

1. تحتاج إلى جدول لمتابعة حركة استلام الأصناف، مثلاً AmountsIn يحتوي على الحقول (الأعمدة) التالية:

أ. رقم السجل ID.

ب. رقم الصنف ItemID.

ج. تاريخ الاستلام InDate.

د. الكمية المستلمة InAmount.

هـ. الكمية الحالية NowAmount.

2. عند استلام صنف ستضيف كميته المستلمة إلى كميته الحالية في الجدول الخاص بأصنافك، بالإضافة إلى تسجيله في هذا الجدول الجديد. واضح أنه في البداية ستكون الكمية الحالية و الكمية المستلمة هي نفسها.

3. عند الصرف يجب فتح الجدول الجديد باستخدام استعلام (Query) بحيث يحتوي فقط على سجلات الصنف قيد الصرف (حسب رقم الصنف ItemID) التي كمياتها الحالية (NowAmount) لا تساوي صفراً، و مرتباً حسب رقم السجل (ID) أو تاريخ الاستلام InDate

4. تستعمل حلقة (Loop) للمرور على السجلات بالتوالي لخصم الكمية المصروفة من الكمية الحالية (NowAmount) حتى يتم خصم الكمية المصروفة بالكامل. طبعاً ستخصم الكمية من الكمية المسجلة في الجدول الخاص بأصنافك.

* ملاحظة مهمة: بما أنك تتعامل مع عدة جداول مترابطة في نفس الوقت - في هذا البرنامج أو غيره - فلا تنس استعمال الصفقات (Transactions) للمحافظة على تكامل البيانات Data Integrity

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#4

الف شكر أخي najy علي ردك .. وأنت دائماً سباق في الرد علي استفسارات الأعضاء

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

هحاول اجرب فكرتك وربنا يجعل فيها الشفي .

بس انا ليا استفسار عن جدول Transaction اللى بيبقي موجود في معظم البرامج المحاسبية ايه فائدته , فانا مثلا عندي بقاعدة البيانات جدول لتسجيل الاصناف الحالية وجدول آخر لتسجيل الأصناف الواردة وكمايتها وجدول لتسجيل الأصناف الصادرة وكمياتها , فإيه لازمة جدول Transaction

وأكرر شكري ليك أخي ناجي علي إهتمامك كما عودتنا دائماً

#5

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

أعتقد حدث التباس في مصطلح الـ Transaction.

تستعمل بعض البرامج و خاصة التي تحتاج إلى متابعة دقيقة لما يحدث للبيانات من تغييرات (إضافة، تعديل، حذف) جدولاً واحداً أو أكثر لتسجيل تلك التغييرات (نوع العملية، القيمة القديمة، القيمة الجديدة، وقت الإجراء، تاريخ الإجراء، رقم تعريف المستخدم الذي قام بالإجراء، ... إلخ). يمكن أن نقول أن هذا الجدول هو "جدول متابعة" و هو يستعمل لمراجعة البيانات أو استرجاع بيانات سابقة أو تحديد الشخص المسؤول عن إجراء معين، و غير ذلك. هذا الجدول قد يكون اسمه Transaction أو Transactions أو أي اسم آخر، لا يهم.

أما ما قصدته أنا بالـ Transaction في المشاركة السابقة فهو عملية نقوم بها برمجياً لضمان تكامل البيانات عندما نقوم بعملية تؤثر في جدولين أو أكثر.

و الـ Transaction (يمكننا أن نسميه "الصفقة") هو مسألة مهمة لضمان صحة البيانات، فمثلاً نفرض أن لدينا جدول لتسجيل بيانات فاتورة المبيعات و آخر لتسجيل حسابات الزبائن، و أن كل فاتورة مبيعات صادرة سنسجل قيمتها في جدول الفواتير و في جدول حسابات الزبائن (و ربما يكون لدينا جدول ثالث يخص الخزينة!). دون استعمال الـ Transaction سنسجل القيمة في جدول الفواتير ثم ثم ثم في جدول حسابات الزبائن. ماذا لو حدث خلل خلال فترة "ثم" (توقف البرنامج أو توقف Windows) ؟!! سيكون لدينا فاتورة باسم الزبون "فلان" لكن قيمتها غير موجودة في سجلات حسابه! و السبب هو أن عمليات الحفظ بهذا الشكل تتم مباشرة على ملف قاعدة البيانات في القرص الصلب.

أما باستعمال الـ Transaction أو الصفقة فلا يمكن أن يحدث ذلك لأن كافة العمليات التي تتم داخل الـ Transaction تتم داخل دارئ (Buffer) مؤقت، قد يكون في الذاكرة أو على القرص، ثم تتم كتابتها دفعة واحدة إلى ملف قاعدة البيانات (أو يتم إلغاؤها جميعاً إذا حدث خطأ ما). يمكننا تصور الـ Transaction على أنه قوسان يحتويان على كافة العمليات، فإما أن تتم كافة العمليات أو تلغى كافة العمليات، و هو بهذا يطبق مبدأ "الكل أو لا أحد" (All or None)..

أخيراً، استعمال الـ Transaction برمجياً سهل جداً جداً جداً... كما في الكود التالي:

Private Sub Command1_Click()
	On Error GoTo Command1_Click_Error

	MyCnn.BeginTrans	' فتح صفقة
	' عمليات - إضافة و تعديل و حذف
	' تتم على جدولين أو أكثر
	'
	'
	MyCnn.CommitTrans   ' إغلاق الصفقة مع حفظ البيانات 
	MsgBox "تم حفظ البيانات بنجاح", vbInformation, "حفظ"

	Exit Sub
Command1_Click_Error:
	' عند حدوث أي خطأ سينتقل التنفيذ إلى هنا:
	MsgBox "حدث خطأ في حفظ البيانات: " & vbCrLf & Err.Description, vbCritical, "خطأ"

	MyCnn.RollbackTrans	' إغلاق الصفقة مع إلغاء كافة العمليات
End Sub

طبعاً MyCnn هو ADODB.Connection مفتوح سابقاً. نستعمل BeginTrans لفتح الصفقة، و نستعمل CommitTrans لقبول كافة العمليات و حفظها و إغلاق الصفقة، و نستعمل RollBackTrans لإلغاء كافة العمليات و إغلاق الصفقة.

لاحظ أن مثل هذه العملية تحتاج إلى مصيدة أخطاء (Error Trap) التي تبدأ بـ On Error GoTo و معالج أخطأ (Error Handler) في نهاية الإجراء.

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#6

تسلم إيدك يا أخ ناجي واللاهي .. بارك الله فيك وزادك من علمه

فهمت حاجة كانت غامضة علي جدا .. ودائماً كنت بسأل نفسي عن هدفها

الف مليون شكر

#7

تسلم ايدك وبرنامج وسورس اكتر من رائع

مواضيع مشابهة