اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

الردود الموصى بها

قام بنشر

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

 

ممكن من خلال الكود التالى  فى وحده نمطية عامة مثلا باسم : basGetDatesBetween

Public Function GetDatesBetween(ByVal dtmStartDate As Date, ByVal dtmEndDate As Date) As String
    If dtmStartDate > dtmEndDate Then
        GetDatesBetween = ""
    Exit Function
    End If
    
    Dim dtmCurrentDate As Date
    Dim arrDates() As String
    ReDim arrDates(0 To DateDiff("d", dtmStartDate, dtmEndDate))
    Dim lngIndex As Long
    For dtmCurrentDate = dtmStartDate To dtmEndDate
        arrDates(lngIndex) = Format(dtmCurrentDate, "yyyy-mm-dd")
        lngIndex = lngIndex + 1
    Next dtmCurrentDate
    GetDatesBetween = Join(arrDates, " | ")
End Function

على ان يكون الاستدعاء فى الاستعلام لعمل حقل التواريخ بالشكل التالى
 

DateList: GetDatesBetween([startA],[endA])

لتكون جملة الاستعلام كاملة كما يلى

SELECT 
    tbl1.user_id, 
    GetDatesBetween([startA], [endA]) AS DateList
FROM 
    tbl1;

ويمكن خفظ الاستعلام مثلا باسم : qryUserDateList

لا اعرف هل الفكرة تلبى الطلب ام لا


خطر على بالى ايضا اضفة استعلام جديد يعتمد على الاستعلام السابق
لنعط مثلا للاستعلام الجديد اسم qryFilteredDates
وتكون جملة الاستعلام بالشكل التالى 

 

SELECT *
FROM qryUserDateList
WHERE DateList LIKE "*" & Format([InbutFromDate], "yyyy-mm-dd") & "*"
    OR DateList LIKE "*" & Format([InbutToDate], "yyyy-mm-dd") & "*";

 

أو مثلا لو أردنا تمرير التواريخ من نموذج 

SELECT *
FROM qryUserDateList
WHERE DateList LIKE "*" & Format(Forms!frmSearch!txtFromDate, "yyyy-mm-dd") & "*"
    OR DateList LIKE "*" & Format(Forms!frmSearch!txtToDate, "yyyy-mm-dd") & "*";

وظيفة الاستعلام الاخير qryFilteredDates
أذا كنا نريد البحث في DateList إن كانت تحتوي على أي تاريخ بين النطاقين

وذلك لأنه لا يمكن تصفية نتيجة دالة GetDatesBetween بشكل مباشر باستخدام WHERE

 

قام بنشر

تمام ابا جودي

الفكرة هي اني استبعد انشاء جدول من العملية

باقي تكة

1- ان تكون النتيجة كسجلات  ومرتبطة بالمعرف

يعني المعرف 11 يكون له 4 تواريخ فوق بعض  والمعرف 22 امامه تاريخ واحد

وتسلم يالغالي والف شكر .. 

  • Thanks 1
قام بنشر

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

  • ابوخليل changed the title to هل يمكن العرض في قائمة واحدة في استعلام تواريخ بين تاريخين من حقلين في جدول باستخدام SELECT فقط
قام بنشر

اذا لا يوجد حل .. او انه غير منطقي .. نلجأ الى شيء آخر يساعدنا

في المثال جدول tbl2  المساعد

يحتوي على تواريخ عدة

الآن اريد النتيجة في الاستعلام .. اظهار جميع التواريخ التي في tbl2  وما يتفق معها من جدول1

اريد المعرف وحقل تاريخ

يعني المعرف 11 يظهر له 4 سجلات  من 2/7 / الى  5/7  وسبب ظهورها هو ان لها ما يقابلها في جدول2

اعتذر اذا شرحي مش ولا بد 

Database2.rar

  • Thanks 1
  • تمت الإجابة
قام بنشر
17 دقائق مضت, ابوخليل said:

يعني المعرف 11 يظهر له 4 سجلات  من 2/7 / الى  5/7  وسبب ظهورها هو ان لها ما يقابلها في جدول2

 

اذا الموضوع اسهل الان بوجود هذا الجدول المساعد

مباشرة وبدون اى اكواد ممكن عمل الاستعلام التالى 
 

