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

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

قام بنشر

السلام عليكم

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

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

وبسم الله الرحمن الرحيم أبدأ ...

" إزالة عوامل الفرز (الترتيب) والتصفية عن النماذج والتقارير "

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

في الإقتران التالي والذي يشغل لمرة واحدة قبل عملية التوزيع يتم إزالة جميع عوام الفرز والتصفية المعرفة في النماذج والتقارير تلقائيا .

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

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

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

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

السلام عليكم

عدت إليكم ...

"2- تغيير المعالج الإفتراضي لإنشاء جدول جديد "

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

krajabi1kdk.JPG

وما أود أن أشارككم به هنا ، طريقة لجعل خيار عرض التصميم هو الخيار الأول والإفتراضي كما في الصورة التالية :

krajabi2kdk.JPG

والطريقة هي كما يلي :

من start ... Run ثم إطبع regedit لتدخل إلى تسجيلات الويندوز ... ثم

HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/

<النسخة>/Access/Wizards/TableWizards

"Index" value - إجعلها 1 بدلا من 0 لخيار "Datasheet View"

ولخيار عرض التصميم إجعلها صفر بدلا من 1

krajabi3kdk.JPG

وقل وداعاً للخيار عرض ورقة البيانات المزعج وعديم الفائدة.

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

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

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

السلام عليكم

عدت إليكم ...

" 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 ولكل نسخة يوجد رقم مختلف.

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

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

قام بنشر

السلام عليكم

عدت لكم ...

"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

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

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

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

قام بنشر

السلام عليكم

إخواني وأخواتي ،

عدت إليكم ...

"5- كيف أغير نوع الخط والوان واشكال عناصر التحكم في نموذج من نوع ورقة بيانات ؟"

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

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

Private Sub Form_Load()
  Me.DatasheetForeColor = vbBlue
  Me.DatasheetFontWeight = 700     'Bold
  Me.DatasheetBackColor = 8454143  'Light yellow
End Sub

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

krajabiwhatd.JPG

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

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

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

السلام عليكم

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

عدت إليكم ...

"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

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

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

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

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

السلام عليكم

أشكرك أخي المتنور ، الله يزيدك العافية.

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

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

قام بنشر

مشاء الله

بارك الله فيك اخى خضر عمل رائع .. و موفق باذن الله

خالص تحياتى و إلى الأمام دائما

الأصـــــــ :fff::fff: ــــــــــــيل

قام بنشر

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

اخي المحترم حضر الرجبي

بارك فيك وزادك الله علما ونور

وجعله الله في ميزان حسناتك

كل يوم وانت تدهشن بدرر النفيسه

بتوفيق والى الامام

احوك شاهر

قام بنشر

السلام عليكم

أخواي الأصيل وشاهر :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

قام بنشر

السلام عليكم

إخواني وأخواتي :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

قام بنشر

السلام عليكم

إخواني وأخواتي :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

قام بنشر

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

موضوع رائع

يعطيك العافيه اخوي خضر الرجبي

انت مثل النور في الضلام

مشاء الله تبارك الله

والله يوفقك

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

قام بنشر

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

أشكرك أخي طيف :fff: لهذا الاطراء ، واعدك إن شاء الله أن أقدم المزيد من المواضيع التي ارجو من الله أن يكون فيها الفائدة للجميع.

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

قام بنشر

السلام عليكم

إخواني وأخواتي :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- طريقة تبديل عرض النموذج الفرعي برمجيا وديناميكيا خلال العمل"

ربما يود أحدنا في احدى التطبيقات أن يكون هناك امكانية لعرض النماذج الفرعية بطريقتين عرض نموذج وعرض ورقة بيانات وإليكم هذا الاسلوب البسيط باستخدام 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

قام بنشر

السلام عليكم

إخواني وأخواتي :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

قام بنشر

السلام عليكم

إخواني وأخواتي :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

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