PDA

View Full Version : این دستور اشتباه درستش چی مشیه؟؟؟



Rocker
دوشنبه 05 شهریور 1386, 09:43 صبح
دوستان خوبم سلام.
شرمنده من همیشه سعی میکنم عنوان تاپیکم گویا باشه اما ایندفه نمی دونستم چی بزارم.
این دستور اشتباه خودمم میدونم.

َِ ADOTable1.filter:='ID Like ''%'+edit1.text+'%'''
فیلد ID از نوع عددی می باشد برای همین این دستور اشتباه اما من میخواستم بتونم فیلدهای عددی را نیز مانند فیلدهای رشته ای به صورت نسبی (تطبیق جزئی) جستجو کنم من الان چند تا تاپیک برای نوشتن یک برنامه سرچ تو بانک ایجاد کردم اما جواب درست نگرفتم.
دوستان عزیز خواهش میکنم مارو هم راهنمایی بفرمایند.
فداتون.

Rocker
دوشنبه 05 شهریور 1386, 12:12 عصر
بتمن جان سلام.
این کد صد در صد غلطه اصلا کاری انجام نمیده البته ببخشید اینقدر صریح حرف میزنم.
اما آخه کجای دنیا دیدی که یه عدد و با یک رشته با عملگر + کنار هم گذاشت کاری که شما تو کدتون با تابع StrToInt انجام دادید.
می دونم که حواست نبوده اما دفعه بعد مواظب باش که روت یه جور دیگه حساب نشه.
من با این دستور خیلی وقته آشنا هستم اما میدونی مشکل کجاست اینه که ممکن کاربر داخل Edit1 رشته وارد کنه اونوقته که برنامه خطا میده در واقع میخواستم کاری کنم که با یک edit هم بین فیلدهای عددی و هم بین فیلدهای رشته ای جستجو کند.
فداتون.

SYNDROME
دوشنبه 05 شهریور 1386, 14:52 عصر
با سلام
می توانی به جای استفاده از دستور در Filterآن را در ADO.SQL.Textبنویسی و قبل از مقایسه آن را تبدیل کنید.


ADO.Sql.Text := 'Select * From Tbl_Test Where Cast(ID As NvarChar(10)) Like ''%'+Edit.Text+'%''';

موفق باشید

Rocker
دوشنبه 05 شهریور 1386, 16:48 عصر
با سلام
می توانی به جای استفاده از دستور در Filterآن را در ADO.SQL.Textبنویسی و قبل از مقایسه آن را تبدیل کنید.


ADO.Sql.Text := 'Select * From Tbl_Test Where Cast(ID As NvarChar(10)) Like ''%'+Edit.Text+'%''';

موفق باشید
سیندروم جان:
دستور فیلتر از اونجایی که جزو متدهای استاندارد دلفی هست کارایی و مزایای بیشتری داره البته میدونم که دستورات sql فوق العاده هستند اما بعضی جاها دستور فیلتر فوق العاده تر عمل میکند.
درضمن دستورات sql تفاوتی بین اعداد و ذشته قائل نمیشن و اینهم یکی از مزایای اونه و فکر نمی کنم برای این کار نیاز به توایع اضفی باشه.
اگه میتونی درباره دستور sql که بالا نوشتی یکم بیشتر توضیح بده ازت ممنونم.مثلا کار تابع cast چیه؟؟؟

Batman
دوشنبه 05 شهریور 1386, 18:20 عصر
بتمن جان سلام.
این کد صد در صد غلطه اصلا کاری انجام نمیده البته ببخشید اینقدر صریح حرف میزنم.
اما آخه کجای دنیا دیدی که یه عدد و با یک رشته با عملگر + کنار هم گذاشت کاری که شما تو کدتون با تابع StrToInt انجام دادید.
می دونم که حواست نبوده اما دفعه بعد مواظب باش که روت یه جور دیگه حساب نشه.
من با این دستور خیلی وقته آشنا هستم اما میدونی مشکل کجاست اینه که ممکن کاربر داخل Edit1 رشته وارد کنه اونوقته که برنامه خطا میده در واقع میخواستم کاری کنم که با یک edit هم بین فیلدهای عددی و هم بین فیلدهای رشته ای جستجو کند.
فداتون.
سلام Rocker جون
واقعا عذر میخوام اصلا نمیدونم چرا یه لحظه فکر نکردم و چنین پست احمقانه ای رو نوشتم :اشتباه:
در عین حال بعد از گفتگوی تلفنی که با جناب syndrome داشم به این نتیجه رسیدیم که دستور ado.filtered با چیزی که شما میخواین منافات داره بنابراین من یه برنامه برات میذارم که تست شده هستش دو تافیلد داره id از نوع number و family از نوع text دقیقا همون کدی رو که خودت گذاشتی من هم استفاده کردم و هیچ مشکلی نداره هم برای رشته و هم برای اعداد جستجو رو به صورت کامل انجام میده
بازم عذر میخوام آدمیزاده دیگه (بشر جایز الخطا هستش)

