منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
[سؤال] كود نقل السجلات السنوية - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم اسئلة VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=183)
+--- الموضوع : [سؤال] كود نقل السجلات السنوية (/showthread.php?tid=24902)



كود نقل السجلات السنوية - سمير الجبالي - 10-05-18

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

أرجو منكم كما أعتدنا منكم المساعدة 

سؤالي :

مشروع على الفيجوال بيسك 2012 ما هو الكود الذي أستطيع من خلاله نسخ البيانات المدخلة في الجدول الذي أريد لجدول جديد يولده الكود .

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

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

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

وشكراً لكم وعذراً منكم على الإطالة


RE: كود نقل السجلات السنوية - عبدالله الدوسري - 11-05-18

(10-05-18, 11:04 PM)سمير الجبالي كتب : السلام عليكم ورحمة الله وبركاته

أرجو منكم كما أعتدنا منكم المساعدة 

سؤالي :

مشروع على الفيجوال بيسك 2012 ما هو الكود الذي أستطيع من خلاله نسخ البيانات المدخلة في الجدول الذي أريد لجدول جديد يولده الكود .

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

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

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

وشكراً لكم وعذراً منكم على الإطالة



أرى ان هذة الطريقة خطأ
فكر بطربقة مختلفة


RE: كود نقل السجلات السنوية - سمير الجبالي - 11-05-18

أستاذي العزيز

البيانات التي سأنسخها بالجدول الجديد هي نتاج العمل في سنة انتهت وسيبدأ الترقيم بالعام الجديد من الرقم واحد 

من غير الوارد  أن أصفر البيانات 

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

ما هو الحل الذي تقترحه ؟

شكراً لكم


RE: كود نقل السجلات السنوية - عبدالله الدوسري - 12-05-18

رقم الصادر ورقم الوارد
كلهم يبدأون برقم 1 من بداية السنة الجديدة
يجب أن يكون الجدول في قاعدة البيانات مهيئ لمثل هذا الأمر
كان من الأصح التفكير في مثل هذا الأمر قبل البداء في كتابة أي كود في البرنامج
ووضع الحقول التي تخدم عمل البرنامج بالشكل الصحيح

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

DocDir  يعني Document Direction يعني إتجاة الوثيقة ( صادر أم وارد )
حقل ( DocDir ) رقمي : يبين هل هذا السجل صادر أو وارد : ولنفترض رقم ( 0 / 1 ) ( 0 : سجل صادر ) ( 1 : سجل وارد )

RefYear  يعني Reference Year يعني سنة المرجع
حقل ( RefYear  ) رقمي : تاريخ من خلالة نستطيع معرفة رقم السنة ( من أربع أرقام : مثلاً 2017 / 2018 / 2019 )

RefNo  يعني Reference No يعني رقم المرجع ( الصادر أو الوارد )
حقل ( RefNo ) رقمي : يبين رقم ( الصادر أو الوارد ) : عبار عن رقم ( يبداء من 1 ) أي لا يمكن أن يكون صفر 



القيود  : CONSTRAINT
( Unique constraint to combination of Three columns )
القيود التي يجب تطبيقها على هذة الحقول 
ممنوع أن تتكرر قيم الحقول وهي ( مجتمعة )
DocDir + RefYear + RefNo    ( لا أقصد عملية جمع )
كلهم لا يمكن أن تتكرر في حقل آخر بنفس القيم 


أي أن هذة القيم تكون فريدة وهي مجتمعة
-------------------------------
DocDir | RefYear | RefNo
-------------------------------
  115   |   2017    |      0 
-------------------------------
  116   |   2017    |      0 
-------------------------------
  117   |   2017    |      0 
-------------------------------

* لا يمكن لسجل (Row) آخر أن يحتوي على نفس جميع قيم الحقول الثلاثة





لنفترض جزلاً أن جميع السجلات الموجودة في قاعدة البيانات للسنة الفائتة 2017  , ولا يوجد أي سجل للسنة الحالية 2018

الآن ( في هذة اللحضة Now ) انت تريد رقم ( صادر جديد : صادر يعني DocDir = 0 ) ونحن في سنة 2018 يعني ( RefYear = 2018 )
ماذا سنفعل ؟
سنقوم بعمل إستعلام سيكون كالتالي :
هذا الإستعلام يبحث أن أكبر رقم للـ(RefNo) الموجود للصادر في سنة 2018
--------------------------------------------------------------------------------------------------------
( SELECT MAX(RefNo) FROM TABLE WHERE ( RefYear = 2018 ) AND ( DocDir = 0
--------------------------------------------------------------------------------------------------------
قلنا أنه لا يوجد سجلات لسنة 2018
إذن النتاج سيكون Null وهذا يعني أنه لا يوجد أي رقم صادر لسنة 2018 يعني سنقوم بكتابة أول رقم وهو ( 1 )

الآن يمكنك إدراج سجل جديد بهذا الرقم 
DocDir = 0
RefYear = 2018
RefNo = 1

لو أعدنا تنفيذ نفس الإستعلام :
--------------------------------------------------------------------------------------------------------
( SELECT MAX(RefNo) FROM TABLE WHERE ( RefYear = 2018 ) AND ( DocDir = 0
--------------------------------------------------------------------------------------------------------
النتيجة ستكون الرقم ( 1 )
قم بإضافة 1 إلى هذا الرقم ، ستحصل على رقم صادر جديد وهو ( 2 ) 
وهكذا .............


هذة فكرة بسيطة عن الصادر والوارد
نظام الصادر والوارد يحتاج إلى امور معقد أكثر من هذا بكثير ، لو أخذنا بعين الإعتبار أنه يعمل على النظام الكثير من الموظفين.
لو قام عدد 4 موظفين بعمل إستعلام في نفس الوقت لأخد رقم صادر جديد 
SELECT MAX(RefNo) FROM TABLE WHERE RefYear = 2018 AND DocDir = 0
كلهم سيحصلون على نفس الرقم وهذا لا يجوز في نظام الصادر والوارد
المفترض أن يتم أخذ الرقم الصادر في لحظة الحفظ ( داخل قاعدة البيانات يتم تعيين الرقم )
وإظهارة للمستخدم على الشاشة بعد عملية الحفظ
أما قبل عملية الحفظ لا يجب أن يتم إظهار الرقم الجديد لأنه من الممكن أن أحد الموظفين قام بإستخدامة في أثناء إدخالك أنت للبيانات