(09-04-19, 02:08 AM)elgokr كتب :وعليكم السلام ورحمة الله وبركاته
اسف لتاخري بالرد لعدم تواجدى تقريباً امسعلى اى حال شوف ركز معايا هنا فى الشرح لتوضح ما سببالخطاء الذى لديك ولماذا هذا وكيف حلها والحل سيعتمد انك تفهم الفكرةحتى لا تقع بها مجدداً
اولاً فى كود الخاص بـ :
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);
بكدة يكون تم حل المشكلة مع الملاحظات الموضحة لك
اتمنى ان يكون الشرح بسيطوبه جميع ما تريده تماماً
تحياتى لكوتمنياتى لك التوفيق
حرفياً .. من اكتر الناس اللى بتشرح بطريقه رهيبه .. شكراً جداً
بس فيه مشكلة اخيره
وهى اني لما عملت جدول جديد سميته S.N وحددته بمفتاح علشان ميعملش تكرار للارقام
بس المشكلة انى لو حذفت سطر فى النص مثلاً عندى ارقام من 1 الى 10 لو حذفت الرقم 4 هلاقي زي كدا
1.2.3.5.6.7.8.9.10 من غير رقم 4 .. كنت عايزه يعمل ابديت للارقام بعد ما امسح اى سطر من الداتا بيز
وتانى مره الف مليون شكر
