ورود

View Full Version : ساخت فرم از نتیجه کویری کراس تب



reza_1199
شنبه 30 دی 1402, 16:35 عصر
سلام خدمت دوستان و اساتید گرانقدر و آرزوی سلامتی و توفیق
دوستان در نمونه پیوستی یک کویری کراس تب ایجاد شده و شرطی در قسمت تاریخ گذاشته شده است (به فرض 14021030) بنا به شرطمون آیتم ها متفاوت می باشد و ثابت نمی باشد حالا میخواستم از نتیجه کویری یک فرم دیتاشیت ساخته بشه و با هر بار که تاریخ تغییر میکند این فرم دیتاشیت هم تغییر کند متاسفانه موفق نشدم هر چند با ارسال نتیجه کویری کراس تب و ساخت Make Table تا حدودی می تونستم نتیجه دلخواه رو ببینم اما در اصل مد نظرم دیتاشیت هست ممنون میشم اساتید و دوستان راهنمایی کنن .

mazoolagh
شنبه 30 دی 1402, 17:38 عصر
سلام و روز خوش
پرسش خوبی مطرح کردین
خواسته شما شدنی هست

یک نمونه درست میکنم و روی همون براتون توضیح میدم روش کار رو

reza_1199
شنبه 30 دی 1402, 17:43 عصر
ممنون استاد بی صبرانه منتظرم

mazoolagh
یک شنبه 01 بهمن 1402, 18:14 عصر
شما مسیر رو درست رفتین و تقریبا نزدیک به پاسخ نهایی هم بودین:

این که crosstab Query رو نمیشه به عنوان record source یک فرم گذاشت،
چون تعداد قیلدها (ستونها) ثابت نیست و با شرایط کوئری تغییر میکنه
این که باید از یک جدول استفاده کنین (make table query) تا نتایج crosstab query رو در یک جدول بریزین
این که فقط محدود به datasheet view هستین

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

راه حل : باید یک sub form به فرم اضافه کنین و این جدول رو به عنوان source object اون بگذارین.

من دیتا نمونه شما رو تغییر دادم و طراحی جدول ها رو که اشکال داشت ویرایش کردم،
که با مقایسه با جداول اولیه میتونین متوجه بخش های ویرایش شده بشین.

مهمترین اون ها تبدیل ستونهای text به عدد و استفاده از relation هست،
به همین خاطر نیاز هست که چندین جدول اضافه بشه.

به عنوان مثال به جای این که یک فیلد سازنده (Brand) از نوع text داشته باشیم یک جدول سازنده ها (Brands) میسازیم
و فیلد BrandID رو در جدول بازرسی میاریم و هرگاه نیاز اسم اون داشته باشیم جدول ها رو join میکنیم.

این روش اصولی هست که باید در طراحی رعایت بشه.

mazoolagh
یک شنبه 01 بهمن 1402, 18:28 عصر
طراحی crosstab query

155274

PARAMETERS [TempVars]![InspectionDate] Long;
TRANSFORM Count(InspectionsQRY.InspectionID) AS CountOfInspectionID
SELECT TireSizes.Size AS [مشخصات لاستیک], Format(InspectionsQRY.InspectionDate,"0000\/00\/00") AS [تاریخ بازرسی], Count(InspectionsQRY.InspectionID) AS [تعداد بازرسی]
FROM (InspectionsQRY INNER JOIN DefectDetails ON InspectionsQRY.DefectDetailID = DefectDetails.DetailID) INNER JOIN TireSizes ON InspectionsQRY.SizeID = TireSizes.SizeID
WHERE (((InspectionsQRY.InspectionDate)=[TempVars]![InspectionDate]))
GROUP BY TireSizes.Size, InspectionsQRY.InspectionDate
PIVOT DefectDetails.Detail;


پارامتر تاریخ رو از form fieldبه tempvar تغییر دادم - به این ترتیب دستمون بازتر هست و کوئری رو در هر شرایطی میتونیم استفاده کنیم.

البته میشد پارامتر رو اسم داد ولی در این مسئله خاص همین tempvar بهتر هست.

یک نمونه از خروجی کوئری برای تاریخ 1402/10/30
155275

mazoolagh
یک شنبه 01 بهمن 1402, 18:51 عصر
ساخت فرم:
برای فیلتر تاریخ یک کمبو باکس در header فرم میگذاریم و
با یک کوئری همه تاریخ های بازرسی رو گروه بندی میکنیم و بعنوان رکورد سورس اون میگذاریم:
SELECT FORMAT(InspectionDate,"0000/00/00") FROM Inspects GROUP BY InspectionDate;

