اذهب الي المحتوي
أوفيسنا

الدكتور خضر الرجبي

المشرفين السابقين
  • Posts

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

  • تاريخ اخر زياره

مشاركات المكتوبه بواسطه الدكتور خضر الرجبي

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

    تحياتي لأخي أبا يوسف وللأخ الفيلسوف111 ، وكل عام وانتم بخير

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

    يرجى، إن كان بالإمكان، الاشارة إلى صاحب الملفات بإعادة رفعها.

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

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

    اقتران التحويل الذي ارفقته هو مفتاح الحل .

    الطريقة : يتم وضع الاقتران في وحدة نمطية ، ويتم طلبه من النموذج بالطريقة التالية :

    Private Sub convert_Click()
    
    Dim answer As String
    
     answer = NoToTxt(r, "دينار", "فلس")
    
    MsgBox answer
    
    End Sub

    ويمكن استعماله لأي عملة سواء كويتية أو غيرها بتغيير الرموز فقط (دينار ، فلس)

    post-6770-1168155618_thumb.jpg

    واليكم المثال التطبيقي : Example_NO_TO_Text_ARABIC_.rar

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

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

    ارجو السماح لي بهذه المداخلة ، لعل فيها الفائدة للجميع.

    مثال: تلوين سجل وترك أخر

    Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
    Dim Cntl As Control
    
    On Error Resume Next
    
    For Each Cntl In Me.Controls
      With Cntl
        If .Section = 0 Then
          If Me.Report.CurrentRecord Mod 2 = 0 Then
            .BackStyle = 1
            .BackColor = vbGreen
          Else
            .BackStyle = 0
          End If
        End If
      End With
    Next
    End Sub

    وهذا البرنامج الخاص بالمثال : DifferentRecordColorsInReports.rar

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

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

    اعتقد أن سبب المشكلة هو حقل التاريخ الثاني ، ولكن الحمد لله تم الضبط والتعديل والنقل بواسطة النسخ واللصق.

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

    الملف بعد تعديله : Update1.rar

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

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

    أعتقد أن إحدى طرق الحل تكون بعمل برنامج بسيط في حدث (بعد التحديث) الخاص بالإسم، وذلك بقراءة السجل الذي تم اختياره في متغيرات اسميتها (t1,t2,t3,t4) والتي ستمكننا من تحديد السجل الذي تم اختياره ، وبعدها نقوم بعمل استعلام اجرائي نبني بواسطته جدول مؤقت اسميته (temp) ، وأخيراً نجعل مصدر السجلات للتقرير الجدول (temp).

    لاحظ : أننا في هذه الطريقة قد استغنينا عن استعلام التحديد وهي طريقتك في معالجة المسألة.

    Private Sub m_AfterUpdate()
    Dim SQL As String
    Dim t1 As String, t2 As String, t3 As String, t4 As String
    
    t1 = m.Column(0)
    t2 = Str(m.Column(1))
    t3 = m.Column(2)
    t4 = Str(m.Column(3))
    
        SQL = "SELECT Table1.name, Table1.Age, Table1.Address, Table1.Telephone INTO temp " & _
              "FROM Table1 " & _
              "WHERE Table1.name             = '" & t1 & "' and " & _
              "      str(Table1.Age)         = '" & t2 & "' and " & _
              "      Table1.address          = '" & t3 & "' and " & _
              "      str(Table1.Telephone)   = '" & t4 & "'"
    
        DoCmd.RunSQL SQL
    End Sub

    مثال معدل لبرنامجك : print_update1.rar

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

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

    أشكرك أخي رضا ، وبارك الله فيك على هذه الاداة وهذه الثقة واعتذر عن تأخري في الرد لظروف طارئة قطعتني عن جميع لمنتديات في الاسبوعين الماضيين.

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

    هدف الأداة :

    1. معالجة مشكلة تغيير الهوامش من جهاز لأخر ، والاحتفاظ بنفس الاعدادات بغض النظر عن الجهاز.

    2. تعديد خصائص التقرير دون الحاجة إلى التعديل في وضع التصميم وخصوصا في MDE .

    3. المساعدة في تعريف الإعدادات الخاصة بالملصقات وبطريقة مرنة وسهلة.

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

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

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

    إخواني وأخواتي :fff: ، بارك الله فيكم

    عدت إليكم ...

    "13- كود نسخ النصوص المخزنة في الحافظة والعكس"

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

    Declare Function abOpenClipboard Lib "user32" Alias "OpenClipboard" (ByVal hwnd As Long) As Long
    Declare Function abCloseClipboard Lib "user32" Alias "CloseClipboard" () As Long
    Declare Function abEmptyClipboard Lib "user32" Alias "EmptyClipboard" () As Long
    Declare Function abIsClipboardFormatAvailable Lib "user32" Alias "IsClipboardFormatAvailable" (ByVal wFormat As Long) As Long
    Declare Function abSetClipboardData Lib "user32" Alias "SetClipboardData" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    Declare Function abGetClipboardData Lib "user32" Alias "GetClipboardData" (ByVal wFormat As Long) As Long
    Declare Function abGlobalAlloc Lib "kernel32" Alias "GlobalAlloc" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
    Declare Function abGlobalLock Lib "kernel32" Alias "GlobalLock" (ByVal hMem As Long) As Long
    Declare Function abGlobalUnlock Lib "kernel32" Alias "GlobalUnlock" (ByVal hMem As Long) As Boolean
    Declare Function abLstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
    Declare Function abGlobalFree Lib "kernel32" Alias "GlobalFree" (ByVal hMem As Long) As Long
    Declare Function abGlobalSize Lib "kernel32" Alias "GlobalSize" (ByVal hMem As Long) As Long
    Const GHND = &H42
    Const CF_TEXT = 1
    Const APINULL = 0
    Function Text2Clipboard(szText As String)
        Dim wLen As Integer
        Dim hMemory As Long
        Dim lpMemory As Long
        Dim retval As Variant
        Dim wFreeMemory As Boolean
    
        ' Get the length, including one extra for a CHR$(0) at the end.
        wLen = Len(szText) + 1
        szText = szText & Chr$(0)
        hMemory = abGlobalAlloc(GHND, wLen + 1)
        If hMemory = APINULL Then
            msgbox "Unable to allocate memory."
            Exit Function
        End If
        wFreeMemory = True
        lpMemory = abGlobalLock(hMemory)
        If lpMemory = APINULL Then
            msgbox "Unable to lock memory."
            GoTo T2CB_Free
        End If
    
        ' Copy our string into the locked memory.
        retval = abLstrcpy(lpMemory, szText)
        ' Don't send clipboard locked memory.
        retval = abGlobalUnlock(hMemory)
    
        If abOpenClipboard(0&) = APINULL Then
            msgbox "Unable to open Clipboard.  Perhaps some other application is using it."
            GoTo T2CB_Free
        End If
        If abEmptyClipboard() = APINULL Then
            msgbox "Unable to empty the clipboard."
            GoTo T2CB_Close
        End If
        If abSetClipboardData(CF_TEXT, hMemory) = APINULL Then
            msgbox "Unable to set the clipboard data."
            GoTo T2CB_Close
        End If
        wFreeMemory = False
    
    T2CB_Close:
        If abCloseClipboard() = APINULL Then
            msgbox "Unable to close the Clipboard."
        End If
        If wFreeMemory Then GoTo T2CB_Free
        Exit Function
    
    T2CB_Free:
        If abGlobalFree(hMemory) <> APINULL Then
            msgbox "Unable to free global memory."
        End If
    End Function
    
    
    
    Function Clipboard2Text()
        Dim wLen As Integer
        Dim hMemory As Long
        Dim hMyMemory As Long
    
        Dim lpMemory As Long
        Dim lpMyMemory As Long
    
        Dim retval As Variant
        Dim wFreeMemory As Boolean
        Dim wClipAvail As Integer
        Dim szText As String
        Dim wSize As Long
    
        If abIsClipboardFormatAvailable(CF_TEXT) = APINULL Then
            Clipboard2Text = Null
            Exit Function
        End If
    
        If abOpenClipboard(0&) = APINULL Then
            msgbox "Unable to open Clipboard.  Perhaps some other application is using it."
            GoTo CB2T_Free
        End If
    
        hMemory = abGetClipboardData(CF_TEXT)
        If hMemory = APINULL Then
            msgbox "Unable to retrieve text from the Clipboard."
            Exit Function
        End If
        wSize = abGlobalSize(hMemory)
        szText = Space(wSize)
    
        wFreeMemory = True
    
        lpMemory = abGlobalLock(hMemory)
        If lpMemory = APINULL Then
            msgbox "Unable to lock clipboard memory."
            GoTo CB2T_Free
        End If
    
        ' Copy our string into the locked memory.
        retval = abLstrcpy(szText, lpMemory)
        ' Get rid of trailing stuff.
        szText = Trim(szText)
        ' Get rid of trailing 0.
        Clipboard2Text = left(szText, Len(szText) - 1)
        wFreeMemory = False
    
    CB2T_Close:
        If abCloseClipboard() = APINULL Then
            msgbox "Unable to close the Clipboard."
        End If
        If wFreeMemory Then GoTo CB2T_Free
        Exit Function
    
    CB2T_Free:
        If abGlobalFree(hMemory) <> APINULL Then
            msgbox "Unable to free global clipboard memory."
        End If
    End Function

    ثم قمت باختبار هذه الاقترنات وتأكدت من أنها تعمل بدون أية مشكلة ، أنظروا معي :

    10.JPG

    أترككم مع المرفق لتتمتعوا بهذه النتائج التي لها فوائد عظيمة جدا .

    إلى اللقاء ...

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

    ClipBoard_20050806.rar

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

    إخواني وأخواتي :fff: ، بارك الله فيكم

    عدت إليكم ...

    "12- استخدام عنصر ActiveX - Mircrosft Web Browser في البحث الديناميكي من داخل الأكسيس"

    9.JPG

    نعم إخواني وأخواتي سنتعرف الآن ومن خلال هذا الموضوع على كيفية البحث الديناميكي الحيوي من داخل الأكسيس ، والعملية غاية في البساطة وهي كما يلي :

    1. في النموذج تقوم بإضافة عنصر ActiveX - Microsoft Web Browser وضع اسمه على سبيل المثال wb ولا تغير أي شيء في خصائصه سوى حجمه كما تريد.

    2. للتعامل مع هذا العنصر ولإخفاءه في وضع الفتح ضع في حدث فتح النموذج الجملة التالية :

    Me.wb.Visible = False
    3. للبحث في اي عنوان يتم ذلك بطلب العنوان كما يلي :
    Me.wb.Navigate "العنوان"
    4. للبحث في google باللغة العربية الطريقة كما يلي :
    http://www.google.com/search?lr=lang_ar&cr=&hl=ar&ie=windows-1256&oe=windows-1256&q= ومفاتيح البحث هنا
    5. للبحث في google في موقع محدد كما أشرت سابقا وبإضافة ما يلي في نهاية البحث :
    &as_sitesearch=الموقع&safe=images
    على سبيل المثال للبحث في الفريق العربي للبرمجة نضع العنوان كاملا كما يلي :
    Me.wb.Navigate "http://www.google.com/search?lr=lang_ar&cr=&hl=ar&ie=windows-1256&oe=windows-1256&q=" & SearchString & " &as_sitesearch=arabteam2000-forum.com&safe=images"

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

    إلى اللقاء ...

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

    InternetSearch_20050806.rar

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

    إخواني وأخواتي ، بارك الله فيكم

    عدت إليكم ...

    "11- طريقة تبديل عرض النموذج الفرعي برمجيا وديناميكيا خلال العمل"

    ربما يود أحدنا في احدى التطبيقات أن يكون هناك امكانية لعرض النماذج الفرعية بطريقتين عرض نموذج وعرض ورقة بيانات وإليكم هذا الاسلوب البسيط باستخدام DoCmd.RunCommand التي جاءت كبديل DoMenuItem وهو أمر خاص بالاكسيس ولا ينصح باستخدامه إذا كنتم تفكرون في تحويل التطبيق في النهاية إلى بيئة اخرى مثل VB أو VB.NET أو حتى للنسخ السابقة من الاكسيس.

    ولكن الامر DoCmd.RunCommand مفيد ورائع ويمكن استخدامه بكفاءة وسهولة مع أكثر من 500 معامل مختلف لمن يستخدم الاكسيس فحسب وغير معني بالتحويل ومنها مثالنا .

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

    Option Compare Database
    Public p As Byte
    
    
    Private Sub  أمر6_Click()
    If Nz(p, 0) = 0 Then
     Me.الحركات.SetFocus
     DoCmd.RunCommand acCmdSubformFormView
     p = 1
    Else
     Me.الحركات.SetFocus
     DoCmd.RunCommand acCmdSubformDatasheetView
     p = 0
    End If
    End Sub

    المتغير p بناء على قيمته سيتم تغيير طريقة العرض التبديلية .

    إلى اللقاء ...

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

    ChangeSubFormView_20050805.rar

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

    إخواني وأخواتي :fff: ، بارك الله فيكم

    عدت إليكم ...

    "10- برمجة التنسيق الشرطي بناء على التنقل بين السجلات في نموذج مجدول"

    إخواني لننظر للصورتين التاليتين اللتين تمثلان نموذج مجدول موضوع حديثنا اليوم ،

    8.JPG

    الصورة الاولى تمثل كيف يتغير لون السجل عندما نتنقل من سجل لأخر ، وفي الصورة الثانية تغير خلفية الحقل عند تحريره (عند التركيز) .

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

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

    Private Sub Form_Current()
    DoCmd.SetWarnings False
    DoCmd.RunSQL "UPDATE الطلاب SET الطلاب.تم= False;"
    DoCmd.SetWarnings True
    Me.تم= True
    End Sub
    هكذا سيكون الحقل (تم) = true فقط للسجل الحالي . الان الآمر أصبح أكثر وضوحا ، سنبني التنسيق الشرطي بناء على قيم هذا الحقل ولكنني لا أريد في كل نموذج أن اقوم بتحرير التنسيق الشرطي لمربعات النص في وضع التصميم وعوضا عن ذلك قمت ببناء الاقتران التالي الذي يحدد تلقائيا التنسيق الشرطي حسبما اريده أن يكون كما يلي :
    Private Sub التنسيق_الشرطي ()
    
       Dim objFormat As FormatCondition
       Dim ctl As Control
       For Each ctl In Me
        Flag = (ctl.Section = 0) And _
               (ctl.ControlType = acTextBox)
        If Flag Then
             ctl.FormatConditions.Delete
             Set objFormat = ctl.FormatConditions.Add( _
                              Type:=acFieldHasFocus)
             objFormat.BackColor = vbYellow
             
             With ctl.FormatConditions.Add( _
             Type:=acExpression, _
             Expression1:="Forms!الطلاب.تم = true")
             .ForeColor = vbBlack
             .BackColor = vbMagenta
            End With
         
        End If
       Next
    End Sub

    وهكذا فإن شرط التركيز هو خلفية صفراء وشرط عدم التركيز وحيثما يكون الحقل (تم) = true تكون الخلفية باللون Magenta ، أليس هذا الحل جميلا ؟؟

    أترككم لتتمتعوا مع المرفق واجراء تجاربكم الخاصة به متمنيا لكم الفائدة دائما.

    وإلى اللقاء ...

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

    ConditionalFormatingTrick_20050805.rar

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

    إخواني وأخواتي :fff: ، بارك الله فيكم

    عدت إليكم ...

    "9- بناء مربع تحرير وسرد يحتوي على تصنيفات وفروعها"

    انظروا معي فضلا للصورة التالية :

    7.JPG

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

    ولكي اسهل عليكم فهم الموضوع سأشرحه من نقطة الصفر ...

    1. نقوم ببناء جدول مؤلف من ثلاث حقول هي معرف_التصنيف مفتاح رئيس وترقيم تلقائي ، التصنيف عبارة عن نص ، ومعرف_الأب عبارن عن رقم وقد سميت هذا الجدول التصنيفات.

    2. يمكن تعبئة الجدول مباشرة بوضوع التصنيفات الرئيسة بحيث نحدد معرف الأب لها صفر والتصنيفات الفرعية نضع لها معرف الاب = معرف التصنيف الذي تنتمي له ، ولكني سأشرح لكم طريقة أمتع للتعبئة ...

    3. لتعبئة النماذج عن طريق نموذج رئيسي فيه الاصناف وفرعي فيه الاصناف الفرعية نقوم بما يلي :

    3.1 نعمل الاستعلام qryCategories والذي يرجع لنا الاصناف الرئيسة انظروا إلى طريقة تصميمه

    SELECT التصنيفات.معرف_التصنيف, التصنيفات.التصنيف, التصنيفات.معرف_الأب
    FROM التصنيفات
    WHERE (((التصنيفات.معرف_الأب)=0))
    ORDER BY التصنيفات.التصنيف;
    3.2 نعمل الاستعلام qryCategoriesSub والذي يرجع لنا الاصناف المتفرعة انظروا إلى طريقة تصميمه
    SELECT التصنيفات.معرف_التصنيف, التصنيفات.التصنيف, التصنيفات.معرف_الأب
    FROM التصنيفات
    WHERE (((التصنيفات.معرف_الأب)<>0))
    ORDER BY التصنيفات.التصنيف;
    3.3 نعمل نموذج frmCategories مصدره qryCategories نضع فيه حقل التصنيف فقط. 3.4 نعمل نموذج frmCategoriesSub مصدره qryCategoriesSub نضع فيه حقل التصنيف فقط ومن نوع ورقة بيانات 3.5 لربط النموذجين ببعضهما نفتح النموذج frmCategories في وضع التصميم ونجر اليه من نافذة القاعدة النموذج frmCategoriesSub ليصبح فرعيا به ونعرف في خصائص الربط بأن الحقول الرئيسة للربط هي معرف_التصنيف والفرعية هي معرف_الأب. 4. الآن نأتي إلى الهدف الآساس من الموضوع وهو مربع التحرير والسرد ما في الصورة اعلاه ، نعمل نموذج جديد فارغ ، ونضع فيه مربع تحرير وسرد نجعل مصدره الاستعلام qryCombo والذي طريقة بناءه كما يلي :
    SELECT t1.معرف_التصنيف, IIf(t1.معرف_الأب=0,t1.التصنيف,t2.التصنيف & " - " & t1.التصنيف) AS قائمة_الأصناف, IIf(t1.معرف_الأب=0,t1.التصنيف,"    - " & t1.التصنيف) AS معرفات_الأصناف
    FROM التصنيفات AS t1 LEFT JOIN التصنيفات AS t2 ON t1.معرف_الأب = t2.معرف_التصنيف
    ORDER BY IIf(t1.معرف_الأب=0,t1.التصنيف,t2.التصنيف & " - " & t1.التصنيف);

    الآن افتح النموذج الكمبو المتفرع وتمتع بالنتائج

    إلى اللقاء ...

    BranchingCombo_20050804.rar

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

    إخواني وأخواتي :fff: ، بارك الله فيكم جميعاً

    عدت إليكم ...

    "8- خاصية الترتيب المتبدلة حسب الحقول للبيانات في نموذج مجدول"

    لننظر إلى النموذج التالي من المرفق ،

    6.JPG

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

    تضعون الإقتران التالي في وحدة نمطية

    Public Sub ChangeSortOrder _
       (frm as Form, strFld as String)
      On Error Goto ErrHand
    
      If frm.OrderBy = strFld Then
        'If it's already ordered by this field name, 
        'you want to reverse it.
        frm.OrderBy = strFld & " DESC"
      Else
          frm.OrderBy = strFld
      End If
      frm.OrderByOn = True
    
    ExitProc:
      Exit Sub
    
    ErrHand:
      MsgBox Err.Num & " " & Err.Desc
      Goto ExitProc
    End Sub
    ثم لكل حقل في حدث عند النقر تطلبون الاقتران على سبيل المثال كما يلي من حقل الرقم
    Private Sub الرقم_تسمية_Click()
       Call ChangeSortOrder(Me, "الرقم")
    End Sub

    إلى اللقاء ...

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

    SortingAZ_ZA.rar

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

    أخواي الأصيل وشاهر :fff::fff: ، أشكركما

    إخواني وأخواتي :fff: ، بارك الله فيكم جميعا

    عدت إليكم ...

    "7- هل يوفر الأكسيس خاصية الربط FULL OUTER JOIN "

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

    في مثالي جدولي الموظفين و الموردين وفي كل جدول اسم الموظف أو المورد ومدينته وسأبني الربط بناء على المدينة.

    أولا : للناقش الطرق الثلاث لأنواع الربط بين جدولين الموفرة في الأكسيس :

    وقبل أي شيء للنظر لمحتويات الجدولين

    Suppliers الموردين = {(خضر ،القدس)، (محمد،الخليل)،(سمير،غزة)،(رامي،نابلس)،(سعاد،بيت لحم)،(فاطمة،رام الله)،(زينب ،القدس)}

    Employees الموظفين = {(سهيلة،جنين)،(راوية،بيت لحم)،(زهرة،رفح)،(ربيع،طولكرم)،(سعيد،رفح)،(نافذ،نابلس)،(احمد،القدس)}

    ولو احببنا تمثيل الجدولين (المجموعتين) باستخدام اشكال فن الرياضية حسب التشارك في المدينة فالنتيجة ستكون كما يلي :

    5.JPG

    1. Inner Join

    وطريقة التعريف كما يلي :

    1.JPG

    والنتيجة هي العناصر المشتركة بين الجدولين حسب المدينة كما يلي :

    11.JPG

    وللنظر إلى جملة SQL الخاصة بهذه الطريقة للربط ونلاحظ أنها inner join

    111.JPG

    2. left outer join

    2.JPG

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

    22.JPG

    وللنظر إلى جملة SQL الخاصة بهذه الطريقة للربط ونلاحظ أنها left join

    222.JPG

    3. right outer join

    3.JPG

    والنتيجة هي العناصر المتوفرة في الموظفين وغير متوفرة التقاطع .

    33.JPG

    وللنظر إلى جملة SQL الخاصة بهذه الطريقة للربط ونلاحظ أنها right join

    333.JPG

    ثانياً : الان نأتي لهدف الموضوع الأساس وهو بناء طريقة ربط جديدة بين الجداول وهي FULL OUTER JOIN بحيث تكون النتيجة جميع العناصر من الجدولين يعني الاتحاد set1 Union Set2 Union Set3 حيث Union تعني اتحاد والنتيجة ستكون كما يلي :

    44.JPG

    والطريقة هي بناء استعلام توحيدي لكل المجموعات السابقة والغير المتقاطعة كما يلي :

    SELECT Suppliers.SupplierName, Suppliers.SupplierCity, Employees.EmplyeeName, Employees.EmployeeCity
    FROM Employees INNER JOIN Suppliers ON Employees.EmployeeCity = Suppliers.SupplierCity
    Union all
    SELECT Suppliers.SupplierName, Suppliers.SupplierCity, Employees.EmplyeeName, Employees.EmployeeCity
    FROM Suppliers LEFT JOIN Employees ON Suppliers.SupplierCity = Employees.EmployeeCity
    WHERE (((Employees.EmployeeCity) Is Null))
    UNION ALL SELECT Suppliers.SupplierName, Suppliers.SupplierCity, Employees.EmplyeeName, Employees.EmployeeCity
    FROM Suppliers RIGHT JOIN Employees ON Suppliers.SupplierCity = Employees.EmployeeCity
    WHERE (((Suppliers.SupplierCity) Is Null));

    إلى اللقاء ...

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

    FULL_OUTER_JOIN.rar

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

    أخي ابا هادي :fff: ، بارك الله فيك

    باسمي واسم كل المهتمين بإدواتك الإبداعية أشكرك على هذه الأدوات المفيدة والرائعة التي تقدمها لنا داعيا الله لك بالتوفيق والسرور والسعادة في الدنيا والأخرة.

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

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

    إخواني وأخواتي ، بارك الله فيكم جميع.

    عدت إليكم ...

    "6- فرز وتصفية سجلات التقرير حسب ما تم تحديده في النموذج"

    سؤال : عندي نموذج وفي التعامل معه أقوم بالتصفية فيظهر لي جزء من السجلات حسب عوامل التصفية التي احددها ثم اقوم بفرز (ترتيب) هذه السجلات تصاعديا أو تنازليا حسب حقل معين ، وما أريده هو أنه عند الضغط على زر الطباعة للتقرير المتعلق بهذا النموذج أن يطبع لي هذه السجلات تماما حسب عوامل التصفية والفرز التي تم تحديدها في النموذج.

    الجواب : تلقيت هذا السؤال من عدة أشخاص بأشكال مختلفة فتارة الحديث عن التصفية فقط وتارة عن الفرز(الترتيب) وتارة عن استخدام المعاملات في الحالتين ، والآن أود أن ألقي الضوء على الطريقة النموذجية للتعامل مع هذه المسألة الشيقة والمفيدة للكثيرين.

    أولا : نقل عوامل التصفية إلى التقرير

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

    DoCmd.OpenReport "f1", acViewPreview, , Me.Filter

    حيث f1 اسم التقرير

    acViewPreview للمعاينة قبل الطباعة

    ولا تنسى وضع فاصلتين ,, وليس واحدة بعد طريقة العرض acViewPreview

    وأخير me.filter هي التصفية التي تم تحديدها في وضع الفتح للنموذج

    وتعمل هذا مع كل أوامر فتح التقارير الموجودة في النموذج مع تغيير اسم التقرير فقط

    ثانيا : نقل عوامل الفرز إلى التقرير

    في النموذج ولز الأمر الخاص بمعاينة التقرير تضع في إجراء حدث عند النقر ما يلي :

    stDocName = "test"
         DoCmd.OpenReport stDocName, acPreview, , , , Me.OrderBy
    أرجو الانتباه لعدد الفواصل لأنه مهم جدا. في التقرير وفي حدث الفتح تضع ما يلي :
    Private Sub Report_Open(Cancel As Integer)
    Me.OrderBy = Me.OpenArgs
    Me.OrderByOn = True
    End Sub
    النتيجة هي فرز (ترتيب) التقرير حسب نفس الترتيب الذي تم تحديده في النموذج وهذه الطريقة سأسميها "استخدام OpenArgs في ترتيب التقارير بحسب الترتيب في النموذج" ولا تعارض بين الإثنتين ولنقل الفرز والتصفية معا إلى التقرير يتم طلب التقرير كما يلي :
    DoCmd.OpenReport "f1", acViewPreview, , Me.Filter, , Me.OrderBy

    مع الإنتباه للفواصل لأنها مهمة جدا .

    إلى اللقاء ...

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

×
×
  • اضف...

Important Information