أبو آدم قام بنشر مايو 23, 2012 قام بنشر مايو 23, 2012 إخوتي الفضلاء التطبيق الذي سنعمل عليه اليوم ، تطبيق يلزم بعض الإخوة الذين يعملون على الشبكات المحلية الذين يحتاجون تخصيص طابعة معينة لطباعة كل تقرير ، لغايات مختلفة وأسباب مختلفة حسب ظروف المستخدمين وغايات التطبيق أو التقرير. الغاية المشودة الوصول لتحديد طابعة معينة لطباعة تقرير معين بعيداً عن الطابعة الافتراضية للجهاز. وسنقوم هنا بتفصيل الإجراءات ومراحل التطبيق لغايات التوضيح بشكل دقيق قدر الامكان سعياً لعموم الفائدة ، وسعياً لما يكثر تداوله في المنتدى من الحاجة لتوضيح وشرح التطبيقات المقدمة. نبدأ تطبيقنا كما يلي : · انشاء نموذج وفتحه بعرض التصميم · ننشيئ مربع تحرير وسرد جديد : نستخدمه لعرض التقارير الموجودة في التطبيق ، باستخدام كائنات النظام . يكون اسم المربع cboReport ويكون نوع مصدر الصف Row Scurce Type هنا Table/Query ويكون مصدر الصف Row Scurce هنا : SELECT MsysObjects.Name FROM MsysObjects WHERE (((MsysObjects.Name) Not Like "~*") AND ((MsysObjects.Type)=-32764)) ORDER BY MsysObjects.Name; حيث نقوم بذلك باختيار جميع التقارير ، والتي تعرف بالنظام بانها من نوع 32764 ، ونقوم بترتيبها حسب الاسم ......... 2
أبو آدم قام بنشر مايو 23, 2012 الكاتب قام بنشر مايو 23, 2012 نتابع .... · ننشيئ مربع تحرير وسرد جديد : نستخدمه لعرض الطابعات المعرفة و الموجودة على الجهاز ، باستخدام كائنات النظام . يكون اسم المربع cboPrinter ويكون نوع مصدر الصف Row Scurce Type هنا Value List ويكون مصدر الصف Row Scurce هنا نتيجة وظيفة خاصة (روتين) نضعه في محرر الفيجوال بيسك للنموذج باسم GetPrinters · لإنشاء الوظيفة لا بد أن نصل لمحرر الفيجوال بيسك للنموذج ، نقوم بالضغط على Alt+f11 ، وننسخ الكود التالي : Private Function GetPrinters() As String Dim prn As Printer Dim strPrinter As String If Application.Printers.Count > 0 Then For Each prn In Application.Printers strPrinter = strPrinter & """" & prn.DeviceName & """;" Next GetPrinters = Left$(strPrinter, Len(strPrinter) - 1) End If End Function ونكون هنا قد جلبنا أسماء الطابعات المعرفة على الجهاز على شكل سلسلة قيم ، وأصبحت جاهزة لدينا للإستخدام ومتاحة في أي لحظة نحتاج فيها للتعامل معها. .............
أبو آدم قام بنشر مايو 23, 2012 الكاتب قام بنشر مايو 23, 2012 نتابع ... · لغايات استحضار أسماء الطابعات في مربع التحرير والسرد ، نقوم باستدعاء الوظيفة الخاصة GetPrinters ، نقوم بكتابة الكود التالي في حدث عند الفتح لنموذجنا : Private Sub Form_Open(Cancel As Integer) Dim strMsg As String Dim strTemp As String 'Load the combo with names of the installed printers. strTemp = GetPrinters() If Len(strTemp) = 0 Then Cancel = True strMsg = "No installed printers found." Else Me.cboPrinter.RowSource = strTemp End If End Sub حيث قمنا هنا بتعريف القيم strMsg و strTemp ثم جعلنا strTemp تساوي أسم الطابعة / الطابعات الناتجة من تطبيق الوظيفة GetPrinters وهناك شرط ضروري لا بد من تطبيقه وهو عدم وجود طابعات معرفة على الجهاز ، فنقوم بالتأكد من طول سلسلة القيم في strTemp (اسم الطابعة / الطابعات) فإذا كانت تساوي صفر ، فهذا يعني عدم وجود طابعات معرفة على الجهاز ، وبالتالي لا بد من أغلاق السلسلة الاجراءات باستخدام Cancel = True ، وإظهار رسالة تفيد بعدم وجود طابعات معرفة على الجهاز. وعكس الشرط هو وجود قيمة أعلى من صفر فتكون هذه القيمة (اسم الطابعة / الطابعات ) مصدر الصف لمربع التحرير و السرد cboPrinter بذلك نكون قد زودنا النموذج بالمتغيرات التي تحقق لنا الغاية التي نسعى لها ، وهي توفير متغير اسم التقرير ومتغير اسم الطابعة . .............
أبو آدم قام بنشر مايو 23, 2012 الكاتب قام بنشر مايو 23, 2012 نتابع .... نقوم الآن بحفظ الاجراءات التي قمنا بها ونسمي النموذج frmSetPrinter ، ثم نقوم بتشغيل النموذج. عند الضغط على السهم المضمن في مربع التحرير و السرد cboReport تظهر لنا أسماء كافة التقارير في تطبيقنا ، كما هي ، وبالضغط على السهم المضمن في مربع التحرير و السرد cboPrinter تظهر لنا أسماء كافة الطابعات المعرفة على الجهاز والتي سنتمكن من استخدامها في تطبيقنا ، لطباعة تقاريرنا. وهنا نصل للمرحلة التالية التي هي الغاية الأساسية من هذا التطبيق ، حيث يبرز السؤال الأهم ، وهو ، كيف نجعل التطبيق يقوم بطباعة التقرير الذي تم إختيارة بمربع التحرير و السرد cboReport باستخدام الطابعة التي سنختارها من مربع التحرير و السرد cboPrinter ؟ .......
أبو آدم قام بنشر مايو 23, 2012 الكاتب قام بنشر مايو 23, 2012 نتابع ... في عرض التصميم للنموذج frmSetPrinter · ننشيئ زر أمر نسميه cmdOk ستكون وظيفة هذا الزر تشغيل منظومة إجراءات لتحقيق الإجراء النهائي ، واكتابة وتحديد هذه الاجراءات ، نقوم بالضغط على Alt+f11 ، لنصل لمحرر الفيجوال بيسك للنموذج ، و نبدأ بكتابة الكودات التي تحقق غاياتنا باستخدام ما قمنا بتحقيقه وتوفيره ضمن النموذج . هناك مسأله مهمة لا بد من معرفتها و إحسان التعامل معها ، وهي أن الاجراء الرئيسي الذي نسعى اليه وهو تحديد الطابعة لطباعة هذا التقرير ، لا تتحقق الا في حالة فتح التقرير بعرض التصميم !! لحل هذه المشكلة نقوم بافتتاح الكود بالجملة التالية : DoCmd.OpenReport Me.cboReport, acViewDesign, Null, Null, acHidden حيث نقوم ضمن هذا الأمر بفتح التقرير (الذي تم اختياره في مربع التحرير و السرد cboReport ) بوضع التصميم ، و إحفاؤه acHidden ن وهذا ضروري حتى لا يظهر لنا التقرير فعلا بوضع التصميم أثناء التنفيذ. ثم نقوم بتعريف oRpt كتقرير Dim oRpt As Report ثم ضبط هذا التقرير ليكون تقريراً محدداً (قابل للتحديد) Set oRpt = Reports(0) حتى نتمكن من الوصول لإختيار تقريرنا ثم نقوم بتعطيل الطابعة الإفتراضية عند التعامل مع تقريرنا ، كون واحد من أهدافنا عدم التعامل مع الطابعة الإفتراضية oRpt.UseDefaultPrinter = False ثم نجعل طابعة تقريرنا هي الطابعة التي تم إختيارها في مربع التحرير و السرد cboPrinter oRpt.Printer = Application.Printers((Me.cboPrinter)) ثم نقوم بفتح (طباعة) تقريرنا ، حسب كل ما مرّ بأعلاه DoCmd.OpenReport Me.cboReport, acViewNormal ثم نغلق التقرير (كنا فتحناه بعرض التصميم مخفياً) ، مع الحفظ DoCmd.Close acReport, Me.cboReport, acSaveYes وأخيراً نلغي ضبط تقريرنا السابق في oRpt Set oRpt = Nothing .............
أبو آدم قام بنشر مايو 23, 2012 الكاتب قام بنشر مايو 23, 2012 نتابع .... وبذلك يصبح الكود خلف زر الأمر cmdOk ، كما يلي : Private Sub cmdOk_Click() DoCmd.OpenReport Me.cboReport, acViewDesign, Null, Null, acHidden Dim oRpt As Report Set oRpt = Reports(0) oRpt.UseDefaultPrinter = False oRpt.Printer = Application.Printers((Me.cboPrinter)) DoCmd.OpenReport Me.cboReport, acViewNormal DoCmd.Close acReport, Me.cboReport, acSaveYes Set oRpt = Nothing End Sub · ننشيئ زر أمر لإغلاق النموذج وبذلك يكون تطبيقناً جاهزاً للاستخدام . .........
عبدالله المجرب قام بنشر مايو 23, 2012 قام بنشر مايو 23, 2012 ما شاء الله بارك الله فيك استاذ نارت على هذه الدروس القيمة
أبو آدم قام بنشر مايو 23, 2012 الكاتب قام بنشر مايو 23, 2012 بارك الله لك وبك أخي عبدالله ونحن سعداء جداً بوجودك بيننا ونتمنى أن تستفيد من خبرتنا المتواضعة ، وأن نتمكن من الاستفادة من خبراتك الطيبة ...........
عبدالله المجرب قام بنشر مايو 23, 2012 قام بنشر مايو 23, 2012 بارك الله لك وبك أخي عبدالله ونحن سعداء جداً بوجودك بيننا ونتمنى أن تستفيد من خبرتنا المتواضعة ، وأن نتمكن من الاستفادة من خبراتك الطيبة ........... ما اجمل تواضع العلماء
أبو آدم قام بنشر مايو 23, 2012 الكاتب قام بنشر مايو 23, 2012 نتابع .... بالتطبيق ستجد بأنه في عند الضغط على زر الأمر cmdOk حال خلوها من المعلومات ستظهر لك رسالة خطأ ، لذا سنقوم بحلَ الموضوع ببساطة ، حيث نضيف كود يقوم بتفحص الحقلين وحال خلوها من المعلومات سيزودنا برسالة خطأ ممنهجة ويعيد التركيز للحقل الفارغ ، ويكون الكود كما يلي : If IsNull(Me.cboReport) Then MsgBox "You Must Enter A Report Name", vbCritical, "Note That ..." Me.cboReport.SetFocus Exit Sub ElseIf IsNull(Me.cboPrinter) Then MsgBox "You Must Enter The Prenter Name", vbCritical, "Note That ..." Me.cboPrinter.SetFocus Exit Sub End If
أبو آدم قام بنشر مايو 23, 2012 الكاتب قام بنشر مايو 23, 2012 نتابع ... ومنعاً للخطأ و اللبس يصبح الكود خلف زر الأمر cmdOk ، كما يلي : Private Sub cmdOk_Click() If IsNull(Me.cboReport) Then MsgBox "You Must Enter A Report Name", vbCritical, "Note That ..." Me.cboReport.SetFocus Exit Sub ElseIf IsNull(Me.cboPrinter) Then MsgBox "You Must Enter The Prenter Name", vbCritical, "Note That ..." Me.cboPrinter.SetFocus Exit Sub End If DoCmd.OpenReport Me.cboReport, acViewDesign, Null, Null, acHidden Dim oRpt As Report Set oRpt = Reports(0) oRpt.UseDefaultPrinter = False oRpt.Printer = Application.Printers((Me.cboPrinter)) DoCmd.OpenReport Me.cboReport, acViewNormal DoCmd.Close acReport, Me.cboReport, acSaveYes Set oRpt = Nothing End Sub ...........
أبو آدم قام بنشر مايو 23, 2012 الكاتب قام بنشر مايو 23, 2012 نتابع .... أثناء عملي بالتطبيق ، ورغم محاولاتي الحثيثة من التخلص من هاجس " ماذا لو" الذي يستفزني دائماً لتطوير وتعقيد التطبيقات والاضافة عليها ، لم أتمكن من التخلص منه ، ودفعني نحو : ماذا لو أردنا التحكم بخيارات الطباعة بعد تحديد الطابعة لتقريرنا ؟؟ وهنا ننتقل لمنظومة أخرى " مرتبطة " بفكرتنا ، تمكننا من السيطرة على خيارات الطباعة من خلال الطابعة التي إخترناها لتقريرنا. وهذه نرى فيها رأينا ، فإما أن نستمر بها في موضوعنا هذا أو ننتقل بها لموضوع جديد. هذا التطبيق يمكن الإستفادة منه في أي تطبيق ، كل ما عليك هو إستيراد النموذج frmSetPrinter والله من وراء القصد ... وهو حسبي ........... NA_ReportPrenter.rar 2
ابوخليل قام بنشر مايو 23, 2012 قام بنشر مايو 23, 2012 خصلتان : البذل والعطاء الشرح والايضاح وايصال المعلومة باسلوب علمي منظم . وهذه ملكة وهبة من الله اجزل الله لك الثواب وزادك علما
أبو آدم قام بنشر مايو 23, 2012 الكاتب قام بنشر مايو 23, 2012 خصلتان : البذل والعطاء الشرح والايضاح وايصال المعلومة باسلوب علمي منظم . وهذه ملكة وهبة من الله اجزل الله لك الثواب وزادك علما أحسن الله اليك وبارك لك وبك استاذي أبو خليل جزيت خيراً على طيب قولك ودعائك .........
محمد ايمن قام بنشر يونيو 1, 2012 قام بنشر يونيو 1, 2012 بسم الله ما شاء الله بارك الله فيك اخي و معلمي و استاذي ابا آدم
hamzehmmk قام بنشر سبتمبر 16, 2012 قام بنشر سبتمبر 16, 2012 السلام عليكم ورحمة الله وبركاته وبارك الله فيك اخي ابو ادم لقد استفدت كثيرا من هذا الموضوع واستخدمته وطبقته لكن هناك مشكلة صغيرة ارجو منكم التوضيح عند اختيار تقرير عرضي يظهر طولي اي انني صممت تقرير ليتم عرضه وطباعته بشكل عرضي لكن عند الطباعة يظهر طولي على الصفحة مع العلم ان كود الطباعة العادي يظهر الطباعة بشكل عرضي طبيعي ارجو التوضيح واقبلوا فائق الاحترام
hamzehmmk قام بنشر سبتمبر 17, 2012 قام بنشر سبتمبر 17, 2012 السلام عليكم ورحمة الله واجهتني مشكلة جديدة اخي ابو آدم النموذج لم يفتح على جهاز آخر واعطى خطأ نصه: LoadInternalDevmode GetPrinter Faild ارجو توضيح السبب وكيف يمكن جعل النموذج يعمل على اي جهاز وتقبلوا تحياتي
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.