PDA

View Full Version : سوال: اجرای گزارش بر اساس انتخاب از دیتا گرید



shafie-rayaneh
شنبه 14 شهریور 1394, 11:00 صبح
سلام خسته نباشید
من سه تا تیبل دارم به نامهای TBLMoshtari و TBLShfaktor و TBLFaktor که این سه تا رو با RelationShip به هم وصل کردم و در برنامه VB6 توی adodc و دیتا گرید ها هر سه رو نشون میده و مشکلی ندارم تیبل مشتری اصلیه و زیرمجموعه اون تیبل شماره فاکتور میشه بعدشم که تیبل فاکتور ریز کالاها رو نشون میده
حالا یک button گذاشتم کنار دیتاگرید TBLShFaltor و میخوام فاکتور فروش برای یک مشتری رو پرینت بگیرم نحوه اتصال من به این صورت است

PRT = Adodc2.Recordset.Fields("Factor_ID")
Form12.Show vbModal
و در داخل فرمی که گزارش کریستال ریپورت رو گذاشتم اینو نوشتم

Private Sub Command1_Click()
Dim crApp As New CRAXDRT.Application
Dim crRept As New CRAXDRT.Report
Dim CrDBTable As CRAXDRT.DatabaseTable
Set crRept = crApp.OpenReport(App.Path & "\Report2.Rpt")
crRept.RecordSelectionFormula = Return_Formula
CrystalActiveXReportViewer1.ReportSource = crRept
CrystalActiveXReportViewer1.ViewReport
Set crApp = Nothing
Set crRept = Nothing
CrystalActiveXReportViewer1.Refresh
End Sub
و فرمولم هم به این شکله

Private Function Return_Formula() As String
Dim Str_Formula As String
Str_Formula = Str_Formula & " {TBLShFaktor.Factor_ID}= RPT"
Str_Formula = Trim(Str_Formula)
End Function
میدونم که صد در صد مشکل داره چون اجرا نمیشه پس اگه میشه راهنماییم کنید و بگید که کجا رو درست کنم که وقتی روی دیتا گرید و روی فاکتور مورد نظر کلیک میکنم و روی button میزنم ریز اون فاکتور یعنی فاکتور فروش رو به من نشون بده مرسی
گزارش رو توی کریستال ریپورت درست کردم و با آی دی مشتری و آی دی شماره فاکتور گروپ کردم توی خود کریستال مشکلی نداره.
با تشکر فراوان

vbhamed
شنبه 14 شهریور 1394, 12:28 عصر
سلام
اگر می‌خواین مشکلتون اساسی حل بشه بر اساس تجربه چند ساله این کار رو انجام بدین خیلی بهتره

1 - اگر از بانک اطلاعاتی Jet استفاده می‌کنید (همونی که میگن اکسس) یک بانک اطلاعاتی، جداگانه بسازید و جداول مورد نیاز رو در اون بسازید و موقع چاپ یک یا چند فاکتور، ابتدا فاکتورها رو از بانک اصلی در اون بانک موقت بریزید و کریستال رو به اون متصل کنید

مزیت این روش اینه که می‌تونید یکسری فیلدهایی مثل متن فارسی مبلغ فاکتور، عنوان گزارش و ... رو هم بزارید و قبل از پرینت اونها رو پر کنید بدون اینکه لازم باشه خود آبجکتهای کریستال رو کنترل کنید یا داخل بانک اصلی برنامه این اطلاعات نوشته بشه و حجم بیخودی اشغال کنه.

2 - تا جای ممکن از فیلتر در کریستال استفاده نکنید چون سرعت کار رو به شدت پایین میاره، اگر به روش بالا عمل کنید قاعدتا در اون جدول و بانک موقت فقط فاکتور یا فاکتورهای مورد نظر برای چاپ وجود داره و نیاز به فیلتر نیست، نهایتا اینکه اگر هم جایی فیلتر لازم شد، یک کوئری بسازید و فیلتر کردن رو داخل کوئری انجام بدین و کریستال رو به اون کوئری متصل کنید، اینطوری اگر بعدا گزارشگرتون رو هم عوض کنید دیگه نیاز به دستکاری سورس برنامه نیست و سرعت کار هم خیلی بالاتره.

3 - در گزارشگرها معمولا ردیفی تحت عنوان Master و ردیفی تحت عنوان Detail وجود داره که اطلاعات سربرگ فاکتور در ردیف Master و اطلاعات ریز فاکتور در قسمت Detail باید نوشته بشه، اینطوری یک فاکتور کامل چاپ میشه

در مورد بانک اطلاعاتی Sql Server, Oracle و ... نیاز به بانک جداگانه نیست و فقط دو جدول Master و Detail جدا از جدول اصلی برای این کار در نظر بگیرید.

در مورد بانک JET استفاده از فایل بانک اطلاعاتی جداگانه بهتره چون نوشتن و پاک کردن زیاد در یک بانک باعث افزایش حجم اون میشه و تا زمانی که بانک رو Compact نکنید سایزش کوچک نمیشه ولی اینطوری می‌تونید یک فایل بانک موقتی به نام مثلا tempdbempty.mdb داشته باشید که هر موقع برنامه رو اجرا کردید از روی اون یک کپی به نام tempdb.mdb بگیرید و روی tempdb.mdb کار کنید، با این کار خود بانک موقت هم بزرگ نمیشه

حتما قبل از پر کردن جداول موقت، ابتدا کل محتویات فعلی اونها رو حذف کنید.

shafie-rayaneh
شنبه 14 شهریور 1394, 13:37 عصر
سلام
مرسی از لطفتون که جواب دادید.
فقط اگه میشه طریقه کپی کردن اطلاعاتی که میخوام از روی دیتابیس اصلی بر روی دیتابیس temp رو به صورت کد نویسی بدید. یعنی میشه بدون اینکه بخوام همون کد هایی که برای ذخیره کردن اطلاعات توی دیتابیس اصلی دادم به Temp بدم یجوری راحت تر اون اطلاعاتی که میخوام کپی بشه. ممنون