ورود

View Full Version : استفاده ار فیلد رکورد انتخابی



آوا123
سه شنبه 27 شهریور 1386, 20:10 عصر
یه قسمت از برنامم (ویدئو کلوپ)عمل جستجو فیلم رو انجام میده من می خوام نتیجه عملیات جستجو (فیلد مربوط به کد فیلم ) رو در فرم دیگه داشته باشم

اگه نتیجه عملیات جستجو چند رکورد باشه همیشه کد رکورد اول رو بر می گردونه واسه اینکه بتونه کد فیلم رکورد های دیگه رو بر گردونه چی باید کنم ؟


کد دکمه جستجو :

with DataModule4.ADOQuery2 do
begin
Active := False;
SQL.Clear;
sql.Add('SELECT v_film.code, v_film.film.name');
SQL.Add('FROM v_film INNER JOIN [film_count_ Mojoudi] ON v_film.code = [film_count_ Mojoudi].Fcode');
SQL.Add('WHERE (((v_film.film.name)=m) AND (([film_count_ Mojoudi].count)<>0))');
Parameters.ParamValues['m']:= Edit1.Text;
Active := true;
if Eof then
begin
ShowMessage('There is no film with this details');
form13.DBEdit1.Text:= ' no film';

end
else
form13.DBEdit1.Text := FieldValues ['code'] ;

توضیح بیشتر :
نتایج جستجو چندین رکورد . کد من فقط کد فیلم مربوط به اولین رکورد رو برمی گردونه (منطقا هم این درسته چون Search اولین رکورد ی رو که پیدا میکنه به عنوان رکورد انتخابی در نظر میگیره پس فقط کد مربوط به اون رو برمیگر دونه) من میخوام کد فیلم رکورد انتخاب شده رو برگردونه
به عبارت دیگه می خوام به فیلد کد رکورد انتخاب شده دسترسی داشته باشم . واسه خاطر همین شاید لازم باشه تو قسمت search این کار رو نکنم و دکمه دیگه داشته باشم که این کار رو واسم انجام بده


ممنون

SYNDROME
سه شنبه 27 شهریور 1386, 20:27 عصر
با سلام
می توانید اطلاعات را در یک DBGridنمایش دهید یا به وسیله یک Whileکلیه رکوردها را خوانده و مثلا در یک ListBox بریزید.


While Not ADO.Eof Do
Begin
// دستورات مورد نظر
ado.Next.
End;

موفق باشید

vahid64
سه شنبه 27 شهریور 1386, 20:32 عصر
با سلام
دوست عزیز منظورت از دسترسی به رکوردهای دیگه که کد فیلم یکسانی دارند چیه ؟!
اگه من درست منظورت رو متوجه شده باشم شما می تونی یه dbgrid روی فرمت بزاری و به query وصلش کنی تا تمام رکوردهایی که کد فیلم یکسان دارند رو برات نمایش بده
راه دیگش اینه که یه دکمه find next بزاری روی فرمت و مثل find next های موجود تو برنامه ها مثلاً note pad عمل کنی

آوا123
چهارشنبه 28 شهریور 1386, 00:15 صبح
سلام خیلی ممنون از اینکه جواب دادین اما به جوابم هنوز نرسیدم بهتر دیدم توضیحات بیشتری بدم

همونطور که گفتم دارم یه برنامه ویدئو کلوپ می نویسم شکل زیر فرم تحویل فیلم رو نشون میده

http://eternity.persiangig.com/Ava/tahvil.jpg

شکل زیر هم قسمت جستجو فیلم رو نشون میده

http://eternity.persiangig.com/Ava/jostejoo.jpg

تحویل فیلم فرم 13 است که از یه Adodataset استفاده می کنه (و در حالت insert)واسه پر کردن این فرم (فیلدهای مربوطه مثل کد فیلم و کد مشتری و ....) اپراتور نیاز به جستجو داره (فیلم و مشتری و... ، که ببینه اصلا چنین فیلمی وجود داره یا نه !!!) واسه همین دو تا label گذاشتم واسه راحتی کار اپراتور .(جستجو فیلم و مشتری)....جستجو هم از یه adoquery استفاده میکنه
وقتی اپراتور وارد صفحه جستجو میشه و بر اساس یکی از موارد (نام ، موضوع و ...) جستجو میکنه نتایج جستجو در یه Dbgrid نمایش داده میشه به طور مثال جستجو بر اساس ملیت صورت گرفته و نتایج رو شما تو عکس می بینید . من با کد زیر که تو کد جستجو گذاشتم



form13.DBEdit1.Text := FieldValues ['code'] ;

