PDA

View Full Version : مشکل update در query



maisam57
دوشنبه 10 مهر 1385, 07:53 صبح
با سلام
یه سوال کلیشه ای داشتم دستور زیر رو که مینویسم میاد تمام رکورد های جدول رو تغیر میده اگه ممکنه این کد رو کامل کرده برام بزارید با تشکر


with adoquery1 do
begin
close;
sql.Clear;
sql.Add(format('UPDATE personal SET id=%S , fname=%S , brithday=%S , salary=%S',
[quotedstr(edit2.Text),quotedstr(edit3.Text),quoted str(edit4.Text),edit5.Text]));
execsql;
end;

در ضمن
id از نوع bigint
fname از نوع string
brithday از نوع time&date
salary از نوع mony
با تشکر

mzjahromi
دوشنبه 10 مهر 1385, 08:54 صبح
کلید اصلی تون چیه؟
شما باید از شرط و Where استفاده کنید تا بتونید تغییرات مورد نظر خودتون رو روی یک رکورد خاص اعمال کنید

maisam57
دوشنبه 10 مهر 1385, 08:58 صبح
کلید اصلی نگذاشتم
تازه اگه ممکنه بگید که چطوری با کلید اصلی update کنم
با تشکر

mzjahromi
دوشنبه 10 مهر 1385, 09:01 صبح
یک اشتباهتون اینه که جداولتون کلید اصلی نداره
اگر مثلا ID کلید اصلی باشه مثلا مینویسید


Update TableName set FieldName=NewFieldvalue where ID=IDvalue

maisam57
دوشنبه 10 مهر 1385, 09:02 صبح
ممنون از لطفتون اگه ممکنه کد رو که نوشتم کامل کنید با فرض اینکه id کلید اصلی با شه با تشکر

mzjahromi
دوشنبه 10 مهر 1385, 09:05 صبح
with adoquery1 do
begin
close;
sql.Clear;
sql.Add(format('UPDATE personal SET id=%S , fname=%S , brithday=%S , salary=%S where ID=%S',
[quotedstr(edit2.Text),quotedstr(edit3.Text),quoted str(edit4.Text),edit5.Text,Edit6.Text]));
execsql;
end;

با فرض اینکه Edit6.Text محتوی مقدار ID فعلی باشه که باید عوض بشه و با یه مقدار جدید جایگزین بشه

maisam57
دوشنبه 10 مهر 1385, 09:08 صبح
ممنون از شما
ولی مقدار id توی edit2.text قرار میگیره و من باید بجای edit6.text شما edit2.text قرار بدم درسته یا نه

mzjahromi
دوشنبه 10 مهر 1385, 09:11 صبح
نه درست نیست
چون مقدار مورد نظر من مقداری هست که قبلا ID داشته
ببینید مثلا ID مقدار 6 داشته و الان قراره مقدار 2 بگیره اونی که شما توی Edit2 دارید همون 2 هست ولی اونی که من تو Edit6 مد نظرم هست 6 هست
امیدوارم تونسته باشم طوری توضیح بدم که متوجه بشین

maisam57
دوشنبه 10 مهر 1385, 09:13 صبح
متوجه شدم
ولی آیا این درست هست که من دوتا edit قرار بدم که توی یکیشون id ثابت شده باشدتوی یکیشون id تغییر پیدا کنه

دوست من ببینید من قبلا توی بانک پارادوکس یه edit واسه جستجو قرار میدادم و یه DBGrid واسه اینکه کاربر روی رکورد مورد نظر دابل کلیک کنه تا فیلدها توی edit ها برای ویرایش ظاهر بشن الان هم میخوام به این صورت باشه چکار کنم
با تشکر از شما

mzjahromi
دوشنبه 10 مهر 1385, 09:24 صبح
ولی آیا این درست هست که من دوتا edit قرار بدم که توی یکیشون id ثابت شده باشدتوی یکیشون id تغییر پیدا کن
نه درست نیست

دوست من ببینید من قبلا توی بانک پارادوکس یه edit واسه جستجو قرار میدادم و یه DBGrid واسه اینکه کاربر روی رکورد مورد نظر دابل کلیک کنه تا فیلدها توی edit ها برای ویرایش ظاهر بشن الان هم میخوام به این صورت باشه چکار کنم
با تشکر از شما
همین
شما جستجو که کردید ID قدیم اون رکورد رو درون یک متغیر نگه دار و بجای Edit6.text از اون متغیر استفاده کنید

