PDA

View Full Version : ایجاد یک گزارش Dynamic با استفاده از کوئری CrossTab



Nazir Ahmad
پنج شنبه 10 بهمن 1392, 14:26 عصر
سلام خدمت اساتید گرامی

امیدوارم بعد از چند تا تاپیکی که زدم و بدون جواب موند یکی پیدا بشه یه کم کمک کنه.
یه گزارش داریم و یک کیویری کراس تب . حالا میخوام این گزارش اطلاعات کراس تب کیویری رو نشون بده و این درحالیه که تعداد فیلدهای کیویری ممکنه در هر بار باز شدن متفاوت باشه. مثلا یه بار 5 فیلد یه بار 8 فیلد و .... .
حالا میخوم حد اقل 15 فیلد داخل گزارش داشته باشیم و اگر کویری ما 15 فیلد داشت که همه استفاده میشه و اگر در کیویری مثلا 8 فیلد موجود بود تنها 8 فیلد گزارش نمایش داده بشه و بقیه هیچ.
تو فایل ضمیمه هم توضیحات لازم اومده
ممنون میشم اگر کمک کنید. :افسرده::افسرده::افسرده:
یا حق

Abbas Amiri
جمعه 11 بهمن 1392, 21:21 عصر
سلام خدمت اساتید گرامی

امیدوارم بعد از چند تا تاپیکی که زدم و بدون جواب موند یکی پیدا بشه یه کم کمک کنه.
یه گزارش داریم و یک کیویری کراس تب . حالا میخوام این گزارش اطلاعات کراس تب کیویری رو نشون بده و این درحالیه که تعداد فیلدهای کیویری ممکنه در هر بار باز شدن متفاوت باشه. مثلا یه بار 5 فیلد یه بار 8 فیلد و .... .
حالا میخوم حد اقل 15 فیلد داخل گزارش داشته باشیم و اگر کویری ما 15 فیلد داشت که همه استفاده میشه و اگر در کیویری مثلا 8 فیلد موجود بود تنها 8 فیلد گزارش نمایش داده بشه و بقیه هیچ.
تو فایل ضمیمه هم توضیحات لازم اومده
ممنون میشم اگر کمک کنید. :افسرده::افسرده::افسرده:
یا حق

نمونه زیر با استفاده از نمونه شما با کمی تغییر (حذف ردیف) جهت استفاده عموم تهیه شده است .

تعداد فیلدهایی که در قسمت Detail گزارش ایجاد می کنید بایستی مساوی حداکثر تعداد ممکن باشد . ضمن اینکه از نامگذاری فیلدها و لیبل های شان مطابق فایل پیوست استفاده کنید.

Nazir Ahmad
شنبه 12 بهمن 1392, 07:42 صبح
سلام دوباره
ممنون که وقت گذاشتید.
دقیقا همون چیزی بود که منظورم بود. اما یه مشکل وجود داره اونم اینه که وقتی گزارش رو به فایل اصلی خودم انتقال میدم کدهایی که نوشتید کار نمیده و ارور میده که ضمیمه کردم.
البته فکر کنم چون کدهایی که شما نوشتید در آفیس 2003 هست و دیتابیسی که من درست کردم با اکسس 2013. چون قبلا هم به این مشکل برخورد کردم و وقتی جداول و دیگر اشیای دیتابیس خودم رو به فایلی که کد داخل اون نوشته شده بود انتقال دادم دیگه ارور نمیداد.
ممنون میشم اگر دوباره همکاری کنید.
یا حق
116248

hamid-nice
شنبه 12 بهمن 1392, 11:33 صبح
با اضافه کردن ریفرنس Microsoft DAO 3.6 Object Library به ریفرنسهات مشکل حل خواهد شد
موفق باشید

Nazir Ahmad
دوشنبه 14 بهمن 1392, 09:17 صبح
از همکاری شما ممنون
البته ببخشید که اینقدر سوال میکنم.
وقتی من داخل گزارش تعداد فیلدها که قبلا 15 تا بود یعنی 15 تا لیبل و 15 فیلد تکست) اضافه میکنم اررو میده که مثلا لیبل20 پیدا نشد. این درحالیه که تعداد لیبلهایی که به شکل lbl&i نام گزاری شده تا لیبل lbl15 بیشتر نیست ولی در گزارش لیبلهایی با نام های دیگه وجود داره.
البته وقتی خط For i = MAX_FIELD_COUNT - 1 To fldCount Step -1 رو عدد -1 رو به -10 تغییر میدمFor i = MAX_FIELD_COUNT - 10 To fldCount Step -1 دیگه ارور نیمده ولی بعضی از لیبلها رو در حالت پرینت نمایش نمیده.
عکسش رو هم ضمیمه کردم.
نمیدونم مشکل از کجاست
یه سوال دیگه هم داشتم که اگر خواسته باشیم به جای نام فیلدی که از کیویری میگیره و در لیبل‌های گزارش نمایش میده؛ در صورتیکه اون فیلد دارای Caption نبود؛ نام فیلد در لیبل ها نمایش داده بشه و در غیر آن Caption فیلد در لیبل نمایش داده بشه.
116334116335http://barnamenevis.org/images/misc/pencil.png

