View Full Version : فیلتر هوشمند یک محدوده در Adotable
beh.tehrani
چهارشنبه 22 تیر 1390, 19:39 عصر
سلام
من یک بانک اکسس که دارای یک تیبل و 3 فیلد دارم.
فیلدهای من به ترتیب به نام های فیلد 1 و فیلد 2 و فیلد 3 می باشد که رکوردهای موجود در فیلد 1 و 2 همگی یکسری آی پی هستند و فیلد 3 شامل یکسری کدهای کشورها می باشد.
Filed1 Field2 Field3
86.62.1.0 86.62.5.231 NG
86.62.5.232 86.62.5.243 IQ
86.62.5.244 86.62.5.247 A2
حال می خواهم اگر در شی ادیت باکس برای مثال این آی پی 86.62.3.12 وارد شد بررسی شود که اگر این آی پی در محدوده بین یکی از فیلدهای 1 و 2 است آن محدوده فیلتر شود.
مثلا آی پی 86.62.3.12 در محدوده بین فیلد 1 و 2 سطر اول می باشد پس باید سطر اولی فیلتر شود و تنها این سطر در Grid نمایش داده شود. به این شکل من می توانم کد کشوری آی پی هایی که در ادیت باکس وارد می کنم متوجه شوم.
البته تعداد سطرهای این تیبل بیش از 100.000 است که تمامی کشورها و محدوده های آی پی را شامل میشه.
سپاس
Mahmood_M
چهارشنبه 22 تیر 1390, 20:05 عصر
کافیه بررسی کنید که مقدار Field1 از مقدار وارد شده کمتر و مقدار Field2 از مقدار وارد شده بیشتر باشه :
در ADOQuery
'SELECT * FROM TableName WHERE Field1 <= ' + QuotedStr(Edit1.Text) + ' AND Field2 >= ' + QuotedStr(Edit1.Text)
در ADOTable
Filter = 'Field1 <= ' + QuotedStr(Edit1.Text) + ' AND Field2 >= ' + QuotedStr(Edit1.Text)
موفق باشید ...
beh.tehrani
چهارشنبه 22 تیر 1390, 20:40 عصر
سلام
مرسی نتیجه داد اما یه سوال الان وقتی یک آی پی را وارد می کنم فیلتر انجام میشه و 3 نتیجه را نشان می دهد که از این 3 نتیجه نیز فقط 1 نتیجه جواب من است.
حالا می خواهم بگونه ای این فیلتر انجام بشه که محدوده تنگتر بشه که فقط همون نتیجه من نشون داده بشه.
مثلا وقتی من 115.248.234.251 را فیلتر می کنم 3 نتیجه زیر که در این محدوده ها است فیلتر میشن که جواب من آخری است.
11.0.0.0--------------12.1.52.63
115.24.0.0-----------115.29.255.255
115.240.0.0----------115.255.255.255
مرسی
MohsenB
چهارشنبه 22 تیر 1390, 22:49 عصر
با سلام خدمت آقای تهرانی
دوستان درست راهنمایی کردن فقط من یه نکته کوچیک بگم :
تو روش دوستان دوتا رشته با هم مقایسه میشن ، خوب اگه این دوتا رشته یه سبک یا اندازه نداشته باشن تو مقایسه رشته ای مثلا بین دو عدد "2" و "10" عدد "2" بزرگتر نتیجه میشه ، برای حل این مشکل شما باید عدد دو رو به سبک یا اندازه عدد ده نشون بدین یعنی "02" .
پس شما باید یه اصلاحی تو جدولتون انجام بدین.
برا مثال آی پی 192.16.0.12 رو بصورت 192.016.000.012 بنویسید .
حالا بعد از جستجو و دریافت نتیجه شما این آی پی رو به حالت درستش تبدیل کنید.
وطن يعني گذشته حال فردا
تمام سهم یک ملت ز دنیا
وطن يعني چه آباد و چه ويران
وطن يعني همین جا یعنی ایـران
beh.tehrani
چهارشنبه 22 تیر 1390, 22:57 عصر
سلام
با تشکر از محسن عزیز
با توجه به اینکه جدول من بیش از 100.000 رکورد داخلش است و کار بسیار سختی است که بخواهد درست شود. راه حل دیگر یا روش خاصی به ذهنتون میرسه که بشه این مسئله را حل کرد
مرسی از شما دوستان
یوسف زالی
چهارشنبه 22 تیر 1390, 23:40 عصر
سلام.
بهترین کار اینه:
یک تابع بنویسید که فرمت IP شما رو تبدیل کنه به باینری متناظرش.
create function IP2Decimal(@IP varchar(15))
returns decimal
as
begin
declare @IP_1 decimal
declare @IP_2 decimal
declare @IP_3 decimal
declare @IP_4 decimal
set @IP_1 =substring(@IP, 1,CHARINDEX('.', @IP, 1)-1)
set @IP =substring(@IP,CHARINDEX('.', @IP, 1)+1,LEN(@IP))
set @IP_2 =substring(@IP, 1,CHARINDEX('.', @IP, 1)-1)
set @IP =substring(@IP,CHARINDEX('.', @IP, 1)+1,LEN(@IP))
set @IP_3 =substring(@IP, 1,CHARINDEX('.', @IP, 1)-1)
set @IP_4 =substring(@IP,CHARINDEX('.', @IP, 1)+1,LEN(@IP))
return @IP_1 * 256 * 256 * 256 + @IP_2 * 256 * 256 + @IP_3 * 256 + @IP_4
end
و در فیلترتون به راحتی Between می گیرید!
where dbo.IP2Decimal(Field)between dbo.IP2Decimal(Field1)and dbo.IP2Decimal(Field2) -- so easy
مثال:
print dbo.IP2Decimal('192.168.0.21') -- wow
MohsenB
چهارشنبه 22 تیر 1390, 23:54 عصر
با سلام دوباره
یه برنامه بنویسید که بتونه اطلاعات جدول رو درست کنه .
مثل این کد:
procedure TForm1.btn1Click(Sender: TObject);
var i:Integer;
ts1,ts2 :string;
// تابع تبدیل ------------------------------------
function txt2ip(txt :string):string
begin
txt:= txt + '.';
for i:= 1 to 4 do
for j:= (Pos('.',Copy(txt,((i-1)*4)+1,4))+((i-1)*4)) to (i*4)-1 do
Insert('0',txt,((i-1)*4)+1);
Delete(txt,Length(txt),1);
Result:= txt;
end;
//-------------------------------------------------
begin
with adods do begin
CommandText:= 'Select * From table';
Open;
First;
while not(Eof) do begin
ts1:= txt2ip(FieldByName('Field1').AsString);
ts2:= txt2ip(FieldByName('Field2').AsString);
Edit;
FieldByName('Field1').AsString:= ts1;
FieldByName('Field2').AsString:= ts2;
Post;
Next;
end;
Close;
end;
end;
بعد از این جدول اصلاح شده استفاده کنید
موفق و پیروز باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.