SELECT tbl1.user_id, tbl2.dateField
FROM tbl1, tbl2
WHERE (((tbl2.dateField) Between [tbl1].[startA] And [tbl1].[endA]))
ORDER BY tbl1.user_id, tbl2.dateField;

 

ممكن الجدول المساعد tbl2
يتم عمل البيانات بداخله ديناميكا ليحتوى على كل تواريخ العام منذ بداية العام الى نهايته مثلا من خلال الكود التالى

Public Sub PopulateDateTable(Optional ByVal dtmStartDate As Date = 0, Optional ByVal dtmEndDate As Date = 0)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim dtmDate As Date
    Dim lngYearNow As Long

    ' الحصول على السنة الحالية
    lngYearNow = Year(Date)

    ' تعيين القيم الافتراضية إذا لم يتم تمريرها
    If dtmStartDate = 0 Then dtmStartDate = DateSerial(lngYearNow, 1, 1)
    If dtmEndDate = 0 Then dtmEndDate = DateSerial(lngYearNow, 12, 31)

    ' التأكد أن التاريخين صالحين
    If dtmStartDate > dtmEndDate Then
        MsgBox "تاريخ البداية أكبر من تاريخ النهاية!", vbExclamation
        Exit Sub
    End If

    Set db = CurrentDb

    ' مسح البيانات القديمة
    db.Execute "DELETE FROM tbl2", dbFailOnError

    ' فتح الجدول للإضافة
    Set rs = db.OpenRecordset("tbl2", dbOpenDynaset)

    ' ملء السجلات
    For dtmDate = dtmStartDate To dtmEndDate
        rs.AddNew
        rs!dateField = dtmDate
        rs.Update
    Next dtmDate

    ' تنظيف الموارد
    rs.Close
    Set rs = Nothing
    Set db = Nothing

    MsgBox "تم توليد التواريخ من " & Format(dtmStartDate, "yyyy-mm-dd") & " إلى " & Format(dtmEndDate, "yyyy-mm-dd"), vbInformation
End Sub

 

  • Like 1
  • Thanks 1
قام بنشر

طيب دى فكرة تانى لو لا تريد عمل جداول مؤقته او حتى جدول ثابت لمعالجة موضوع التواريخ
وان كنت لا تريد كذلك الاعتماد على جداول مساعدة كالجدول الاخير : tbl2

الكود 

Public Sub GenerateSafeUnionQuery()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim dtmStart As Date, dtmEnd As Date, dtmCurrent As Date
    Dim lngUserID As Long
    Dim strSQL As String
    Dim strOneLine As String
    Dim bolFirst As Boolean

    Set db = CurrentDb
    Set rs = db.OpenRecordset("SELECT user_id, startA, endA FROM tbl1", dbOpenSnapshot)

    bolFirst = True

    Do Until rs.EOF
        lngUserID = rs!user_id
        dtmStart = Nz(rs!startA, 0)
        dtmEnd = Nz(rs!endA, 0)

        If IsDate(dtmStart) And IsDate(dtmEnd) And dtmStart <= dtmEnd Then
            For dtmCurrent = dtmStart To dtmEnd
                ' استخدام جدول فعلي لتجنب التكرارات
                strOneLine = "SELECT " & lngUserID & " AS user_id, #" & Format(dtmCurrent, "yyyy-mm-dd") & "# AS dateField FROM (SELECT TOP 1 * FROM tbl1)"

                If bolFirst Then
                    strSQL = strOneLine
                    bolFirst = False
                Else
                    strSQL = strSQL & vbCrLf & "UNION ALL" & vbCrLf & strOneLine
                End If
            Next dtmCurrent
        End If

        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing

    ' حذف الاستعلام القديم (لو موجود)
    On Error Resume Next
    db.QueryDefs.Delete "qryUnioUserDates"
    db.QueryDefs.Delete "qryFinalUserDates"
    On Error GoTo 0

    ' إنشاء الاستعلام الأساسي UNION
    db.CreateQueryDef "qryUnioUserDates", strSQL

    ' إنشاء استعلام مبني عليه
    db.CreateQueryDef "qryFinalUserDates", "SELECT * FROM qryUnioUserDates;"

    ' إظهار الاستعلام مباشرة
    DoCmd.OpenQuery "qryFinalUserDates", acViewNormal

    MsgBox "تم إنشاء الاستعلامين بنجاح، والاستعلام النهائي تم فتحه.", vbInformation
End Sub

