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

احتاج مساعده فى عمل فلتر للتواريخ

بدأه misho3333 في 13 فبراير 2013 · 20 رد · 1,144 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله وبركاته 

 

انا عندى حقل فى جدول بالداتا بيز بياناته كالاتى مثلا

 

 

13/01/2013 08:15ص

13/01/2013 08:17ص

 

13/01/2013 08:20ص

13/01/2013 04:49م

13/01/2013 04:50م

14/01/2013 08:49ص

14/01/2013 04:49م

15/01/2013 08:30ص

15/01/2013 08:35ص

15/01/2013 04:50م

16/01/2013 08:49ص

16/01/2013 05:00م

17/01/2013 09:00ص

17/01/2013 06:00م

18/01/2013 08:22ص

18/01/2013 08:23ص

 

 

 

والبيانات دى عباره عن مواعيد الحضور والانصراف لاحد الموظفين فى فتره معينه من ماكينه البصمه والمشكله ان هذا الموظف  بيبصم اكتر من مره سواء بالخطا او غيره اثناء الحضور مثلا او اثناء الانصراف زى يوم 13 ويوم 15 ويوم 18 ودلوقتى انا عايز احسبله ايام حضوره الفعليه فى الفتره دى  عن طريق حساب عدد الايام الى باصم فيها الصبح مثلا

cmd.commandtext="select * from chektime where chekinout between " & cd1 & " , " & cd2 & " and chekinout like '%ص%'

 

حيث cd1,cd2 متغيرات بتكون فيها الايام الى انا ببحث فيها

 

ولما بنفذ الكود بيطلع صح ومفيهوش مشكله لكن المشكله انه بيحسب الايام الى باصم فيها اكتر من مره الصبح وبكده بيزود عدد ايام حضوره وحاولت انى اعمل group by بس بيدينى error ومش عارف ازاى اخليه يحسبها

#2

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

  1. إذا كانت قاعدة البيانات سيكوال سيرفر فاستخدم الاستعلام التالي :
    Select  cast(floor(cast(dateColumn as float)) as datetime)  As TheMonth , Count(*) As TheCount  From myTable
    Group by cast(floor(cast(dateColumn as float)) as datetime)
    Order by cast(floor(cast(dateColumn as float)) as datetime)

     

  2. الفكرة هي عمل Group by  على حقل التاريخ بعد إزالة الوقت منه (Truncate Datetime sql server) .

  3. حاول استخدام البارمترات أفضل كي لا تحصل مشاكل في تنسيق التاريخ :

    OleDbCommand cmd = new OleDbCommand("Select * From myTable Where dateCol  BETWEEN  @dt1 AND @dt2 " , conn);
    cmd.Parameters.Add("@dt1", OleDbType.Date).Value = dt1;
    cmd.Parameters.Add("@dt2", OleDbType.Date).Value = dt2;

     

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

مشكور على الرد بس هى قاعده البيانات acess  

بس ازاى اقدر اعمل group by على اساس التاريخ فقط على الرغم من الحقل فيه التاريخ والساعه مع بعض لرجو التوضيح ولك جزيل الشكر

#4

أخي لم تستخدم GROUP BY  بإمكانك استخدام تابع MIN  ليحضر لك أول قراءة من كل يوم

 

وأما إذا أردت التعامل مع الحقول على أساس التاريخ وتجاهل الوقت فاستخدم تابع التحويل CAST  إلى النوع

date فقط

 

شاهد مثال التحويل في آخر الصفحة التالية واحتر النوع المناسب

http://technet.microsoft.com/en-us/library/ms187819.aspx

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 13 فبراير 2013 في 22:54

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#5

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

أبو أحمد المبرمج كتب:

أخي لم تستخدم GROUP BY  بإمكانك استخدام تابع MIN  ليحضر لك أول قراءة من كل يوم

 

وأما إذا أردت التعامل مع الحقول على أساس التاريخ وتجاهل الوقت فاستخدم تابع التحويل CAST  إلى النوع

date فقط

 

شاهد مثال التحويل في آخر الصفحة التالية واحتر النوع المناسب

http://technet.microsoft.com/en-us/library/ms187819.aspx

حاول تغيير إصدار المقالة إلى 2005 (من السهم other versions ) ستجد أنه لا يوجدنمط بيانات date  .

 

