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

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

قام بنشر

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

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

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

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

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

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

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

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

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

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

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