View Full Version : چند گزارش و چند پرینتر
moustafa
پنج شنبه 18 مرداد 1403, 09:18 صبح
با سلام
من چند تا گزارش دارم و چند تا پرینتر میخوام از طریق کد هر گزارش رو به پرینتر مد نظر ارسال و چاپ بگیرم .بطور ملموس وقتی ctr+p رو میزنیم دیالوگ پرینتر که ظاهر میشه نام پرینتر و تعداد کپی و ... توسط کد پاس داده و ok بشه .
توبعضی گزارشها علیرغم تعیین پرینتر فیزیکی دیفالت ،به هنگام چاپ میره microsoft print to pdf
mazoolagh
چهارشنبه 24 مرداد 1403, 11:55 صبح
سلام و روز خوش
البته توضیح کافی نیست و کدی هم پیوست نشده،
ولی:
در بخش پرینترها، status اون پرینتر که در گزارش برای چاپ مشخص شده (specific printer) چی هست؟
moustafa
چهارشنبه 24 مرداد 1403, 22:08 عصر
سلام و روز خوش
البته توضیح کافی نیست و کدی هم پیوست نشده،
ولی:
در بخش پرینترها، status اون پرینتر که در گزارش برای چاپ مشخص شده (specific printer) چی هست؟
درود بر شما سرورگرامی
در کد زیر رویداد کلیک نمایش هر گزارش ظاهر میشه وبعدش کد چاپ بتعداد 2 کپی برای هر گزارش منتهی بعضیها رو مستقیم چاپ میگیره بعضیها رو هم علیرغم تعریف پرینتر دیفالت دیالوگ پرینتر ظاهر میشه با نام پرینتر microsoft print to pdf و پشبندش دیالوگ باکس save که محل ذخیره به فرمت pdf رو میخواد .حالا من میخوام که دیالگو پرینترکه ظاهر شد نامش همون پرینتر دیفالت باشه و اتوماتیک ok برای چاپ
Private Sub btnPrintA11_Click()
On Error Resume Next
If IsNull(cmbOstan) = False And IsNull(cmbShahr) = False And IsNull(Text0) = False Then
Call btnNamayesh_Click
DoCmd.PrintOut acPrintAll, , , , 2
DoCmd.Close acReport, "dastor_pardakht"
Call btntblreport_Click
DoCmd.PrintOut acPrintAll, , , , 2
DoCmd.Close acReport, "qrSort_riz"
Call btnhavale_Click
DoCmd.PrintOut acPrintAll, , , , 2
DoCmd.Close acReport, "rptHavale"
Call btnDarkhast_vajh_Click
DoCmd.PrintOut acPrintAll, , , , 2
DoCmd.Close acReport, "darkhast_ vajh"
Call btnAnbar_Click
DoCmd.PrintOut acPrintAll, , , , 2
DoCmd.Close acReport, "rptAnbar"
Call btnHavaleAnbar_Click
DoCmd.PrintOut acPrintAll, , , , 2
DoCmd.Close acReport, "rptHavale_anbar"
Call btnDarkhastKharid_Click
DoCmd.PrintOut acPrintAll, , , , 2
DoCmd.Close acReport, "rptDarkhast_kharid"
For I = 2 To 4
Me.sort_majles = DLookup("sortmajles", "mostandat", "id=" & I)
DoCmd.RunSQL ("DELETE tblreport.* FROM tblreport")
DoCmd.OpenQuery "qrAppend_sortmajle_to_tblreport", acViewNormal, acReadOnly
X = DCount("id", "tblreport")
If X > 0 Then
DoCmd.OpenReport "rptSortmajles", acViewPreview
DoCmd.PrintOut acPrintAll, , , , 2
DoCmd.Close acReport, "rptSortmajles"
End If
Next
Else
MsgBox "فيلد خالي رو پر کنيد"
End If
End Sub
mehdi_fiz
پنج شنبه 25 مرداد 1403, 00:09 صبح
سلام و وقت بخیر
از کد زیر استفاده کنید
به جای PrintIndex نام پرینتر مورد نظر تایپ کنید و بهتره یک جدول داشته باشید که کاربر پرینتر مورد نظر و انتخاب کنه و شما از اونجا فراخوانی کنی
Dim Prt As Printer
Dim PrintIndex As String
PrintIndex = "Microsoft Print to PDF"
Set Application.Printer = Application.Printers(PrintIndex)
Set Prt = Application.Printer
DoCmd.OpenReport "REPORT1", , , "[id]=" & Me.ID
moustafa
پنج شنبه 25 مرداد 1403, 19:14 عصر
سلام و وقت بخیر
از کد زیر استفاده کنید
به جای PrintIndex نام پرینتر مورد نظر تایپ کنید و بهتره یک جدول داشته باشید که کاربر پرینتر مورد نظر و انتخاب کنه و شما از اونجا فراخوانی کنی
Dim Prt As Printer
Dim PrintIndex As String
PrintIndex = "Microsoft Print to PDF"
Set Application.Printer = Application.Printers(PrintIndex)
Set Prt = Application.Printer
DoCmd.OpenReport "REPORT1", , , "[id]=" & Me.ID
با تشکر از شما .این کدها پرینتر دیفالت رو تعیین می کنند و مشکل کماکان پابرجاست دوباره همون Microsoft Print to PDF ظهور میکنه!!!
mazoolagh
پنج شنبه 25 مرداد 1403, 20:56 عصر
درود بر شما دوست گرامی
در کد زیر رویداد کلیک نمایش هر گزارش ظاهر میشه وبعدش کد چاپ بتعداد 2 کپی برای هر گزارش منتهی بعضیها رو مستقیم چاپ میگیره بعضیها رو هم علیرغم تعریف پرینتر دیفالت دیالوگ پرینتر ظاهر میشه با نام پرینتر microsoft print to pdf و پشبندش دیالوگ باکس save که محل ذخیره به فرمت pdf رو میخواد .حالا من میخوام که دیالگو پرینترکه ظاهر شد نامش همون پرینتر دیفالت باشه و اتوماتیک ok برای چاپ
سلام دوباره
باید کد رو وقت بگذارم ببینم.
ولی تا اون موقع:
1- حتما اون on error resume next رو بردارین،
و بجاش error handling پیاده کنین.
2- اون بلوک if رو ساده کنین:
بجای این که یک کد بزرگ رو در if then بگذارین،
و در else یک کد کوچک،
یک if then ساده برای اون کد else بنویسین و در همون بلوک exit sub کنین،
و بدنه اصلی کد رو از بلوک if بیرون بیارین - اینجوری کد شما خواناتر و نگهداریش هم اسونتره.
Private Sub btnPrintA11_Click()
If IsNull(cmbOstan) = False And IsNull(cmbShahr) = False And IsNull(Text0) = False Then
...
...
...
Else
MsgBox "فيلد خالي رو پر کنيد"
End If
End Sub
Private Sub btnPrintA11_Click()
If IsNull(cmbOstan) OR IsNull(cmbShahr) OR IsNull(Text0) Then
MsgBox "فيلد خالي رو پر کنيد"
EXIT SUB
End If
...
...
...
End Sub
mehdi_fiz
پنج شنبه 25 مرداد 1403, 22:03 عصر
با تشکر از شما .این کدها پرینتر دیفالت رو تعیین می کنند و مشکل کماکان پابرجاست دوباره همون Microsoft Print to PDF ظهور میکنه!!!
با سلام و احترام من خودم با همین روش دارم چاپ می فرستم به چندتا پرینتر فقط به جای Microsoft Print to PDF نام چاپگر که باید چاپ کنه رو فراخوانی می کنم از جدول
moustafa
جمعه 26 مرداد 1403, 09:26 صبح
با سلام و احترام من خودم با همین روش دارم چاپ می فرستم به چندتا پرینتر فقط به جای Microsoft Print to PDF نام چاپگر که باید چاپ کنه رو فراخوانی می کنم از جدول
سلام وسپاس . در حالت عادیشم که پرینتر دیفالت تعریف شده نباید بره رو پی دی اف ! کد شما و سایر کدها رو هم که تست کردم علیرغم اینکه نام پرینتر رو هم با printer.divicename میگیرم باز همون آش و همون کاسه !! در اینجا ما 6 تا گزارش دارم دوتاش اینطوری میشه
moustafa
جمعه 26 مرداد 1403, 09:51 صبح
سلام دوباره
باید کد رو وقت بگذارم ببینم.
ولی تا اون موقع:
1- حتما اون on error resume next رو بردارین،
و بجاش error handling پیاده کنین.
2- اون بلوک if رو ساده کنین:
بجای این که یک کد بزرگ رو در if then بگذارین،
و در else یک کد کوچک،
یک if then ساده برای اون کد else بنویسین و در همون بلوک exit sub کنین،
و بدنه اصلی کد رو از بلوک if بیرون بیارین - اینجوری کد شما خواناتر و نگهداریش هم اسونتره.
Private Sub btnPrintA11_Click()
If IsNull(cmbOstan) = False And IsNull(cmbShahr) = False And IsNull(Text0) = False Then
...
...
...
Else
MsgBox "فيلد خالي رو پر کنيد"
End If
End Sub
Private Sub btnPrintA11_Click()
If IsNull(cmbOstan) OR IsNull(cmbShahr) OR IsNull(Text0) Then
MsgBox "فيلد خالي رو پر کنيد"
EXIT SUB
End If
...
...
...
End Sub
با دورد وسپاس فراوان
ممنون میشم از لطفتون اگه محبت بفرمائین
on error resume next رو به منظور تریس و بررسی کدهای بعدیش گذاشتم قطعا با goto و err.number , selectcase خطاها بررسی و بمنظور کنترل برای هر شماره خطا اکشن مورد نظر اعمال خواهد]
ممنون از اصلاح کد تمیزتون باور بفرمائین اول از or استفاده کردم عمل نکرد مجبور شدم از And استفاده کنم بطور کل نمیدونم چرا برای من موارد غیر عادی خیلی پیش میاد !!!!
mehdi_fiz
جمعه 26 مرداد 1403, 17:10 عصر
سلام وسپاس . در حالت عادیشم که پرینتر دیفالت تعریف شده نباید بره رو پی دی اف ! کد شما و سایر کدها رو هم که تست کردم علیرغم اینکه نام پرینتر رو هم با printer.divicename میگیرم باز همون آش و همون کاسه !! در اینجا ما 6 تا گزارش دارم دوتاش اینطوری میشه
با سلام و احترام این مورد که گفتید ممکنه تنظیمات Page Setup گزارش براش چاپگر پیش فرض تعریف شده باشه
eb_1345
جمعه 26 مرداد 1403, 18:46 عصر
سلام آقا مصطفی!
وقت بخیر!
میگم چرا از یک فرم شبیه سازی شده پنجره پیشفرض Print استفاده نمی کنی که بتونی مانور بیشتری بر روی کدهای اون داشته باشی ؟
moustafa
جمعه 26 مرداد 1403, 21:19 عصر
سلام آقا مصطفی!
وقت بخیر!
میگم چرا از یک فرم شبیه سازی شده پنجره پیشفرض Print استفاده نمی کنی که بتونی مانور بیشتری بر روی کدهای اون داشته باشی ؟
عرض سلام وادب جناب آقای بهرامی
رو دوتا از گزارشاتم هر کدی رو که تست میکنم بازم میره رو Microsoft Print to PDF .
مگر اینکه شما عنایت بفرمائین یک فرم با انتخاب پرینتر و گزارش بذارین . حالا نام گزارش و پرینتر دستی در یه جدول وارد باشه یا توسط کد از جدول سیستمی گرفته بشه
moustafa
جمعه 26 مرداد 1403, 21:31 عصر
با سلام و احترام این مورد که گفتید ممکنه تنظیمات Page Setup گزارش براش چاپگر پیش فرض تعریف شده باشه
با سلام و سپاس فراوان
این مورد رو در محل کار بررسی میکنم که قطعا مشکل همینجا خواهد بود ولی باز مگه ما با کد بهش دستور نمیدیم که گزارش ما رو از پرینتر دیفالت بگیره ؟!!! اگه قراره با این برنامه 20 نفر تو کامپیوترهای متفاوت کار کنن اون وقت برای هر مورد جزئی نظیر این مورد بایست یک به یک بررسی بشن
eb_1345
جمعه 26 مرداد 1403, 23:04 عصر
مگر اینکه شما عنایت بفرمائین یک فرم با انتخاب پرینتر و گزارش بذارین . حالا نام گزارش و پرینتر دستی در یه جدول وارد باشه یا توسط کد از جدول سیستمی گرفته بشه
با سلام و سپاس فراوان
این مورد رو در محل کار بررسی میکنم که قطعا مشکل همینجا خواهد بود ولی باز مگه ما با کد بهش دستور نمیدیم که گزارش ما رو از پرینتر دیفالت بگیره ؟!!! اگه قراره از این برنامه 20 نفر تو کامپیوترهای متفاوت کار کنن اون وقت برای هر مورد جزئی نظیر این مورد یک به یک بررسی بشن
فعلاً موردی که جناب فیض اشاره کردند در محل کار امتحان کنین شاید با اعمال مورد فوق مشکلتون برطرف شد اگر مشکل همچنان بقوت خود باقی بود ان شاءالله میریم سر وقت ایجاد یک فرم شبیه سازی شده چاپ
moustafa
شنبه 27 مرداد 1403, 00:33 صبح
ظاهر شدن تولبار گزارشات خود اکسس شامل تمام ابزارهای مورد نیاز برای تنظیم و چاپ.popup گزارش باید no باشه
DoCmd.Minimize
DoCmd.ShowToolbar "Ribbon", acToolbarYes
DoCmd.OpenReport "dastor_pardakht ", acViewPreview
تو رویداد بسته شدن گزارش هم باید این کد وارد بشه
Private Sub Report_Close()
Forms!frmReport.SetFocus
DoCmd.Restore
DoCmd.ShowToolbar "Ribbon", acToolbarNo
End Sub
moustafa
شنبه 27 مرداد 1403, 00:50 صبح
فعلاً موردی که جناب فیض اشاره کردند در محل کار امتحان کنین شاید با اعمال مورد فوق مشکلتون برطرف شد اگر مشکل همچنان بقوت خود باقی بود ان شاءالله میریم سر وقت ایجاد یک فرم شبیه سازی شده چاپ
سپاسگزارم از همراهی شما
ما یه گزارش داریم که در ابتدا بمنظور بررسی پی دی اف گرفته و از طریق کارتابل به واحد بررسی ارسال و بعد از بررسی و رفع نواقص میخوایم 9 تا گزارش بطور یکجا بطور کاغذی چاپ بگیریم .حالا اون گزارش اولی تو حالت specific printer میمونه در حالیکه ما فقط یه ctr+p زدیم و از حالت دیفالت خارجش نکردیم که حتی بعد اینکه مجددا چاپ با پرینتر دیفالت میگیرم باز رو اون پی دی اف میمونه !!! بنابراین هر بار باید بطور دستی تمام کابران برن همون اپشن رو بذارن رو دیفالت . این همون مسئله ای که میخوایم با کد حل بشه
mehdi_fiz
شنبه 27 مرداد 1403, 04:57 صبح
سپاسگزارم از همراهی شما
ما یه گزارش داریم که در ابتدا بمنظور بررسی پی دی اف گرفته و از طریق کارتابل به واحد بررسی ارسال و بعد از بررسی و رفع نواقص میخوایم 9 تا گزارش بطور یکجا بطور کاغذی چاپ بگیریم .حالا اون گزارش اولی تو حالت specific printer میمونه در حالیکه ما فقط یه ctr+p زدیم و از حالت دیفالت خارجش نکردیم که حتی بعد اینکه مجددا چاپ با پرینتر دیفالت میگیرم باز رو اون پی دی اف میمونه !!! بنابراین هر بار باید بطور دستی تمام کابران برن همون اپشن رو بذارن رو دیفالت . این همون مسئله ای که میخوایم با کد حل بشه
با سلام و احترام یک بار روی سیستمی که سورس برنامه هست گزارش رو در حالت Print Preview باز کنید و تنظیمات Page Setup رو روی حالت Default قرار دهید و Ctrl+S جهت ذخیره گزارش بزنید درست میشه
moustafa
شنبه 27 مرداد 1403, 15:51 عصر
با سلام و احترام یک بار روی سیستمی که سورس برنامه هست گزارش رو در حالت Print Preview باز کنید و تنظیمات Page Setup رو روی حالت Default قرار دهید و Ctrl+S جهت ذخیره گزارش بزنید درست میشه
با سپاس فراوان بله اینطوری مشکل حل میشه ولی وقتی پی دی اف میگیرم دوباره این تنظیم دستی رو باید انجام داد
eb_1345
شنبه 27 مرداد 1403, 17:33 عصر
با سلام
با کدهای زیر گزارشتون با نام پرینتر مورد نظرتون چاپ و بعد از چاپ گزارش نام پرینتر به همان پرینتر پیشفرض اولیه تغییر می کند
Dim ptr As Printer
Set ptr = Application.Printer ' default printer
Set Application.Printer = Application.Printers("Microsoft Print to PDF") 'set new printer
DoCmd.OpenReport "R1" 'print my report
Set Application.Printer = ptr 'restore default printer
در کدهای فوق فرض شده که گزارشتون بصورت pdf چاپ شود.
بجای ست کردن پرینتر با نام پرینتر میتوانید از ردیف یا اندیس پرینتر هم استفاده کنی
بصورت زیر:
SetDefaultPrinter Application.Printers(4).DeviceName 'set new printer
ببخشید بنده به پرینتر دسترسی ندارم کدهای فوق رو تست کنم
moustafa
یک شنبه 28 مرداد 1403, 09:29 صبح
با سلام
با کدهای زیر گزارشتون با نام پرینتر مورد نظرتون چاپ و بعد از چاپ گزارش نام پرینتر به همان پرینتر پیشفرض اولیه تغییر می کند
Dim ptr As Printer
Set ptr = Application.Printer ' default printer
Set Application.Printer = Application.Printers("Microsoft Print to PDF") 'set new printer
DoCmd.OpenReport "R1" 'print my report
Set Application.Printer = ptr 'restore default printer
در کدهای فوق فرض شده که گزارشتون بصورت pdf چاپ شود.
بجای ست کردن پرینتر با نام پرینتر میتوانید از ردیف یا اندیس پرینتر هم استفاده کنی
بصورت زیر:
SetDefaultPrinter Application.Printers(4).DeviceName 'set new printer
ببخشید بنده به پرینتر دسترسی ندارم کدهای فوق رو تست کنم
دست شما درد نکنه جناب بهرامی . همونطور که آقای فضلی تشخیص دادن این کدها تا زمانی عمل میکنه که در تنظیمات setup در تب page آپشن defualtPrinter انتخاب شده باشه اما وقتی بعلت نامعلومی(ویروسکش سفارشی بخاطر مسائل امنیتی ایجادمحدودیت در پرینترها و اسکنرها ،اشتراکی بود پرینترها در شبکه ،ادمینی که بعضا میاد رو سیستم های کاربران چاپ میگیره یا تنظیمات رو تغییر میده و.... ) use specific printer انتخاب شده باشه اون موقع است با پرینتری که فکر میکنم اخرین بار مورد استفاده قرار گرفته چاپ میگیره
حالا کدی میخوائیم که در ابتدا این مورد رو بررسی و آپشن defualtPrinter انتخاب و در ادامه کدهای شما کار رو تموم کنه . با تشکر
eb_1345
دوشنبه 29 مرداد 1403, 14:11 عصر
با سلام مجدد
گزارشاتتون رو با پرینتر شبیه سازی شده ضمیمه چاپ کن تا در ادامه در صورت عدم رفع مشکل نسبت به تغییر در کدهای مربوطه اقدام لازم انجام بشه
moustafa
دوشنبه 29 مرداد 1403, 15:37 عصر
با سلام مجدد
گزارشاتتون رو با پرینتر شبیه سازی شده ضمیمه چاپ کن تا در ادامه در صورت عدم رفع مشکل نسبت به تغییر در کدهای مربوطه اقدام لازم انجام بشه
سلام وتشکر . کدها برای ویندوز 32 بیتی هست در سیستم 64 بیتی من عمل نکرد .
eb_1345
دوشنبه 29 مرداد 1403, 17:18 عصر
کدها برای ویندوز 32 بیتی هست در سیستم 64 بیتی من عمل نکرد .
ماژول عمومی مربوط به پرینت مشکلی نداره در ماژول عمومی مسیج باکس فارسی بنام masgfa باید کدها با سیستم 64 بیتی مطابقت داده بشه که اصلاً نیاز به اون ماژول نیست ، میتونی حذفش کنی و در پیغام های فرم MsgBox رو جایگزین MsgBoxFa کن
moustafa
سه شنبه 30 مرداد 1403, 22:03 عصر
ماژول عمومی مربوط به پرینت مشکلی نداره در ماژول عمومی مسیج باکس فارسی بنام masgfa باید کدها با سیستم 64 بیتی مطابقت داده بشه که اصلاً نیاز به اون ماژول نیست ، میتونی حذفش کنی و در پیغام های فرم MsgBox رو جایگزین MsgBoxFa کن
جناب بهرامی فعلا مشکلی پیش نیومده تا ببینیم موردی پیش میاد یانه . با سپاس فراوان
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.