maisam57
دوشنبه 10 مهر 1385, 09:32 صبح
من کد که شما گذاشته بودی رو تست کردم درست شد ولی همون طور که شما گفتید id رو نمیشه تغییر داد که اون هم طبیعی
با تشکر
--------------------
بحث این که شاید من نخوام جستجو کنم و با دابل کلیک برروی رکوردی که روی DBGrid هست تمام فیدها رو توی edit های که قرار دادم ضاهر کنم بعد تغییر بدو یعنی اینکه اون زمانی که رکودرهای بانک من کمن و نیازی به جستجو ندارن

sarvestan
دوشنبه 10 مهر 1385, 10:58 صبح
یک نگاهی به sample که برات نوشتم بنداز!
امیدوارم به دردت بخوره!

maisam57
دوشنبه 10 مهر 1385, 11:11 صبح
با تشکر از شما ولی من اینو به کد خودم اضافه کردم متاسفانه error داد


quotedstr(DBGrid1.Fields[0].AsString

mzjahromi
دوشنبه 10 مهر 1385, 14:54 عصر
بحث این که شاید من نخوام جستجو کنم و با دابل کلیک برروی رکوردی که روی DBGrid هست تمام فیدها رو توی edit های که قرار دادم ضاهر کنم بعد تغییر بدو یعنی اینکه اون زمانی که رکودرهای بانک من کمن و نیازی به جستجو ندارن مشکلی نداره شما همه رو توی Editهای مربوط به خودشون بریز ولی ID رو بریز توی یه متغیر اینجوری میدونی که رکوردی که داره تغییر میکنه مربوط به کدوم ID هست (همونطور که اگه جستجو میکردید)

sarvestan
دوشنبه 10 مهر 1385, 15:44 عصر
گلم! بجای اون کدی که من نوشتم باید فیلد ID را بزاری!
مثلا این کد رو امتحان کن!


IntToStr(ADOTable1.FieldValues['id'] )

maisam57
سه شنبه 11 مهر 1385, 07:22 صبح
آقا مشکل من حل نشد اجازه بدید که من توضیح بدم که چکار کردم
فیلدهای که من انتخاب کردم
id از نوع numeric
fname از نوع string
brithday از نوع date&time
salary از نوع mony
از ADOQuery استفاده کردم
توی AfterScroll مربوط به ADOQuery اینو نوشتم


if not(varIsNull(adoQuery1['id'])) then
Edit2.Text:=adoQuery1['id'];
if not(varIsNull(adoQuery1['fname'])) then
Edit3.Text:=adoQuery1['fname'];
if not(varIsNull(adoQuery1['brithday'])) then
Edit4.Text:=adoQuery1['brithday'];
if not(varIsNull(adoQuery1['salary'])) then
Edit5.Text:=adoQuery1['salary'];

با این کار وقتی که توی DBGrid اسکرول انجام میشود فیلدها توی Edit ها نمایش داده میشوند
و بالاخره


with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(format('UPDATE Personal SET id=%s,fname=%s,brithday=%s,salary=%s where id=%s',
[quotedstr(edit2.Text),quotedstr(edit3.Text),quoted str(edit4.Text),edit5.Text,IntToStr(ADOQuery1.Fiel dValues['id'])]));
ExecSQL;
end;

ولی این error رو میده

ّFiled 'id' Not Found

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

mzjahromi
سه شنبه 11 مهر 1385, 07:27 صبح
خوب درسته دیگه شما برای Update کردن داری از همون AdoQuery اول استفاده میکنی و پس از بستن سعی داری دوباره ازش استفاده کنی واسه همین هم خطا میده
راه حل:
1-یک AdoQuery2 هم بذار رو فرمت و برای Update کردن از اونیکی استفاده کن
2- راه حلی رو که توی پست شماره 14 نوشتم یک بار دیگه مرور کن

maisam57
سه شنبه 11 مهر 1385, 07:37 صبح
MZJHROMI خیلی خیلی خیلی متشکر
همونطوری که شما گفته بودید یه متغیر از نوع integer تعریف کردم
بعد

i:=ADOQuery1['id']

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