منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : اذا ممكن مساعدة في تحويل معادلة في اكسل الى كود sql server
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم 

تحياتي للجميع 

اذا ممكن مساعدة في تحويل معادلة في اكسل الى كود sql server
حسب المرفق
فى البدابة الجدول عبارة عن التالى

الراتب الاساسـي                   :  2290
تاريخ التعيين                      :  1995
تاريخ استحقاق اخر العلـاوة        :  2018
نسبة العـلاوة                      :  0.0125
اجمالي العـلاوة                    :   757.34

الاجمالى عبارة عن التالى
1- نسبة العلاوة وهى القيمة +1 لتصبح [ 1 + 0.0125 ] = 1.0125 .
2- عدد السنوات وهلى هبارة عن [ 2018 - 1995 ] = 23 .
3- قيمة المرتب وهو 2290 .

ليتم عمل المعدلة التالية بهذا الشكل النهائي
((1.0125^23)-1)*2290

هيكون الناتج عبارة عن 757.3421288
سيتم عمل تقريب اقرب رقم عشري 2 ليصبح الناتج 757.34

طيب الشكل الكلى لكود الاستعلام سيكون كالتالى
كود :
SELECT Salary, DateStart, DateEnd, Premium, (round(((val(val(1 + Premium) ^ round(val(DateEnd - DateStart)/(30*12),0) )-1) * Salary), 2)) AS Total FROM Test

مرفق مثال بسيط لقاعدة البيانات
تم عمل قاعدة البيانات بـ Access ستقوم بتطبيق المثال على Sql
بنفس الكود الاستعلام بدون اى اختلاف

تم عمل المثال المرفق بـ Access حتى توضح الفكرة
صورة لشكل الناتج بعد تنفيذ كود الاستعلام


مع العلم ان الجدول الرئيسي يحتوى فقط على كل من اول 4 اعمدة فقط

تحياتى لك
وتمنياتى لك التوفيق
كلمة شكر قليلة بحقك بارك الله فيك اخي الكريم 


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

السلام عليكم 

اخي الكريم طبقت الكود على sql server 

اعطاني الخطأ التالية

Msg 195, Level 15, State 10, Line 2

'val' is not a recognized built-in function name.
Val هي Function تخص قواعد بيانات MS Access

ولا يوجد ما يقابلها في قواعد بيانات SQL Server
اشكرك اخي [b]عبدالله الدوسري وبارك الله فيك [/b]
مرحباً اخى sharawee707

فقط قم بحذف اى كلمة تحت اسم ( الكلمة فقط )
كود :
val

أو قم باستخدام الكود بهذا الشكل
كود :
SELECT Salary, DateStart, DateEnd, Premium, (round(((convert(int,convert(int,1 + Premium) ^ round(convert(int, DateEnd - DateStart)/(30*12),0) )-1) * Salary), 2)) AS Total FROM Test

لا يلزم استخدام كلاً من Val و Convert
كل الامر فقط توضيح فى المثال لتجنب اى خلل فى القيم للمثال
خصوصاً لان الامر بقاعدة بيانات Access قد يقوم باستخدام + كما لو انها &
ليصبح 1+1 = 11 بدلاً من 2 ولهذا تم استخدامه فى المثال فقط

فقط اتبع الخطوات كما تم شرحه فى الاعلى
اذا كنت ستقوم بحذف اى كلمة تحت اسم val
أو انك تقمو باستبدالها بكلمة Convert كما موضح فى الكود كاملاً

واسف لعدم توضح على امل انك ستكون على علم الفرق بين 
Access و Sql Server

تحياتى لك
وتمنياتى لك التوفيق
بارك الله فيك واشكرك اخي الكريم على هذه المعلومة القيمة 

كل الاحترام التقدير
الشكر لله والحمد لله
والحمد لله على كل حال

تحياتى لك
وتمنياتى لك التوفيق
السلام عليكم 

اخي الكريم بعد تجربة المثال لا تظهر النتائج الصحيحة في sql server بعكس الاكسيس

جرب هذا


قم بإنشاء دالة Function داخل SqlServer بإسم GetPremiumTotal
كود :
CREATE FUNCTION dbo.GetPremiumTotal(
    @salary    float,
    @dateStart date,
    @dateEnd   date,
    @premium   float)
RETURNS float
AS
BEGIN

   DECLARE @yearFrac float;  
   SET @yearFrac = DATEDIFF(d, @dateStart, @dateEnd) / 365 ;

   DECLARE @premiumTotal float;  
   SET @premiumTotal = ROUND( ((POWER( (1+ @premium), @yearFrac ) -1) * @salary), 2, 1) ;
    
   RETURN @premiumTotal;

END

ويتم استخدام الدالة GetPremiumTotal بالطريقة التالية
كود :
SELECT  GetPremiumTotal(Salary, DateStart, DateEnd, Premium) AS PremiumTotal
FROM    Employees
الصفحات : 1 2