طبعا الاستدعاء للدالة GenerateSafeUnionQuery
يقوم بعمل استعلامين بشكل ديناميكى 
الاساسى : qryUnioUserDates
ومبنى عليه الاستعلام الثانى : qryFinalUserDates
والذى نتيجته كما هو مطلوب تماما

ولكن يعيب هذه الفكرة شئ واحد
لابد من استدعاء الداله دائما : GenerateSafeUnionQuery مع اى تحديث يتم على الجدول : tbl1



----------------------------

أفكار أخرى لا تعتمد على جدول مساعد او جدول مؤقت او حتى جدول ثابت
الكود الاساسى فى وحده نمطية عامة

Private Const adInteger = 3
Private Const adDBTimeStamp = 135
Private Const adOpenStatic = 3
Private Const adLockOptimistic = 3

Public Function GetSplitDatesRecordset() As Object
    Dim db As DAO.Database
    Dim rsSource As DAO.Recordset
    Dim rsTemp As Object
    Dim arrDates() As String
    Dim i As Long
    Dim lngUserID As Long
    Dim strDates As String

    Set rsTemp = CreateObject("ADODB.Recordset")
    rsTemp.Fields.Append "user_id", adInteger
    rsTemp.Fields.Append "SingleDate", adDBTimeStamp
    rsTemp.CursorType = adOpenStatic
    rsTemp.LockType = adLockOptimistic
    rsTemp.Open

    Set db = CurrentDb
    Set rsSource = db.OpenRecordset("SELECT user_id, GetDatesBetween([startA], [endA]) AS DateList FROM tbl1", dbOpenSnapshot)

    Do While Not rsSource.EOF
        lngUserID = rsSource!user_id
        strDates = Nz(rsSource!DateList, "")
        
        If Len(strDates) > 0 Then
            arrDates = Split(strDates, " | ")
            For i = LBound(arrDates) To UBound(arrDates)
                If IsDate(arrDates(i)) Then
                    rsTemp.AddNew
                    rsTemp!user_id = lngUserID
                    rsTemp!SingleDate = CDate(arrDates(i))
                    rsTemp.Update
                End If
            Next i
        End If
        rsSource.MoveNext
    Loop

    rsSource.Close
    Set rsSource = Nothing
    Set db = Nothing

    If Not rsTemp.EOF Then rsTemp.MoveFirst
    Set GetSplitDatesRecordset = rsTemp
End Function

Public Sub LoadDatesIntoForm(frm As Object)
    Dim rs As Object
    Set rs = GetSplitDatesRecordset()

    If rs.EOF Then
        MsgBox "لا توجد تواريخ!", vbExclamation
        Exit Sub
    End If
    
    If TypeOf frm Is Form Then
        Set frm.Recordset = rs
    ElseIf TypeOf frm Is Access.SubForm Then
        Set frm.Form.Recordset = rs
    End If
End Sub


Public Sub LoadDatesIntoListBox(frm As Form, strListBoxName As String)
    Dim rs As Object
    Dim strRowSource As String
    Dim ctl As Control
    
    Set ctl = frm.Controls(strListBoxName)
    Set rs = GetSplitDatesRecordset()

    If rs.EOF Then
        ctl.RowSource = ""
        Exit Sub
    End If

    Do Until rs.EOF
        strRowSource = strRowSource & rs!user_id & ";" & Format(rs!SingleDate, "yyyy-mm-dd") & ";"
        rs.MoveNext
    Loop

    ctl.RowSourceType = "Value List"
    ctl.ColumnCount = 2
    ctl.ColumnWidths = "2cm;3cm"
    ctl.RowSource = strRowSource
End Sub

ولكن تعتمد على احدى الحيلتين
الاولة نموذج مستمر غير منضم به حقلين
الاول  : txtuserId   
الثانى: txtSingleDate  
وعند تحمل النموذج نستخدم الاستدعاء التالى 

 

Private Sub Form_Load()
    Me.txtuserId.ControlSource = "user_id"
    Me.txtSingleDate.ControlSource = "SingleDate"
    LoadDatesIntoForm Me
End Sub



الحيلة الثانية نموذج غير منضم به مربع قيم مثلا باسم : lstDates
وعند تحمل النموذج نستخدم الاستدعاء التالى 

 

Private Sub Form_Load()
    LoadDatesIntoListBox Me, "lstDates"
End Sub



هذا كل ما خطر على بالى من افكار 


 