هو يريد :

 

اقتباس

حساب عدد الايام الى باصم فيها الصبح مثلا

و لا اعتقد انه يمكن إيجدا ذلك دون Group  .. حيث أن المشكلة انه قد يتم البصم أكثر من مرة في اليوم و لكن في النهاية كلها تحتسب يوم عمل واحد زز ارجو ان اكون فهمت المشكلة بشكل صحيح .

في الأكسس يكون الاستعلام بطريقة :

SELECT DateValue(birthDate)  AS TheDate , Count (*) AS TheCount
FROM Employee
GROUP BY DateValue(birthDate) 
ORDER BY DateValue(birthDate)

حيث أن الدالة DateValue تعطي قيمة التاريخ فقط و تهمل الوقت .

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 14 فبراير 2013 في 00:48

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#6

استاذ 

houssam11350_11350 انت فهمت مشكلتى بالضبط 

وانا كتبت الكود ده 

  cmd.CommandText = "create view s12 as select USERID,DateValue(CHECKTIME),CHECKTYPE from CHECKINOUT where CHECKTIME BETWEEN " & cd1 & " AND " & cd2 & " And USERID = " & t & "  and CHECKTYPE = 'I' GROUP BY DateValue(CHECKTIME)"

 

 

t ده عباره عن رقم الموظف

 

لكن هو بيدينى error 

 

You tried to execute a query that does not include the specified expression 'USERID' as part of an aggregate function.

 

وبصراحه مش فاهم معناه

تم تعديل هذه المشاركة بواسطة misho3333 في 14 فبراير 2013 في 10:26

#7

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

  1. الحقول التي توضع بعد عبارة الــ SELECT  يجب أن تكون ضمن عيارة Group  أو مطبق عليها أحد توابع التجميع مثل Count , sum , Min , Max  . مثلا :
    select USERID,DateValue(CHECKTIME),CHECKTYPE  , count(*) from CHECKINOUT     GROUP BY CHECKTYPE ,USERID ,DateValue(CHECKTIME)

     

  2. انت طالما وضعت شرط للـــ UserID  فلا داعي أبدا للـــ Group  ..
  3.  

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#8

انا مشكور كتير على المساعده انا جربت الكود وهو فعلا اشتغل بس برده مدنيش التيجه الى كنت عايزها 

 

وكان بيكرر الايام الى باصم فيها اكتر من مره 

 

وانا جربت انى استخدم كود تانى وادانى النتيجه المطلوبه 

 

الكود :

 

select DISTINCT DateValue(CHECKTIME),CHECKTYPE,USERID from CHECKINOUT where CHECKTIME BETWEEN " & cd1 & " AND " & cd2 & " And USERID = " & t & "

#9

انا بس كنت محتاج مساعده كمان 

 

هو انا لو حبيت انى اضيف شرط لجمله select بحيث انى اقدر اعرف الايام الى الموظف جه فيها خلال الفتره دى وفى نفس الوقت كان معاد الانصراف بتاعه يتراوح بعد الساعه 4 مثلا مع مراعاه نفس المشكله الى هى ان الموظف ممكن يكرر البصمه وانا عايزه يحسبلى اخر بصمه فقط 

#10

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

  1. في الانصراف يكون checktype = O
  2.  لاستخراج الساعة من التاريخ نستخدم الدالة datePart  مع الرمز h 
  3. ارجو أن يكون هذا هو المطلوب :
    "select  DISTINCT  DateValue(CHECKTIME) As theDate,CHECKTYPE,USERID from CHECKINOUT where CHECKTIME BETWEEN '" & cd1 & "' AND '" & cd2 & "' And USERID = " & t & " AND CHECKTYPE = 'O' AND DatePart('h', CHECKTIME) >= 16"

     

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#11

فعلا استاذ 

houssam11350_11350 

هذا هو المطلوب والكود اشتغل وانا متشكر جدا على المساعده

#12
misho3333 كتب:

فعلا استاذ 

houssam11350_11350 

هذا هو المطلوب والكود اشتغل وانا متشكر جدا على المساعده

لا شكر على واجب .. بالتوفيق

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 17 فبراير 2013 في 13:31

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#13

