ورود

View Full Version : حرفه ای: جمع دو ستون از یک جدول دارای شرط بدون فیلد کلید



saayeban
شنبه 22 دی 1397, 21:44 عصر
باسلام

یک جدول داریم به نام Data

سه ستون داره به نام mark1 , mark2 و code

دو کوئری داریم که هر کدام بر اساس فیلد code روی ستون های mark1 , mark2 یک شرط خاص را اعمال میکند.


حالا باید یک گزارش داشته باشیم که این دو ستون رو با مقادیرش نمایش بده و Mark1+Mark2 کنه و در یک textbox نمایش بده.

نکته: ما در این جدول فیلد کلید نمیتونیم داشته باشیم.(این دیتا رو از یک فایل اکسل که وصله به این اکسس میخونیم)
ستون ها همه shortText هستند و عددی نیستند.

از اونجایی که کلید نداریم داده تکراری و اشتباه نشون میده چطور میشه این مشکل رو حل کرد؟

ممنون میشم از اساتید بزرگوار راهنمایی کنند

فایل نمونه رو پیوست کردم تا مفهوم بهتر منتقل بشه

mazoolagh
یک شنبه 23 دی 1397, 13:15 عصر
یک مقدار گنگ مطرح کردین.
براساس همین دو کوئری g10,g100 دقیقا خروجی رو مشخص کنین که چی باید باشه: بصورت یک جدول یا تصویرش

saayeban
یک شنبه 23 دی 1397, 18:45 عصر
خروجی رو در فالب یک عکس گذاشتم

فایل اکسس رو هم مجدد گذاشتم

سپاس

mazoolagh
پنج شنبه 27 دی 1397, 09:48 صبح
اینکه در جدول data فیلد کلید ندارین مهم نیست، باید در کوئری های g10,g100 یک فیلد ردیف داشته باشین که ندارین.
اگر sql server میبود خب خیلی راحت میتونستیم از rownumber استفاده کنیم. اینجا یک تابع براش مینویسیم و شبیه سازی میکنیم:

Dim XX As Long
Public Function RX(x As Variant) As Long
XX = Nz(XX, 0) + 1
RX = XX
End Function


حالا از این تابع برای ساخت جداول موقت g10,g100 استفاده میکنیم (بجای کوئری)

SELECT mark1,RX([code]) AS ID INTO g10 FROM data WHERE code In ('11','12','13')
SELECT mark2,RX([code]) AS ID INTO g100 FROM data WHERE code In ('150','300')


149625
149626

mazoolagh
پنج شنبه 27 دی 1397, 09:52 صبح
حالا که شماره ردیف ID رو داریم کافی هست این دو جدول رو outer join کنیم، که این رو هم در اکسس نداریم!
بنابراین یکبار left join و یکبار right join و نتایج رو با هم union میکنیم:

SELECT g10.mark1, g100.mark2
FROM g10 LEFT JOIN g100
ON g10.ID = g100.ID
UNION
SELECT g10.mark1, g100.mark2
FROM g10 RIGHT JOIN g100
ON g10.ID = g100.ID

149627

mazoolagh
پنج شنبه 27 دی 1397, 09:56 صبح
حالا گزارش رو بر مبنای همین کوئری میسازیم و کدهای لازم رو هم اضافه میکنیم:

Private Sub Report_Open(Cancel As Integer)
DoCmd.SetWarnings False
XX = 0
DoCmd.RunSQL ("SELECT mark1,RX([code]) AS ID INTO g10 FROM data WHERE code In ('11','12','13')")
XX = 0
DoCmd.RunSQL ("SELECT mark2,RX([code]) AS ID INTO g100 FROM data WHERE code In ('150','300')")
End Sub

149628

mazoolagh
پنج شنبه 27 دی 1397, 09:58 صبح
دیتابیس نمونه