تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تحويل عدد ساعات العمل من عشري (٢٫٧٥) الى - "HH:MM" في التقارير - تم الحل
#1
هل يمكن تحويل عدد عشري وهو لمجموع ساعات عمل يوم محدد والنفرض كان ٢٫٧٥
الى صيغة الوقت  HH:MM فاليصبح 2:45 

من خلال الكود الشيئ بسيط 
فهل من الممكن عمل ذلك من داخل التقرير للكريستال ريبورت ؟؟

فكرت انة اقةم بتحول العدد العشري من خلال الكود وحفظه في الجدول على صيغة hh:mm 
لكن هذا الحل سيعمل صعوبة في جمع عدد الساعات وكذلك يحتاج مني لتغير الكثير في الكود.

من لدية طريقه ساكون مشكور
الرد
تم الشكر بواسطة:
#2
اولاً فى البداية كيف تحويل 2.75 الى 2:45
هناك فرق 30 بين الرقمين المذكور ويبدو انك تستخدم طريقة جمع الوقت بطريقة غير صحيحة
تذكر ان جمع الارقام الاعتيادية فينتهى عند 100 ليصبح 1.00
بينما الوقت ينتهى عند 60 ليصبح 1:00

الا اذا كان الرقم المذكور هو الرقم النسبي للوقت كما سيتم توضيحه بنهاية الرد

لاتمام جمع وقت مع وقت اخر او الطرح
يجب عليك وضع الامر فى معرف من نوع TimeSpan
لاتمام الطرح والجمع كما تشاء

والمعرف هذا يمكنك بعدها استخراج الوقت منه كما تم الاشارة اليه مسبقاً
فى ردى عليك فى هذا الرابط

لتوضح الصورة لك اكثر انظر للكود التالى
كود :
       Dim i1 As Date = "10:00"
       Dim i2 As Date = "16:40"
       Dim i3 As New TimeSpan
       i3 = i2 - i1
       MsgBox(i3.TotalHours)
       MsgBox(i3.Hours & ":" & i3.Minutes)

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

عند اتمام ذلك فالبرنامج بيتم تعريف نفسه كالقيمة i1 بهذا الشكل تلقائياً
PHP كود :
"14/06/2019 10:00:00" 

ويتم تلقائي اعطاء قيمة i2 بهذا الشكل
كود :
"14/06/2019 16:40:00"

حيث يتم وضع التاريخ لليوم تلقائي
وكذلك يتم ادراج الثانية كونه صفر 

وياتى دور i3 وهو الخاص بـ TimeSpan لتحويل التاريخ الى رقم
وخلينا نقول ان الرقم ده عبارة عن الثوانى ليصبح بهذا الشكل كمثال
1132564654653132

والرقم بالثوانى هو عبارة عن بداية احتساب عدد الثوانى من تاريخ الى لحظة التاريخ / الوقت المذكور فى i1 و i2
كود :
"01/01/1970 00:00:00"

طبعاً لما اصبح التاريخ والاوق عبارة كونه رقم
فاصبح عملية الطرح والجمع عبارة عن كما لو تقول 10-5
فالناتج المتبقي بينهم يتحول بعد ذلك لجلب الفارق لاعداد وليس لتاريخ
بمعنى عدد الاعوام / عدد الاشهر / عدد الاسابيع / عدد الايام / عدد الساعات / عدد الدقائق / عدد الثواني .. الخ

ويتم عرض ما تريده كما مشير اليه فى اخر سطر الكود وهو
كود :
       MsgBox(i3.Hours & ":" & i3.Minutes)

حيث قمت بجلب الساعات ثم الدقائق
بينما فى الرسالة التى قبلها مباشراً 

يتم جلب عدد السعات كالنسبة الئوية وهو
كود :
6.6666667

اتمنى ان تكون الصورة وضحت لك كلياً

وبخصوص السؤال كيفية تحويل الرقم الى وقت فى التقارير
فقط كل ما عليك ان تاتى فى اداء  text بالتقرير الذى يحتوى على الرقم
وعدل فى خصائصه لتقوم بتعريف الاداء لقيمة وقت بدلاً من رقم وستجد ان الرقم تحول الى وقت

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد
#3
صديقي الجوكر شكرا لك على المجهود في الشرح 
بالفعل انا قمت بالعمل كما قلت لي باول شرح 
و استعمل هذة الطريقة لاخذ الفرق بين تاريخين :

