ما هي افضل طريقة لضبط كمية المخزون
#1
السلام عليكم :
كيف يمكن ضبط كميات الاصناف في المخزون ، الطريقة المعتادة في كل عملية زيادة او نقصان ويتم الخصم او الزيادة والتخزين في جدول الاصناف وفي حقل الكمية تحديداً ولكن اظن ان هذه العملية بالتعديل والاضافة والحذف الكثير قد يتم خطأ بسيط ويحصل خطأ في الكمية ، هل توجد طريقة افضل ، لدي طريقة وهي لكل صنف يتم استعلام عن جميع المشتريات له وطرح منها المبيعات لهذا الصنف مع اضافة حقل مثلاً للتالف او الزائد او الناقص ويتم الطرح او الزيادة حسب هل تنصحوني بهذه الطريقة وهل توجد طريقة افضل لضمان سلامة الكميات بشكل صحيح بنسبة 100%
الرد
#2
وعليكم السلام و رحمة الله

في رأيي لن يحصل خطأ إن لم يكن هناك خطأ برمجي ( في الطريقة الأولى )

أما الطريقة الثانية تبدو أفضل خاصة عند إستعمال SQL
1- بإستعمال إستعلامين مثال
كود :
QueryBuy Select Sum(Quantity) from BuyTable Where Produt_Id='xx'
كود :
QuerySell Select Sum(Quantity) from SalesTable Where Produt_Id='xx'

ثم تقوم بالطرح

2- بإستعمال إستعلام واحد هو معقد بعض الشيئ لأننا سنقوم بالجمع من جدولين مثال
كود :
SELECT DISTINCT t1.n, (SELECT SUM(t3.nbr) FROM Table1 AS t3 WHERE t3.n = t1.n) AS BuyQuantity, (SELECT SUM(t4.qtt) FROM Table2 AS t4 WHERE t4.n = t1.n) AS SalesQuantity, (BuyQuantity-SalesQuantity) AS RealQuantity FROM Table1 AS t1 INNER JOIN Table2 AS t2 ON t1.n=t2.n;

N هو Produt_Id و nbr هو BuyQuantity و qtt هو SalesQuantity
كنت أجرب على جدولين عندي لهذا تجد التسمية مختلفة

لا تنسى إضافة

كود :
Where Produt_Id='xx'

و السلام عليكم
الرد
#3
السلام عليكم

أخي amar

الحل الثاني هو الأفضل.

في جدول الأصناف يكون لدينا خانة لرصيد/كمية أول المدة (في السنة المالية الحالية) (يعتبر رقم مقدس لايتغير خلال السنة إلا وفق حالات خاصة و قيود صارمة).

يكون لدينا جدول واحد لحركة الأصناف، به خانة لكمية الداخل (مشتريات، مسترجعات، ألخ..)، و خانة أخرى لكمية الخارج (مبيعات، تالف، فاقد، إلخ) و خانة لنوع الحركة.

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

رصيد آخر المدة (بعد آخر حركة في السنة الحالية) سيكون رصيد أول المدة في السنة الجديدة.

أي خطأ يحدث عند إدخال أية حركة، يجب عدم إلغاؤها، و تبقي محفوظة في قاعدة البيانات.
أية أخطاء أو تعديلات في الحركة يتم تصحيحها بحركة أخرى معاكسة (قيد عكسي).

حركة المواد مهما كان نوعها أو مخزنها يجب أن تكون في جدول واحد.
الرد
#4
السلام عليكم :
شكراً لكم على الاجابة ..ولكن بالنسبة لجدول حركة المواد هل هو جدول الاصناف نفسه .. ولكن عندما نريد كمية صنف معينة كيف هل نطلبه ويتم استخدام الاستعلامات من الداخل - الخارج وما يتبعها من عمليات اخرى ،، وبالنسبة لاستعلام راس مال المخزون والمخزون حسب سعر البيع سيكون بعد تحليل الكميات ما رأيكم ،، ننتظر اجابتكم ولكم كل الشكر .
الرد
#5
جدول الحركة مفصول عن جدول الأصناف

للاستعلام عن الرصيد Onhand يتم اجراء استعلام sql يتم فيها حساب الفرق بين مجموع الداخل و مجموع الخارج في جدول الحركة، ويجمع الفرق مع رصيد أول المدة الذي في جدول الأصناف.

PHP كود :
Table: Item جدول الأصناف
    Item_No
    Description
    OpenQuantity