مقدار کد فیلم رو مستقیما تو فیلد فیلم تو فرم 13 گذاشتم ( dbedit1) . این کد من وقتی کار میکنه که نتیجه جستجو یه رکورد بیشتر نباشه اما وقتی که بیشتر از یکی بشه اپراتور حق انتخاب داره اونوقت که باید مقدار کد فیلم رکورد انتخابی در dbedit جایگزین شه . کد من فقط مقدار فیلد کد رکورد اولی رو جایگزین میکنه البته خودم هم می دونم که این کد رو نباید به تنهایی در دکمه Search بذارم چون search اولین رکورد رو برمی گردونه
اگه ممکنه بهم کمک کنید که چطور اینکار رو کنم

پیشاپیش از جوابهاتون ممنونم

اگه عکسا باز نشد زحمتی بکشید از لینکای زیر عکسا رو ببینید


http://eternity.persiangig.com/Ava/tahvil.jpg

http://eternity.persiangig.com/Ava/jostejoo.jpg

vahid64
چهارشنبه 28 شهریور 1386, 00:44 صبح
خب حالا که اینجوریه می تونی به جای DBEdit از DBCombobox استفاده کنی البته اگه اصرار بر این داری که از روش خودت استفاده کنی ولی تا جایی که من می دونم کد فیلم که تکراری نمی تونه باشه همین طور کد مشتری پس onexit ادیت های مربوط به این کدها در فرم 13 خودت می تونی با یه سرچ تو جدولت اعتبارسنجی انجام بدی در مورد جستجو هم راههای زیادی داری مثلاً اگه فرم جستجوت از روی فرم 13 فراخوانی شده تو رویداد oncellclick در DBGrid همون کد خودت رو بزاری که اپراتور مجبور به انتخاب یه فیلم از میان گزینه ها بشه

آوا123
چهارشنبه 28 شهریور 1386, 01:06 صبح
خیلی ممنون اما
من می تونستم یه combobox اما می خوام اپراتور مستقیما با کلییک کردن رو هر رکورد در dbgrid این کار واسش انجام بشه

به هر حال ممنونم از روشی که گفتید استفاده میکنم

m101_30
چهارشنبه 28 شهریور 1386, 09:42 صبح
اگر منظورتان را درست فهمیده باشم راه خیلی ساده می‌باشد.

Else form13.DBEdit1.Text := FieldValues ['code'] ; را از قسمت کد خود حذف نمائید. تنها کافی است یک Datadsource از قسمت Data Access دلفی بر روی فرم خود قرار دهید و آن را به AdoQuery خود اتصال دهید. سپس Dbgride و Dbedit مورد نظر را به DataSource‌متصل نمائید.
به برنامه نمونه نگاه کنید. یک مثال خیلی ساده می باشد.
:لبخندساده: امیدوارم مشکلتان با این مثال حل شود.

آوا123
چهارشنبه 28 شهریور 1386, 23:48 عصر
تشکر از همه شما دوستان
جناب sindrome من متوجه ایجاد دو تاپیک نشدم ممنون که گفتید تاپیک دیگر رو حذف کردم

آوا123
پنج شنبه 29 شهریور 1386, 00:27 صبح
جناب m101 من کد شما رو نگاه کردم راستش منظور من این نبود
ببینید شما با استفاده از feilds editor ، فیلد مربوط به نام فیلم رو روی فرم گذاشتی در نتیجه وقتی عمل جستجو رو انجام می دهی مشخص که با کلیک کردن روی هر رکورد نام فیلم مربوطه رو در dbedit1 ببینی (هم dbgird وهم dbedit به یک جا که همان datasource باشه وصلند)

اما حالا منظور من :

من می خواستم با کلیک کردن روی هر رکورد اطلاعات مربوط به فیلد کد در dbedit جایگزین شود که این dbedit خودش به datasource دیگه وصله (دقت کنید دیگه این جا dbgrid , dbedit به یک جا متصل نیستند بلکه به دو datasource دیگه متصل هستند)

با توجه به راهنمایی بقیه دوستان وقتی کد مربوطه رو در رویداد oncellclick می نوشتم جوابی نگرفتم بنابراین مجبور شدم اطلاعات مربوط به فیلد درخواستی را در combobox قرار بدهم و اطلاعات را از combobox در dbedit جایگزین نمایم .
البته من هنوز اول راهم و این اولین برنامه پایگاه دادهای است که دارم می نویسم تا حالا کتابی رو هم نخوندم (فقط 4 فصل از کتاب قمی)
کد شما برام جالب بود جستجو شما با جستجو من متفاوت بود اگر ممکن است در مورد این قسمت از کد توضیح دهید

if ps[length(ps)]<>'\' then ps:=ps+'\';
Ps:=Ps+'test.mdb';

