الدكتور خضر الرجبي قام بنشر يوليو 24, 2005 قام بنشر يوليو 24, 2005 السلام عليكم إخواني وأخواتي ، بارك الله فيكم جميعا يسعدني ويشرفني أن أبدأ معكم هذه السلسلة من إلقاء الأضواء الكاشفة على غيابات الأكسيس والتي سأكررها للتسهيل على الأعضاء في كل منتديات الأكسيس العربية المتخصصة ، أملا أن يكون بإذن الله فيها الفائدة للجميع. وبسم الله الرحمن الرحيم أبدأ ... " إزالة عوامل الفرز (الترتيب) والتصفية عن النماذج والتقارير " نكتب البرامج بهدف توزيعها وفي مرحلة الكتابة يتم اختبار هذه البرامج ونقوم بتحديد عوامل تصفية وترتيب على بعض النماذج والتقارير كجزء من الاختبارات ، ويأتي بعدها دور توزيع هذه البرامج ، وبالتأكيد أننا لا نود توزيعها مع ما تم اختباره من عوامل تصفية وترتيب والتي ستكون قد خزنت تلقائيا في هذه النماذج والتقارير. في الإقتران التالي والذي يشغل لمرة واحدة قبل عملية التوزيع يتم إزالة جميع عوام الفرز والتصفية المعرفة في النماذج والتقارير تلقائيا . Sub ResetFormsAndReports() Dim frm As Form Dim rpt As Report For Each obj In CurrentProject.AllForms DoCmd.OpenForm obj.Name, acDesign, , , , acHidden Set frm = Forms(obj.Name) frm.Filter = "" frm.FilterOn = False frm.OrderBy = "" frm.OrderByOn = False DoCmd.Close acForm, obj.Name, acSaveYes Next obj For Each obj In CurrentProject.AllReports DoCmd.OpenReport obj.Name, acDesign Set rpt = Reports(obj.Name) rpt.Filter = "" rpt.FilterOn = False rpt.OrderBy = "" rpt.OrderByOn = False DoCmd.Close acReport, obj.Name, acSaveYes Next obj End Sub إلى اللقاء ... مع الاحترام والتقدير
الدكتور خضر الرجبي قام بنشر يوليو 25, 2005 الكاتب قام بنشر يوليو 25, 2005 (معدل) السلام عليكم عدت إليكم ... "2- تغيير المعالج الإفتراضي لإنشاء جدول جديد " أرجو أنه لا يوجد مبرمج محترف يستخدم طريقة عرض ورقة البيانات كمعالج بناء الجداول. بناء الجداول بإستخدام هذا المعالج يؤدي إلى بناء وتصميم ضعيف لقاعدة البيانات ولا يلبي نظريات القواعد العلائقية ومتعلقات التصميم الأخرى. بالرغم من ذلك ، أكسيس تضع لك هذا الخيار العديم الفائدة كخيار إفتراضي لإنشاء جدول جديد فلننظر للصورة التالية: وما أود أن أشارككم به هنا ، طريقة لجعل خيار عرض التصميم هو الخيار الأول والإفتراضي كما في الصورة التالية : والطريقة هي كما يلي : من start ... Run ثم إطبع regedit لتدخل إلى تسجيلات الويندوز ... ثم HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/ <النسخة>/Access/Wizards/TableWizards "Index" value - إجعلها 1 بدلا من 0 لخيار "Datasheet View" ولخيار عرض التصميم إجعلها صفر بدلا من 1 وقل وداعاً للخيار عرض ورقة البيانات المزعج وعديم الفائدة. إلى اللقاء ... مع الاحترام والتقدير تم تعديل يوليو 25, 2005 بواسطه خضر الرجبي
الدكتور خضر الرجبي قام بنشر يوليو 26, 2005 الكاتب قام بنشر يوليو 26, 2005 السلام عليكم عدت إليكم ... " 3- تحديد نسخة الويندوز المستخدمة " قد يحتاج المبرمج لمعرفة رقم نسخة الويندوز المستخدمة ، وبناء عليه يتم طلب أو تنفيذ اقتران مكتبي مختلف ، طبعا يمكن عمل ذلك بسهولة باستخدام جملة select case ولكن يبقى السؤال المهم كيف نعرف نسخة الويندوز المستخدمة ؟ Private Type OSVERSIONINFO lVersionInfo As Long lMajorVersion As Long lMinorVersion As Long lBuildNumber As Long lplatformID As Long sVersion As String * 128 End Type Private Declare Function apiGetVersion Lib "Kernel32" _ Alias "GetVersionExA" _ (ByRef osVer As OSVERSIONINFO) As Long Public Function GetWindowsVersion() As String Dim lRetVal As Long Dim VersionNo As OSVERSIONINFO Dim lngVer As Long Dim Version As String VersionNo.lVersionInfo = 148 lRetVal = apiGetVersion(VersionNo) GetWindowsVersion = VersionNo.lMajorVersion & "." & _ VersionNo.lMinorVersion End Function وهكذا نعرف نسخة الويندوز ، عندما استخدمت الأقتران عندي حصلت على رقم 5.1 وهذا هو رقم نسخة XP الأخيرة SP2 ولكل نسخة يوجد رقم مختلف. إلى اللقاء ... مع الاحترام والتقدير
الدكتور خضر الرجبي قام بنشر يوليو 27, 2005 الكاتب قام بنشر يوليو 27, 2005 السلام عليكم عدت لكم ... "4- التعامل مع اسماء جداول مؤقتة في بيئة تعدد المستخدمين " لا بد أن كل منا قد احتاج في تطبيق ما إلى بناء جداول مؤقتة وخاص بالمستخدمين ، تخيلوا معي في تطبيق ما وجود مربعي تحرير وسرد يعتمد فيهما الثاني على الأول وبناء على الاختيار في الأول يتم بناء جدول وجعله مصدراً للمربع الثاني . هذه الطريقة ستعمل بشكل رائع في بيئة المستخدم الواحد ولكن في بيئة تعدد المستخدمين سنواجه مشاكل كثيرة لأن اسم الجدول نفسه لكل المستخدمين فربما ما تم أختياره لمستخدم يختلف عن أخر أو أن مستخدم ما يقوم بإنشاء الجدول بينما الثاني يستخدمه وهكذا ... الحل هنا نسبيا سهل ، في كل مرة تقوم بها ببناء جدول مؤقت ما عليك إلا ربط اسمه بمتغير فريد لكل مستخدم كأن تربطه باسم المستخدم للقاعدة أو الحاسوب . إليكم هذان الإقترانان اللذان يرجعان الأسماء : Declare Function GetComputerName _ Lib "Kernel32" _ Alias "GetComputerNameA" _ (ByVal Buffer As String, _ BufferSize As Long) As Long Declare Function GetUserName _ Lib "Advapi32" _ Alias "GetUserNameA" _ (ByVal Buffer As String, _ BufferSize As Long) As Long الإقتران الذي سيقوم ببناء الجداول المؤقت بناء على الاسم سيبدو هكذا : Function GetTemporaryTableName() As String 'Returns a table name based on 'the user's computer's name. Dim lngSize As Long Dim strName As String strName = Space(16) lngSize = 16 If GetComputerName(strName, lngSize) Then GetTemporaryTableName = _ "tbl" & Left$(strName, lngSize) Else GetTemporaryTableName = vbnullstring End If End Function وهذا إقتران أخر يستخدم أسماء المستخدمين لتكوين الجدول المؤقت : Function GetTemporaryTableName () As String Dim strName As String Dim lngSize As Long Dim lngRetVal As Long strName = Space(15) lngSize = 15 lngRetVal = apiGetUserName(strName, lngSize) GetTemporaryTableName = _ "tbl" & Left$(strName, lngSize - 1) End Function شخصيا أفضل الإقتران الأخير ، طبعا هنا أفترض أننا نريد أن ننشأ هذه الجداول في القاعدة المركزية وليس محليا على اجهزة المستخدمين لأن بناءها على أجهزة المستخدمين يبقى خيارا متاحا بدون مشاكل. إلى اللقاء ... مع الاحترام والتقدير
الدكتور خضر الرجبي قام بنشر يوليو 28, 2005 الكاتب قام بنشر يوليو 28, 2005 السلام عليكم إخواني وأخواتي ، عدت إليكم ... "5- كيف أغير نوع الخط والوان واشكال عناصر التحكم في نموذج من نوع ورقة بيانات ؟" عندما تصمم نموذج وتجعل طريقة العرض له من نوع ورقة بيانات Datasheet فإنك مهما تغير في وضع التصميم من أشكال عناصر التحكم بما يتعلق بالألوان والخلفيات وغيرها من التأثيرات فإن العرض لهذا النموذج يبقى كما هو (افتراضيا) ولا يتغير شيء في النتيجة. نعم إخواني وأخواتي ، لن يتغير شيء لأن التغير في مظهر عناصر التحكم للنموذج الذي من نوع ورقة بيانات لا يتم في وضع التصميم ، بل في وضع العرض أي بعد فتحه ولا يمكن عمل ذلك إلى برمجيا على سبيل المثال لا الحصر كما يلي في حدث التحميل للنموذج : Private Sub Form_Load() Me.DatasheetForeColor = vbBlue Me.DatasheetFontWeight = 700 'Bold Me.DatasheetBackColor = 8454143 'Light yellow End Sub والخصائص التي يمكننا التحكم بها كما في الجدول المرفق إلى اللقاء ... مع الاحترام والتقدير
الدكتور خضر الرجبي قام بنشر يوليو 29, 2005 الكاتب قام بنشر يوليو 29, 2005 (معدل) السلام عليكم إخواني وأخواتي ، بارك الله فيكم جميع. عدت إليكم ... "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 مع الإنتباه للفواصل لأنها مهمة جدا . إلى اللقاء ... مع الاحترام والتقدير تم تعديل يوليو 29, 2005 بواسطه خضر الرجبي
المتنور قام بنشر يوليو 30, 2005 قام بنشر يوليو 30, 2005 موضوع رائع يعطيك العافيه اخوي خضر الرجبي بانتظار جديدك دائما تحياتي
الدكتور خضر الرجبي قام بنشر يوليو 30, 2005 الكاتب قام بنشر يوليو 30, 2005 السلام عليكم أشكرك أخي المتنور ، الله يزيدك العافية. علماً أن هذه الأضواء ستبقى دائما وبشكل مستمر بإذن الله وبمعدل موضوعين إلى ثلاثة اسبوعيا فالقليل الدائم خير من الكثير المنقطع. مع احترامي وتقديري لك
الاصيل قام بنشر يوليو 31, 2005 قام بنشر يوليو 31, 2005 مشاء الله بارك الله فيك اخى خضر عمل رائع .. و موفق باذن الله خالص تحياتى و إلى الأمام دائما الأصـــــــ ــــــــــــيل
شاهر قام بنشر أغسطس 1, 2005 قام بنشر أغسطس 1, 2005 السلام عليكم ورحمة الله وبركاته اخي المحترم حضر الرجبي بارك فيك وزادك الله علما ونور وجعله الله في ميزان حسناتك كل يوم وانت تدهشن بدرر النفيسه بتوفيق والى الامام احوك شاهر
الدكتور خضر الرجبي قام بنشر أغسطس 3, 2005 الكاتب قام بنشر أغسطس 3, 2005 السلام عليكم أخواي الأصيل وشاهر ، أشكركما إخواني وأخواتي ، بارك الله فيكم جميعا عدت إليكم ... "7- هل يوفر الأكسيس خاصية الربط FULL OUTER JOIN " من المعروف أن الأكسيس يوفر اساسا ثلاث أنواع من طرق الربط بين جدولين بغرض عرض البيانات باشكال مختلفة ، في هذا الموضوع سألقي الضوء على هذه الأنواع وسأعرض لكم كيف نضيف طريقة جديدة ببعض الاجتهاد . في مثالي جدولي الموظفين و الموردين وفي كل جدول اسم الموظف أو المورد ومدينته وسأبني الربط بناء على المدينة. أولا : للناقش الطرق الثلاث لأنواع الربط بين جدولين الموفرة في الأكسيس : وقبل أي شيء للنظر لمحتويات الجدولين Suppliers الموردين = {(خضر ،القدس)، (محمد،الخليل)،(سمير،غزة)،(رامي،نابلس)،(سعاد،بيت لحم)،(فاطمة،رام الله)،(زينب ،القدس)} Employees الموظفين = {(سهيلة،جنين)،(راوية،بيت لحم)،(زهرة،رفح)،(ربيع،طولكرم)،(سعيد،رفح)،(نافذ،نابلس)،(احمد،القدس)} ولو احببنا تمثيل الجدولين (المجموعتين) باستخدام اشكال فن الرياضية حسب التشارك في المدينة فالنتيجة ستكون كما يلي : 1. Inner Join وطريقة التعريف كما يلي : والنتيجة هي العناصر المشتركة بين الجدولين حسب المدينة كما يلي : وللنظر إلى جملة SQL الخاصة بهذه الطريقة للربط ونلاحظ أنها inner join 2. left outer join والنتيجة هي العناصر المتوفرة في الموردين وغير متوفرة التقاطع إنظر إلى الرسم التوضيح بأشكال فن مرة أخرى . وللنظر إلى جملة SQL الخاصة بهذه الطريقة للربط ونلاحظ أنها left join 3. right outer join والنتيجة هي العناصر المتوفرة في الموظفين وغير متوفرة التقاطع . وللنظر إلى جملة SQL الخاصة بهذه الطريقة للربط ونلاحظ أنها right join ثانياً : الان نأتي لهدف الموضوع الأساس وهو بناء طريقة ربط جديدة بين الجداول وهي FULL OUTER JOIN بحيث تكون النتيجة جميع العناصر من الجدولين يعني الاتحاد set1 Union Set2 Union Set3 حيث Union تعني اتحاد والنتيجة ستكون كما يلي : والطريقة هي بناء استعلام توحيدي لكل المجموعات السابقة والغير المتقاطعة كما يلي : 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
الدكتور خضر الرجبي قام بنشر أغسطس 4, 2005 الكاتب قام بنشر أغسطس 4, 2005 السلام عليكم إخواني وأخواتي ، بارك الله فيكم جميعاً عدت إليكم ... "8- خاصية الترتيب المتبدلة حسب الحقول للبيانات في نموذج مجدول" لننظر إلى النموذج التالي من المرفق ، بالتأكيد سيكون الأمر رائعا لو توفرت لدينا أداة بسيطة بحيث لو ضغطنا على الرقم يتم الترتيب تصاعديا والضغط الثانية تنازليا وهكذا يكون الترتيب تبديليا ولكل الحقول وليس للرقم فحسب وإليكم الطريقة .. تضعون الإقتران التالي في وحدة نمطية 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
الدكتور خضر الرجبي قام بنشر أغسطس 4, 2005 الكاتب قام بنشر أغسطس 4, 2005 السلام عليكم إخواني وأخواتي ، بارك الله فيكم عدت إليكم ... "9- بناء مربع تحرير وسرد يحتوي على تصنيفات وفروعها" انظروا معي فضلا للصورة التالية : إن كنتم مهتمين بطريقة بناء مثل هذا الكمبو الذي يحتوي على تصنيفات وفروع لها فأرجو منك متابعة هذا الموضوع الممتع معي ... ولكي اسهل عليكم فهم الموضوع سأشرحه من نقطة الصفر ... 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
ظل السراب قام بنشر أغسطس 4, 2005 قام بنشر أغسطس 4, 2005 السلام عليكم ورحمة الله وبركاته موضوع رائع يعطيك العافيه اخوي خضر الرجبي انت مثل النور في الضلام مشاء الله تبارك الله والله يوفقك والسلام عليكم ورحمة الله وبركاته
الدكتور خضر الرجبي قام بنشر أغسطس 5, 2005 الكاتب قام بنشر أغسطس 5, 2005 وعليكم السلام ورحمة الله وبركاته أشكرك أخي طيف لهذا الاطراء ، واعدك إن شاء الله أن أقدم المزيد من المواضيع التي ارجو من الله أن يكون فيها الفائدة للجميع. مع الاحترام والتقدير
الدكتور خضر الرجبي قام بنشر أغسطس 5, 2005 الكاتب قام بنشر أغسطس 5, 2005 السلام عليكم إخواني وأخواتي ، بارك الله فيكم عدت إليكم ... "10- برمجة التنسيق الشرطي بناء على التنقل بين السجلات في نموذج مجدول" إخواني لننظر للصورتين التاليتين اللتين تمثلان نموذج مجدول موضوع حديثنا اليوم ، الصورة الاولى تمثل كيف يتغير لون السجل عندما نتنقل من سجل لأخر ، وفي الصورة الثانية تغير خلفية الحقل عند تحريره (عند التركيز) . وفي هذا الموضوع سألقي الضوء على طريقتي الخاصة بمعالجة تغيير لون السجل عند الانتقال من سجل لأخر لأن التنسيق الشرطي بحدودياته التي بالاكسيس لا يستطيع معالجة هذه المسألة بشكل مباشر ومبسط . ومن الفوائد الضمنية للموضوع تعلم كيفية تحديد التنسيق الشرطي لمربعات النص التي في تفصيل النموذج المجدول تلقائيا وبرمجيا. الطريقة تعتمد على وضع حقل خاص في مصدر السجلات (الجدول أو الاستعلام) الذي سيكون مصدراً للنموذج المجدول ، وقد أطلقت عليه اختصار (تم) تنسيق مشروط ... ثم في النموذج وفي حدث في الحال الذي يتم تفعيله كلما تنقلنا بين السجلات نقوم بإعادة تعيين الحقل (تم) للقيم 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
الدكتور خضر الرجبي قام بنشر أغسطس 6, 2005 الكاتب قام بنشر أغسطس 6, 2005 السلام عليكم إخواني وأخواتي ، بارك الله فيكم عدت إليكم ... "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
الدكتور خضر الرجبي قام بنشر أغسطس 6, 2005 الكاتب قام بنشر أغسطس 6, 2005 السلام عليكم إخواني وأخواتي ، بارك الله فيكم عدت إليكم ... "12- استخدام عنصر ActiveX - Mircrosft Web Browser في البحث الديناميكي من داخل الأكسيس" نعم إخواني وأخواتي سنتعرف الآن ومن خلال هذا الموضوع على كيفية البحث الديناميكي الحيوي من داخل الأكسيس ، والعملية غاية في البساطة وهي كما يلي : 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
الدكتور خضر الرجبي قام بنشر أغسطس 6, 2005 الكاتب قام بنشر أغسطس 6, 2005 السلام عليكم إخواني وأخواتي ، بارك الله فيكم عدت إليكم ... "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 ثم قمت باختبار هذه الاقترنات وتأكدت من أنها تعمل بدون أية مشكلة ، أنظروا معي : أترككم مع المرفق لتتمتعوا بهذه النتائج التي لها فوائد عظيمة جدا . إلى اللقاء ... مع الاحترام والتقدير ClipBoard_20050806.rar
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.