SYNDROME
دوشنبه 05 شهریور 1386, 20:36 عصر
اگه میتونی درباره دستور sql که بالا نوشتی یکم بیشتر توضیح بده ازت ممنونم.مثلا کار تابع cast چیه؟؟؟
دستور Castهمان تبدیل نوع است.من در بالا عدد را به یک رشته تبدیل کردم.
البته می توانی دستور Castرا هم ننویسی.
شما در دستور Filterنمی توانید برای یک مقدار عددی Like و سپس % استفاده کنید.
موفق باشید

Rocker
دوشنبه 05 شهریور 1386, 21:08 عصر
سلام Rocker جون
واقعا عذر میخوام اصلا نمیدونم چرا یه لحظه فکر نکردم و چنین پست احمقانه ای رو نوشتم :اشتباه:
در عین حال بعد از گفتگوی تلفنی که با جناب syndrome داشم به این نتیجه رسیدیم که دستور ado.filtered با چیزی که شما میخواین منافات داره بنابراین من یه برنامه برات میذارم که تست شده هستش دو تافیلد داره id از نوع number و family از نوع text دقیقا همون کدی رو که خودت گذاشتی من هم استفاده کردم و هیچ مشکلی نداره هم برای رشته و هم برای اعداد جستجو رو به صورت کامل انجام میده
بازم عذر میخوام آدمیزاده دیگه (بشر جایز الخطا هستش)
سیندروم جان.
از اینکه به فکر مایی خیلی خیلی ارت ممنونم اما من خودم هم قبلا از این کد استفاده کردم(برنامه test رو میگم) اما باز به این نتیجه رسیدم که از دستور فیلتر استفده کنم میدونی علتش چیه؟ به خاطر اینکه میخواستم از متد های Findfirst,findnext بهره ببرم اما انگار با این توصیفات شما دوستان قرار نیست که بشه آخه این متدها خیلی مفید هستند.
بازم از زحماتت خیلی خیلی ممونونم دمت گرم پسر بد.
آقای بتمن عزیز امیدوارم که همیشه خفاش خوبی باشی از شما دوست عزیز هم خیلی ممونم دمت گرم.
حالا من هنوز امیدوارم آخه تا الان که دلفی روی منو زمین نزده بازم از دوستان خواهش میکنم به این نکته ریز اما اساسی (البته از نظر بنده) توجه کنند و یه راهی جلوی پای ما بزارن.
فداتون.

Arman_1367
دوشنبه 05 شهریور 1386, 22:10 عصر
کد شما به این صورت هیچ مشکلی ندارد :

Var I:Integer;
begin
If not TryStrToInt(Edit1.Text,i) then
exit;
ADOTable1.Filtered:=False;
ADOTable1.Filter:='ID like '+Edit1.Text;
ADOTable1.Filtered:=true;
end;

SYNDROME
دوشنبه 05 شهریور 1386, 22:20 عصر
با سلام
خدمت آقا آرمان گل

کد شما به این صورت هیچ مشکلی ندارد :

Var I:Integer;
begin
If not TryStrToInt(Edit1.Text,i) then
exit;
ADOTable1.Filtered:=False;
ADOTable1.Filter:='ID like '+Edit1.Text;
ADOTable1.Filtered:=true;
end;
دستور شما درست کار می کند و مانند "=" عمل می کند ولی دوستمان به دنبال استفاده از "%" در دو طرف مقدار فوق است.
موفق باشید

Rocker
دوشنبه 05 شهریور 1386, 22:52 عصر
آرمان جان سلام از این که تو تاپیک من شرکت کردی ازت ممنونم آره دوست عزیزم آقای سیندروم راست میگه من میخوام اعداد رو هم به صورت تطبیق جزئی با % بررسی کنم اگه این مشکل حل بشه به جرات میتونم بگه که میتونیم یک برنامه سرچ قوی و کامل برای بانکمون بنویسیم.
خوب مسئله شرچ هم مسئله ی بی اهمیتی نیست انشالله وقتی یک کار بهتون بخوره می فهمید.
من هنوزم امیدوارم به دلفی و دلفی کاران عزیز
فداتون

JavanSoft
سه شنبه 06 شهریور 1386, 09:27 صبح
به این صورت بنویسید



Query1.Sql.Text:='
Select * From Table Where I Like
'+QutedStr('%'+InNum+'%')

Rocker
سه شنبه 06 شهریور 1386, 09:40 صبح
به این صورت بنویسید



Query1.Sql.Text:='
Select * From Table Where I Like
'+QutedStr('%'+InNum+'%')


جناب جوان سافت عزیز از راهنماییتون متشکرم.
اما خواستم بگم علت اسرار بنده به دستور Filter استفاده از متدهای Findfirst و.... اونهست .
آیا راهی مشابه هم وجود دارد ممونم از راهنماییتون.
فداتون.