Table
: Transaction جدول الحركة 
    Transaction_No
    Transaction_Type  
    Item_No
    Quantity_In
    Quantity_Out

Quantity_Onhand 
=  Item. OpenQuantity –
 
( SUM(Transaction.Quantity_In) –  SUM(Transaction.Quantity_Out) ) 
الرد
#6
السلام عليكم :
الاخ الشقروني ، ولكن هل يجب ان يكون جدول لحركة الاصناف ، يمكن بواسطة استعلام على تفاصيل المبيعات وتفاصيل المشتريات والطرح ما بينهم ، اذا كان يجب فهل كل عملية مبيعات يتم اضافة الخارج الى جدول الحركة في حالة عدم وجود الصنف ييتم ادراجه وفي حالة وجوده يتم اضافته الى الكمية السابقة للخارج في جدول الحركة ... ولك الشكر
الرد
#7
إذا فهمت سؤالك جيدا

في جدول الحركة:
كل حركة بيع (أي شيء يخرج)، يتم إضافة تسجيلة جديدة يحدد فيها رقم الصنف و كمية الخارج من تلك الحركة في خانة QuantityOut.

كل حركة شراء (أي شيء يدخل)، يتم إضافة تسجيلة جديدة يحدد فيها رقم الصنف و كمية الداخل من تلك الحركة في خانة QuantityIn.

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

لاتوجد خانة يسجل فيها آخر رصيد للصنف، وعوضا عن ذلك وعند الرغبة في معرفة رصيد الصنف، يتم توليده حسابيا بمعرفة رصيد أول المدة وجمعه مع فارق الداخل و الخارج.
الرد
#8
السلام عليكم:
لكن اخي الشقروني هل تلاحظ هذه الحركة فيها تعب ، لانه في تعديل وحذف صنف وحذف فاتورة هذه كلها يجب ان تذهب الى جدول حركة المواد وتعدل ،،، انا اقتراحي لو يتم جلب استعلام من جدول تفاصيل المبيعات وجدول تفاصيل المشتريات وهكذا ويتم احذ الفرق واضافته الى كمية الصنف بعد جمعه مع اول مدة ... ما رأيك
الرد
#9
السلام عليكم ورحمة الله وبركاته
amar_del2007 كتب :السلام عليكم :
كيف يمكن ضبط كميات الاصناف في المخزون ، الطريقة المعتادة في كل عملية زيادة او نقصان ويتم الخصم او الزيادة والتخزين في جدول الاصناف...
ولهذا ارى ان افضل طريقة لضبط كمية المخزون هي بواسطة الفواتير نفسها
لان القاعدة تقول ان تخزين بيانات يمكن حسابها من شانه ان يحدث خطاء وتظارب بين هذه البيانات وبين البيانات الفعلية ( وارى ان هذا هو الكلام الصائب )