Abbas Amiri
دوشنبه 14 بهمن 1392, 17:26 عصر
وقتی من داخل گزارش تعداد فیلدها که قبلا 15 تا بود یعنی 15 تا لیبل و 15 فیلد تکست) اضافه میکنم اررو میده که مثلا لیبل20 پیدا نشد. این درحالیه که تعداد لیبلهایی که به شکل lbl&i نام گزاری شده تا لیبل lbl15 بیشتر نیست ولی در گزارش لیبلهایی با نام های دیگه وجود داره.

مطمئنا به این قسمت پست 2 توجه نکرده اید :

تعداد فیلدهایی که در قسمت Detail گزارش ایجاد می کنید بایستی مساوی حداکثر تعداد ممکن باشد . ضمن اینکه از نامگذاری فیلدها و لیبل های شان مطابق فایل پیوست استفاده کنید.

در صورت رعایت موضوع فوق مشکلی نخواهد بود . جهت استفاده از کپشن فیلد در جدول کدهای زیر را جایگزین کنید :

Private Sub Report_Open(Cancel As Integer)
Dim MAX_FIELD_COUNT As Integer, strCaption As String
Dim qdf As QueryDef, i As Integer, fldCount As Integer
MAX_FIELD_COUNT = Me.Detail.Controls.Count
Set qdf = CurrentDb.QueryDefs("Qry_Result")
fldCount = qdf.Fields.Count
For i = MAX_FIELD_COUNT - 1 To fldCount Step -1
Me.Controls("lbl" & i).Visible = False
Me.Controls("fld" & i).Visible = False
Next
For i = 0 To fldCount - 1
Me.Controls("fld" & i).ControlSource = qdf.Fields(i).Name
strCaption = GetFieldCaption(qdf.Fields(i).Name, qdf.Fields(i).SourceTable)
Me.Controls("lbl" & i).Caption = strCaption
Next
Set qdf = Nothing
End Sub

Function GetFieldCaption(FieldName As String, TableName As String) As String
On Error GoTo errH
GetFieldCaption = CurrentDb.TableDefs(TableName).Fields(FieldName).P roperties("Caption")
Exit Function
errH:
GetFieldCaption = FieldName
End Function

Nazir Ahmad
سه شنبه 15 بهمن 1392, 08:57 صبح
باز هم ممنون بخاطر وقتی که گذاشتید
البته من منظور شما رو از "حد اکثر تعداد ممکن" متوجه نشدم. یعنی حد اکثر ممکن باید مساوی تعداد لیبل‌ها باشه یا چیز دیگه‌ای
در مورد کپشن هم کدهایی که ارایه کردید کپشن یک فیلد رو از داخل جدول استخراج میکنه اما منظور من این بود که کپشن رو از کیویری بگیره.
باز هم تشکر فراوان

یا حق

Abbas Amiri
چهارشنبه 16 بهمن 1392, 17:19 عصر
باز هم ممنون بخاطر وقتی که گذاشتید
البته من منظور شما رو از "حد اکثر تعداد ممکن" متوجه نشدم. یعنی حد اکثر ممکن باید مساوی تعداد لیبل‌ها باشه یا چیز دیگه‌ای
در مورد کپشن هم کدهایی که ارایه کردید کپشن یک فیلد رو از داخل جدول استخراج میکنه اما منظور من این بود که کپشن رو از کیویری بگیره.
باز هم تشکر فراوان

یا حق


منظور از حداکثر ممکن ، بیشترین تعداد فیلدهایی که از کوئری استخراج میشود می باشد . شما بایستی همان تعداد فیلد و لیبل در گزارش ایجاد کنید ( با همان نوع نامگذاری)

اگر قصد دارید از نامی که در کوئری استفاده کرده اید به جای کپشن لیبل ها استفاده کنید از همان روش پست اول برای آن استفاده کنید:

Me.Controls("lbl" & i).Caption = qdf.Fields(i).Name