PDA

View Full Version : خطا در ADODB.Recordset.Filter



A.Farzin
دوشنبه 17 تیر 1387, 22:21 عصر
با سلام

در زير پارامترهاي جلوي .Filter به سه شكل چيده شده‌اند.
شكل اول:

.Filter = "Amount = 0 and (EntrID = 2 or EntrID = 9)"
شكل دوم:

.Filter = "Amount = 0 and EntrID = 2 or Amount = 0 And EntrID = 9"
شكل سوم:

.Filter = "Amount = 0 and EntrID = 2 or EntrID = 9"

در واقع من به دنبال سوا كردن ركوردهائي هستم كه Amount = 0 و EntrID آنها يا 2 و يا 9 باشند.
بدين ترتيب، مسلماً شكل سوم، هرچند كه بدون مشكلي اجرا مي‌شود ولي جوابگوي سئوال نيست.
در شكل اول و دوم، ADODB.Recordset خطاي 3001 را با مضمون زير برمي‌گرداند.

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
آيا ممكن است دوستان كمكم كنند تا بفهمم مشكل كجاست و چگونه چنين فيلتري انجام دهم؟
ممنون

A.Farzin
یک شنبه 30 تیر 1387, 19:22 عصر
خواهش ميكنم؟؟؟؟؟؟؟ به من .... كمك كنيد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟

vbhamed
دوشنبه 31 تیر 1387, 15:53 عصر
سلام
بانكتون رو بزاريد

A.Farzin
دوشنبه 31 تیر 1387, 19:43 عصر
فايل پيوست را ببينيد

vbhamed
سه شنبه 01 مرداد 1387, 19:09 عصر
سلام
از روش زير استفاده كنيد


Private Sub Command2_Click()

Me.Adodc1.RecordSource = "select * from table1 where Amount = 0 and (EntrID = 2 or EntrID = 9)"
Me.Adodc1.Refresh

MsgBox "RecordCount = " & Adodc1.Recordset.RecordCount

End Sub

A.Farzin
پنج شنبه 03 مرداد 1387, 21:41 عصر
مشكل اينجاست كه نمي‌خواهم اين فيلتر را از طريق تغيير دستور ركوردست انجام دهم و به دنبال پياده كردن آن با .Fiter هستم.
آيا واقعاً نمي‌توان به كمك فيلتر اين كار را عملي كرد؟

فاطمه وطن دوست
جمعه 04 مرداد 1387, 16:01 عصر
سلام

دقیقا میخواین چی کار کنین ؟

کوئریتون چیه ؟

A.Farzin
دوشنبه 07 مرداد 1387, 18:56 عصر
دقیقا میخواین چی کار کنین ؟
من ابتدا تعدادي از ركودهاي مورد نظر كاربر را در يك Grid به او نشان مي‌دهم. در اكثر مواقع كاربر نياز دارد تا از بين نتايج حاصل از SELECT (اجراي كوئري) اقدام به جدا كردن مقادير دلخواهي از هر كدام از ستونها كند و نياز ندارد تا بقيه ركوردهائي كه شرط مورد نظر او را ندارند در Grid ديده شوند. من اين كار دوم را به كمك Filter انجام مي‌دهم چون:
اول) به دليل اجراي آن با استفاده از امكانات ADO بسيار سريعتر از اجراي مجدد SELECT از ديتابيس جواب مي‌دهد. علت آن اين است كه اگر از SELECT استفاده كنم عمل پردازش دستور را بايد Query Analyser برنامه SQL Server انجام دهد. ولي وقتي از Filter استفاده مي‌كنم در واقع پردازش دستور توسط ADO صورت مي‌گيرد نه توسط موتور SQL Server.
دوم) ديتابيس من بسيار بزرگ است و از آنجا كه كاربر ممكن است از هر كدام از ستونها براي جدا كردن مقادير دلخواه خود بخواهد كمك بگيرد اگر بخواهم اين كار را به كمك SELECT انجام دهم بايد ايندكسهاي زيادي روي ديتابيسم بگذارم كه حجم ديتابيس را وحشتناك بالا مي‌برد.

پس مناسبترين راه همان اجراي SELECT و استفاده از امكان فيلتر روي ركوردست است ولي نمي‌دانم چرا ADO روي شروطي كه با OR و داخل پرانتز قرار داده مي‌شوند، خطا مي‌گيرد؟

فاطمه وطن دوست
سه شنبه 08 مرداد 1387, 07:39 صبح
سلام
اینو هم تست کنید .




Private Sub Command1_Click()
Me.Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb;Persist Security Info=False"
Me.Adodc1.RecordSource = "SELECT * FROM Table1 where Amount='0'"
Me.Adodc1.Refresh
MsgBox "RecordCount = " & Adodc1.Recordset.RecordCount
End Sub


Private Sub Command2_Click()
'Err.Description = Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
Me.Adodc1.Recordset.Filter = "EntrID = '2' or EntrID = '9'"
'Err.Description = Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
Me.Adodc1.Recordset.Filter = " EntrID = '2' and EntrID = '9'"
Me.Adodc1.Recordset.Filter = " EntrID = '2'"
'Me.Adodc1.Recordset.Requery
MsgBox "RecordCount = " & Adodc1.Recordset.RecordCount
End Sub

A.Farzin
سه شنبه 08 مرداد 1387, 18:44 عصر
با اين شكل خطا رخ نمي‌دهد ولي منظور من اين نيست چون در لحظه انجام SELECT معلوم نيست كاربر از چه فيلدي براي جدا كردن استفاده خواهد كرد جدول واقعي من حدود 50 فيلد دارد و هر كدام از اين فيلدها ممكن است جاي Amount را بگيرند
پس ممكن است كاربر در يك لحظه Amount=0 و در لحظه بعدي فيلد ديگري را. حتي تركيبهائي از فيلدهائي كه انتخاب هر كدام آنها و به هر شكل منجر به يك شرط براي Filter مي‌شود. اگر اينها را بخواهم در SELECT بگنجانم مشكل ايندكسها و حجم پيدا مي‌كنم. و داستاني كه در پست قبلي گفتم.
بهترين راه استفاده از Filter است. بهتر است علت عدم اجراي اين شكل دستور را در Filter پيدا كنيم شايد نتيجه اين شود كه آقا به هيچ وجه من‌الوجوه چنين كاري با Filter عملي نيست.!!!
اميدوارم كه به اين نتيجه نرسيم.
تازه متوجه شدم كه اگر بخواهيم عكس (نقيض) موارد ذيل را فيلتر كنيم هم همچنين مشكلي پيش مي‌آيد:

Me.Adodc1.Recordset.Filter = "EntrName Like '*ote*'"