بصراحة الموضوع جميل جدا ومهم جدا وقلما تجد مثله بالانترنت لاني ببحث كثيرا ولم اجد .
ولي ليلتين وانا مقفل الباب على نفسي ابحث عن حل لهذه المشكلة .
وقررت ان لا اخرق قوانين انشاء قواعد البيانات وحاولت ان اجعل جدول المشتريات والمبيعات واحد وافرق بين فاتورة المبيعات وفاتورة المشريات عن طريق الشخص المسلم او المستلم ان كان مورد فهي مشتريات وان كان عيمل فهي مبيعات ويكون جدول العملاء وجدول الموردين واحد وافرق بينهم بواسطة حقل رقمي الرقم واحد فيه يعني مورد وصفر يعني عميل.
نوعا ما كادت العملية ان تنجح حتى وجدت انني انشئ استعلامات معقدة كثيرة للحصول على معلومة بسيطة
تجاهلت هذا الامر الليلة الثانية وجعلت للمشتريات جدول وللمبيعات جدول وللموردين جدول وللعملاء جدول.
وبدأت من جديد .
وكان قراري هو الحصول على كمية الاصناف من جدول المشتريات والمبيعات بجملة استعلام واحدة
او بعملية واحدة لانني وجدت انه ليس من المعقول ان انفذ الاستعلام كلما اراد المستخدم اضافة صنف جديد الى فاتورة المبيعات لارى هل لها رصيد بالمخزن ام لا .
وكانت البداية مع الاكسس وكدت اصل الى الحل بربط الجداول ببعضها وكان الحل في الدالة Full Joint
والتي تعود بكل القيم من الجدول الايمن والايسر حتى وان لم تكن لها ما يقابلها .
فلو كان هناك صنف بجدول المشتريات ولم يكن موجود بجدول المبيعات فلن يظهر بالاستعلام بدون هذه الدالة او المفتاح .
ولكن للاسف اكسس لا يدعم ذلك فتوجهت الى SqlLite وهو كذلك لا يدعم ذلك .
ووجدت ان SQlServer يدعم هذا وجربت الطريقة وحصلت على تقرير كامل بالاصناف وكمياتها من الجدولين بجملة واحدة وعملية واحدة .
ولكن كان هناك مشكلة مع الاصناف التي لا يوجد لها صنف يقابلها لانها ستعود Null
لذلك استخدمت المفتاح ISNULL(FildName,0)
والذي يجعل القيمة تساوي صفر او اي قيمة تحددها انت اذا وجدها تساوي Null
في الاسكيو ال سيرفر والاكسس تكون كما بالشكل التالي
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
اما في الاوراكل كما بالشكل التالي :
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
وفي الماي سيكوال فكما بالشكل
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
الجملة التي توصلت لها بعد ليلتين وحلت كل مشاكلي هي هذه
كود :
SELECT ISNULL(dbo.CeraBody.Sanf, dbo.Bea3Body.Sanf) AS sanfchera, SUM(ISNULL(dbo.CeraBody.Total, 0)) AS CheraTotal, SUM(ISNULL(dbo.Bea3Body.Total, 0)) AS Bea3Total, SUM(ISNULL(dbo.CeraBody.Total, 0) - ISNULL(dbo.Bea3Body.Total, 0)) AS Expr1, ISNULL(dbo.Bea3Body.Sanf, dbo.CeraBody.Sanf) AS SanfBea3 FROM dbo.CeraBody FULL OUTER JOIN dbo.Bea3Body ON dbo.CeraBody.Sanf = dbo.Bea3Body.Sanf GROUP BY dbo.CeraBody.Sanf, dbo.Bea3Body.Sanf
ويمكنك ان تشاهد هنا مثلا انني اقوم بانقاص مجموع المشتريات من مجموع المبيعات بالجملة التالية .
SUM(ISNULL(dbo.CeraBody.Total, 0) - ISNULL(dbo.Bea3Body.Total, 0)) AS Expr1
واعوض عن القيم Null بالقيمة صفر لتتم عملية الطرح بشكل صحيح والا فستكون النتيجة هي Null
وبهذه الطريقة يمكننا معرفة رصيدنا بالمخزن باقل عملية واسرعها ويمكن القيام بهذه العملية مرة واحدة عند الدخول لنافذة المبيعات ومقارنة مدخلات المستخدم بهذه الارقام .
كما يمكنكم رؤية نتيجة تنفيذ الاستعلام بالمرفقات
ولا اعرف اذا كان هناك طريقة لجعل الاكسس او SQLLite يعمل بطريقة مشابهة
والله الموفق


الملفات المرفقة
.jpg   untitled.JPG (الحجم : 11.24 ك ب / التحميلات : 77)
بين الانسان والكفر ترك الصلاة فمن تركها فقد كفر .
الرد
#10
السلام عليكم
بصراحة الموضوع بطئ ولا يأخذ حقه من النقاش فلا ردود من يوم أمس وسوف تتزاحم الاسئلة ويضيع الحابل بالنابل كما حصل بموضوع تحليل منظومة مبيعات
اردت ان اضيف ان المشكلة لاتتوقف عند هذا الحد فلا زال ينقص هذه العملية جداول أخرى
هناك جدول مسترجع المبيعات وجدول مسترجع المشتريات وايضا التالف من البضاعة وسوف تتعقد جملة SQL أكثر من هذا بكثير وقد يحدث بطئ شديد
وقبل كل شئ يجب حل مشكلة البطئ انا حملت لكم قاعدة بيانات اكسس بها جدولين مشتريات ومبيعات للتجربة فقط وفيها 250000 سجل مبيعات ومثلها للمشتريات
وبها استعلام بسيط جربوا ان تشغلوه وستعلمون عندها ما المشكلة الفعلية في هذا الامر
المشكلة ليست في كيف تولد الاستعلام وانما كيف تجعله يعمل بسرعة
المثال برهذا الرابط والحجم 900 كيلوبايت
كود :
http://www.sendspace.com/file/htp0ax
والله الموفق
بين الانسان والكفر ترك الصلاة فمن تركها فقد كفر .
الرد


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


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