• 0
alrahel

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

سؤال

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

عندي خطأ في الكود مع العلم انو شغال ولكن ياخذ قيمة 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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

9 إجابة على هذا السؤال .

  • 0

السلام عليكم

جرب الكود ده

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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لسلام عليكم

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

سوف أشرح لك..

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

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

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

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

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

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم اخي الكريم شكرا علي شرح الفكرة . الان بما انك فى الاخير لديك 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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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


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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

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

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

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

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

تم تعديل بواسطه ahamied
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

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

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

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

تم تعديل بواسطه alrahel
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .