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

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


salehamr

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

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

  • Like 1
رابط هذا التعليق
شارك

أرجو أن يكون هذا طلبك

للأسف لا يمكن التنزيل في المنتدى

لذلك أرجو القيام بالتالي

1- إنشاء قائمتين منسدلتين Combo Boxes اسمهما CboTables , CboFields

2- إنشاء قائمة عادية ListBox اسمها LstRecords

3- نسخ الكود التالي كله عندك بالفورم

4- التأكد من وضع كلمة Event Procedure على كل قائمة في الحدث المطلوب ... كما هو موضح في بداية كل جزء من الكود

Private Sub CboFields_AfterUpdate()
Dim FieldName As String, TableName As String, Query As String
With Me
FieldName = "[" & .CboFields & "]"
TableName = "[" & .CboTables & "]"
Query = "Select " & FieldName & " From " & TableName
.LstRecords.RowSource = Query
.LstRecords.Locked = False
End With
End Sub

Private Sub CboTables_AfterUpdate()
Dim TableName As String
Dim I As Byte
Dim rs As dao.Recordset
TableName = Me.CboTables.Value
Set rs = CurrentDb.OpenRecordset(TableName)
With Me.CboFields
For I = 0 To rs.fields.Count - 1
.AddItem rs.fields(I).Name
Next I
.Value = .Column(0, 0)
rs.Close
.Locked = False
End With
End Sub

Private Sub Form_Load()
Dim tbl As dao.TableDef
With Me
.CboTables.RowSourceType = "Value List"
.CboFields.RowSourceType = "Value List"
.LstRecords.RowSourceType = "Table/Query"
.CboFields.Locked = True
.LstRecords.Locked = True
End With
With Me.CboTables
For Each tbl In CurrentDb.TableDefs
If Left(tbl.Name, 4) <> "MSys" Then
.AddItem (tbl.Name)
End If
Next tbl
.Value = .Column(0, 0)
Set tbl = Nothing
End With
End Sub

بالتوفيق إن شاء الله

رابط هذا التعليق
شارك

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

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

For Each tbl In CurrentDb.TableDefs

If Left(tbl.Name, 4) <> "MSys" Then

.AddItem (tbl.Name)

End If

Next tbl

.Value = .Column(0, 0)

Set tbl = Nothing

تم تعديل بواسطه عمار زيد
رابط هذا التعليق
شارك

راح أحاول أشرح لك سطر سطر ...

For Each tbl In CurrentDb.TableDefs
طبعا أنت شفت إني عرفت متغير (Variable) اسمه tbl في بداية الكود و نوعه TableDef
Dim tbl As dao.TableDef
TabDef = Table Definition
هذا المتغير قادر على تخزين جدول في مرحلة الDesign بحيث تتحكم فيه كما تريد قبل أن تقوم بتخزينه مره أخرى... الرجاء النظر في الصورة على الرابط جدول في مرحلة التصميم
CurrentDb = Current Database
هذا متغير موجود في الأكسيس و يشير دائما إلى قاعدة البيانات الحالية
CurrentDb.Tabdefs
هذا التعبير يقوم باسترجاع جميع الجداول الموجودة في قاعدة بياناتك و بالتالي فإن معنى السطر بالكامل هو ... لكل Table Definition موجود في قاعدة البيانات الحالية CurrentDB قم بعمل الآتي ... (يتم تخزين كل جدول في المتغير tbl) ... و يستمر في استرجاع الجداول واحد واحد
If Left(tbl.Name, 4) <> "MSys" Then
توجد جداول مخفية في كل قاعدة بيانات ... غير الجداول التي التي يتم إنشاؤها من المستخدم ... ولاحظت أنها دائما تبدأ بكلمة MSys ... الرجاء النظر في الصورة على الرابط الجداول المخفية في الأكسيس لذلك كان يجب أن أتأكد من عدم إدراجها في القائمة المنسدلة ... فاستخدمت التعبير
Left(tbl.Name, 4) <> "MSys"
حتى أتأكد من أن اسم الجدول لا يبدأ بهذه الأربع حروف ... هنالك عيب في هذه الطريقة وهو لو أنشأ المستخدم جدولا يبدأ بهذه الأربع حروف فلن يظهر في القائمة المنسدلة طبعا لاحظت أخوي إن الدالة Left تستخدم في استرجاع الحروف من اليسار إلى اليمين ... لذلك استخدمتها و استرجعت أربعة حروف فقط من اسم الجدول ... :wink2:
.AddItem (tbl.Name)
هذا السطر يضيف اسم الجدول إلى القائمة المنسدلة ... و طبعا لأن نوعها ValueList فيمكنني التحكم في القيم التي بها أما لو كانت تعتمد على استعلام Table/Query فلن يمكنني ذلك
End If
نهاية الجملة الشرطية
Next tbl
هذا السطر يعود إلى بداية ال For loop ( أول سطر شرحناه ) مع تخزين الجدول التالي في المتغير Tbl .. و هكذا إلى أن تنتهي الجداول
.Value = .Column(0, 0)
بعد أن تم وضع جميع أسماء الجداول المطلوبة في القائمة المنسدلة ... يتم اختيار قيمة من بينها ووضعها في القائمة المنسدلة ك - بداية .. Initialize Value و أنا اخترت القيمة الأولى طبعا لو تتخيل محتويات القائمة المنسدلة ك مصفوفة تحتوي على صفوف و أعمدة ... فهي تحتوي في هذه الحالة على عمود واحد و عدة صفوف ... الرجاء النظر في الصورة على الرابط وضعية الأعمدة و الصفوف في القائمة المنسدلة
Set tbl = Nothing

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

