الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تصحيح الكود في العمليه الحسابيه

بدأه alrahel في 19 أبريل 2010 · 9 رد · 1,176 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

عندي خطأ في الكود مع العلم انو شغال ولكن ياخذ قيمة Call duration التي قبلها

هذا الكود

DECLARE @cost smallmoney;


update CallDetails SET @cost =
CASE 
            WHEN  HPno LIKE '017%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.01
            WHEN  HPno LIKE '093%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.05 
            WHEN  HPno LIKE '066%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.10
			end            
INSERT calldetails (DateAndTime,HPno,[Type],CallDuration,Cost,UserName)

values ('2010-08-09','0170000000','Call','00:00:05',@cost,'Kim');

المفروض ان تتم عملية الضرب * هلله واحده إذا كان الرقم يبدأ بـ 017

وهو مايحدث لكن العمليه في القيمه التي قبلها وليست في القيمه الحاليه من [callduration]

أرففت الصورة للتوضيح أكثر

c109bdf694.jpg

وشكرا لكم مقدما

#2

السلام عليكم

جرب الكود ده

DECLARE @cost smallmoney;


update CallDetails SET @cost =
CASE [HPno]
            WHEN  LIKE '017%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.01
            WHEN  LIKE '093%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.05 
            WHEN  LIKE '066%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.10
			end            
;

مرفق ملف شرح case من كتاب Willy

Case Expressions.rar

تم تعديل هذه المشاركة بواسطة ahamied في 19 أبريل 2010 في 14:19

Microsoft Certified DataBase Administrator MCDBA

#3

شكرا أخي ahamied على سرعة الإستجابه

لكن لم تعمل طريقتك ..

حملت الملف وقرأته لكن دون جدوى .. هل هناك طريقة أخرى ..

وجزاكم الله خير..

#4

لسلام عليكم

اخي الكريم ناتج الاستعلام بتاعك جميع قيم ال HPno هي 017000000 وهذه القيمة قمت انت بتثبيتها .... لماذا ؟

كذلك قيمة ال CallDuration  قيمتها 5 ثواني .... لماذا

ولماذا تستخدم Insert بما انك تريد Update لقيمة فقط ؟

Microsoft Certified DataBase Administrator MCDBA

#5

لم أقم بتثبيتها بل أجرب فيها لأتأكد من دقة الحساب

والثواني أغيرها عند الاكسكيوت ..

سوف أشرح لك..

انا عندي مشروع تخرجي وهو عمل ويب سايت لشركة إتصالات مبسط

ويريدون مني أن أقوم بعمليه ادخال تفاصيل المكالمه عن طريق الويب سايت وتخزينها بالداتابيس

وطلب مني لنفترض بأن الرقم الذي يبدأ بـ 017 قيمته واحد سنت بالثانيه

والرقم الذي يبدأ بـ 093 بـ 5 سنت للثانيه

والرقم الذي يبدأ بـ 066 بـ 10 سنت للثانيه

وكان لابد ان يكون عمليه حسابيه فاستخدمت ال CASE لعملية الضرب الذي هو cost

وبعدها أدخل القيم .فأردتها في SQL ثابته لأجرب عمليه الحساب .

وسوف أجعلها متغيره في صفحة الويب asp.net

هل أنا أخطأت باتجاهي للـ CASE أنرني ..

وأسف أن لم أكتب بوضوح.

#6

السلام عليكم اخي الكريم شكرا علي شرح الفكرة . الان بما انك فى الاخير لديك table اسمه CallDetails يحتوي علي بياانات المكالمات وهي DateAndTime,HPno,[Type],CallDuration,Cost,UserName

والويب سايت يوفرلك جميع البيانات ما عدا التكلفة Cost وانت تقوم بحسابها حسب الرقم HPno بمعادلة معينة شرطية.

لديك اتجاهين للحل :

1- Run Update Query - لازم يكون فيه Field اسمه Cost موجود بالجدول CallDetails ولا يحتوي علي بيانات

update CallDetails 
SET cost =
CASE [HPno]
            WHEN  LIKE '017%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.01
            WHEN  LIKE '093%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.05 
            WHEN  LIKE '066%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.10
                        end;

2- Run Select Qerry لا يوجد Field اسمه Cost موجود بالجدول CallDetails

DECLARE @cost smallmoney;

SET @cost =
CASE 
WHEN  HPno LIKE '017%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.01
WHEN  HPno LIKE '093%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.05 
WHEN  HPno LIKE '066%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.10
End
Select calldetails (DateAndTime,HPno,[Type],CallDuration,@Cost,UserName);
1

Microsoft Certified DataBase Administrator MCDBA

#7

وعليكم السلام

يسعدني جدا تجاوبك معي

أستخدمت الأول مع تغير بسيط وهو :

update CallDetails SET cost = CASE            
 WHEN HPno LIKE '017%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.01           
 WHEN HPno LIKE '093%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.05             
  WHEN HPno LIKE '066%' then  DATEDIFF(SECOND, 0, CallDuration) * 0.10 
 end;

عدل القيم كلها وعدل الأخطاء السابقه وهذا شيء جيد .. لكن عندما حاولت بأن أدخل قيم جديده وهي

INSERT INTO calldetails (DateAndTime,HPno,[Type],CallDuration,UserName)
values 
('2010-08-09','0170000000','Call','00:00:50','Kim');

أظهر لي COST

Null

جعلتها في كوري واحد واشتغلت ..

أخي ahamied أُقدر لك مافعلته معي من تجواب وتقديم الحل الصحيح ..

أنرتني .. بارك الله فيك وزادك من علمه ونوره ..

سأحاول أن أكمل المشروع وأتمنى من الله أن يوفقني فيه ..

تحياتي

تم تعديل هذه المشاركة بواسطة alrahel في 20 أبريل 2010 في 11:24

#8

السلام عليكم اخي الكريم

فى كل مرة يتم فيها اخال بيانات جديدة سوف تكون قيمة Cost فى كل ال fields الجديده Null هذا طبيعي لانه لم يتم تشغيل Update لقيمة ال Cost للـ fields الجديدة

يعني المفروض انت من خلال البرنامج بتاعك تعمل اكواد تنفذ رغباتك يعني بعد كل insert تعمل Update

وفي حل...انك تعمل Cost عبارة عن Calculated Columns فى تصميم الجدول وتنتهي المشكلة تماما.

وفيه حل جميل اسمه Trigger بس مش عايزك تستخدمه لانه صعب ولا تنصح Microsoft اصلا باستخدامه

مختصر شرحه ان انشاء trigger للـ Table CallDetails من النوع Insert يكون عمله اوتوماتيكي جدا ولا تشعر به

يقوم عند كل insert فى الجدول باحتساب قيمة Cost

تم تعديل هذه المشاركة بواسطة ahamied في 20 أبريل 2010 في 11:56

1

Microsoft Certified DataBase Administrator MCDBA

#9

صحيح أخي العزيز ..

وأشكرك جدا على هذه الإضافه ..

بقي الآن أن اعمل خاصية البحث للجدول نفسه وهو CALLDETAILS

لعرض الاتصالات التي اجريت من تاريخ كذا الى تاريخ كذا

وحبذا لو تفيدونا بكتاب معين او مقالات بالنت أو بخبرتكم..

جزاك ربي كل الخير

تم تعديل هذه المشاركة بواسطة alrahel في 21 أبريل 2010 في 14:17

#10
مرجع ممتاز جدا وشامل

Microsoft Certified DataBase Administrator MCDBA

مواضيع مشابهة