09-04-19, 02:08 AM
وعليكم السلام ورحمة الله وبركاته
اسف لتاخري بالرد لعدم تواجدى تقريباً امس
على اى حال شوف ركز معايا هنا فى الشرح لتوضح ما سبب
الخطاء الذى لديك ولماذا هذا وكيف حلها والحل سيعتمد انك تفهم الفكرة
حتى لا تقع بها مجدداً
اولاً فى كود الخاص بـ :
PHP كود :
stored procedure
انت تستخدم على هذا النحو
كود :
ALTER proc [dbo].[Update_Invoice]
@JOB_NO int,
@ENGINEER_RESPOSIBLE varchar(250),
@DATE datetime,
@COMPANY_NAME varchar(250),
@CUSTOMER_NAME varchar(250),
@SUBJECT varchar(250),
@REFERENCE varchar(250),
@ACKNOWLEDGMENT_COPY varchar(250),
@ACKNOWLEDGMENT_DATE varchar(250),
@NOTES varchar(250)
as
update INVOICES
set NOTES=@NOTES,
JOB_NO=@JOB_NO,
ENGINEER_RESPOSIBLE=@ENGINEER_RESPOSIBLE,
date=@DATE,
COMPANY_NAME=@COMPANY_NAME,
CUSTOMER_NAME=@CUSTOMER_NAME,
SUBJECT=@SUBJECT,
REFERENCE=@REFERENCE,
ACKNOWLEDGMENT_COPY=@ACKNOWLEDGMENT_COPY,
ACKNOWLEDGMENT_DATE=@ACKNOWLEDGMENT_DATE
where NOTES=@NOTESفى البداية ساوضح السطر الذى يحتوى على مشكلة
لما هو بالموضوع وبعدها ساقوم بتوضيح اسطر كا
ملاحظة بحاجة لمراجعتها منك انت شخصياً
السطر الذى يسبب مشكلة فهو :
كود :
where NOTES = @NOTESبالسطر ده انت كانت بتقول
ان عدل البيانات اللى انت كتبتها بنائاً على توافق جميع الملاحظات
لما هو مدخل فى textBox خاص الملاحظات
وهذا خطاء جداً
لانك يبدو لم تستوعب فكرة كلمة where فى كود التحديث
الفكرة من هذه الكلمة هو كا فكرة البحث او الفلتر تماماً
بمعنى انت محتاج تعدل بيانات على شخص واحد باسم : maxruined
والشخص ده يحمل ID رقم 34222
فهنا لاتمام تعديل بيانات للشخص ده فقط دون التعديل على اى شخص اخر
فهنا انا مطلوب ان اقوم بعمل كود :
where uid = @uidوالتى سيتم ارسال قيمة @uid بـ 34222
او انك تستخدم بهذا الشكل
كود :
where username = @usernameوالى هيكون قيمته هو maxruined
طيب ايهم افضل طريقة الـ id ولا user
بكل تاكيد وبدون اى تفكير عن طريق id
لان مش بس المساحة فى البحث اللى هيقلل من الوقت فى تنفيذ الامر
كذلك لضمان ان الرقم بطبيعة الحال غير مكرر عكس الاسم من الممكن ان يكون كا الاسم العام
وقد يكون مكرر من تشابه الاسماء بالعالم ولكن اذا كان الاسم كا اسم مستخدم غير مكرر فيمكن استخدامه
ولكن سيكون مدة تنفيذ الامر اكثر وقتاً من تنفيذ الامر من خلال الرقم
فهنا لحل المشكلة يجب ان يكون الكود الخاص بك
لاخر سطر بهذا الشكل
كود :
where JOB_NO = @JOB_NOوبكده يكون تم حل المشكلة
طيب بخصوص الملاحظات اللى رايتها واريد التحدث عنها
الملاحظة الاولى وهو هذا السطر من نفس الكود
كود :
JOB_NO = @JOB_NO,من المفترض ان هذا العمود عبارة عن رقم الوظيفة
اللى ادخل اول مرة ولا يقبل للتغيير وكذلك للتكرار
بمعنى ان هذا العمود يفترض انه عبارة عن ID
اذا كان موجود او لا فى الجدول عمود باسم ID
وياخذ رقم تلقائي عند ادخال
فايضاً عمود JOB_NO يجب ان يكون محدد بمفتاح
حتى لا يكون به اى تكرار فى الارقام
وبعد اتمام ذلك وتنفيذ هذا الامر فهنا
ايضاً هذا السطر
كود :
JOB_NO = @JOB_NO,لم يعد وجود وسط الكود اى اهمية
فقط يكفي ان يكون تواجده بهذا السطر فقط
كود :
where JOB_NO = @JOB_NOطيب الملاحظة الثانية وبنفس الكود
وهو عن هذا السطر
كود :
ACKNOWLEDGMENT_DATE = @ACKNOWLEDGMENT_DATEما الاحظه انه من المفترض ان يكون هذا العمود تاريخ
ولكن مع ذلك تم تعريف قيمة المدخلة لهذا العمود نص من خلال هذا السطر
كود :
@ACKNOWLEDGMENT_DATE varchar(250),وهذا خطاء اذا كان العمود فعلياً تاريخ
فيجب ان يكون السطر بهذا الشكل
كود :
@ACKNOWLEDGMENT_DATE datetime,فالامر هنا يتطلب مراجعتك والتاكد من صحة الامر
طيب الملاحظة الاخيرة
وهى بناءاً ما تم الشرح بخصوص عمود JOB_NO
فهنا عند اتمام تحرير البيانات فيجب ان تكون textBox الخاص بقيمة JOB_NO
ان تجعل خصائصه للقراءة فقط اى غير قابل للتعديل عليه من قبل المستخدم
لان كما تم الشرح انه سيكون مستخدم فى سطر
كود :
where JOB_NO = @JOB_NOوهذا يعنى ان القيمة هنا موجودة فعلياً قبل اتمام التعديل وبعده
الا اذا كنت تريد اتمام التعديل و تريد ايضاً تكرار الارقام بهذا العمود
فيجب عليك اضاً استخدام عمود ID للترقيم التسلسلى التلقائي
بالنهاية الكود الخاص بـ stored procedure سيكون بهذا الشكل
وتذكر بانى جعلت تعريف ACKNOWLEDGMENT_DATE بكونه تاريخ فعدله فقط لما هو لديك
كود :
ALTER proc[dbo].[Update_Invoice]
@JOB_NO int,
@ENGINEER_RESPOSIBLE varchar(250),
@DATE datetime,
@COMPANY_NAME varchar(250),
@CUSTOMER_NAME varchar(250),
@SUBJECT varchar(250),
@REFERENCE varchar(250),
@ACKNOWLEDGMENT_COPY varchar(250),
@ACKNOWLEDGMENT_DATE datetime,
@NOTES varchar(250)
as
update INVOICES
set JOB_NO = @JOB_NO,
ENGINEER_RESPOSIBLE = @ENGINEER_RESPOSIBLE,
date = @DATE,
COMPANY_NAME = @COMPANY_NAME,
CUSTOMER_NAME = @CUSTOMER_NAME,
SUBJECT = @SUBJECT,
REFERENCE = @REFERENCE,
ACKNOWLEDGMENT_COPY = @ACKNOWLEDGMENT_COPY,
ACKNOWLEDGMENT_DATE = @ACKNOWLEDGMENT_DATE,
NOTES = @NOTES
where JOB_NO = @JOB_NO وبالنهاية بعد مراجعة عمود ACKNOWLEDGMENT_DATE
وان صح التعبير بانه من نوع تاريخ وليس نص
فستاتى فى كود الـ C#
وتاتى على هذا السطركود :
param[8] = new SqlParameter("@ACKNOWLEDGMENT_DATE", SqlDbType.VarChar, 250);وتجعله على هذا النحو
كود :
param[8] = new SqlParameter("@ACKNOWLEDGMENT_DATE", SqlDbType.DateTime);بكدة يكون تم حل المشكلة مع الملاحظات الموضحة لك
اتمنى ان يكون الشرح بسيط
وبه جميع ما تريده تماماً
تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]
ساهم دائماً فى
لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله
▼ شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]
ساهم دائماً فى
لكل من يقوم بالمساهمةفى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله
▼ شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية

