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

Foksh

أوفيسنا
  • Posts

    4525
  • تاريخ الانضمام

  • Days Won

    198

مشاركات المكتوبه بواسطه Foksh

  1. منذ ساعه, Moosak said:

    والآخر هو نفس نموذجك مع بعض الإضافات ولكن لا تزال المشكلة قائمة .. 🤷‍♂️

    فعلاً ليس هناك رد 🤣

    مش عارف إذا فكرتك اللي جربت عليها منطقية حتى اعتمدها للتعديل أم لا 😅 ، هو في منطق في هذا الكود ؟؟

    Private Sub Form_Timer()
        Me.ClockTxt.Requery
        Me.cTimeTxt.Requery
    End Sub

     

    • Confused 1
  2. 01.png.527721e335791220626cc940aee3d3ef.png

    أخواني وأساتذتي ومعلمينا ( دون استثناء )

    بعد المعاناة التي تواجه كل مبرمج أو هاوي أو محترف في التعامل مع الصور داخل آكسيس ، بوجود الترميش أو الوميض . وكنت قد طرحت تساؤلاً حول آلية تجنب هذه المشكلة عند تعامل آكسيس مع الصور داخل النماذج الحركية . خرجت بهذه الفكرة البسيطة والتي آمل أن تكون الحل الشافي لهذه المعضلة - كما عودناكم دائماً - بإيجاد الحل السحري لها .

     

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

     

    Return.png.8f6df0d380e0a3056fed63d89fe36923.png الدالة المستخدمة :-

    '**********************************************
    '***                                        ***
    '***   FFFFFF   OOO   KK KK    SSSS  HH  HH ***
    '***   FF      O   O  KK KK   SS     HH  HH ***
    '***   FFFFF   O   O  KKK      SS    HHHHHH ***
    '***   FF      O   O  KK KK     SS   HH  HH ***
    '***   FF       OOO   KK  KK  SSSSS  HH  HH ***
    '***                                        ***
    '********* Anti Flicker By Foksh 2026 *********
    
    Option Compare Database
    Option Explicit
    
    #If VBA7 Then
        Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" _
            (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
    
        Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" _
            (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    
        Private Declare PtrSafe Function SetWindowPos Lib "user32" _
            (ByVal hWnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
             ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, _
             ByVal uFlags As Long) As Long
    #Else
        Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
            (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    
        Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
            (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    
        Private Declare Function SetWindowPos Lib "user32" _
            (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
             ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, _
             ByVal uFlags As Long) As Long
    #End If
    
    Private Const GWL_EXSTYLE As Long = -20
    Private Const WS_EX_COMPOSITED As Long = &H2000000
    
    Private Const SWP_NOMOVE As Long = &H2
    Private Const SWP_NOSIZE As Long = &H1
    Private Const SWP_NOZORDER As Long = &H4
    Private Const SWP_FRAMECHANGED As Long = &H20
    
    Public Sub Form_SetComposited(ByVal frm As Access.Form, ByVal EnableIt As Boolean)
        On Error Resume Next
    
    #If VBA7 Then
        Dim h As LongPtr: h = frm.hWnd
        Dim ex As LongPtr: ex = GetWindowLongPtr(h, GWL_EXSTYLE)
    
        If EnableIt Then
            If (ex And WS_EX_COMPOSITED) = 0 Then
                Call SetWindowLongPtr(h, GWL_EXSTYLE, (ex Or WS_EX_COMPOSITED))
            End If
        Else
            If (ex And WS_EX_COMPOSITED) <> 0 Then
                Call SetWindowLongPtr(h, GWL_EXSTYLE, (ex And Not WS_EX_COMPOSITED))
            End If
        End If
    
        Call SetWindowPos(h, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_FRAMECHANGED)
    #Else
        Dim h32 As Long: h32 = frm.hWnd
        Dim ex32 As Long: ex32 = GetWindowLong(h32, GWL_EXSTYLE)
    
        If EnableIt Then
            If (ex32 And WS_EX_COMPOSITED) = 0 Then
                Call SetWindowLong(h32, GWL_EXSTYLE, (ex32 Or WS_EX_COMPOSITED))
            End If
        Else
            If (ex32 And WS_EX_COMPOSITED) <> 0 Then
                Call SetWindowLong(h32, GWL_EXSTYLE, (ex32 And Not WS_EX_COMPOSITED))
            End If
        End If
    
        Call SetWindowPos(h32, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_FRAMECHANGED)
    #End If
    
    End Sub

     

    Return.png.8f6df0d380e0a3056fed63d89fe36923.png مع ترك المساحة بالتفعيل أو التعطيل حسب الحاجة .

    بحيث يتم الاستدعاء لها في حدث عند التحميل للنموذج بهذا الأسلوب البسيط :-

    Form_SetComposited Me, True

    Return.png.8f6df0d380e0a3056fed63d89fe36923.png أو التعطيل بهذا الشكل :-

    Form_SetComposited Me, False

     

    Return.png.8f6df0d380e0a3056fed63d89fe36923.png الملف مفتوح المصدر . لمن يرغب بالتجربة على مشروعه ، فضلاً وكرماً منه بإخباري بالنتيجة أن كانت ناجحة أم لا . علماً أنه تم استخدام الفكرة نفسها في إنشاء لعبة الأونو في هذا الموضوع مسبقاً ، والنتيجة كما شاهدتموها في أداء اللعبة والتعامل مع الصور بشكل دقيق لتخرج اللعبة كتجربة دون أي ترميش أو وميض عند حركة الصور داخل النماذج .

     

    Anti Flicker.accdb

    • Thanks 1
    • Haha 1
  3. 🤔

    يعني تريد ألغاء الدمج للخلايا التي تم دمجها ، مع إعادة القيم لكل خلية !!!

    تمام ، جرب هذا الماكرو أ واستعمله في حدث عند النقر لأي زر مثلاً :-

    Sub UnMergeFoksh()
        Dim ws As Worksheet
        Dim r As Long, c As Long
        Dim mArea As Range
        Dim cellText As String
        
        Set ws = ActiveSheet
        
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        Application.Calculation = xlCalculationManual
        
        For r = 4 To 20
            For c = 2 To 36
                
                If ws.Cells(r, c).MergeCells Then
                    Set mArea = ws.Cells(r, c).MergeArea
                    cellText = ws.Cells(r, c).Text
                    mArea.UnMerge
                    mArea.NumberFormat = "@"
                    mArea.Value = "'" & cellText
                    mArea.HorizontalAlignment = xlCenter
                    mArea.VerticalAlignment = xlCenter
                End If
            Next c
        Next r
        
        Application.Calculation = xlCalculationAutomatic
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    End Sub

     

    طبعاً اعتقد انك هنا ستستغني عن حدث عند التغيير للورقة السابق .. ويصبح ملفك كالتالي للحدثين مع إضافة زرين .

     

    merge cell.xlsm

    • Thanks 1
  4. وعليكم السلام ورحمة الله وبركاته ..

    بداية أعتقد أن التنسيق الشرطي سيكون عقبة ومشكلة كونه - على حد علمي - لا يوم بالدمج للخلايا كما تريد . لذا ؛ لجأت لإستخدام دالة بسيطة كالتالي :-

    Sub MergeFokshCells()
        Dim ws As Worksheet
        Dim lastRow As Long
        Dim dayRanges As Variant
        Dim i As Long, j As Long, startCol As Long
        Dim d As Long
        
        Application.DisplayAlerts = False
        
        Set ws = ActiveSheet
        lastRow = 20
        
        dayRanges = Array(Array(2, 8), Array(9, 15), Array(16, 22), Array(23, 29), Array(30, 36))
        For i = 4 To lastRow
            For d = LBound(dayRanges) To UBound(dayRanges)
                j = dayRanges(d)(0)
                Do While j <= dayRanges(d)(1)
                    If ws.Cells(i, j).Value <> "" Then
                        startCol = j
                        Do While j < dayRanges(d)(1) And ws.Cells(i, j).Value = ws.Cells(i, j + 1).Value
                            j = j + 1
                        Loop
                        If j > startCol Then
                            ws.Range(ws.Cells(i, startCol), ws.Cells(i, j)).Merge
                            ws.Cells(i, startCol).HorizontalAlignment = xlCenter
                            ws.Cells(i, startCol).VerticalAlignment = xlCenter
                        End If
                    End If
                    j = j + 1
                Loop
            Next d
        Next i
        
        Application.DisplayAlerts = True
    End Sub

    وتستطيع استدعائها بحدث عند التغيير مثلاً داخل الورقة ، بالشكل التالي :-

    Private Sub Worksheet_Change(ByVal Target As Range)
        Call MergeFokshCells
    End Sub

    أو حتى في حدث عند الفتح إن أردت بنفس الأسلوب :-

    Private Sub Workbook_Open()
        Call MergeFokshCells
    End Sub

     

    جرب وأخبرني بالنتيجة ، طبعاً بعد حفظ الملف بصيغة image.png.1c1042ba2ef37ed3d1f0184912109ec8.png . جرب دون أرفاقي الملف لتتعرف على النتيجة :smile: .

    • Thanks 1
  5. 1 ساعه مضت, Foksh said:

    ابسط طريقة هي استخدام الدالة Dlookup بشرط رقم الموظف الفريد .

    تنفيذاً لما ذكرته لك :-

    قمت بتغيير عنصر الصورة القديم الى عنصر صورة غير منضم فقط . والحدث في بعد التحديث للكومبوبوكس :-

    Private Sub cmbUser_AfterUpdate()
    On Error GoTo Err_Handler
    
        Me.txtFullName = DLookup("fullname", "tblUsers", "username = '" & Me.cmbUser.Column(1) & "'")
        Me.imgPhoto.Picture = DLookup("Photo", "tblUsers", "username = '" & Me.cmbUser.Column(1) & "'")
    
    Exit Sub
    
    Err_Handler:
        MsgBox "حدث خطأ : الصورة غير موجودة في المجلد", vbCritical + vbMsgBoxRight, "خطأ"
        Me.imgPhoto.Picture = ""
    End Sub

    أما فكرة الأستاذ خليفة :clapping:

    فهي جميلة لأنها تقوم ببناء المسار الكامل للصورة أولاً .

    ثانياً أسهل لإضافة حقول أخرى في المستقبل ، لو حبيت تطور الفكرة . ثالثاً تتعامل مع جميع الإحتمالات . وانا افترضت أن مسار الصور في الحقول ثابت وغير قابل للعبث

     

    لكني اقترحت الفكرة من باب التوسع في الخيارات  :biggrin:

     

    saad1.zip

  6. 01.png.527721e335791220626cc940aee3d3ef.png

    تمهيداً للتحدي الثاني ، وللإنتقال إلى مرحلة أكبر عن المستوى الأول . وإنطلاقاً من باب المشاركة للجميع .

    سنتجه للأخذ بترشيحكم لموضوع من بين 3 مواضيع ، ليتم طرحه كسؤال التحدي الثاني .

     

    1️⃣   إنشاء مؤقتة الصلوات ..

    Id01.jpg.feebd2d2e5e5f35fdf41b81d7654ff85.jpg

    1.png.af746c9db3c7cf346a601a610170792b.png

     

    2️⃣   إنشاء نظام تسجيل دخول احترافي برمجياً ، مع نظام صلاحيات متعدد المستويات ..

    image.png.2c6aa4d02cf303ea30da3d0ac35d2a90.png

    1.png.af746c9db3c7cf346a601a610170792b.png

     

    3️⃣   إنشاء نظام قارئ للنصوص متعدد الخصائص ..

    image.png.75e95e5aeb0ee962f974a78e793229bd.png

    1.png.af746c9db3c7cf346a601a610170792b.png

    • Like 1
    • Thanks 1
  7. 01.png.527721e335791220626cc940aee3d3ef.png

    أخواني وأساتذتي ومعلمينا ( دون استثناء )

    الكل مر بحياته على هاي اللعبة البسيطة والجميلة ، إن كان في طفولته أو في شبابه ..

    واليوم جسدناها بطريقة فوكشية جديدة من خلال آكسيس ، وتحدي معوقاته بالتعامل مع الصور .. وبدون ما نتكلم في هذه النقطة - واللي رح أتركها لكم للتجربة - رح أشرحلكم اليوم اللعبة ببساطة للي ما بعرفها من قبل .

     

    image.png.8987cf45879440b52d0fb9ea19a28cb9.png   تتكون اللعبة من مجموعة من الأوراق ، تتمثل في :-

    • أوراق الأرقام : تحتوي اللعبة على أوراق الأرقام (9-0) ضمن ألوان مختلفة : الأحمر ، الأصفر ، الأزرق ، الأخضر .
    • بطاقات الأوامر : تختلف هذه البطاقات في اللون والأمر الذي يترتب على استخدامها ، وهي كالآتي :-
    1. بطاقة تغيير الاتجاه : تُمكن اللاعب من تغيير سير اللعبة من اليسار إلى اليمين أو العكس . وإذا كانت اللعبة مكونة من لاعبين اثنين فقط ، يتم تخطي دور اللاعب الآخر ويعود الدور للّاعب الذي لعب البطاقة .
    2. بطاقة السحب +2 : وتمكن اللاعب من إجبار اللاعب التالي على سحب ورقتين من كومة الأوراق . ويتم تخطي دوره وينتقل الدور للّاعب الذي يليه .
    3. بطاقة تخطي الدور : تمكن اللاعب من منع اللاعب التالي من لعب دوره القادم وينتقل الدور للاعب الذي بعده .
    4. بطاقة السحب +4 : وتمكن اللاعب من اختيار اللون الذي سيلعبه اللاعب التالي ، وإجباره على سحب 4 أوراق من كومة الأوراق . ويتم تخطي دوره وينتقل الدور للّاعب الذي يليه .

     

    image.png.8987cf45879440b52d0fb9ea19a28cb9.png   بالنسبة إلى توزيع الأوراق في الأونو ، يتم التوزيع بشكل عشوائي ، حيث يوزع 7 أوراق لكل لاعب ويضع باقي الأوراق بشكل مقلوب على يسار منطقة اللعب ، وتسمى ( كومة اللسحب ) . وييتم وضع آخر ورقة بشكل مكشوف في منتصف منطقة اللعب ، وهذا المكان يسمى ( النار ) ، وإذا كانت أوّل ورقة مكشوفة في النار هي بطاقة تغيير اللون أو بطاقة اسحب 4 ، هنا يجب إعادتها لكومة الأوراق وتسحب ورقة أخرى غيرها .

     

    image.png.8987cf45879440b52d0fb9ea19a28cb9.png   طريقة اللعب :-

    يبدأ اللاعب باللعب في نسختنا ، وذلك برمي أي ورقة في النار ، على أن توافق هذه الورقة آخر ورقة في النار بأحد الشرطين :-

    - اللون نفسه من أي قيمة .
    - القيمة نفسها من أي لون .

    ينتقل الدّور بين اللاعبين باتجاه عقارب الساعة ، وإذا لم يمتلك أحد اللاعبين ورقة أو بطاقة مناسبة للّعب ، يجب عليه أن يسحب من كومة الأوراق .

    RaiseUHands.png.a7acd27cec612137508b75c80f4fee88.png  زر الأونو :-
         وهي كلمة يقولها اللاعب إذا تبقت في يده ورقة أو ورقتان ، وسيلعب إحداهما ويضعها في كومة النار ، هنا يجب أن يقول " أونو " لتحذير اللاعبين الآخرين قبل رمي ورقته ما قبل الأخيرة ، وإذا لم يُحذّر اللّاعب من امتلاكه بطاقة واحدة وانتبه عليه اللاعبون الآخرون سيُعاقب بسحب بطاقتين من كومة الأوراق وهذا ما أطلقنا عليه اسم تحدي الأونو 😁 .


    Setti.gif   في نموذج البداية ، تم إضافة وتفعيل 3 خيارات للتحكم بخصائص اللعبة . بحيث لديك :-

    1️⃣ السماح بالسحب التراكمي عند رمي ورقة السحب +2 . ماذا يعني هذا ؟ يعني لو اللاعب رمى ورقة +2 ، والكمبيوتر معه ورقة +2 ، فالكمبيوتر بقدر يرمي الورقة اللي معه بغض النظر عن لونها . وهيك بكون الدور عندك إنك تسحب 4 ورقات . إلا إذا كان معك ورقة +2 ثانية ، فبتقدر ترميها . وبرجع الدور للكمبيوتر يسحب 6 ورقات ..... وهيك بشكل تراكمي .

    2️⃣  السماح بتبديل الأوراق عند رمي أي لاعب ورقة 0 أو ورقة 7 مهما كان لونها . فسيتم تبديل الأوراق التي بيدك لتصبح بيد الكمبيوتر والعكس طبعاً 😜 .

    3️⃣   السحب من كومة الورق حتى يجد اللاعب ورقة صالحة للّعب . يعني بدل ما تسحب ورقة وحدة ، رح تضل تسحب حتى تلاقي ورقة ترميها للنار .

    4️⃣   تحديد قيمة النتيجة التي يفوز اللاعب الذي يصل لها أولا . فعند فوز أي لاعب ، يأخذ مجموع القيم للأوراق التي في اللاعب الثاني . والإحتساب كما يلي لقيمة كل ورقة .

     

    image.png.8987cf45879440b52d0fb9ea19a28cb9.png   طريقة حساب النقاط :-

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

    أوراق الأرقام = قيمة الورقة نفسها .

    بطاقة اسحب 2 = 20 نقطة .

    بطاقة تخطّي الدّور = 20 نقطة .

    بطاقة تغيير الاتّجاه = 20 نقطة .

    بطاقة تغيير اللّون = 50 نقطة .

    بطاقة اسحب 4 = 50 نقطة .

     


    image.png.8987cf45879440b52d0fb9ea19a28cb9.png   صورة حية من اللعبة :-


    Uno2026.gif.15d011d97cd6d797d3667e908ef70803.gif

     

     

    image.png.8987cf45879440b52d0fb9ea19a28cb9.png   ملفات اللعبة للإصدارين ، 64 و 32 :-

    Return.png.8f6df0d380e0a3056fed63d89fe36923.png للإصدار 32 :-

    Uno Game - 32.zip

    Return.png.8f6df0d380e0a3056fed63d89fe36923.png للإصدار 64 :-

    Uno Game - 64.zip

     

    05.png.8fe3b502e8827cbc9c5d0d0a8c4e8770.png:- يجب أن يكون ملف اللعبة بجانب مجلد الصور حتى لا تواجه مشاكل في اللعب .

     

    • Like 3
  8. أخي الكريم ، وعليكم السلام ورحمة الله وبركاته ..

    فيما يخص طلبك ، اعتقد أنه مخالف لقوانين المنتدى ولأخلاقياته . حيث أن أصحاب الملفات المحمية بكلمة مرور قاموا بالتعب على مشروعهم وملفهم بحمايته من أيدي العابثين . أو ممن لهم هوايات بكسر الحماية . لذا فإنك لن تجد رداً لطلبك هنا للأسف .

     

    شكراً لتفهمك :fff:

     

    سيتم اغلاق الموضوع لمخالفته الإجابات لو تمت .

    • Like 1
  9. انتهت المدة المحددة للتحدي الأول ، ونشكر جميع من قام على هذا الدعم والمشاركة ..

    وسيتم إختيار الإجابة التي نالت الإعجاب بالتقييم قريباً.

    وسيتم الإعلان أيضاً عن التحدي الثاني قريباً جداً بإذن الله تعالى ، وذلك بالتصويت لنوع وموضوع التحدي الذي تفضلونه من بين مجموعة مواضيع.

     

    شكراً لكم  💐

    • Thanks 1
  10. مين جاب سيرة الكوسا  🤓

    44 دقائق مضت, Moosak said:

    قصدك :

      هههههه فعلاً مهندسنا الغالي ،، شكلي في رابع يوم هكذا ، فكيف بعد اسبوع 🤣

    أعاننا وإياكم الله ، وجزاكم الله على التنبيه :fff:

     

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

    أهلاً أخي أمين ، وبارك الله بك على هذه المبادرة الجميلة .:fff:.

    بدايةً ، واعلم أنك قد طرحت فكرة من تطبيقك وخطوة بخطوة ، وهو شيء جميل شعورك بأنك استطعت نقل الفكرة وتطبيقها ونجاحها معك . ولذا ومستقبلاً ومن باب التطوير لك ، إليك نصيحة قد تكون الخطوة الأولى لبناء مشروع سليم . تتلخص بما يلي :-

    • عدم إستعمال المسميات العربية للحقول أو العناصر أو المكونات بشكل عام ( حقول ، جداول ، استعلامات ، مربعات نص أو أزرار .... إلخ ) .
    • عدم استعمال المسافات بين أسماء المكونات التي تتكون من مقطعين أو أكثر ، وهنا لاحظت إنك تلافيت هذه النقطة باستخدامك الشرطة السفلية أو العادية ( ـ ، - ) في معظم الأحيان :clapping: .
    • حاول دائماً مستقبلاً - ( إن شاء الله ) - أن يكون لأسماء العناصر دلالة عليها . بدلاً من استعمال الأسماء الإفتراضية مثل text0 , text1 أو أمر12 ، أمر45 ... إلخ . كي تسهل عليك الإستدلال عليها دون الحاجة للتنقل بين هنا وهناك لمعرفة وتذكر و كتابة أسمائها عند الإستدعاء داخل الأكواد .

    لاحظت أيضاً أنك استخدمت سطر VBA لأيقاف وتشغيل التنبيهات عند حذف سجل من الجدول ، وهذه نقطة إيجابية وجميلة منك انك استخدمتها ، بدلاً من الرسائل المزعجة التي يظهرها آكسيس عند حذف أو إضافة أو تعديل سجل :clapping:

    أيضاً لاحظت أنك قمت بتبسيط الأمور على من يريد الإستفادة من فكرتك ، فالأكواد بسيطة جداً ومفهومة و واضحة ، ولا تحتاج ترجمة حتى يتقنها من يريد الإتقان والفهم .

     

    شكراً لك على مشاركتك الجميلة ،  ونأمل منك أن لا تقطعنا من أفكارك التي تساعد بها من يحتاجها :wub: 

    • Like 1
  12. 4 ساعات مضت, omran2015 said:

    ولدي عدة ملحوظات وهى:

    1/ مشكلة القفز في الترتيب ولو تلاحظ أن الترتيب يظهر هكذا

    بسيطة أخي الكريم ..

     

    يعني انت تريد إظهار الطلاب الذين في المركز الرابع مثلاً جميعهم بالتمييز بينهم ( متكرر ) !!!!!!!

    انا لم أقترب من الدالة التي قمت بإنشائها ، حرصاً على أنه قد يكون مطلبك .. لكن بعد التوضيح ، إليك التعديل الذي تم على الدالتين أولاً :-

    Public Function fncTrteeb()
        Dim rst As Object
        Dim RankNumber As Long
        
        ' تصفير الحقل أولاً
        CurrentDb.Execute "UPDATE Q_top10 SET trteeb = Null"
        
        Set rst = CurrentDb.OpenRecordset("SELECT * FROM Q_top10 ORDER BY average DESC, StudentID ASC", 2)
        
        If rst.RecordCount = 0 Then Exit Function
        
        rst.MoveFirst
        RankNumber = 0
        
        Do While Not rst.EOF And RankNumber < 10
            RankNumber = RankNumber + 1
            
            rst.Edit
            rst!trteeb = GetArabicRank(RankNumber)
            rst.Update
            
            rst.MoveNext
        Loop
        
        rst.Close
        Set rst = Nothing
    End Function
    
    Public Function GetArabicRank(ByVal n As Long) As String
        Select Case n
            Case 1: GetArabicRank = "الأول"
            Case 2: GetArabicRank = "الثاني"
            Case 3: GetArabicRank = "الثالث"
            Case 4: GetArabicRank = "الرابع"
            Case 5: GetArabicRank = "الخامس"
            Case 6: GetArabicRank = "السادس"
            Case 7: GetArabicRank = "السابع"
            Case 8: GetArabicRank = "الثامن"
            Case 9: GetArabicRank = "التاسع"
            Case 10: GetArabicRank = "العاشر"
            Case Else
                GetArabicRank = "المركز " & n
        End Select
    End Function

     

    والإستعلام سيصبح بهذاالشكل :-

    SELECT TOP 10 S.StudentID, S.StudentName, S.ClassName, S.SETNO1, F.SemesterID, F.TotalSum, F.average, F.Grade, GetArabicRank((
          SELECT COUNT(*)
          FROM TBL_Final1 AS F2
          INNER JOIN TBL_Students AS S2 
          ON F2.StudentID = S2.StudentID
          WHERE 
              F2.SemesterID = F.SemesterID
              AND S2.ClassName = S.ClassName
              AND (F2.average > F.average 
                   OR (F2.average = F.average AND S2.StudentID < S.StudentID))
        ) + 1) AS RankText
    FROM TBL_Students AS S INNER JOIN TBL_Final1 AS F ON S.StudentID = F.StudentID
    WHERE F.SemesterID = [أدخل رقم الفصل]
        AND S.ClassName = [أدخل اسم الصف]
    ORDER BY F.average DESC , S.StudentID;

     

    في الاستعلام القديم كان المنطق هو ( احسب كم طالب معدله أكبر مني ) ؟؟

    فإذا كان هناك طالبان معدلهما متساوٍ ( مثلاً 91% ) ، فإن كلاهما سيجد نفس العدد كترتيب من الطلاب المتفوقين عليهما ، وبالتالي يأخذان نفس الرقم ( مثلاً المركز 2 ) ، ثم يقفز الترتيب للمركز 4 مباشرة .

    أما في الاستعلام المعدل ، إذا تساوى طالبان في المعدل ، انظر لرقم الطالب ؛ صاحب الرقم الأصغر يعتبر هو الأسبق .

    :excl: وبالنسبة لي هذا غير منطقي ، فلا بد من شرط ثاني لتحديد المنافس على نفس المركز !!!!

     

    💥 وفي هذا الموضوع هنا ، قد تطرقنا مع مشاركة أخي @ابو جودي لنفس الفكرة تقريباً .

     

    وملفك بعد التعديل :-

    Data_Base.zip

  13. اهاااا ، بعد متابعة النتيجة ، وجدت أنه يأتيك بجميع الطلاب للفصل الأول والصف الثامن وعددهم 16 على سبيل المثال .. وأنت تريد فقط 10 :biggrin:

    جرب هذا الإستعلام التالي :-

    SELECT TOP 10 S.StudentID, S.StudentName, S.ClassName, S.SETNO1, F.SemesterID, F.TotalSum, F.average, F.Grade, (
          SELECT COUNT(*)
          FROM TBL_Final1 AS F2
          INNER JOIN TBL_Students AS S2 
          ON F2.StudentID = S2.StudentID
          WHERE 
              F2.SemesterID = F.SemesterID
              AND S2.ClassName = S.ClassName
              AND F2.average > F.average
        ) + 1 AS RankOrder
    FROM TBL_Students AS S INNER JOIN TBL_Final1 AS F ON S.StudentID = F.StudentID
    WHERE F.SemesterID = [أدخل رقم الفصل]
        AND S.ClassName = [أدخل اسم الصف]
    ORDER BY F.average DESC, S.StudentID ASC; 

     

    • Like 1
  14. بدايةً ، وعليكم السلام ورحمة الله وبركاته ..

    لديك نقطة واحد فقط كان عليك إدراكها . وهي إضافة الحقل ClassID من الجدول F ، وجعل الشرط [أدخل اسم الصف] له وليس للحقل ClassName من الجدول S . قبل تجربة المرفق ، جرب دون النظر للمرفق حتى تفهم المقصود من كلامي ..

     

    مع العلم أن ملفك يعمل معي بشكل سليم باستخراج الأوائل . إلا إن كان هناك نقطة لم تتوضح في شرحك 😀

     

    Data_Base.zip

×
×
  • اضف...

Important Information