PDA

View Full Version : search بین دو عدد که string تعریف شدند



amir_ir
چهارشنبه 25 شهریور 1388, 21:38 عصر
سلام
اگر فیلدی رو در دیتابیس از جنس string تعریف کرده باشیم ولی در عمل فقط عدد در آن بریزیم و بخواهیم در onchange دو editbox کدی بنویسم که حاصل از editbox اول بزرگتر و از editbox دوم کوچکتر باشه چیکار باید کرد؟ حتما مهم هست که نوع داده string تعریف بشه .
در حالتی که نوع داده float باشه از کد زیر استفاده می کنم(هر چند میدونم خیلی ابتدایی و ... هست ولی نتیجه فکرخودمه) حالاواسه بالا چیکار کنم؟
ممنون از همه دوستان



DM2.ADOQTest.Active:=false;
DM2.ADOQTest.SQL.Clear;
DM2.ADOQTest.SQL.Add ('select * from car' );
IF (Edit1.Text<>'') and (Edit2.Text<>'') then DM2.ADOQtest.SQL.Add ('where km>= :c and km <= :d ' ) ;
if (edit1.Text<>'') and ( Edit2.Text<>'') then
begin
DM2 . ADOQtest . Parameters . ParamByName('c') . Value := strtofloat (Edit1.Text);
DM2.ADOQtest.Parameters.ParamByName('d').Value:=st rtofloat(Edit2.Text);
end;
DM2.ADOQTest.ExecSQL;
DM2.ADOQTest.Active:=true;
DBGrid1.DataSource.DataSet:=DM2.ADOQTest;

MaryamEsmailzadeh
چهارشنبه 25 شهریور 1388, 22:46 عصر
سلام دوست عزیز
به نظر من می تونید این کار رو انجام بدید که داده داخل databaset رو با دستور



; AsString.('نام فیلدی که مقدارش رو می خوای') DM2.ADOQTest.FieldByName
داخل متغیر از نوع رشته ای بریزی و هر کاری اعم از مقایسه و تبدیل و هرکاری رو روش انجام بدی.یعنی دستور فوق برات دادهای رو که می ده از جنس رشته است و اونو میتونی بریزی توی یک متغیر رشتهای مثل a اینطوری:

=:a
; AsString.('نام فیلدی ') DM2.ADOQTest.FieldByName

حمیدرضاصادقیان
پنج شنبه 26 شهریور 1388, 12:11 عصر
سلام.اولا نیازی نیست هم execsql رو اجرا کنید هم active رو true کنید.فقط Active رو true کنید کافیه.
برای سوال اصلیتون شما چرا اصلا عدد رو به صورت رشته ای ذخیره میکنید؟ در ثانی شما میتوانید مثل مقایسه رشته ها بین دوعدد مقایسه کوچکتر بزرگتر انجام بدید و نباید از strtofloat استفاده کنید زیرا فیلد شما از نوع رشته است شما دارید بهش مقدار float پاس میدید!!
شما محتویات خود editbox رو داخل پارامتر قرار بدید و پارامتر هم با کد زیر میتوانید بهش مقدار بدید


adoquery1.parameters.parambyname('field1').value:= edit1.text;

موفق باشید.

Saeed_m_Farid
پنج شنبه 26 شهریور 1388, 13:14 عصر
... بخواهیم در onchange دو editbox کدی بنویسم که حاصل از editbox اول بزرگتر و از editbox دوم کوچکتر باشه چیکار باید کرد؟ حتما مهم هست که نوع داده string تعریف بشه .
دوست عزیز :
اولاً رویداد onchange اصلاً جای مناسبی واسه اینکار نیست، اگه یه button برای این کار بذارید و یا مثلاً در رویداد OnExit دومین Edit کدهای موردنظرتون رو بنویسید به نظر من بهتره، والا با هر تغییری تو هر کدوم از Edit ها کل این کارها انجام میشه و ...
کدی که واسه اینکار میشه نوشت (فرض میشه که سرعت هیچ ماشینی کمتر از صفر نیست!):
if ( StrToFloatDef(Edit1.Text, -1) >= 0 )
and ( StrToFloatDef(Edit2.Text, -1) >= 0 ) then
with DM2.ADOQTest do begin
Close;
SQL.Text := 'SELECT * FROM CAR WHERE CAST (KM AS float) BETWEEN '
+ Edit1.Text + ' AND ' + Edit2.Text ;
ExecSQL;
// do something ...
end;



...
شما چرا اصلا عدد رو به صورت رشته ای ذخیره میکنید؟ در ثانی شما میتوانید مثل مقایسه رشته ها بین دوعدد مقایسه کوچکتر بزرگتر انجام بدید ...
جناب صادقیان، درسته توجیهی نداره که float رو به صورت رشته ذخیره کرد و فضای بیشتری گرفته میشه و ...
ولی به فرض اگه کسی همچین جدولی داشت باید توجه کرد که نحوه مرتب سازی و مقایسه مقادیر عدد و رشته، فرق میکنه : مثلاً 12345 از 2 بزرگتره ولی این موضوع واسه رشته ها صادق نیست، واسه همینه که باید Type Cast داشته باشیم ...

ghasemshami
چهارشنبه 01 مهر 1388, 07:53 صبح
از این دستور استفاده کن مشکلت حل میشه


AdoTable.FiedByName(NameField).asstring := FloatToStr( Data)