ودر رویداد formclose نوشته بودید

if (ADOQuery1.Active) Then ADOQuery1.Close;

می خواستم ببینم این کد برای چیه . در صورت نبودش چه اشکالی پیش میاد

با تشکر

m101_30
پنج شنبه 29 شهریور 1386, 15:10 عصر
if ps[length(ps)]<>'\' then ps:=ps+'\';
Ps:=Ps+'test.mdb';
برای اینکه وقتی برنامه جابه جا می شود و آدرس فیزیکی بانک تغییر می کند با مشکل مواجه نشود. و چون آدرسی که از فایل exe بدست می اید بطور مثال
c:\select میباشد برای اینکه آدرس صحیح بانک یعنی
C:\select\text.mdb را داشته باشیم می بایست یک \ به آن اضافه کنیم.


if (ADOQuery1.Active) Then ADOQuery1.Close; بهتر آن است که در برنامه ها در هر فرم جداولی که نیاز است باز و بقیه بسته باشد. بخصوص اگر از datamodule استفاده کنیم.

بهتر است از خصوصیت Locate استفاده کنید. یعنی کد فیلم را گرفته و با خاصیت Locate بر روی جدول یا query که به dbedit متصل می باشد اعمال کنید.

vcldeveloper
جمعه 30 شهریور 1386, 02:49 صبح
برای اینکه وقتی برنامه جابه جا می شود و آدرس فیزیکی بانک تغییر می کند با مشکل مواجه نشود. و چون آدرسی که از فایل exe بدست می اید
برای همچین مواردی از Application.ExeName یا ParamStr(0) استفاده کنید، مثلا:

ExtractFilePath(Application.ExeName)
کد بالا مسیر برنامه را به شما می دهد. برای کد شما باید چیزی مثل این نوشته می شد:

Ps := ExtractFilePath(Application.ExeName) + '\Test.mdb';

m101_30
شنبه 31 شهریور 1386, 09:22 صبح
اگر کد من را درون مثال مشاهده کنید بطور کامل بصورت زیر می‌باشد

Ps:=ExtractFileDir(application.ExeName);
if ps[length(ps)]<>'\' then ps:=ps+'\';
Ps:=Ps+'test.mdb';

که می تواند به صورت زیر هم باشد

Ps:=ExtractFilePath(application.ExeName);
if ps[length(ps)]<>'\' then ps:=ps+'\';
Ps:=Ps+'test.mdb';

جناب آوا123 مشکل شما با خاصیت Locate حل شد؟

آوا123
شنبه 31 شهریور 1386, 22:54 عصر
با سلام

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

الان یک مشکل دارم که شاید به نظر شما ها خیلی ساده باشه منتها من نمی دونم چه جوری حل میشه

من توی فرم دو تا BTN دارم که یکی کار insert و دیگری هم کار updatebatch رو انجام میده من می خوام دکمه 2علاوه بر این که این کار رو انجام میده مقدار فیلد جدول دیگر رو هم یک واحد کم کنه

کد دکمه 1 :

with DataModule4.ADODataSet2 do
begin
active := false;
CommandText := 'select * from delivery';
active := true;
insert;
end;



کد دکمه:

DataModule4.ADODataSet2.UpdateBatch();
ShowMessage(' عملیات ثبت با موفقیت به اتمام رسید');
with DataModule4.ADOQuery2 do
begin
Active := false;
sql.Clear;
sql.add('select* from film');
Active := true;
open;

Edit;
FieldValues['count']:= FieldValues['count']-1;
post;
close;
end;


توضیح :
این کد ها برای امانت دادن یک فیلم به یک شخص هستند با فشردن دکمه 1 اطلاعات از اپراتور گرفته می شه ( مثل کد فیلم ، کد مشتری ، روز تحویل فیلم و ...) و adodataset در مد insert قرار داده می شه

دکمه 2 که در حقیقت برای update کردن جدول هاست من می خوام وقتی این دکمه فشرده میشه یک واحد از فیلد تعداد فیلم ها count کم بشه

متاسفانه کد من نمی تونه این کار رو کنه اگه ممکنه بگین اشکال کارم کجاست

در مورد سوال اولم هنوز هم دنبال پاسخ می گردم اگه کسی تونست کمک کنه خیلی ممنون میشم

پیشاپیش از توجهتون سپاسگذاری میکنم
ممنون

