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

حساب الكميه المتوفره .. نظره أعمق .

مغلق
بدأه ابو لمى في 24 مايو 2001 · 5 رد · 1,662 مشاهدة · في مراجعة المواضيع
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

[note] كيف أحدث حقل الكمية المتوفره في كل مره أضيف فاتوره ..؟[/note]

الجواب ببساطه : [F=Red] لا تفعل .. [/F] احسب القيمه في كل مره .

طريقة الحساب بسيط جداً : اطرح الكمية المباعه من الكميه الداخله للمخزن (كل منتج على حده).

فقط طبق الدالة DSum() على جدول الدخل للمخزن لحساب الكمية التي دخلت المخازن من أي منتج .

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

اطرح الناتجين من بعض وستحصل على الكمية المتوفره .

الداله DSum() تستخدم لحساب المجموع ولكن مع وجود معيار محدد .. وصيغتها :

 DSum(expr, domain[, criteria])

حيث في مثالنا هذا :

expr : هو اسم الحقل .

domain : اسم الجدول .

criteria : اسم المنتج .

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

بالنسبة لقواعد البيانات البسيطه هذا كل ماتحتاجه ...

دعونا نبحث المسأله بعمق أكثر ..

هناك مشكلتان قد تتعرض لهما :

1- مع مرور السنين سيكون الحسابات ستكون بطيئة .

2- بعيدا عن الحسابات .. بعض المنتجات قد تفقد (بسبب ضياع أو تلف أو سرقه أو ...) مما يتسبب في عدم دقة الحسابات ، إن أي كميه مفقوده تتسبب في إحراج لموظف المبيعات .

برأيــــــــــــكم كيف نحل هذه المشكله ؟؟؟

أنتظر آرائكم ..

#2

الأخ ابو لمى :

يعجبنى فى أمثلتك أنها مع الشرح وواقعية

بالنسبة لي أنا لدي فعلاً برنامج مخازن أعمل به وطبعا على رأي المثل كل شيخ وله طريقه فى التنفيذ :

1- بالنسبة لسؤالك الأول : أنا أقوم بعمل تحديث للأصناف التي إنتهت فى نهاية كل عام أي أصبح أرصدتها مساوية صفر ولا يتم استخدامها مرة أخرى التحديث يقوم بحذفها ( الأصناف التي رصيدها يساوي صفر فقط ) بالتالي لن تزيد قاعدة البيانات على مدار السنين . واستخدم هذا التحديث تلقائيا فى برنامج للمواد الغذائية التي فيها تاريخ صلاحية أي التاريخ المنتهي يكون قد نفذ من المستودع ويجب حذفه ( طبعا أقوم بطباعة كل ما يلزم من بيانات قبل الحذف ) .

2- بالنسبة لسؤالك الثاني هناك إذن صرف مواد تالفة بعد اعتماده من المدير وبعد مراجعة لجنة الجرد للتأكد من التلف يمكن صرف الكميات التالفة بهذا الإذن حتى يتم خصمها من الرصيد الحالى ويكون الرصيد مطابق للواقع . وطبعا المستندات تحفظ فى ملفات ويتم طباعة نفس الإذن من الحاسب ويرفق بمحضر الجرد .

لعلى أكون وفقت فى الإجابة يا أستاذنا وأخذت درجة جيدة

***************

أخيراً لي سؤال عندك يا أخ أبو لمى :

هل لديك المعادلة التي تقوم بتحويل التاريخ الميلادي إلى هجري أو العكس عن طريق الأكسيس

أشرف خليل ... أو أبو خليل

#3

الأخ أشرف عذرا على التأخير ... لقد كنت أنتظر المزيد من الآراء لكن لابأس .

طبعاً أنت محق ...

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

الى هنا والكل متفقون ...

[note] كيف يتم الجرد ؟ [/note]

كل شيخ وله طريقه كما ذكرت ياأشرف .

لكن أعتقد أن الطرق تؤول الى طريقتين رئيسيتين :

1- الطريقه الأولى تتمثل في تخصيص جدول خاص بالجرد وتكون الحقول عباره عن :

* الصنف .

* تاريخ الجرد .