قام بنشر
6 ساعات مضت, ابوخليل said:

السلام عليكم

 

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

على سبيل اني فهمت الفكرة ، هل هذه النتيجة المطلوبة ؟؟

 
المعرف dateField
11 2025-07-02
11 2025-07-03
11 2025-07-04
11 2025-07-05
22 2025-07-04

 

كما في مشاركة أستاذي @ابو جودي ؟؟

2 ساعات مضت, ابو جودي said:
SELECT tbl1.user_id, tbl2.dateField
FROM tbl1, tbl2
WHERE (((tbl2.dateField) Between [tbl1].[startA] And [tbl1].[endA]))
ORDER BY tbl1.user_id, tbl2.dateField;

 

قام بنشر

طيب استاذى الجليل ومعلمى القدير و والدى الحبيب الاستاذ @ابوخليل :fff:

يبدو ان الفكرة هذه تخص
تسجيل اجازة او مأمورية او تدريب او شئ من هذا القبيل بين فترين

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

 

ولكن ولكن لكن 

وبناء على تجارب عملية

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

 

الميزة والافضلية

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

لنعطى مثال صغير وهذا طبقته بشكل عملى فى مؤسستى 

لنفترض ان موظف ما قدم طلب اجازة اعتيادية مثلا من يوم 1/7/2025 وحتى 10/7/2025
تتم عملية التسجيل لكل تاريخ سجل منفرد بكود الموظف والتاريخ ونوع اليومية مع استبعاد ايام العطلات من اللوب سواء كانت رسمية او غير رسمية

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

طيب لفترض ان الموظف اخذ فقط يومين وقطع الاجازة وعاد الى العمل ولم يخبر المختص لاعادة التعديل لأى سبب حتى يتم اعادة ضبط الرصيد وفق الواقع

انا صممت استعلام يبدأ مع فتح نموذج التسجيل يطابق هذا الجدول مع جدول الحضور الخاص بالبصمة و وفق التواريخ التى لها بصمة حضور وتساوت مع تواريح فى جدول اليوميات مثلا على انها اجازة يتم حذفها تلقائيا من جدول الاجازات 

بذلك يتم تصحيح الرصيد بشكل الى وبدون تدخل بشرى :wink2:

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

قام بنشر

 

3 ساعات مضت, ابوخليل said:

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

وخطر لي حيلة يمكن تكون غريبة نوعاً ما .. وهي كما في الاستعلام التالي :-

SELECT tbl1.id, tbl1.user_id, tbl1.startA, tbl1.endA, IIf(DateDiff("d",[startA],[endA])>=0,Format([startA],"yyyy-mm-dd"),"") & IIf(DateDiff("d",[startA],[endA])>=1,"," & Format([startA]+1,"yyyy-mm-dd"),"") & IIf(DateDiff("d",[startA],[endA])>=2,"," & Format([startA]+2,"yyyy-mm-dd"),"") & IIf(DateDiff("d",[startA],[endA])>=3,"," & Format([startA]+3,"yyyy-mm-dd"),"") & IIf(DateDiff("d",[startA],[endA])>=4,"," & Format([startA]+4,"yyyy-mm-dd"),"") AS التواريخ
FROM tbl1;

والنتيجة :-

 

Query3
id المعرف بداية نهاية التواريخ
1 11 2025-07-02 2025-07-05 2025-07-02,2025-07-03,2025-07-04,2025-07-05
2 22 2025-07-04 2025-07-04 2025-07-04

 

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

قام بنشر
9 دقائق مضت, Foksh said:

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

من أجل ذلك كتبت الكود بالشكل ده يا استاذ فؤش :rol:

Public Function GetDatesBetween(ByVal dtmStartDate As Date, ByVal dtmEndDate As Date) As String
    
    If dtmStartDate > dtmEndDate Then
        GetDatesBetween = ""
        Exit Function
    End If
    
    Dim dtmCurrentDate As Date
    Dim arrDates() As String
    
    ReDim arrDates(0 To DateDiff("d", dtmStartDate, dtmEndDate))
    Dim lngIndex As Long
    
    For dtmCurrentDate = dtmStartDate To dtmEndDate
        arrDates(lngIndex) = Format(dtmCurrentDate, "yyyy-mm-dd")
        lngIndex = lngIndex + 1
    Next dtmCurrentDate
    
    GetDatesBetween = Join(arrDates, " | ")
    