دلوقتى لو انا عايز اختار انا الوقت من خلال date time picker ميكنش ثابت زى الى فى المعادله الى فاتت بحيث انى اختار الوقت كله بالساعات والدقايق مش بالساعات بس وكتبت الكود ده علشان اجيب الوقت 

 cd4 = "'" & (DateTimePicker3.Value.ToString("T")) & "'"

 

وطلعلى الوقت فعلا الى هو مثلا 3:45:00 الى انا كنت محدده فى date time picker

 

ولما كتبت الكود بالطريقه دى 

 cmd.CommandText = "create view s13 as select  DISTINCT  DateValue(CHECKTIME) As theDate,CHECKTYPE,USERID from CHECKINOUT where CHECKTIME BETWEEN " & cd1 & " AND " & cd2 & " And USERID = " & t & "  and CHECKTIME like '%م%' and CHECKTYPE = 'O' AND DatePart('T', CHECKTIME) >= " & cd4 & ""

 

والمقصود ب T انه يجبلى الوقت كله مش الساعه بس 

 

بيدينى error 

Invalid procedure call

 

 

لما بمعل count 

 

cmd1.CommandText = "select count(*) from s13  "
        b = cmd1.ExecuteScalar
 
 

بيدينى error 

Invalid procedure call

 
وبيدينى نفس error  لما بتعامل مع الكويرى ده 
#14

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

  1. ضع خاصية الــ Format  الخاصة بالــ DateTimePicker  لتكون بالقيمة Time  .
  2. سيكون الاستعلام شبيها بمايلي :
     command.CommandText = "select  DISTINCT  DateValue(CHECKTIME) As theDate,CHECKTYPE,USERID from CHECKINOUT where TimeValue(CHECKTIME) > TimeValue(@myDate)"
            command.Parameters.Add("@myDate", OleDbType.Date).Value = DateTimePicker1.Value

     

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#15

شكرا على المساعده

#16
misho3333 كتب:

شكرا على المساعده

لا شكر على واجب .. بالتوفيق

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#17

السلام عليكم ورحمه الله وبركاته

 

انا ظهرتلى مشكله جديده ومش فاهمها 

 

انا لما عملت الكود ده كنت بجرب على بيانات شهر يناير وكانت النتائج طالعه سليمه

 

ولما حملت بيانات شهر فبراير لاقيت البرنامج بيحسب بطريقه غريبه يعنى لما بختار من اول يوم 1-2-2013

 

بلاقيه بيحسب من اول شهر يناير ولما اختار من يوم 2 -2- 2013 يحسب صح 

 

ولما مثلا اختار من يوم 11 يطلع النتيجه بصفر على الرغم من وجود بيانات 

 

 

المهم ان النتائج عندى اتلغبطت خالص ومش فاهم المشكله فى ايه 

 

 

فياريت افهم ايه هى المشكله وازاى احلها

#18

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

التاريخ 1-2-2013 هو اليوم الثاني من الشهر الأول يناير ... حسب تنسيق التاريخ في الأكسس ...

لتجاوز هكذا مشاكل استخدم البارمترات كما فعلت أنا ... و لا تستخدم طريقة : BETWEEN " & cd1 & " AND " & cd2 & "

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#19

انا لما كتبت الكود 

        cmd.CommandText = "create view s12 as select  DISTINCT  DateValue(CHECKTIME) As theDate,CHECKTYPE,USERID from CHECKINOUT where dateValue(CHECKTIME) > dateValue(@myDate)"
        cmd.Parameters.Add("@myDate", OleDbType.Date).Value = DateTimePicker1.Value

 

 

وبيدينى error

 

VIEW cannot contain a parameter.

#20
misho3333 كتب:

انا لما كتبت الكود 

        cmd.CommandText = "create view s12 as select  DISTINCT  DateValue(CHECKTIME) As theDate,CHECKTYPE,USERID from CHECKINOUT where dateValue(CHECKTIME) > dateValue(@myDate)"
        cmd.Parameters.Add("@myDate", OleDbType.Date).Value = DateTimePicker1.Value

 

 

وبيدينى error

 

VIEW cannot contain a parameter.

انت تريد تنفيذ استعلام و بالتالي لا داعي لعبارة (create view s12 as)

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#21

مشكور جدا

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