الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف نجعل التقرير يظهر اول 50 سجل فقط

بدأه gadelrab في 1 يناير 2010 · 13 رد · 2,602 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الاخوة الاعزاء

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

لدى تقرير مبنى على استعلام

ويقوم التقرير بعرض كل السجلات

وانا اريد ان يعرض اول 50 سجل فقط

أو اى عدد من السجلات الاولى فقط اقوم انا بتحديدها

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

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

حيث ان هذا التقرير اقوم بعملة شهريا باختيار عدد محدد من السجلات الاولى

ويختلف هذا العدد من شهر لآخر

وجزاكم الله خيرا

4444.rar

ebrahemsound7.gif
#2

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

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

آمل أن أكون أفدتك وبالتوفيق ..

4444.rar

(`'•.¸(` '•. ¸ * ¸.•'´)¸.•'´)

«´¨`.¸ أبو رهـــــــف ¸.´¨`»

(¸. •'´(¸.•'´ * `'•.¸)`'•.¸ )

¸.•’’ ’’

( `•.¸

`•.¸

#3

الاخ العزيز ابو رهف

جزاك الله خير الجزاء على تفضلك بالرد وعلى جميل اهتمامك

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

مع ملاحظة ان التقرير لايعرض سجلات الاستعلام بنفس ترتيبها

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

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

فكلما وضعت فرز تنازلى بالاستعلام للحقل qta يطلب منى قيمة معلمة للحقل uu

وقد تمكنت من عمل الفرز بالتقرير ولكن التقرير يعرض جميع السجلات

ولنا اريد عرض السجلات الاولى طبقا للتحديد

وجزاك الله خيرا مرة اخرى

ebrahemsound7.gif
#4

وجزيت بالمثل أخي الكريم ...

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

(`'•.¸(` '•. ¸ * ¸.•'´)¸.•'´)

«´¨`.¸ أبو رهـــــــف ¸.´¨`»

(¸. •'´(¸.•'´ * `'•.¸)`'•.¸ )

¸.•’’ ’’

( `•.¸

`•.¸

#5

الاخ العزيز ابو رهف

شكرا لك على اهتمامك وسعة صدرك

ولكن يبدو ان الفكرة لم تصل اليك بالشكل المطلوب

الفكرة اننى اريد ان اقوم بفرز حقلqta تنازليا قبل عرضه فى التقرير

اى قبل تحديد عدد السجلات التى تقضلت بحل مشكلتها

لابد من فرز حقلqta تنازليا

لان هذا الحقل هو اساس الاختيار

والسؤال بصيغة اخرى

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

حيث انه عند وضع الترتيب التنازلى يطلب الاستعلام قيمة معلمة

ارجو ان يكون الطلب واضح

ebrahemsound7.gif
#6

الاخوة الاعزاء

لقد توصلت الى حل وجدته

ولكنه طويل ويحتاج مساعدة

الحل هو عمل الكود التالى

فى خصائص تفصيل التقرير

اجراء حدث عند التنسيق

وذلك على فرض ان مربع الترقيم بالتقرير = id

If [iD] Mod 2 = 0 Then

Me.تفصيل.ForceNewPage = 2

Else

Me.تفصيل.ForceNewPage = 0

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

ولكن تبقى مشكلة فى كل مرة افتح التقرير ثم محرر الفجول بيسك ثم تغير الرقم طبقا للاحياجات

وهذه الطريقة طويلة ويكتنفها الخطا

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

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

ارجو المساعدة

ebrahemsound7.gif
#7

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

إذا يسمح لي أخي أبو رهف .... بالمشاركة

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

koao_4444.zip

أما إذا كنت تريد أن تحدد السجلات بين رقمين من الحقل المحسوب qta (مع أن بعض القيم سالبة) وليس من الحقل no .... فلن ينفعك المثال السابق .... فأرجو التوضيح لنساعدك

ولتعلم أني إستفدت من مشاركتك هذه عن Switch والتي لا أعرفها .... وتعلمت فكرتها منك .. فلك الشكر

وبالتوفيق

تم تعديل هذه المشاركة بواسطة koao في 2 يناير 2010 في 23:24

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#8

الاخ العزيز koao

شكرا لك على مشاركتك فانت دائما سباق بالخير

والفضل لما تعلمته لله ثم للقائمين على المنتدى من اعضاء ومشرفين فهم وانت منهم من يستحق الشكر

نعود لمشكلتى

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

هذا الحقل يتم على اساسه وضع الخطة الشهرية

هذه الخطة تتطلب ترتيب الايام بالحقل تنازليا والرقم الاكبر له اولويه فى الخطة ثم الذى يلية وهكذا

لذا وجب قبل اى شىء ترتيب هذا الحقل تنازليا من الاكبر الى الاصغر

اى ان الترتيب التنازلى لابد ان يتم اولا لجميع السجلات قبل تحديد اول عدد من السجلات يتم وضعه بالخطة

بمعنى اخر لابد ان تتم الخطوات بالترتيب التالى

اولاً ترتيب الحقل kta تنازليا

ثانياً اختيار اول عدد من السجلات تبعا للخطة

فلو تم اختيار عدد السجلات اولاً ثم ترتيبها لكان المطلوب غير صحيح

فربما تكون سجلات للحقل kta ذات رقم اكبر وكان لابد ان يشملها الاختيار اولاً

وبصورة اخرى فلنترك التقرير جانبا

ليصبح السؤال

هل يمكن ترتيب الحقل kta تنازليا فى الاستعلام ؟؟؟

ارجو ان اكون قد اوضحت المطلوب

وجزاك الله خيرا

تم تعديل هذه المشاركة بواسطة gadelrab في 3 يناير 2010 في 03:30

ebrahemsound7.gif
#9

بارك الله بكم جميعا

تفضل اخي الكريم ملفك بعد التعديل بناء على طلبك

za-4444-UP.rar

بالتوفيق

1
#10

الاستاذة القديرة زهرة

جزاك الله خير الجزاك وشكراً لكِ على كريم تفضلك بالمشاركة

وتلك فرصة لن تتكرر لكى اقدم لكى عظيم شكرى وامتنانى على ما تقدمينه من علم نافع للجميع

فاللهم اجعل ما تقدمينه من علم نافع ومن مساعدة للجميع فى ميزان حسناتك يوم القيامة

فعلاً ما تفضلت به حل معظم المشكلة

حيث تم ترتيب الحقل kta تنازيلا

والمطلوب هو اختيار 20 سجلاً الاولى بعد هذا الترتيب

ليصبح المطلوب كما بالصورة

وذلك بعد الغاء نموذج وضع الارقام

165308780.jpg

اما عند استخدام الملف المرفق وتحديد ال 20 سجلا الاولى يعطى النتيجة التالية

986463731.jpg

والحقيقة ان الصورة الاولى هى المطلوب تماما حيث تم فيها اولا ترتيب جميع السجلات تنازليا

ثم قمنا باختيار ال 20 سجل الاولى

اما الصورة الثانية فقد تم فيها اختيار 20 سجلا الاولى ثم ترتيبها وهذا ليس المطلوب

ارجو ان يكون المطلوب قد تم ايضاحه

وشكرا لكِ مرة اخرى استاذتنا القديرة

ebrahemsound7.gif
#11

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

تفضل أخي الكريم لعل في هذا المثال الحل

وبالتوفيق

koao_2222.zip

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#12

الاخ العزيز koao

تعجز الكلمات ان توفيك حقك من الشكر

فجزاك الله خير الجزاء

هذا بالضبط ما كنت اريده

ولو تفضلت بشرح الطريقة ليستفيد الجميع

فستثاب ثواباً عظيماً لنشر العلم

وشكرا لك

ebrahemsound7.gif
#13

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

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

وطلباتك اوامر

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

كان في مثالك إستعلام عادي بإسم matlobes قمت بنسخه وأسميته koaoCreatedTableQry وقمت بتعديل بسيط وهو تغيير التعبير qta ليكون كوده كالتالي

qta: DateDiff("d";[Expr1];[uu])

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

1- interval ... الفاصل الزمني إن صحت الترجمة .. مطلوب ... وتضع به "d" إذا كنت تريد ناتج طرح التاريخين يكون بالأيام ... أو "m" للأشهر أو "yyyy" للسنوات أو "q" لأرباع السنوات أو "ww" للأسابيع أو "w" لأيام العمل أو "h" للساعات أو "n" للدقائق أو "s" للثواني

2- date1 ... التاريخ الأول ... مطلوب

3- date2 .... التاريخ الثاني .. مطلوب

4- firstdayofweek .. تحديد يوم بداية الإسبوع الرسمي .. إختياري .... وفي حال تجاهله يكون الأحد ويأخذ القيمة vbSunday .... ولتغييره ليوم آخر حدده كـ vbMonday وباقي الأيام تأخذ نفس الصورة

5- firstweekofyear .. تحديد أول إسبوع بالسنة ... إختياري .... وفي حال تجاهله يكون vbFirstJan1

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

ثم شغلت الإستعلام وبالفعل قام بواجبه وأنشأ الجدول وألحق السجلات الناتجه منه إلى الجدول الجديد ... ثم نسخت هذا الجدول الناشئ وألصقته وأسميته koaoTempTable .... ليكون هذا الجدول للسجلات المؤقتة الناتجة من كود النموذج الذي سنراه لاحقا ... وجعلته مصدر البيانات للتقرير المسمى koaoReport

ثم صممت نموذج بإسم koao به مربع نص بإسم RecCount لتستطيع تحديد عدد السجلات المراد عرضها ... وزر أمر فيه الكود التالي .... وسنشرحه سطرا سطرا

DoCmd.SetWarnings False

هذه الكود لمنع ظهور رسائل التحذير التقليديه للأكسيس .... وستفهم قصدي إذا عطلت هذا الكود

DoCmd.RunSQL "delete * from koaoTempTable"

أمر تنفيذ جملة SQL وكما هو واضح لحذف السجلات من الجدول المؤقت koaoTempTable

Dim stDocName As String
    Dim ReqRecord, x As Integer
    stDocName = "koaoCreatedTableQry"
    DoCmd.OpenQuery stDocName, acNormal, acEdit

عرفنا كم متغير ثم أسندنا للمتغير stDocName قيمة وهي إسم الإستعلام koaoCreatedTableQry ثم وضعنا أمر تنفيذ لفتح الإستعلام المحدد بالمتغير ... وعند تنفيذه طبعا كما شرحنا في فكرة هذا الإستعلام سابقا ... سيحذف الجدول koaoCreatedTable ثم ينشئه من جديد ويلحق فيه السجلات الناتجة من هذا الإستعلام

    Dim RC1, RC2 As Recordset
    Set RC1 = CurrentDb.OpenRecordset("SELECT * FROM koaoCreatedTable ORDER BY qta DESC", dbOpenDynaset)

أولا عرفنا متغيرين من نوع Recordset ثم أسندنا للمتغير RC1 كل السجلات الناتجة من جملة الـ SQL والتي تختار كل السجلات من الجدول koaoCreatedTable وفق ترتيب تنازلي للحقل qta ... وهنا مربط الفرس في حل طلبك

Set RC2 = CurrentDb.OpenRecordset("koaoTempTable", dbOpenDynaset)

ثم أسندنا للمتغير RC2 فتح الجدول koaoTempTable لتمنكن من الإضافة إليه لاحقا

RC1.MoveFirst

نأمر مؤشر القراءة حامل السجلات RC1 للذهاب لأول سجل

Do While Not RC1.EOF

نفتح حلقة Do While Not ... كأننا نقول نفذ الكود بعد هذا السطر ما دام أن مؤشر القراء لحامل السجلات RC1 لم يتعدى آخر سجل .... وللمعلومية فإن عكس EOF هو BOF أي تستطيع تعمل حلقة عكسية وتستخدمه لتحجيم مؤشر القراءة أن لا يتعدى أول سجل .. وطبعا إذا إستخدمت الحلقة العكسية فتحتاج بدل ما تكتب هذا الكود RC1.MoveFirst كما فعلنا سابقا أن تكتب الكود RC1.MoveLast

ReqRecord = ReqRecord + 1

هذا عداد نستخدمه لنعرف كم سجل تعاملنا معه حتى الآن ... وكل مرة يزيد واحد

RC2.AddNew

هنا نخبر حامل السجلات RC2 أن يهيء نفسه لإضافة سجل جديد

        For x = 0 To 11
            RC2(x) = RC1(x)
        Next x

بحكم أن عدد الحقول وترتيبها متطابقين بين حامل السجلات RC1 و RC2 ... ولإختصار الكود فتحت حلقة For Next وجعلت حدودها من صفر لأن مجموعة الحقول تبدأ فهرستها بصفر .. إلى 11 بحكم أن عدد الحقول 12 حقل .... فماذا لو لم تكن كذلك .. فعليك بإتباع الطريقة التقليدية ... بأن تحدد كل حقل بإسمه كالتالي

RC2!no = RC1!no

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

RC2.Update

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

If ReqRecord = CInt(Nz(Me!RecCount, 0)) Then Exit Do

هنا نختبر إذا كانت قيمة المتغير العداد الذي شرحناه سابقا تساوي قيمة مربع النص في النموذج الذي تحدد به عدد السجلات المراد عرضها فإنه سيخرج من الحلقة Do وينفذ ما بعدها وأن ليس كذلك فسيبقى بالحلقة وسينتقل للكود الذي يليه ... وتلاحظ أننا إستخدمنا CInt والتي تحول إي نوع بيانات إلى رقم صحيح ... لأن القيمة الموجودة في مربع النص ... هي نص حتى لو أن المدخل رقم ... فيكون كالتالي ... "4" وهذا لا يساوي 4 ... وبهذه الحالة لن يتحقق الشرط أبدا ... أما إستخدامنا للدالة Nz فهي المسؤلة عن إعطاء قيمة بديلة وهي المعامل الثاني لها في حال كانت قيمة المعامل الأول لها Null ..أما إذا كانت ليست كذلك فتبقى قيمته كما هي ... ولذلك في النموذج تسمية تقول "أدخل عدد السجلات المراد عرضها أو إتركه فاضي لعرض الكل" فإذا كان فاضي فسيعتبر كأنه صفر

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

If IsNumeric(Me!RecCount) = False Then 
MsgBox "القيمة المدخلة ليست رقم , الرجاء المحاولة مرة أخرى"
Exit Sub
End If

عموما نرجع لشرح باقي الكود

RC1.MoveNext

نأمر مؤشر القراءة لحامل السجلات RC1 بأن ينتقل للتالي ... وهذا شئ مهم وإلا سيستمر الكود في حلقة مفرغة وينحبس البرنامج داخلها .... وللمعلومية .. في حال إستخدمت القراءة العكسية كما شرحنا سابقا ... باستخدام BOF ... فتحتاج تأمر مؤشر القراءة للتحرك للسجل السابق ... RC1.MovePrevious

    Loop
    DoCmd.SetWarnings True

أولا سكرنا الحلقة .. ثم كتبنا أمر السماح لرسائل التحذير التقليدية بالظهور ... وهذا شئ مهم يجب أن لا تنساه

    RC1.Close
    RC2.Close

ثم نغلق حاملي السجلات لهدمهما من الذاكرة ... وهذا مهم لتحرير الذاكرة من شئ غير مستخدم

    stDocName = "koaoReport"
    DoCmd.OpenReport stDocName, acPreview

وهذا الكود لعرض التقرير koaoReport

وبالتوفيق للجميع

اللهم صلي على محمد وعلى آل محمد كما صليت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

وبارك على محمد وعلى آل محمد كما باركت على إبراهيم وعلى آل إبراهيم إنك حميد مجيد

#14

الاخ العزيز koao

الله يزيدك علم على علمك

ويجعل مثواك انت ووالديك الجنة

ويرزق من حيث لا تحتسب

وشكراً لك على شرحك المنظم الواضح

الذى مما لاشك فيه سيعود بالنفع على وعلى جميع الاعضاء

ebrahemsound7.gif

مواضيع مشابهة