End Function


 

قام بنشر

 

5 دقائق مضت, ابو جودي said:

من أجل ذلك كتبت الكود بالشكل ده يا استاذ فؤش :rol:

 

مهو برضو ممكن يكون الحل كالآتي :-

Public Function FokshDates(startD As Date, endD As Date) As String
    Dim d As Date, s As String
    For d = startD To endD
        s = s & Format(d, "yyyy-mm-dd") & ","
    Next
    If Len(s) > 0 Then s = Left(s, Len(s) - 1)
    FokshDates = s
End Function

والإستعلام الصغير ده :-

SELECT tbl1.id, tbl1.user_id, tbl1.startA, tbl1.endA, FokshDates([startA],[endA]) AS التواريخ
FROM tbl1;

والنتيجة :-

 

Query2
id المعرف بداية نهاية التواريخ
1 11 2025-07-02 2025-07-05 2025-07-02,2025-07-03,2025-07-04,2025-07-05
2 22 2025-07-04 2025-07-04 2025-07-04

 

مجرد تفكير بصوتك ، لأنه بجد فاضل تكة :wavetowel:

 

هي بسيطة ، وانت عارفني ما بحبش أفوت في تفاصيل قد تكون بعيدة ,,

قام بنشر
3 دقائق مضت, Foksh said:

مجرد تفكير بصوتك ، لأنه بجد فاضل تكة :wavetowel:

يا فؤش افندى لا يعيب الكود كثرة الاسطر أو طوله

انت استخدمت : سلسلة مباشرة
انا استخدمت : مصفوفة ثم Join واستخدمت شرط للتحقق من البداية والنهاية

واعتقد ان (مصفوفة ثم Join) : أسرع وأكثر كفاءة عند كثرة التواريخ (المصفوفة أفضل من تجميع نصي مباشر)

غير كده مفيش أى فروقات تانى عير الفاصلة :eek2:  فــ إيه بئه أنا مش فاهم :wallbash:

 

 
  • Haha 1
قام بنشر
1 دقيقه مضت, ابو جودي said:

يا فؤش افندى لا يعيب الكود كثرة الاسطر أو طوله

انا عارف والله ان فكرتك أسرع من فكرتي لما يكون الفرق بين التاريخين كبير ..

وعارف ان استخدامك للمصفوفة أفضل لأنه ببنيها مرة وحدة وبعدين يجمعها كلها مرة وحدة برضو ، على عكس فكرتي لأن السلسة التراكمية اللي استعملتها يتم بناءها كل مرة ,,,

:rol: ، انا لقيت نفسي فاضي ، قلت أحاول أتعب دماغي شوية واحاول انام 😴

  • Haha 2
قام بنشر
6 دقائق مضت, Foksh said:

:rol: ، انا لقيت نفسي فاضي ، قلت أحاول أتعب دماغي شوية واحاول انام 😴

انت تقصد لاقيت نفسك فاضى

قلت فى عقل بالك تعمل ايه تعمل ايه يا واد فؤش

اه الواد او جودى هنا وعمال يخبط دماغه فى الحيط ..  اسيبــه ؟!  .... 

لا ... اروح اعمل له Error  فى دماغه بزياده قبل ما يروح على شغله وبعدين ادخل انام

عاش عليك يا فؤش :wallbash:

خلاااااااااااااااااااص مباقاش فاضل تكـــــــــه بح خلاص على ايدك يا فؤش أفندى خلصت التكـه

  • Haha 2
قام بنشر
3 دقائق مضت, ابو جودي said:

خلاااااااااااااااااااص مباقاش فاضل تكـــــــــه بح خلاص على ايدك يا فؤش أفندى خلصت التكـه

خلاااااص !!

دلوقتي ارتحت ، وأقدر أنسحب بهوووووووووء وانام مرتاح البال والضمير :biggrin:

  • Haha 2
قام بنشر
4 دقائق مضت, Foksh said:

دلوقتي ارتحت

ههههههههههههه

أنت أرتحت وأنا خلاص على ايدك خلصت التكـه و وصلت لآخر السكـة

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

  • Haha 1
قام بنشر
6 ساعات مضت, ابو جودي said:

اذا الموضوع اسهل الان بوجود هذا الجدول المساعد

مباشرة وبدون اى اكواد ممكن عمل الاستعلام التالى 