vcldeveloper
یک شنبه 01 مهر 1386, 02:31 صبح
چرا برای انجام هر کاری، از Insert و Edit گرفته تا Search و... یک بار کوئری را دوباره می نویسید، اون هم بدون هیچ شرط Where یا محدود کردن فیلدها؟! اگر می خواستید اینطوری کار کنید، اصلا نیازی نبود این قدر خودتون رو درگیر AdoQuery بکنید، استفاده از AdoTable هم همین نتیجه ایی را که الان می گیرید بهتون میداد، با دردسر کمتر!
لازم نیست برای کارهایی مثل Insert یا Edit هر بار DataSet را باز و بسته کنید. اگر می خواید از Query استفاده کنید، طوری استفاده کنید که براتون مزیتی داشته باشه، نه اینکه دردسرتون رو بیشتر کنه.
فکر کنم اگر ساختار بانک اطلاعاتی تون و همچنین تعداد و نوع DataSet هایی که در برنامه استفاده می کنید، و رابطه ایی که بین جداول در بانک و DataSet ها در برنامه برقرار کردید، را اینجا بنویسید، خیلی زودتر به جواب برسید.

موفق باشید

m101_30
یک شنبه 01 مهر 1386, 09:40 صبح
به این برنامه جدید نگاه کنید. آیا مشکلتون را حل می‌کند؟

آوا123
یک شنبه 01 مهر 1386, 16:33 عصر
خیلی ممنون

برنامم رو چک میکنم جواب رو میدم

آوا123
یک شنبه 01 مهر 1386, 20:48 عصر
مشکل دوم رو حل کردم می مونه مشکل اول که هنوز حل نشده
جناب m101 کد شما رو هم بررسی کردم اما اونی نیست که من می خوام شما در حقیقت به یه جدول وصل شدین

نمونه ای از اشکالم رو ساختم
یه سوالی داشتم اونم اینه که میشه تفاضل دو فیلد رو که از نوع Date هستند رو به string تبدیل کرد

ویه سوال دیگه تو کد شما

procedure TForm1.ADOTable2tex1GetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
if Sender.IsNull then Exit;
Text:=LeftStr(Sender.AsString,50);
end;


اگه ممکنه درباره این کد توضیح بدین
از ADOTable2tex1GetText استفاده کردین در حالی که من روفرم Adotable2 ندیدم

ممنون

m101_30
دوشنبه 02 مهر 1386, 09:47 صبح
در مورد کدی که گفتید چون من یک مثال دیگر را تغییر دادم و برای شما فرستادم. ربطی به این مثال ندارد. (عرض معذرت)

اشکال تکرار ID ها در combobox : شما ایتم‌ها ی قبلی را پاک نمی‌کنید. در کد قبل از while باید دستور زیر را بنویسید.

ComboBox2.Items.Clear

برنامه را مجدد نگاه کنید. بدون combobox هم مشکل شما حل می‌شود.

درمورد تفاضل دو فیلد از نوع date منظور خود را واضح تر بیان کنید. مثال زیر تفاوت دو تاریخ است که به رشته تبدیل شده. آیا این منظوز شماست؟

DateToStr(Date-StrToDate('1997/08/01'))

آوا123
سه شنبه 03 مهر 1386, 20:08 عصر
سلام
خیلی خیلی ممنون مشکل اولم همون طور که می خواستم حل شد واقعا ممنونم

در مورد سوال تاریخ هم می خواستم ببینم تبدیل Date به Str و Str به date امکان پذیر هست که با مثالی که زدین فهمیدم که بله وجود داره

خیلی خیلی ممنون

آوا123
سه شنبه 03 مهر 1386, 20:37 عصر
کد شما رو تو برنامم استفاده کردم نشد فک می کنم به خاطر این نمیشه که من از Adoq برای وصل شدن به چند تا جدول استفاده کردم در نتیجه الان نمی تونه بفهمه Adoqid کدوم ستون از کدوم جدوله

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


ExtractFilePath(Application.ExeName)


به هر حال خیلی خیلی ممنون

m101_30
چهارشنبه 04 مهر 1386, 09:22 صبح
خوشحالم مشکلتون حل شد.
در مورد سوالی که کردید اگر شما برای connection می‌خواهید شما کد خود را در فرم اصلی در form.show بنویسید.

آوا123
جمعه 06 مهر 1386, 10:31 صبح
اشکالی به وجود نمیاد اگه فرم اصلی splash باشه؟

m101_30
شنبه 07 مهر 1386, 09:03 صبح
بعد از splash‌ فرم دیگری ندارید که حتما بعد از splash باز بشه؟

آوا123
شنبه 07 مهر 1386, 16:04 عصر
دارم ، منتها صفحه لاگین، بعدش هم فرم منو که عملیات ثبت و حذف و .. . داره و با باز شدن هر کدوم از این فرم ها ، فرم منو بسته میشه

m101_30
یک شنبه 08 مهر 1386, 09:52 صبح
فکر می‌کنم اگر در قسمت oncreate فرم Datamodule بنویسید مشکلتان حل شود.