* الكميه .

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

لو إعتمدنا الطريقة الأخيرة فسيكون حساب الكمية كالتالي :

* الكمية الموجوده في آخر جرد

* زائداً الكمية الداخلة (المشتراه ) للمخزن منذ هذا التاريخ .

* ناقص الكمية المباعة منذ تاريخ آخر جرد .

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

 
Function OnHand(vProductID As Variant, Optional vAsOfDate As Variant) As Long
    'Purpose:   Return the quantity-on-hand for a product.
    'Arguments: vProductID = the product to report on.
    '           vAsOfDate  = the date at which quantity is to be calculated.
    '                           If missing, all transactions are included.
    'Return:    Quantity on hand. Zero on error.
    Dim db As Database              'CurrentDb()
    Dim rs As Recordset             'Various recordsets.
    Dim lngProduct As Long          'vProductID as a long.
    Dim strAsOf As String           'vAsOfDate as a string.
    Dim strSTDateLast As String     'Last Stock Take Date as a string.
    Dim strDateClause As String     'Date clause to use in SQL statement.
    Dim strSQL As String            'SQL statement.
    Dim lngQtyLast As Long          'Quantity at last stocktake.
    Dim lngQtyAcq As Long           'Quantity acquired since stocktake.
    Dim lngQtyUsed As Long          'Quantity used since stocktake.

    If Not IsNull(vProductID) Then
        'Initialize: Validate and convert parameters.
        Set db = CurrentDb()
        lngProduct = vProductID
        If IsDate(vAsOfDate) Then
            strAsOf = "#" & Format$(vAsOfDate, "mm/dd/yyyy") & "#"
        End If

        'Get the last stocktake date and quantity for this product.
        If Len(strAsOf) > 0 Then
            strDateClause = " AND (StockTakeDate <= " & strAsOf & ")"
        End If
        strSQL = "SELECT TOP 1 StockTakeDate, Quantity FROM tblStockTake " & _
            "WHERE ((ProductID = " & lngProduct & ")" & strDateClause & _
            ") ORDER BY StockTakeDate DESC;"

        Set rs = db.OpenRecordset(strSQL)
        With rs
            If .RecordCount > 0 Then
                strSTDateLast = "#" & Format$(!StockTakeDate, "mm/dd/yyyy") & "#"
                lngQtyLast = Nz(!Quantity, 0)
            End If
        End With
        rs.Close

        'Build the Date clause
        If Len(strSTDateLast) > 0 Then
            If Len(strAsOf) > 0 Then
                strDateClause = " Between " & strSTDateLast & " And " & strAsOf
            Else
                strDateClause = " >= " & strSTDateLast
            End If
        Else
            If Len(strAsOf) > 0 Then
                strDateClause = " <= " & strAsOf
            Else
                strDateClause = vbNullString
            End If
        End If

        'Get the quantity acquired since then.
        strSQL = "SELECT Sum(tblAcqDetail.Quantity) AS QuantityAcq " & _
            "FROM tblAcq INNER JOIN tblAcqDetail ON tblAcq.AcqID = tblAcqDetail.AcqID " & _
            "WHERE ((tblAcqDetail.ProductID = " & lngProduct & ")"
        If Len(strDateClause) = 0 Then
            strSQL = strSQL & ");"
        Else
            strSQL = strSQL & " AND (tblAcq.AcqDate " & strDateClause & "));"
        End If

        Set rs = db.OpenRecordset(strSQL)
        If rs.RecordCount > 0 Then
            lngQtyAcq = Nz(rs!QuantityAcq, 0)
        End If
        rs.Close

        'Get the quantity used since then.
        strSQL = "SELECT Sum(tblInvoiceDetail.Quantity) AS QuantityUsed " & _
            "FROM tblInvoice INNER JOIN tblInvoiceDetail ON " & _
            "tblInvoice.InvoiceID = tblInvoiceDetail.InvoiceID " & _
            "WHERE ((tblInvoiceDetail.ProductID = " & lngProduct & ")"
        If Len(strDateClause) = 0 Then
            strSQL = strSQL & ");"
        Else
            strSQL = strSQL & " AND (tblInvoice.InvoiceDate " & strDateClause & "));"
        End If

        Set rs = db.OpenRecordset(strSQL)
        If rs.RecordCount > 0 Then
            lngQtyUsed = Nz(rs!QuantityUsed, 0)
        End If
        rs.Close

        'Assign the return value
        OnHand = lngQtyLast + lngQtyAcq - lngQtyUsed
    End If

    Set rs = Nothing
    Set db = Nothing
    Exit Function