155276
در بخش detail فقط یک سابفرم خالی میگذاریم (results).

پس از انتخاب تاریخ، اول جدول نتایج (results) رو پاک میکنیم (در صورت وجود)،
بعد tempvar تاریخ بازرسی رو مقدار میدیم،
بعد یک make table query اجرا میکنیم که نتایج crosstab query رو در جدول results بریزه،
و در آخر source object سابفرم رو به جدول results ست میکنیم.

Option Compare Database
Option Explicit

Private Sub InspectionDate_AfterUpdate()
Me.Results.SourceObject = ""
If DCount("ID", "MSysObjects", "Type=1 AND Name='Results'") > 0 Then
DoCmd.DeleteObject acTable, "Results"
End If
TempVars("InspectionDate") = Replace(Me.InspectionDate.Value, "/", "")
DoCmd.RunSQL "SELECT * INTO Results FROM InspectionsCrossTabQRY"
Me.Results.SourceObject = "Table.Results"
End Sub

Private Sub InspectionDate_NotInList(NewData As String, Response As Integer)
Me.InspectionDate.Undo
Me.InspectionDate.Dropdown
Response = acDataErrContinue
End Sub

mazoolagh
یک شنبه 01 بهمن 1402, 19:30 عصر
البته راه حل دیگه هم هست:
میتونین از صفحه بندی دیتا با افکت و انیمیشن در مرورگر وب Data-paging with transitions/animations in Web Browser (https://barnamenevis.org/showthread.php?563684-%D8%AE%D8%A7%D8%B1%D8%AC-%D8%A7%D8%B2-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-%D9%BE%D8%B1%D8%B3%D8%B4%D9%87%D8%A7%DB%8C%DB%8C-%D8%A7%D8%B2-%D8%AC%D9%86%D8%B3-%D8%AF%DB%8C%DA%AF%D8%B1&p=2463193&viewfull=1#post2463193) ایده بگیرین
و بخش هایی که نیاز نیست رو کنار بگذارین.

eb_1345
یک شنبه 01 بهمن 1402, 19:31 عصر
این که crosstab Query رو نمیشه به عنوان record source یک فرم گذاشت،
چون تعداد قیلدها (ستونها) ثابت نیست و با شرایط کوئری تغییر میکنه
این که باید از یک جدول استفاده کنین (make table query) تا نتایج crosstab query رو در یک جدول بریزین
این که فقط محدود به datasheet view هستین

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

راه حل : باید یک sub form به فرم اضافه کنین و این جدول رو به عنوان source object اون بگذارین.
.
سلام و درود فراوان
دست مریزاد استاد !
احسنت !
داشتم توضیحات جنابعالی رو در دوسه خط اول این پست مرور می کردم و هنوز چشمم به توضیح راه حل نیفتاده بود که سریع در ذهنم خطور کرد که برای اینکار میشه یک sub form به فرم اضافه کرد و جدول رو به عنوان source object اون قرار داد که در خط راه حل دیدم جنابعالی خیلی قشنگ به این نکته اشاره کردین . اینجا بود که متوجه شدم که خرمائی که من دارم میخورم استاد قبلاً با هسته اش بازی کرده.:قهقهه:
حالا حالاها باید در محضر جنابعالی شاگردی کنیم استاد گرامی !

mazoolagh
یک شنبه 01 بهمن 1402, 19:46 عصر
سلام و درود فراوان
دست مریزاد !
احسنت !
داشتم توضیحات جنابعالی رو در دوسه خط اول این پست مرور می کردم و هنوز چشمم به توضیح راه حل نیفتاده بود که سریع در ذهنم خطور کرد که برای اینکار میشه یک sub form به فرم اضافه کرد و جدول رو به عنوان source object اون قرار داد که در خط راه حل دیدم جنابعالی خیلی قشنگ به این نکته اشاره کردین .


سلام و روز خوش
شما همیشه لطف داشتین
واقعیت اینه که این داستان دو طرفه است جناب بهرامی.

eb_1345
یک شنبه 01 بهمن 1402, 21:22 عصر
...........................................

reza_1199
یک شنبه 01 بهمن 1402, 21:37 عصر
استاد mazoolagh بزرگوار ممنون بخاطر توضیحات مفصل و دقیق و ریزبینانه و ممنون به خاطر این کلاس آموزشی ارزشمند .دقیقا همون چیزی بود که میخواستم . سپاس بیکران