هذا هو الحل النموذجي  .. خاصة مع فكرة ادراج ايام السنة

وعند دخول السنة الجديدة سيتم آليا تحديث الجدول .. بشرط اخذ نسخة قبل التحديث  ..

اقتباس

ولكن ولكن لكن 

وبناء على تجارب عملية

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

فكرتي : اننا لسنا بحاجة لعرض هذه تواريخ الاجازات وغيرها مع سجلات الحضور .. فقط نريد العدد

والعدد سيكون مرن فيما لو تم قطع الاجازة او الاضافة عليها .. سيكون هذا العدد خاصا فيما يتم حصره بين تاريخين

اما الاطلاع على سجل الاجازات والندب فمن مكان آخر 

سأعرض فكرتي في مخرجات التقرير :

معرف/ الفترة من الى / عدد ايام العمل المقررة على الموظف / مجموع ساعات العمل المقررة / عدد ايام الحضور / عدد ايام الغياب / عدد ايام الاجازات والندب/ عدد حالات معالجة ترك توقيع الانصراف/  عدد ساعات التأخر  / عدد ساعات العمل الفعلية

هذا التقرير افقي جدولي مبني على استعلام كخلاصة نتيجة شهر مثلا ( الشهر عند المستفيد من هذا المشروع يبدا من منتصف الشهر الى منتصف الشهر التالي)

من اراد التفاصيل كالاطلاع على الاجازات المعتمدة او ايام الندب .. او ايام الغياب او حلاات المعالجة او سجلات التأخر .. فيمكن عرض ذلك بالتفصيل بعيدا عن الخلاصة

كل هذا بدون استخدام اي جدول مؤقت مطلقا ..

قام بنشر
8 ساعات مضت, ابو جودي said:
SELECT tbl1.user_id, tbl2.dateField
FROM tbl1, tbl2
WHERE (((tbl2.dateField) Between [tbl1].[startA] And [tbl1].[endA]))
ORDER BY tbl1.user_id, tbl2.dateField;

فكرة جميلة يا ابو جودي :clapping:

انا كان في بالي نعمل استعلام1 لأول تاريخ، ثم استعلام2 للتاريخ الثاني، ثم استعلام3 union نجمع نتائج الاستعلامين.

 

قام بنشر (معدل)

بالفعل أستاذ جعفر أفضل حل هو عمل

 union query

  و لقد استخدمت بالفعل هذا الاستعلام لنفس الغرض الذي صرح به الاستاذ أبو خليل و الحمد لله ادي المطلوب بكفاءة 

 

تم تعديل بواسطه mohammed farhat
قام بنشر
25 دقائق مضت, jjafferr said:

فكرة جميلة يا ابو جودي :clapping:

انا كان في بالي نعمل استعلام1 لأول تاريخ، ثم استعلام2 للتاريخ الثاني، ثم استعلام3 union نجمع نتائج الاستعلامين.

 

انا الذي يهمني عدد السجلات فقط حسب اليوزر

عملته كما هو  كجملة  داخل الكود

قام بنشر

فكرة ابو جودي هي الافضل،

وللعلم ، فجدول 2 لا يمكن يكون اكثر من ايام السنة 365 سجل ، 

وقد جربت هذه الطريقة بدل 365 ، جربت 3,000,000 وكانت سريعة ، وكانت السرعة ممتازة:

image.png.18dab39b2605e36fcdfcb0edee01f094.png

.

image.png.28fc7d6a2086f24f2e6d103921ff783c.png

.

Speed.gif.ca66b614a26f311d2dcb834e5dfb4706.gif

قام بنشر

تمام 

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

وهي عرض الحالات من جدول الحضور (الحضور والغياب ) فقط

سيتم عرض الأيام المستهدفة .. كل معرف وايام عمله الفعلية مع استبعاد عطلة نهاية الاسبوع ( لكل معرف عطلته الخاصة)

السجلات الفارغة = غياب  .. وسيظهر ( العدد )في الخلاصة وبجانبها عدد ايام الاجازة (ان كان يتمتع باجازته)

الخلاصة النهائية عبارة عن ارقام  فقط + المعرف .. والفترة من/الى تكون في رأس الخلاصة

من اراد تفاصيل الاجازات وتفاصيل التأخر يمكنه ذلك باستعلامات اخرى يتم عرضها من المكان نفسه ( نموذج التقارير)

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information