أرجو أن يكون الشرح واضح ... و أي سؤال أو استفسار لديك ... سأحاول إجابته قدر استطاعتي

بالتوفيق إن شاء الله ... :smile2:

رابط هذا التعليق
شارك

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

جزاك الله خيراً أخي Dream Works وأثقل بها ميزان حسناتك

وللشهادة أني أحببت هذا المنتدى لوجود الخيرين أمثالك من مشرفين وخبراء وأعضاء جزاكم وجزاهم الله عنا كل خير .

وأرجوا أن تسمحوا لي بالسؤال التالي تكملة للموضوع أعلاه :

كيف يمكن تغيير مصدر النموذج الفرعي إستناداً لما يتم إختياره في مربع التحرير والسرد المسمى CboTables ؟ .

رابط هذا التعليق
شارك

يمكنك ببساطة فلترة بيانات النموذج الفرعي دون الحاجة إلى تغيير مصدر البيانات

فمثلا

With Me.subformName.Form
 .Filter = "[TableField] = 'TableName' "
 .FilterOn = true
End With

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

رفع ملفات

أو على الأقل توضيح المطلوب بمزيد من التفصيل

سأحاول إيجاد أنسب طريقة لقاعدة بياناتك

رابط هذا التعليق
شارك

جزيل الشكر لك أخي Dream Works على سرعة إستجابتك

المعذرة ما المقصود بـــ

.Filter = "[TableField] = 'TableName' "

وللتوضيح أخي :

قاعدة البيانات تحوي أكثر من جدول .....

النموذج الرئيسي يحوي :

1- قائمتين منسدلتين Combo Boxes الأولى CboTables , والثانية CboFields تعتمد على CboTables

2- قائمة عادية ListBox اسمها LstRecords تعتمد على CboFields

3- نموذج فرعي أريد أن تتم تحديد أو تصفية ( فلترة ) سجلاته بحسب ما يتم إختياره من قائمة ListBox

رابط هذا التعليق
شارك

أخي الكريم

لدي بعض التساؤلات أرجو الرد عليها

هل النموذج يحتوي على بيانات مسبقا ... أم تريد أن عرض البيانات حسب الاختيار من القائمة ؟ ...

طريقتك تدل على أنك تريد عرض أي بيانات من أي جدول ... في نموذج فرعي واحد هل هذا صحيح ؟ ....

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

رابط هذا التعليق
شارك

لك الشكر الجزيل على تفاعلك وإهتمامك أخي

نعم أريد أن أعمل :

قاعدة بيانات بها أكثر من جدول وأكثر من إستعلام

ونموذج رئيسي يحتوي على :

1- زرين إختيار :

الأول : جداول

الثاني : إستعلام

2 - قائمة منسدلة CboTables تستعرض الجداول و/ أو الإستعلام فقط ( حسب الإختيار أعلاه )

3 - قائمة منسدلة CboFields تستعرض فقط حقول الجدول / الإستعلام الذي تم إختياره من القائمة CboTables

4 - قائمة عادية ListBox تستعرض فقط بيانات الحقل الذي تم إختياره من القائمة CboFields

5 - زرين إختيار :

الأول : تحديد

الثاني : تصفية

6 - نموذج فرعي واحد فقط بحيث أتمكن من :

1- إستعراض بيانات أي ( جدول / إستعلام ) يتم إختياره من القائمة المنسدلة CboTables

2 - تحديد و/ أو تصفية السجلات على ضوء الحقل الذي يتم إختياره من القائمة المنسدلة CboFields و معيار التصفية الذي يتم إختياره من القائمة ListBox

أرجو المعذرة أخي

  • Like 1
رابط هذا التعليق
شارك

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