13-04-2012, 10:23 PM
السلام عليكم ورحمة الله وبركاته
لان القاعدة تقول ان تخزين بيانات يمكن حسابها من شانه ان يحدث خطاء وتظارب بين هذه البيانات وبين البيانات الفعلية ( وارى ان هذا هو الكلام الصائب )
بصراحة الموضوع جميل جدا ومهم جدا وقلما تجد مثله بالانترنت لاني ببحث كثيرا ولم اجد .
ولي ليلتين وانا مقفل الباب على نفسي ابحث عن حل لهذه المشكلة .
وقررت ان لا اخرق قوانين انشاء قواعد البيانات وحاولت ان اجعل جدول المشتريات والمبيعات واحد وافرق بين فاتورة المبيعات وفاتورة المشريات عن طريق الشخص المسلم او المستلم ان كان مورد فهي مشتريات وان كان عيمل فهي مبيعات ويكون جدول العملاء وجدول الموردين واحد وافرق بينهم بواسطة حقل رقمي الرقم واحد فيه يعني مورد وصفر يعني عميل.
نوعا ما كادت العملية ان تنجح حتى وجدت انني انشئ استعلامات معقدة كثيرة للحصول على معلومة بسيطة
تجاهلت هذا الامر الليلة الثانية وجعلت للمشتريات جدول وللمبيعات جدول وللموردين جدول وللعملاء جدول.
وبدأت من جديد .
وكان قراري هو الحصول على كمية الاصناف من جدول المشتريات والمبيعات بجملة استعلام واحدة
او بعملية واحدة لانني وجدت انه ليس من المعقول ان انفذ الاستعلام كلما اراد المستخدم اضافة صنف جديد الى فاتورة المبيعات لارى هل لها رصيد بالمخزن ام لا .
وكانت البداية مع الاكسس وكدت اصل الى الحل بربط الجداول ببعضها وكان الحل في الدالة 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
الجملة التي توصلت لها بعد ليلتين وحلت كل مشاكلي هي هذه
ويمكنك ان تشاهد هنا مثلا انني اقوم بانقاص مجموع المشتريات من مجموع المبيعات بالجملة التالية .
SUM(ISNULL(dbo.CeraBody.Total, 0) - ISNULL(dbo.Bea3Body.Total, 0)) AS Expr1
واعوض عن القيم Null بالقيمة صفر لتتم عملية الطرح بشكل صحيح والا فستكون النتيجة هي Null
وبهذه الطريقة يمكننا معرفة رصيدنا بالمخزن باقل عملية واسرعها ويمكن القيام بهذه العملية مرة واحدة عند الدخول لنافذة المبيعات ومقارنة مدخلات المستخدم بهذه الارقام .
كما يمكنكم رؤية نتيجة تنفيذ الاستعلام بالمرفقات
ولا اعرف اذا كان هناك طريقة لجعل الاكسس او SQLLite يعمل بطريقة مشابهة
والله الموفق
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.SanfSUM(ISNULL(dbo.CeraBody.Total, 0) - ISNULL(dbo.Bea3Body.Total, 0)) AS Expr1
واعوض عن القيم Null بالقيمة صفر لتتم عملية الطرح بشكل صحيح والا فستكون النتيجة هي Null
وبهذه الطريقة يمكننا معرفة رصيدنا بالمخزن باقل عملية واسرعها ويمكن القيام بهذه العملية مرة واحدة عند الدخول لنافذة المبيعات ومقارنة مدخلات المستخدم بهذه الارقام .
كما يمكنكم رؤية نتيجة تنفيذ الاستعلام بالمرفقات
ولا اعرف اذا كان هناك طريقة لجعل الاكسس او SQLLite يعمل بطريقة مشابهة
والله الموفق
بين الانسان والكفر ترك الصلاة فمن تركها فقد كفر .