محمود رضا
سه شنبه 06 شهریور 1386, 10:04 صبح
فکر کنم دستور درست این باشه
AdoTable.filter = 'cast (id as varchar(50 )) Like ''%' + Edit1.text + '''%' 000

Rocker
سه شنبه 06 شهریور 1386, 10:16 صبح
فکر کنم دستور درست این باشه
AdoTable.filter = 'cast (id as varchar(50 )) Like ''%' + Edit1.text + '''%' 000
آقا محمود سلام.
این دستور هم خطا میده در واقع این دستور برای sql هستش ته برای خاصیت فیلتر اما من هم تو این فکرم که مثل دستورات sql در خاصیت filter هم بتونم فیلدهای از نوع عددی را به رشته ای تبدیل کنم فکر میکنم یه همچین راهی باشه البه امیدوارم.
راستی قضیه اون سه تا صفر آخر چیه باعث ارور میشد.
دوستان تو روخدا نزارید من نا امید بشم.

Arman_1367
سه شنبه 06 شهریور 1386, 11:04 صبح
در خاصیت OnFilterRecord از کمپاننت ADoTable از این کد استفاده کن و مقدار Filtered را هم True بکن .

procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept:=pos(edit1.text,DataSet.fieldbyname('ID').A sString)>0;
end;

Rocker
سه شنبه 06 شهریور 1386, 11:35 صبح
فکر کنم من هنوز مقصودم رو درست نگفتم.
میدونید من میخوام چی کار کنم میخوام یک برنامه سرچ بنویسم که بدون اینکه تمام رکوردهای جدول را فیلتر کند و یا به عبارت دیگر تمام رکوردها را نمایش دهد اما مثلا کاربر با زدن دکمه Find Next بتواند رکوردها بعدی طبق آن کلمه کلیدی که در edit1.text وارد کرده نشان دهد.
اما تمام این راه های که دوستان تا الان گفته اند در واقع جدول را فیلتر می کند و این کار برای جستجو در بانک درست نیست!!!
اصلا یه سئوال:
آیا شما وقتی در برنامه اکسس جستجو می کنید برنامه میاد یکدفعه تمام رکوردهایی که با کلمه کلیدیی که شما وارد کرده اید تطابق دارد را به شما نشان میدهد؟
خوب جواب مسلما خیر است.
بلکه با زدن مکرر روی کلید find next شما را به رکورد مورد نظرتان میرساند درست مثل جستجو در تمام برنامه ها چه برنامه های ویرایش متن چه دیتابیسها.
باز هم همه دوستان محترم متشکرم که قصد کمک کردن دارند.
فداتون.

Rocker
سه شنبه 06 شهریور 1386, 12:15 عصر
ببخشید تا حالا کسی به من نگفته بود از Filter میشه برای:

استفاده کرد.
آقا آرمان فکر کنم تو این پست به من قصد طعنه زدن داشته باشید آخه یه جوری گفتید که هر کسی اینطور برداشت میکنه.
اگه علت طعنه زدن شما اینه که من گفتم "مثل تمام برنامه های ویرایش متن..." منظورم این نبود که میشه با دستور Filter در متن جستجو کرد اون فقط و فقط یک مثال بود نه یک حقیقت.
اینجور پستهای طعنه آمیز در شعونات این وب سایت نیست قبل از طعنه زدن منظور را خوب درک کنید.
متشکرم.
فداتون.

Arman_1367
سه شنبه 06 شهریور 1386, 12:36 عصر
آخه یه جوری گفتید که هر کسی اینطور برداشت میکنه.

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


دوستان بزارید چند نکته را متذکر بشم فکر کنم کمی ذهنتون رو برای نوشتن برنامه های بهتر و قوی تر مشغول کنه.

در ضمن من اصلاً کاری به برنامه ویرایش متن و ... نداشتم.

Rocker
سه شنبه 06 شهریور 1386, 12:45 عصر
نه من قصد طعنه زدن نداشتم من تا قبل از پست قبلی شما فکر می کردم می خواهید همه رکوردهایی که با عدد مورد نظر مطابقت داره را نمایش بدهید برای همین راه دوم را گفتم اما شما بدجوری کنایه آمیز توهین کردید.



در ضمن من اصلاً کاری به برنامه ویرایش متن و ... نداشتم.
آرمان عزیز:
میدونم اینجا جای این حرفا نیست اما تو این وب سایت ما فقط با متن با هم حرف میزنیم و مکالمه صوتی نداریم خوب این دوتا با هم خیلی فرق دارن بنابراین باید خیلی مواظب باشیم تا حرفامون رو طوری بنویسیم که برداشت دو پهلو از اونها نشه.
من به هیچ وجه به کسی توهین نکردم شاید خودم همون قضیه دوپهلو نوشتنرو رعایت نکردم.
خوب حالا که میگید منظورتون طعنه زدن نیست من از شما مغذرت میخوام.
حالا میتونی مارو کمک کنی آرمان جان.