End Function

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

[note] دالة تحويل التاريخ [/note]

 
'هذه الدالة تعمل التحويل من الهجري إلى الميلادي والعكس حسب المتغيرات التي تمررها
Function ConvertDateString( _
ByRef StringIn As String, _
ByRef OldCalendar As Integer, _
ByVal NewCalendar As Integer, _
ByRef NewFormat As String) As String
Dim SavedCal As Integer
Dim d As Date
Dim s As String
'// Save VBA Calendar setting to restore when finished
SavedCal = Calendar
'// Convert date to new calendar and format
Calendar = OldCalendar ' Change to StringIn calendar
d = CDate(StringIn) ' Convert from String to Date
Calendar = NewCalendar ' Change to calendar of new string
s = CStr(d) ' Convert to short format String
ConvertDateString = Format(s, NewFormat) 'Reformat
'// Restore VBA Calendar setting
Calendar = SavedCal
End Function
'***************************************
'هذه الدالة تحول من الميلادي الى الهجري
Function Hijri(Gregp As Variant) As String
Dim GregorianDate As String
Dim HijriDate As String
Dim HijriFormat As String
Dim Greg As String
Greg = CStr(Gregp)
GregorianDate = Greg ' Gregorian string to convert
HijriFormat = "Short Date" ' Format for Hijri date
'// Convert to Hijri date 7/8/1414 and return in Long Date format
HijriDate = ConvertDateString( _
GregorianDate, _
vbCalGreg, _
vbCalHijri, _
HijriFormat)
Hijri = HijriDate
End Function
'****************************************
'وهذه تحول من الهجري الى الميلادي
Function Gregori(HijriDatP As Variant) As String
Dim GregorianDate As String
Dim HijriDate As String
Dim HijriFormat As String
Dim HijriDat As String

HijriDat = CStr(HijriDatP)
GregorianDate = HijriDat ' Gregorian string to convert
HijriFormat = "Short Date" ' Format for Hijri date

'// Convert to Hijri date 7/8/1414 and return in Long Date format
HijriDate = ConvertDateString( _
GregorianDate, _
vbCalHijri, _
vbCalGreg, _
HijriFormat)
Gregori = HijriDate
End Function
#4

انا معاك اخي ابو لمي

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

كان ربك في عوننا لمن تظهر التقارير او عرض لهذا الحقل

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

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

وفكرة الجرد يلي عملتها انا هي نفس فكرتك

يكون هناك حقل كا رصيد اول مدة والتاريخ الخاص به

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

وينقل حقل الكمية المتوفرة كا رصيد اول مدة وتاريخ الجرد ايضا وهذا يكون في جدول الاصناف طبعا،

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

ولا ايش رئيك اخي ابو لمي والاخوة الافاضل

لا يتعلم العلم كل مستحي او مستكبر

#5

بسم الله

الأستاذ / ابو لمى

السلام عليكم و رحمة الله

دلوقتى فيه واحد قاعد جنبى .. صديقى

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

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

طبعا أنا أضم صوتى اليه بدون شك :) :D

فما رايك ؟

فى انتظارك باذن الله

تقبل تحيات

أخــــBengaــوك

قال أبن القيم : أكثروا من الخير فينتشر .. و أقلوا من الشر فيندثر ..

#6

بسم الله الرحمن الرحيم

الأستاذ ابو لمى

السلام عليكم و رحمة الله

الحقيقة لقد عاد و سألنى صديقى عن امكانية عمل هذا الاقتراح .. ؟

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

شكرا لك

خالص تحياتى

أخــــBengaـــوك

قال أبن القيم : أكثروا من الخير فينتشر .. و أقلوا من الشر فيندثر ..

هذا الموضوع مغلق.

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