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

(تطبيق) إختيار تقرير للطباعة وتحديد طابعة معينة لتنقيذ الإجراء


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

إخوتي الفضلاء

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

الغاية المشودة الوصول لتحديد طابعة معينة لطباعة تقرير معين بعيداً عن الطابعة الافتراضية للجهاز.

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

نبدأ تطبيقنا كما يلي :

· انشاء نموذج وفتحه بعرض التصميم

· ننشيئ مربع تحرير وسرد جديد : نستخدمه لعرض التقارير الموجودة في التطبيق ، باستخدام كائنات النظام .

يكون اسم المربع 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 ، ونقوم بترتيبها حسب الاسم

.........

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

نتابع ....

· ننشيئ مربع تحرير وسرد جديد : نستخدمه لعرض الطابعات المعرفة و الموجودة على الجهاز ، باستخدام كائنات النظام .

يكون اسم المربع 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

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

.............

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

نتابع ...

· لغايات استحضار أسماء الطابعات في مربع التحرير والسرد ، نقوم باستدعاء الوظيفة الخاصة 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

بذلك نكون قد زودنا النموذج بالمتغيرات التي تحقق لنا الغاية التي نسعى لها ، وهي توفير متغير اسم التقرير ومتغير اسم الطابعة .

.............

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

نتابع ....

نقوم الآن بحفظ الاجراءات التي قمنا بها ونسمي النموذج frmSetPrinter ، ثم نقوم بتشغيل النموذج.

عند الضغط على السهم المضمن في مربع التحرير و السرد cboReport تظهر لنا أسماء كافة التقارير في تطبيقنا ، كما هي ، وبالضغط على السهم المضمن في مربع التحرير و السرد cboPrinter تظهر لنا أسماء كافة الطابعات المعرفة على الجهاز والتي سنتمكن من استخدامها في تطبيقنا ، لطباعة تقاريرنا.

وهنا نصل للمرحلة التالية التي هي الغاية الأساسية من هذا التطبيق ، حيث يبرز السؤال الأهم ، وهو ، كيف نجعل التطبيق يقوم بطباعة التقرير الذي تم إختيارة بمربع التحرير و السرد cboReport باستخدام الطابعة التي سنختارها من مربع التحرير و السرد cboPrinter ؟

.......

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

نتابع ...

في عرض التصميم للنموذج 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

.............

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

نتابع ....

وبذلك يصبح الكود خلف زر الأمر 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

· ننشيئ زر أمر لإغلاق النموذج

وبذلك يكون تطبيقناً جاهزاً للاستخدام .

.........

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

بارك الله لك وبك أخي عبدالله

ونحن سعداء جداً بوجودك بيننا

ونتمنى أن تستفيد من خبرتنا المتواضعة ، وأن نتمكن من الاستفادة من خبراتك الطيبة

...........

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

بارك الله لك وبك أخي عبدالله

ونحن سعداء جداً بوجودك بيننا

ونتمنى أن تستفيد من خبرتنا المتواضعة ، وأن نتمكن من الاستفادة من خبراتك الطيبة

...........

ما اجمل تواضع العلماء

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

نتابع ....

بالتطبيق ستجد بأنه في عند الضغط على زر الأمر 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

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

نتابع ...

ومنعاً للخطأ و اللبس يصبح الكود خلف زر الأمر 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


...........

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

نتابع ....

أثناء عملي بالتطبيق ، ورغم محاولاتي الحثيثة من التخلص من هاجس " ماذا لو" الذي يستفزني دائماً لتطوير وتعقيد التطبيقات والاضافة عليها ، لم أتمكن من التخلص منه ، ودفعني نحو :

ماذا لو أردنا التحكم بخيارات الطباعة بعد تحديد الطابعة لتقريرنا ؟؟

وهنا ننتقل لمنظومة أخرى " مرتبطة " بفكرتنا ، تمكننا من السيطرة على خيارات الطباعة من خلال الطابعة التي إخترناها لتقريرنا.

وهذه نرى فيها رأينا ، فإما أن نستمر بها في موضوعنا هذا أو ننتقل بها لموضوع جديد.

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

والله من وراء القصد ... وهو حسبي

...........

NA_ReportPrenter.rar

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

خصلتان :

البذل والعطاء

الشرح والايضاح وايصال المعلومة باسلوب علمي منظم . وهذه ملكة وهبة من الله

اجزل الله لك الثواب وزادك علما

أحسن الله اليك وبارك لك وبك استاذي أبو خليل

جزيت خيراً على طيب قولك ودعائك

.........

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

  • 2 weeks later...
  • 3 months later...

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

وبارك الله فيك اخي ابو ادم

لقد استفدت كثيرا من هذا الموضوع واستخدمته وطبقته لكن

هناك مشكلة صغيرة ارجو منكم التوضيح

عند اختيار تقرير عرضي يظهر طولي

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

مع العلم ان كود الطباعة العادي يظهر الطباعة بشكل عرضي طبيعي

ارجو التوضيح

واقبلوا فائق الاحترام

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

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

واجهتني مشكلة جديدة اخي ابو آدم

النموذج لم يفتح على جهاز آخر واعطى خطأ نصه:

LoadInternalDevmode GetPrinter Faild

ارجو توضيح السبب وكيف يمكن جعل النموذج يعمل على اي جهاز

وتقبلوا تحياتي

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

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information