PHP كود :
       // function to return worked hours
 
       decimal GetHours(DateTime startTimestampDateTime stopTimestamp)
 
       {
 
           var span = (stopTimestamp startTimestamp);
 
           decimal total = (decimal)span.TotalHours;
 
           return Math.Round(total2);
 
       
و هذة الطريقة ترجع عدد الساعات بالنسبة وليس كوقت
في تخزين البيانات هذا افضل فهو يسهل عمل جمع الساعات لدفع الرواتب الخ ٫٫٫٫

حاليا انا اعمل على اخراج وصل صغير من الطابعة للموظف عند انتهاء الوردية الخاصة به
عند جلب عدد ساعات العمل للموظف تكون بالنسبة المئوية 
ما اريدة هو اظهار وقت العمل في الوصع بالساعات والدقائق فهذا اسهل للمستخدم ليفهة
هل هناك طريقة لعمل هذا بال Formula Field او طريقه لفعل هذا من خلال تقارير الكريستال .

إقتباس :تاتى فى اداء  text بالتقرير الذى يحتوى على الرقم

وعدل فى خصائصه لتقوم بتعريف الاداء لقيمة وقت بدلاً من رقم وستجد ان الرقم تحول الى وقت

قمت بالبحث بالخصائص لم اعثر على شيء 
مع العلم ان العمود الخاص بحفظ عدد الساعات في قاعدة البيانات من نوع رقم (double)


تم الحل :

قمت بانشاء Formula Field 
وقمت بتحويل الرقم الى دقائق وساعات و دمجها كنص 
كما موضح في الاتي :

كود :
local numbervar sum_mins := ({shift_view.work_hour} * 60 ); // duration in mins
local numbervar hrs;
local numbervar mins;
hrs := truncate(sum_mins/60); //get whole hours
mins := remainder(sum_mins,60); //get remaining minutes
totext(hrs,'00') + ':' + totext(mins,'00')
شكرا لك اخي الجوكر
الرد
تم الشكر بواسطة: ابراهيم ايبو , حريف برمجة , wared , wared
#4
بات الامر جميلاً وخصوصاً ان الصورة اصبحت مرئية جيداً
فى البداية نقلت الموضوع الى قسم C# بما انك تعمل بهذه اللغة
لتسهيل عليك الكود مباشر بدلاً من التحويل وليكون كل شئ بتخصصه

انظر الى هذا الكود بدلاً من الـ function المستخدم لديك

وركز معايا فى كم فكرة ممكن تعملها لما هو يناسبك
اعلم انك وصلت لحل لما تريده ولكن حتى تعم الفائدة لك وللجميع

فى البداية قم بانشاء هذا الـ function
كود :
       public TimeSpan GetHours(DateTime startTime, DateTime stopTime)
       {
           TimeSpan myTime = new TimeSpan();
           myTime = stopTime - startTime;
           return myTime;
       }
الان ناتى لكود التنفيذ كمثال لاختبار الامر
كود :
           TimeSpan GetTime = new TimeSpan();
           DateTime srtTime = Convert.ToDateTime("10:00");
           DateTime stpTime = Convert.ToDateTime("16:40");
           GetTime = GetHours(srtTime, stpTime);

           MessageBox.Show(GetTime.Hours + ":" + GetTime.Minutes);

لاحظ بساطة الكود وان انا عملت الكود على تجزئة لتوضح الصورة خطوة بخطوة
طيب الان اللى فهمنا من الكود المثال لعرض فارق عدد الساعات واللى هيكون 6:40

بكده مطلوب منى انفذ حفظ هذا الوقت بقاعدة البيانات من خلال هذا السطر
كود :
GetTime.Hours + ":" + GetTime.Minutes
لكن فى مشكلة ان العمود بقاعدة البيانات عبارة عن double
الحلول هنا لها الف حل فابسط مثال يمكنك تحويل نوع العمود الى نص او تاريخ
الامر الثاني ان تجعل الكود المرسل لهذا العمود بهذا الشكل
كود :
GetTime.Hours + "." + GetTime.Minutes

ليكون الرقم المسجل هو 6.40
وسيكون الامر بسيط فى التقارير من تحويل . الى :
او يمكنك تركه على هذا الوضع كونه 6.40 فهو مشير الى 6 ساعات و 40 دقيقة

وغيرها كتير من افكار لكن لا اريد اضيف المزيد حتى لا تدخل الامور فى بعضها

اتمنى ان الصورة مرئية وان بناء function بصورة صحيحة يكون على هذا الشكل
وليك كما اشرت اليه فى الكود الخاص بك وتذكر ان الـ function
هو عبارة عن تسهيل وليس اعتماد
بمعنى انه يسهر عليك استخدامه لاكثر من امر واكثر من طريقة
وليس ليكون على شكل واحد يستخدم عند الاستدعاء
فلاحظ فى الـ function الذى فعلته يمكنك استخدامه فى كل زر بطريقة
يقوم بعرض شئ يختلف عن الزر الاخر
مثل عرض فارق التاريخ لاستخراج العمر بين تاريخين
مثل عرض فارق التوقيت بالدقائق فقط او الثواني فقط
مثل عرض فارق التوقيت بين ساعة ودقيقة
...... الخ من ايام وسنين واشهر واسابيع وكذلك النسبة

فهنا انت المتحكم فى كل زر ما تريد اظهاره
بينما فى كوده اصبح مجبر اظهار النسبة مهما استخدمته فى اكثر من حدث

اتمنى ان تكون الصورة وضحت امامك كاملاً
وان يكون الامر اصبح بسيطاً وسهلاً معك

ولو فى اى سؤال اى استفسار فى الكود ابشر به وسافيدك بامر الله

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد
#5
اخي الجوكر شكرا جزيلا و ازادك الله علما
لدي استفسار بسيط 

هل من الافضل حفظ وقت العمل في قاعدة البيانات بالنسبة المئوية
ام على شكل وقت كما تفضلت بالشرح ؟؟

فمثلا حاليا انا اخزن بالنسبة المئوية وهذا يساعدني ببساطه على ارجاع مجموع الساعات لشهر معين
فانفرض انة قمت بتخزينها على شكل double كما تفضت والنفرض 6.40 عند استرجاع المجموع في ال query
سيتعامل معها على اساس رقم عشري كالاتي:

6.40 + 0.60 = 7
مع العلم اننا نتعامل مع الوقت وهو ينتهي عند ٦٠ وليس ١٠٠

هذا الشيء الوحيد المحيرني حاليا هل هو اسهل للتعامل مع الوقت كنسبة مئوية ام كوقت عادي ساعات و دقائق.

المشكله الحالية الان بالتعامل مع النسبة المئوية انها غير مفهومة جيدا بالنسبة للمستخدم عند عرضها للمستخدم 
في ال gridview مثلا، يعني لو كان الوقت بالنسبة المئوية 6.20 هي ليست 6 ساعات و 20  دقيقة، لكن المستخدم سيفهما هكذا.

السؤال الاساسي من كل هذا.
هل افضل ان اقوم بالبقاء على النسبة المئوية ام احول الكود ليخزنها كوقت؟؟
 
الرد
تم الشكر بواسطة: حريف برمجة , wared
#6
الشكر لله والحمد لله
والحمد لله على كل حال

بخصوص السؤال ابسط ما يمكننى الرد عليه
اعطي لكل ذي حق حقه

بمعنى عندما نتحدث عن شئ كا وقت فيفضل ان يسجل كا وقت
وعندما نتحدث عن شئ كا نص يبقي نص وكذلك الارقام وما غيره

لان اشاهد الكثير خصوصاً فى مراحل التعليم يعتمد على 
جعل الامر نص للاعمدة حتى يرتاح البال

وبما اننا نتحدث عن وقت لعدد الساعات
وليس الوقت الفعلى ولا هو يناسب التاريخ 

لكونه الناتج النهائي من العملية الحسابية لعدد الساعات

باصح الجزء المشير اليه هنا فى هذا

إقتباس :6.40 + 0.60 = 7

مع العلم اننا نتعامل مع الوقت وهو ينتهي عند ٦٠ وليس ١٠٠


وهو غير صحيح لانك بعد جلب عدد الساعات لم تقوم بعملية جمع ولا طرح
واذا قلنا احتمالية يتم عملية الطرح والجمع لاسباب مثل عدد الساعات الاضافية وما شبه

ولكنها كان من الاحق انها تتم فى كود الـ function بهذا السطر 
كود :
          myTime = (stopTime - startTime) + TimeSpan.FromMinutes(60);

والـ 60 هنا يشير الى الدقائق
يعنى لو كان عندك وقت مثل 6:40 فهنا عليك عمل 6*60 + 40
ليصبح الاجمالى هو 400 يضع بدلاً من 60
طيب على الامور الواقع كيفق سيكون الكود

تعال كده على كود الـ function واستبدل القديم بهذا
كود :
       public TimeSpan GetHours(DateTime startTime, DateTime stopTime, int addTime = 0)
       {
           TimeSpan myTime = new TimeSpan();
           myTime = stopTime - startTime;
           myTime = myTime + TimeSpan.FromMinutes(addTime);
           return myTime;
       }

طبعاً مش محتاج الشرح انت ستلاحظ ما تم اضافته
عن الكود فى الرد السابق

الان ناتى على كود الاستخدام فى الحدث
ناتى فى الكود الاول وهو عندما يكون الكود بدون اى اضافات للوقت الرئيسي

سيكون الاستخدام بهذا الشكل
كود :
           TimeSpan GetTime = new TimeSpan();
           DateTime srtTime = Convert.ToDateTime("10:00");
           DateTime stpTime = Convert.ToDateTime("16:40");
           GetTime = GetHours(srtTime, stpTime);

           MessageBox.Show(GetTime.Hours + ":" + GetTime.Minutes);

لو تلاحظ انه لا يوجد اى فرق ولا تغيير عن الكود فى ردى السابق
وعند اختبار الكود ستجد ان عدد الساعات الناتج هو 6:40

طيب لو حبينا نعمل اضافة عدد الساعات والدقائق الاضافية
كل ما عليك فعله هو التالى جلب اجمالى عدد الدقائق من الوقت المطلوب اضافته

ليتم وضعه واستخدامه كالتالى
كود :
           TimeSpan GetTime = new TimeSpan();
           DateTime srtTime = Convert.ToDateTime("10:00");
           DateTime stpTime = Convert.ToDateTime("16:40");
           GetTime = GetHours(srtTime, stpTime, 60);

           MessageBox.Show(GetTime.Hours + ":" + GetTime.Minutes);

بما انك قلت فى الرد السابق +0.60
فلاحظ استخدمت الـ 60 وهى تعنى ساعة كاملة

عند المعينة والاختبار ستجد الناتج بالنهاية هو  7 ساعات و 40 دقيقة 
بدلاً من 6 ساعات و 40 دقيقة

ناتى بالنهاية كيف يتم حفظ القيمة فى قاعدة البيانات
هل استخدم نوع العمود تاريخ ووقت او اختار نص او رقم

طبعاً انا احبب دائماً الاستخدام لما هو يعنى لانه سيفيد وسيسهل الامور كثيراً
خصوصاً فى التقارير قبل الفورم

فعند عمل الحفظ فى قاعدة البيانات بعمود من نوع تاريخ ووقت
فيجب عليك ان تحدد نوع التنسيق لخصائص العمود فاذا كنت تستخدم الـ Access
فان تجعل النوع هو Short Time 
حتى تتجنب مشكلة وجود التاريخ والثواني وكذلك رمز صباحاً ومساءاً

وبكدة ستكون حليت المشكلة تماماً
ويبقي الشئ الاخير عند عرضها فى التقارير وهو ظهور التاريخ مع الوقت لعدد ساعات العمل
كل ما عليك تعدل خصائص الـ Text فى التقارير وتعطي نوع وقت فقط وبكدة تكون انهيت الامر

اعلم ان الشرح كثيراً وقد تحس بمتاهة
بس عيد مرة واتنين قراءة الامر ستوضح الامر كلياً لك وستتعلم منه بامر الله

من السهل ان اعطي رداً بحل يخلصك لما تريد
ولكن العلم ليس من السهل ان تجده فى احد ان يعطيك ايه بدون مقابل

فالحمد لله على كل حال

بناء مشروع بصورة صحيحة
يجعلك فخوراً من نفسك اولاً
ويجعل الامر معك بسيطاً وسهلاً فى التعديل والتطوير به

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد
تم الشكر بواسطة: Rabeea Qbaha , wared , wared
#7
شكرا جزيلا اخي ووفقك الله
ساقوم بتعديل المشروع للعمل بالطريقة الأصح
الرد
تم الشكر بواسطة: elgokr , wared
#8
الشكر لله والحمد لله
والحمد لله على كل حال

تحياتى لك
وتمنياتى لك التوفيق
{ وَقُل رَّبِّ زِدْنِي عِلْمًا }
[ كن على يقين من اعمالنا نخطئ ومن اخطائنا نتعلم ولذلك لا شي مستحيل ]

ساهم دائماً فى    لكل من يقوم بالمساهمة
فى حل المشكلة او الاستفسار لديك فالجميع هنا يعمل 
على مساعدة الاخرين لوجه الله وان تحتسب له اجر عند الله


 شرح كيفية عمل قاعدة بيانات تعمل على اكثر من جهاز على الشبكة الداخلية
الرد
تم الشكر بواسطة: Rabeea Qbaha , wared



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم