PDA

View Full Version : سوال: ايجاد كوئري با تعداد زيادي شرط OR



Rasool-GH
یک شنبه 20 آذر 1390, 11:39 صبح
سلام خدمت دوستان
من نياز دارم براي گزارشگيري از ديتابيس خودم حدود 50 شرط OR داخل كوئري بنويسم ولي متوجه شدم كه بيش از 10 رديف نميشه شروط مختلف رو اضافه كرد ايا راه حلي براي اين مشكل وجود داره يا بايد از كوئري هاي متعدد به صورت متوالي استفاده كنم

Abbas Amiri
یک شنبه 20 آذر 1390, 17:45 عصر
در لیست زیر محدودیت های کوئری در اکسس آمده است . شما به کدام مورد استناد می کنید؟

مهدی د
یک شنبه 20 آذر 1390, 18:15 عصر
در یک سطر هم می توان تمام OR ها را گنجاند مثلا
OR 1 OR 3 OR 5 OR 7 OR 9 و ... و نیازی نیست که هر کدام از OR ها را در یک سطر وارد کرد.

Rasool-GH
یک شنبه 20 آذر 1390, 18:48 عصر
ممنون از توجه دوستان
یه مقدار بیشتر توضیح میدم . من در یک دیتابیس که دارای 30 ستون هست (هر رکورد 30 فیلد داره) میخوام یه مقدار که در فرم گزارشگیری به وسیله کاربر درج میشه رو بگیرم و کوئری رو بسازم .
مثلا میخوام تمام رکوردهایی که مقدار هر کدوم از فیلدهای اون بالای 30 هست رو به دست بیارم . طبیعتا باید تمام فیلدها رو در کوئری وارد کنم و هرفیلد رو در یک ردیف با عدد مورد نظر مقایسه کنم (مشکل اینجاست که 9 ردیف بیشتر نمیشه شرط OR در فیلدهای جداگانه نوشت)

Abbas Amiri
یک شنبه 20 آذر 1390, 19:01 عصر
شما می توانید براحتی با ایجاد رکوردست و یک حلقه از رکوردها و داخل آن یک حلقه از فیلدهای آن مقادیر راچک کنید و هرکدام که شرط درآنها صادق بود ، به جدول موقت افزوده شود

Rasool-GH
یک شنبه 20 آذر 1390, 19:04 عصر
براتون امکان داره که یک نمونه از کد مورد نظر رو قرار بدین
من با رکوردست اصلا اشنایی ندارم (البته کلا با کد نویسی خیلی اشنا نیستم )

Abbas Amiri
یک شنبه 20 آذر 1390, 19:44 عصر
از کد زیر استفاده کنید . مقدار برگشتی را به یک کوئری و یا رکوردسورس یک فرم یا گزارش نسبت دهید



Function CheckFields(tableName As String, Value) As String
Dim fld As Field, strSQL As String
Dim rs As Recordset, k As Integer
Set rs = CurrentDb.OpenRecordset(tableName)
strSQL = "SELECT * FROM " & tableName & " WHERE"
For k = 1 To rs.Fields.Count - 1
Set fld = rs.Fields(k)
strSQL = strSQL & " " & fld.Name & " > " & quotes(fld.Type) & Value & quotes(fld.Type) & " OR"
Next
'For Each fld In rs.Fields
' strSQL = strSQL & " " & fld.Name & " > " & quotes(fld.Type) & Value & quotes(fld.Type) & " OR"
'Next

rs.Close
Set rs = Nothing
CheckFields = Left(strSQL, Len(strSQL) - 1)
End Function

Function quotes(ft As DataTypeEnum) As String
Select Case ft
Case dbText, dbMemo
quotes = "'"
Case dbDate
quotes = "#"
End Select
End Function

Rasool-GH
یک شنبه 20 آذر 1390, 20:53 عصر
اقا ممنون
دارم چندتا مطلب در مورد رکوردست میخونم . شاید یه چیزی دستگیرم بشه . به غیر از این روش تنها راه کوئریهای متوالیه ؟

Abbas Amiri
یک شنبه 20 آذر 1390, 21:32 عصر
از طریق کوئری هم می توانید . رشته تولید شده را دریک کوئری کپی کنید وببینید.

Rasool-GH
یک شنبه 20 آذر 1390, 22:31 عصر
رشته مذکور رو چه جوری به دست بیارم (تولید کنم) . حاصل اجرای کد یک رشته خواهد شد ؟
ضمنا منظور شما از کوئری داخل نمای SQL یک کوئری هست ؟

Abbas Amiri
یک شنبه 20 آذر 1390, 22:47 عصر
بله در تعریف فانکشن نوشته شده است As String ودر مورد دوم هم بله
می توانید در (immediate Window (Control + G تایپ کنید: (لیست آرگومانها) CheckFilds ? تا خروجی تابع چاپ شود