PDA

View Full Version : حرفه ای: چاپ رکوردهای انتخاب شده در فرم



e.shahidifar
چهارشنبه 19 مهر 1391, 15:44 عصر
با سلام خدمت تمامی دوستان و اساتید عزیز
می خواستم بدونم امکان این هست که بشه رکوردهایی که در یه فرم یا سابفرم توسط کاربر انتخاب شده اند رو چاپ کرد. البته با کدهای VBA میخوام این کار انجام بشه.
یعنی کاربر در فرم مورد نظر چند رکورد ( چند سطر از اطلاعات در حال نمایش ) رو انتخاب کنه و بشه فقط اونها رو چاپ کرد.
یه مطلب خوندم که بایستی از SelTop و SelHeight استفاده کرد. ولی نمی دونم چه جوری باید این کارو انجام داد.
ممنون میشم دوستان و اساتید بزرگوار راهنمایی کنند.
ممنونم.

e.shahidifar
پنج شنبه 20 مهر 1391, 10:39 صبح
هیچ کدوم از دوستان راهی به نظرشون نمیرسه؟

emami.sie
پنج شنبه 20 مهر 1391, 12:01 عصر
سلام
نمونه رو ببینید...
موفق باشید
یا علی

e.shahidifar
پنج شنبه 20 مهر 1391, 12:12 عصر
با تشکر از شما دوست عزیز . ولی من میخوام رکوردهای انتخاب شده توسط کاربر در فرم ، چاپ بشن.
در آدرس های زیر یه سری مطلب وجود داره ولی مستلزم اینه که یه فیلد Yes/No به جدول اضافه بشه و از طریق Checkbox این کار رو در فرم انجام میده.
http://www.pcreview.co.uk/forums/access-select-multiple-records-form-process-list-vba-t3148329.html
http://www.pcreview.co.uk/forums/print-selected-records-subform-t2035732.html

آیا راهی برای شناسایی و چاپ رکوردهایی که در فرم در حالت انتخاب قراردارند تنها با کدهای Vba وجود نداره؟ (فرم در حالت DataSheet باز میشه )

emami.sie
پنج شنبه 20 مهر 1391, 12:30 عصر
سلام مجدد
خب شما زمانی که از حالت دیتاشیت استفاده می کنید چه طور میخواید مثلا رکورد 1 و 5 رو انتخاب کنید؟؟ (منظورم اینه که سری رکورد انتخاب شده، متوالی نباشه)
پس 2 راه دارید برای انتخاب رکوردهای غیرمتوالی
یا باید از لیست باکس استفاده کنید (نمونه ای که ضمیمه کردم و شما می تونید با اضافه کردن یک فرم قبل از مرحله چاپ، کل رکوردهایی که در سابفرمتون هست رو در یک لیست باکس نشون بدید و پس از انتخاب رکوردهای مد نظر توسط کاربر اون رو به گزارش انتخابی هدایت کنید)
و یا هم از همون چک باکس برای انتخاب رکوردهای مورد نظر بهره ببرید...
راستش من روش دیگه ای رو ندیدم...
موفق باشید
یا علی

e.shahidifar
پنج شنبه 20 مهر 1391, 12:46 عصر
البته حق با شماست و کاربر نمیتونه ردیف های یک و پنج رو که کنار هم نیستند انتخاب کنه. ولی اگه رکوردها سرت شده باشند و بخواد چند تا رکورد پشت سر هم رو با هم انتخاب کنه و فقط اونا رو چاپ کنه ، مورد سئوال منه.
مثلا از تراز حسابهایی که گرفته بعد از سرت اقلام با مانده های بدهکار ، فقط چند تا ردیف اول رو انتخاب کنه و اونا رو چاپ کنه. ( بالای 10.000.000 یا 50.000.000 ریال بدهکار (بنا به انتخاب خودش))
هر چی هم سرچ کردم غیر از روش چک باکس و البته روش شما ، روش دیگه ای پیدا نکردم:گیج:
روش شما هم برای لیست باکس خوبه ولی باعث دوباره کاری میشه یعنی کاربر یه بار گزارش خودش رو تو فرم میبینه و دوباره با انتخاب پرینت باید رکوردها رو تو یه لیست باکس ببینه و از بین اونا انتخاب کنه.

Abbas Amiri
پنج شنبه 20 مهر 1391, 19:55 عصر
سلام احتمالا این کد بدردشما میخورد
در رویداد رها کردن کلید موس ، پس ازاینکه تعدادی از رکوردها با موس انتخاب کردید برای شما شماره اولین رکورد انتخاب شده وتعداد آنهارا نشان میدهد . میتوانید این دومقدار را در دومتغیر ذخیره وهرزمان خواستید استفاده کنید(تا قبل از انتخاب رکوردهای بعدی)


Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
MsgBox Me.SelTop & "," & Me.SelHeight
End Sub

Abbas Amiri
پنج شنبه 20 مهر 1391, 22:26 عصر
باسلام مطمئنا پست قبلی هیچ راهنمایی برای اکثریت کاربران محترم تالار ایجاد نمی کند . واآنجا که خودم هم از ایده این نوع ارسال گزارش خوشم آمد کدهای زیر میتواند منظور درخواست کننده را محقق نماید.

اساس کارهم به این شکل است که شماره اولین رکورد انتخاب شده و تعداد رکوردها وبراساس این دو شماره آخرین رکورد گرفته میشود و سپس با استفاده از یک رکوردست به شماره رکوردهای ابتدا وانتهای رکوردها رفته وفیلد شناسه آنها بدست می آید . حالا بایک کوئری براساس جدول ویا کوئری مربوط به فرم و بافیلترکردن شناسه ، رکوردهای انتخاب شده به یک کوئری منتقل میشوند . به همین آسانی
از این به بعد هم که راحت است یا در همین زیرروال ویا هرکجای دیگر میتوانید گزارشی را که به کوئری tmpQuery مقید است را بازکنید.
نکته : رکوردها حتما باید براساس شناسه Sort شده باشند



Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim rs As DAO.Recordset, strSQL As String
Dim qdf As QueryDef, db As DAO.Database
If Y < 250 Then Exit Sub
FirstRec = Me.SelTop - 1
LastRec = Me.SelHeight - 1
Set db = CurrentDb()
Set rs = Me.Recordset
rs.MoveLast
rs.MoveFirst
rs.Move FirstRec
FirstRec = rs("ID")
rs.Move LastRec
LastRec = rs("ID")
strSQL = "SELECT * FROM (" & Me.RecordSource & ") WHERE ID >=" & _
FirstRec & " AND ID<=" & LastRec
On Error Resume Next
Set qdf = db.QueryDefs("tmpQuery")
Set qdf = db.CreateQueryDef("tmpQuery")
qdf.SQL = strSQL
'*********************
'Some Code
'*********************
Set qdf = Nothing
Set rs = Nothing
Set db = Nothing
End Sub