Arman_1367
سه شنبه 06 شهریور 1386, 13:28 عصر
ببینید من این راه حل به نظرم می رسه البته اگر اسرار خاصی به استفاده از خاصیت Filter ندارید:


unit Unit2;

interface

uses
Classes, ADODB, DB;

type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure ADOTableFilterRecord(DataSet: TDataSet;var Accept: Boolean);
public
STbl:TADOTable;
FldName:String;
SearchString:String;
end;

implementation


{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure TMyThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

{ TMyThread }

procedure TMyThread.Execute;
Var tbl:TADOTable;
begin
{ Place thread code here }
tbl:=TADOTable.Create(nil);
tbl.Connection:=STbl.Connection;
tbl.TableName:=STbl.TableName;
tbl.Open;
tbl.OnFilterRecord:=ADOTableFilterRecord;
tbl.Filtered:=true;
tbl.First;
//
if Pos(SearchString,STbl.FieldByName(FldName).AsStrin g)>0 then
tbl.RecNo:=STbl.RecNo
else
begin
tbl.RecNo:=STbl.RecNo;
while Pos(SearchString,tbl.FieldByName(FldName).AsString )=0 do
tbl.Next;
tbl.Prior;
end;
//
tbl.Next;
STbl.RecNo:=tbl.RecNo;
tbl.Close;
tbl.Free;
end;
procedure TMyThread.ADOTableFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept:=(Pos(SearchString,DataSet.FieldByName(FldN ame).AsString)>0);
end;

end.

این یونیت را در برنامه قرار دهید و به روش زیر از اون استفاده کنید:

Var T:TMyThread;
begin
T:=TMyThread.Create(true);
T.STbl:=ADOTable1;
T.FldName:='ID';
T.SearchString:=Edit1.Text;
t.Suspended:=false;
end;


البته این کد که نوشتم خیلی غیر حرفه ای هست و برای استفاده درست و حسابی باید با مبحث MultiThreding آشنایی داشته باشید اما خوب کار راه بیانداز هست دلیل استفاده از روش MultiThreding هم این هست که ممکنه بین رکوردی که الآن در ان هستید و رکورد بعدی که قرار است پیدا شود 5000 یا بیشتر فاصله باشه که با حلقه طول می کشه جست و جو کنه برای همین در صورت استفاده از روش معمولی برنامه تا پایان حلقه قفل می شه.اما با این روش نه قفل نمی شه.

Rocker
سه شنبه 06 شهریور 1386, 14:10 عصر
از دوست عزیزم آرمان خیلی خیلی متشکرم.
اما انگار باید برم سراغ همون روشهای من درآوردی و سرعت پایین(منظورم روشهای خودم هست دوستان به خود نگیرند)
البته آقای آرمان از تکنیک تقریبا پیشرفته ای استفاده کردند اما همون طور که خودشون ذکر کردن اگه تعداد رکوردها زیاد باشه که مسلما هست سرعت برنامه خیلی پایین میاد.
فکر کنم دیگه دارم به این نتیجه میرسم که دلفی داره رومو زمین میندازه به نظر من که این میتونه یک نقطه ضعف برای دلفی باشه با اینکه به نظر ساده و پیش پا افتاده میرسه اماه مهمه چون سرچ در بانک یکی از مسائلی بوده که همیشه مد نظر بوده و همیشه مهم.
اما بورلند میتونست به خودش یه زحمت بده و یک راهی میزاشت تا بشه در دستور فیلتر فیلدهای نوع عددی رو به رشته تبدیل کرد اونوقت ما دیگه مشکلی نداشتیم آخه این دستور ساده برای فیلدهای رشته ای میتونم به جرات بگم که فوق العاده کار میکنه.
در آخر باز هم از آرمان عزیز و همه ی دوستان خوبم بی نهایت سپاسگزارم.

SYNDROME
سه شنبه 06 شهریور 1386, 15:03 عصر
با سلام


AdoTable.filter = 'cast (id as varchar(50 )) Like ''%' + Edit1.text + '''%' 000
شما نمی توانید از دستور Cast و بعضی از توابع دیگر SQL نمی توانید در Filterاستفاده کنید.
موفق باشید

Rocker
سه شنبه 06 شهریور 1386, 15:25 عصر
این تاپیک در هشت روز گذشته در قسمت بانکهای اطلاعاتی دلفی پر بیننده ترین و پر پست ترین تاپیک بوده امیدوارم برای همه مفید بوده باشه چون دوستان زحمت کشیدن و کدهای مفیدی در اون قرار دادن اما من هنوز به جواب ایده آلم نرسیدم البته منظورم نا سپاسی از زحمات دوستان خوبم نیست بلکه دوستان خیلی هم به من لطف داشتن و ازشون بی نهایت متشکرم شاید هم چیزی که من میخواهم خیلی خاص است و امکان نوشتن آن وجورد ندارد.
اما من هنوز نا امید نشدم برای همین یه تاپیک دیگه ایجاد کردم با عنوان "تبدیل فیلدهای عددی به رشته ای در خاصیت Filter" اینجوری مشکل رو بهتر و نکته ای تر بیان کردم چون اگه این کار امکان پذیر بشه دیگه مشکلمون برطرف میشه امیدوارم که به درد همه دوستان گلم بخوره.
فداتون

Maisa pardaz
سه شنبه 06 شهریور 1386, 15:51 عصر
دوستان خوبم سلام.
شرمنده من همیشه سعی میکنم عنوان تاپیکم گویا باشه اما ایندفه نمی دونستم چی بزارم.
این دستور اشتباه خودمم میدونم.

َِ ADOTable1.filter:='ID Like ''%'+edit1.text+'%''' فیلد ID از نوع عددی می باشد برای همین این دستور اشتباه اما من میخواستم بتونم فیلدهای عددی را نیز مانند فیلدهای رشته ای به صورت نسبی (تطبیق جزئی) جستجو کنم من الان چند تا تاپیک برای نوشتن یک برنامه سرچ تو بانک ایجاد کردم اما جواب درست نگرفتم.
دوستان عزیز خواهش میکنم مارو هم راهنمایی بفرمایند.
فداتون.

سلام دوست عزیز
البته نمیدونم کد شما کاملا درسته یا نه کمی شک دارم. ولی یکی از دوستان گفته بود که اگر کسی در Edit به جای عدد حرف وارد کنی نمیشه از کد فوق استفاده کنی، باید بگم که برای اون قضیه میتونی از MaskEdit استفاده کنی و خاصیت EditMask اونو به تعداد رقمهایی که میخواهی عدد 9 را قرار بدی تا از ورود حروف به جای اعداد جلوگیری کنی.
بعد میتونی از StrToInt با خیال راحت استفاده کنی. در ضمن برای استفاده بهتر از دستور Trim هم اگه استفاده کنی بد نیست. مثلاً:


StrToInt(Trim(MaskEdit1.Text))

اینطوری میتونی فضاهای خالی دو طرف رشته رو حذف کنی



موفق باشی

SYNDROME
سه شنبه 06 شهریور 1386, 18:33 عصر
با سلام
با احترام
کاربر عزیز Maisa pardaz
فکر کنم شما کامل این تاپیک را نخوانده اید.
دوست ما مشکل در جستجو عددی در Filterبا دستور Like به همراه "%" زمانی که فیلد بانک از نوع عددی باشد دارد.
موفق باشید

Answer
سه شنبه 06 شهریور 1386, 18:50 عصر
دوستان عزیز اگه اشتباه میگم ببخشید ولی تا اونجا که من تحقیق کردم در ساختار فیلتر از دستور Like و همچنین علامت % نمیشه استفاده کرد ولی در عوض یه روش هست که من تو فیلتر استفاده میکنم اونم استفاده از علامت* میباشد

Table1.filter:='ID = '+QuotedStr(edit1.text+'*')
من بازم تلاشم رو میکنم و جواب رو براتون میزارم
البته باید بگم که ابن روشم تنها در رشته ها جواب میده

Rocker
سه شنبه 06 شهریور 1386, 20:19 عصر
دوستان عزیز اگه اشتباه میگم ببخشید ولی تا اونجا که من تحقیق کردم در ساختار فیلتر از دستور Like و همچنین علامت % نمیشه استفاده کرد ولی در عوض یه روش هست که من تو فیلتر استفاده میکنم اونم استفاده از علامت* میباشد

Table1.filter:='ID = '+QuotedStr(edit1.text+'*')
من بازم تلاشم رو میکنم و جواب رو براتون میزارم
البته باید بگم که ابن روشم تنها در رشته ها جواب میده
دوست عزیز از علامت * وقتی استفاده میشه که موتور بانک شما از نوع BDE باشه برای موتور بانکهای مایکروسافت و نه فقط ADO برای تطبیق جزئی از همون % استفاده میشه با این حال بازم ازت ممونم که تو این بحث شرکت می کنی.

Arman_1367
چهارشنبه 07 شهریور 1386, 00:44 صبح
از دوست عزیزم آرمان خیلی خیلی متشکرم.
اما انگار باید برم سراغ همون روشهای من درآوردی و سرعت پایین(منظورم روشهای خودم هست دوستان به خود نگیرند)
البته آقای آرمان از تکنیک تقریبا پیشرفته ای استفاده کردند اما همون طور که خودشون ذکر کردن اگه تعداد رکوردها زیاد باشه که مسلما هست سرعت برنامه خیلی پایین میاد.
فکر کنم دیگه دارم به این نتیجه میرسم که دلفی داره رومو زمین میندازه به نظر من که این میتونه یک نقطه ضعف برای دلفی باشه با اینکه به نظر ساده و پیش پا افتاده میرسه اماه مهمه چون سرچ در بانک یکی از مسائلی بوده که همیشه مد نظر بوده و همیشه مهم.
اما بورلند میتونست به خودش یه زحمت بده و یک راهی میزاشت تا بشه در دستور فیلتر فیلدهای نوع عددی رو به رشته تبدیل کرد اونوقت ما دیگه مشکلی نداشتیم آخه این دستور ساده برای فیلدهای رشته ای میتونم به جرات بگم که فوق العاده کار میکنه.
در آخر باز هم از آرمان عزیز و همه ی دوستان خوبم بی نهایت سپاسگزارم.

با سلام

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

دلفی هیچ وقت روی کسی را زمین نمی اندازد بلکه این کم تجربی و بلد نبودن مطالب کافی افراده مثلاً شما فکر می کنید آیا با C# آیا می شه کاری را که می خواهید انجام بدهید مسلماً خیر چون در دلفی هم نتوانسته اید.منظورم از کم تجربه خودم هستم چون هیچ وقت زحمت یادگرفتن ADO را به خودم ندادم همیشه از oracle استفاده کردم.

راستی من گفتم سرعت پایین منظورم این نبود که برنامه کنده از تکنیک مالتی ترید برای رفع این مشکل استفاده کردم.
کاشکی یک دور کد را تست می کردید تا الکی نکنید سرعت پایین من همین کد را با یک سیستم p4 با 256 مگ رم تست کردم فاصله 8000 رکورد را در کمتر از 1 ثانیه طی کرد تازه برنامه هم قفل نکرد.


یا حق

Rocker
چهارشنبه 07 شهریور 1386, 17:51 عصر
با سلام

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

دوست عزیز:
فکر نمی کنم یه برنامه با بانک اکسس مناسب باشه این بانک به صورت آزمایش در نسخه آلفای برنامه قرار دارد و در نسخه های بتا به بعد قرار که به SQL Server ایمپورت بشه اصلا برنامه ای که بانکش با اکسس نوشته شده باشه اصلا ارزش اینهمه دردسرو داره.


دلفی هیچ وقت روی کسی را زمین نمی اندازد بلکه این کم تجربی و بلد نبودن مطالب کافی افراده

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

(هرگز نخورد آب زمینی که بلند است
افتادگی آموز اگر طالب علمی)

متشکرم

fereshtehrahimi
چهارشنبه 07 شهریور 1386, 19:02 عصر
چه طور می تونم در کریستال ریپورت آدرس تصاویر را از دیتابیس بخونم و تصویر را نمایش دهم .

Rocker
پنج شنبه 08 شهریور 1386, 00:16 صبح
چه طور می تونم در کریستال ریپورت آدرس تصاویر را از دیتابیس بخونم و تصویر را نمایش دهم .
سلام:
شما اصلا موضوع تاپیک رو خوندید و پست زدید اینجوری هیچ وقت به جوابتون نمی رسید تو این سایت یه بخش برای کار با ابزارهای گزارش گیری وجود دارد در ضمن سرچ کردن توی سایت هم کار بدی نیست.

Arman_1367
پنج شنبه 08 شهریور 1386, 01:10 صبح
کاربر Rocker اطفاً زود نتیجه گیری نکنید بابا منظورم از بی تجربه خودم بود :

دلفی هیچ وقت روی کسی را زمین نمی اندازد بلکه این کم تجربی و بلد نبودن مطالب کافی افراده مثلاً شما فکر می کنید آیا با C# آیا می شه کاری را که می خواهید انجام بدهید مسلماً خیر چون در دلفی هم نتوانسته اید.منظورم از کم تجربه خودم هستم چون هیچ وقت زحمت یادگرفتن ADO را به خودم ندادم همیشه از oracle استفاده کردم.


فکر نمی کنم یه برنامه با بانک اکسس مناسب باشه این بانک به صورت آزمایش در نسخه آلفای برنامه قرار دارد و در نسخه های بتا به بعد قرار که به SQL Server ایمپورت بشه اصلا برنامه ای که بانکش با اکسس نوشته شده باشه اصلا ارزش اینهمه دردسرو داره.

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


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

من که خودم خیلی با ADO کار نکردم ولی چشم بین دوستان مطرح می کنم اگر راهی بهتر پیدا شد براتون می نویسم.

Rocker
پنج شنبه 08 شهریور 1386, 02:13 صبح
آرمان جان منم زیاد تجربه ندارم منم تازه اولشم من هنوز خودمو برنامه نویس نمی دونم اینم بدون که من هیچ وقت الطاف دوستان رو از یاد نمی برم و حتما جبران میکنم و هر چی بلد باشم خالصانه در اختیارشون میزارم این حد اقل کاری که من میتونم انجام بدم.

SYNDROME
پنج شنبه 08 شهریور 1386, 07:40 صبح
با سلام
شما چرا از روش نوشتن دستورات کامل در ADO(مثالی که در اول تاپیک زده شد)استفاده نکرده اید؟
کاملا مشکل شما را حل می کند.
موفق باشید

Rocker
پنج شنبه 08 شهریور 1386, 15:47 عصر
با سلام
شما چرا از روش نوشتن دستورات کامل در ADO(مثالی که در اول تاپیک زده شد)استفاده نکرده اید؟
کاملا مشکل شما را حل می کند.
موفق باشید
سیندروم عزیز سلام:
میشه منظورتو بهتر بگی آخه تو این تاپیک مثال زیاد زده شده شما کدومشون رو میفرمایید.
اگر منظورتون استفاده از دستورات sql باشه من قبلا مشکلمو بهتون عرض کردم که نمی خوام یکدفعه همه رکوردها رو فبلتر کنم .
فداتون.

SYNDROME
پنج شنبه 08 شهریور 1386, 18:15 عصر
با سلام


اگر منظورتون استفاده از دستورات sql باشه من قبلا مشکلمو بهتون عرض کردم که نمی خوام یکدفعه همه رکوردها رو فبلتر کنم .
فداتون.
دوست عزیز شما یک دفعه Selectمورد نظر را می نویسید و بعد در فیلتر عمل فیلترین را انجام می دهد.یعنی در دو مرحله کار را انجام می دهید(دو فیلتر)
حالا اگر در یک مرحله این فیلتر را انجام دهید(با دستور SQL) با روش قبلی چه فرقی دارد؟
موفق باشید

Rocker
پنج شنبه 08 شهریور 1386, 20:48 عصر
با سلام

دوست عزیز شما یک دفعه Selectمورد نظر را می نویسید و بعد در فیلتر عمل فیلترین را انجام می دهد.یعنی در دو مرحله کار را انجام می دهید(دو فیلتر)
حالا اگر در یک مرحله این فیلتر را انجام دهید(با دستور SQL) با روش قبلی چه فرقی دارد؟
موفق باشید
سیندروم جان اینو ختما امتحان کن.
خاصیت filter رو تنظیم کن.
حالا بلافاصله متد findfirst را اجرا کن.
در یک باتن دیگه هم متد findnext را پشت سر هم اجرا کن.
نتیجه را دیدی؟ اصلا جدول فیلتر شد؟؟
من یه همچین چیزی میخوام اما دستورات sql همه را یک جا نمایش می دهند.
راستی اگه میشه در مورد آخرین پستت واضحتر توضیح بده متشکرم.

Rocker
جمعه 09 شهریور 1386, 18:14 عصر
آقا توروخدا این تاپیکو فراموش نکنید من هنوز به جوابم نرسیدم آقای سیندروم دیگه جواب ندادید.

SYNDROME
جمعه 09 شهریور 1386, 19:40 عصر
با سلام


من یه همچین چیزی میخوام اما دستورات sql همه را یک جا نمایش می دهند.
راستی اگه میشه در مورد آخرین پستت واضحتر توضیح بده متشکرم.
راستش را بخواهید من مفهوم کلمات شما را نفهمیدن.
یعنی چی که دستورات SQL همه چیز را یک جا نمایش می دهد با استفاده از شرطها (Where)شما می توانید فیلتر کنید.
دقیقاً بگویید چه می خواهید.
موفق باشید

Rocker
جمعه 09 شهریور 1386, 21:01 عصر
با سلام

راستش را بخواهید من مفهوم کلمات شما را نفهمیدن.
یعنی چی که دستورات SQL همه چیز را یک جا نمایش می دهد با استفاده از شرطها (Where)شما می توانید فیلتر کنید.
دقیقاً بگویید چه می خواهید.
موفق باشید
سیندروم جان:
فرض کن شما دنبال رکوردهایی میگردی که فیلد نام آنها "علی" است خوب وقتی که ما از این دستورات استفاده کنیم برنامه به صورت یک جا تمام رکوردهایی که فیلد نام آنها برابر "علی" هست رو نشون میده من اینو نمی خوام بلکه میخوام کاربر تمام رکوردها رو ببینه و مثلا با زدن کلید Find Next برنامه, کاربر رو به رکورد بعدی که فیلد نام اون "علی" هست منتقل کنه یه چیز تو مایه های برنامه سرچ اکسس و ....
الان فکر کنم منظورمو بهتر گفتم.

SYNDROME
جمعه 09 شهریور 1386, 22:17 عصر
فرض کن شما دنبال رکوردهایی میگردی که فیلد نام آنها "علی" است خوب وقتی که ما از این دستورات استفاده کنیم برنامه به صورت یک جا تمام رکوردهایی که فیلد نام آنها برابر "علی" هست رو نشون میده من اینو نمی خوام بلکه میخوام کاربر تمام رکوردها رو ببینه و مثلا با زدن کلید Find Next برنامه, کاربر رو به رکورد بعدی که فیلد نام اون "علی" هست منتقل کنه یه چیز تو مایه های برنامه سرچ اکسس و ....
الان فکر کنم منظورمو بهتر گفتم.
من هم قبلا یک چنین مشکلی داشتم.
دو تا ADOروی صفحه قرار دادم.
یکی از آنها همانی است که الان تو روی صفحه داری و کاربر اطلاعات آن را می بیند.
سپس ADOدوم را بر اساس نیاز کاربر(مثلا همان نام علی)با دستورات SQLجستجو می کردم.
حالا هر رکوردی که پیدا می شود بر اساس فیلد کلید روی ADOاول Locateمی زدم و اگر کاربر می خواست به رکورد بعد برود بر روی رکورد دوم بنده ADO.Next را اجرا می کردم و سپس با مقدار کلید دستور Locate را روی ADOاول اجرا می کردم.


ADO1.Locate('KeyField',ADO2.FieldByName('KeyFiled' ).Asstring,[]);

موفق باشید

Rocker
شنبه 10 شهریور 1386, 00:47 صبح
من هم قبلا یک چنین مشکلی داشتم.
دو تا ADOروی صفحه قرار دادم.
یکی از آنها همانی است که الان تو روی صفحه داری و کاربر اطلاعات آن را می بیند.
سپس ADOدوم را بر اساس نیاز کاربر(مثلا همان نام علی)با دستورات SQLجستجو می کردم.
حالا هر رکوردی که پیدا می شود بر اساس فیلد کلید روی ADOاول Locateمی زدم و اگر کاربر می خواست به رکورد بعد برود بر روی رکورد دوم بنده ADO.Next را اجرا می کردم و سپس با مقدار کلید دستور Locate را روی ADOاول اجرا می کردم.


ADO1.Locate('KeyField',ADO2.FieldByName('KeyFiled' ).Asstring,[]);

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

Answer
یک شنبه 11 شهریور 1386, 15:38 عصر
اونطورکه من متوجه شدم شما یه کد میخواین که رکوردها رو جدا نکنه من همچین کدی نوشتم و ضمیمه کردم امیدوارم به کارتون بیاد
البته حتما موضوع رو به اطلاع ما برسونید

Answer
یک شنبه 11 شهریور 1386, 15:41 عصر
کدی رو که نوشتم ترکیبی از ADOQuery و ADOTable البته این رو بگم که هم از sql‌ و هم از locate استفاده میکنه
------------------------
تا ندیدی هیچ وقت قضاوت نکن

Rocker
دوشنبه 12 شهریور 1386, 14:58 عصر
Answer عزیز از لطفتون سپاسگزارم واقعا ساده و زیبا کار شده.:تشویق:
البته این ایده را دوست خوبم آقای Syndrom عزیز تو همین تاپیک بهم داده بود اما وقت نکردم اجراش کنم به هر حال از شما دوست عزیز متشکرم که وقت گذاشتی و این ایده را پیاده سازی کردی.
امیدوارم همیشه به ما Answer بدی Answer جان.
راستی تا یادم نرفته بازم از دوست عزیزم آقای سیندروم به خاطر ایدش متشکرم امیدوارم همیشه پسر بد:شیطان: خوبی :قلب:باشه(خودش میدونه).

nafisehk
یک شنبه 29 مرداد 1391, 05:16 صبح
سلام
سوالی که 5 سال قبل مطرح شده الان برای من پیش اومده...:تشویق:
من هم میخوام اعداد رو با دستور filter به شکل تطبیق جزیی مقایسه کنم منتهی تو #C
کسی هست که راهنماییم کنه...

hassan p.b
پنج شنبه 19 آذر 1394, 11:54 صبح
این تاپیک بحث قدیمی است ولی من بدنبال فیلتر کاراکترهای بزرگ و کوچک بودم منظور تفاوتی نکنه که حروف بزرگ یا کوچک هستند ایجا را دیدم
لینک زیر را فقط میشه آن لاین دید وقتی صفحه امد کمی پایین بیایید مطلب آنجاست
https://books.google.com/books?id=9JzBn4vcUBoC&pg=PA344&lpg=PA344&dq=%D8%AF%D8%B3%D8%AA%D9%88%D8%B1+%D9%81%DB%8C%D9% 84%D8%AA%D8%B1+ACCEPT+%D8%AF%D8%B1+%D8%AF%D9%84%D9 %81%DB%8C&source=bl&ots=wzRtQvsnvY&sig=mdWctrn0EZ6Pf8ffW8gcFwGhbUk&hl=fa&sa=X&ved=0ahUKEwiGhse789DJAhXMVhoKHZE_B50Q6AEIKDAC#‎v =onepage&q=%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%20%D9%81%DB%8C%D9 %84%D8%AA%D8%B1%20ACCEPT%20%D8%AF%D8%B1%20%D8%AF%D 9%84%D9%81%DB%8C&f=false

البته من بدنبال این هستم که با دستور
procedure TForm1.ADOQuery2FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
ACCEPT:=(
(FORM1.Edit1.Text='')OR
(POS(FORM1.Edit1.Text,FORM1.ADOQuery2.FIELDBYNAME( 'NAME').AsString)>0))
فیلتر نمایم ولی بشرطی که کاراکتر های کوچک و بزرگ را بیارد و تفاوت قایل نشود.
مرسی
حسن