View Full Version : مشکل در locate
a-azad
یک شنبه 19 مهر 1388, 08:59 صبح
باسلام من از locate برای سرچ استفاده میکنم.توی فرمم از db استفاده کردم
ولی یک اشکالی هست با هر بار locateکردن می آید یک رکورد جدید به tableمن اضافه می کند اشکال مال چیه؟
کدمم اینجوریه درضمن این کد تو onenter یکی از dbeditها می نویسم
if enter.adoquery1.Locate('name',dbedit1.Text,[]) then
begin
showmessage('اين اطلاعات قبلاً ثبت شده است') ;
ModalResult:=mrNo;
form1.Close;
enter.show;
vcldeveloper
یک شنبه 19 مهر 1388, 09:16 صبح
Locate به خودی خود رکوردی به جدول اضافه نمیکنه. اگر رکورد مورد نظر پیدا بشه، کرسر را میبره بر روی آن، و گرنه تغییری در کرسر ایجاد نمیکنه، و فقط مقدار False را برگشت میده. مشکل شما باید از جای دیگه ایی باشه.
a-azad
یک شنبه 19 مهر 1388, 09:59 صبح
آخه کامپوننتام همه ازنوع dbهستن
dbedit،dbcombo
ممکن مال اون باشه.
کدم مشکلی نداره
MohsenTi
دوشنبه 20 مهر 1388, 21:03 عصر
دوست عزیز شاید شما تیبل رو در حالت Insert قرار میدید و با locate اون پوست میشه. مخصوصا چو از کامپونت های Db استفاده می کنید شاید تیبل به حالت های Insert یا Edit میره !
behzad_dr
دوشنبه 20 مهر 1388, 22:25 عصر
دوست خوب شما اگر این کار رو برای عدم (ثبت نام یک نفر به صورت تکراری) استفاد ه میکنید ، حتما اون نام رو پیدا نمیکنه و میاد دوباره insert میکنه !
دلایل پیدا نکردن میتونه وجود حتی یه space قبل یا بعد از نام باشه یا هر خطایی دیگه ای .
در عین حال برای مطمئن شدن شما برنامه در همون قسمت trace کن ، قطعا متوحه اشتباهتون میشین . در ضمن از trim استفاده کنید.
Locate('name',TRIM(EDIT1.Text),[])در ضمن اگر هم از dbedit برای جستجو استفاده می کنید کار بسیار اشتباهی انجام می دهید . شما باید از edit استفاده کنید . در ضمن حتما زمانی که در هرجایی از برنامه از dbedit استفاده میکنید حتما autoedit اونا رو فالس کنید
young_man1365
سه شنبه 21 مهر 1388, 08:30 صبح
با سلام
با اجازتون یه مورد رو یاد آور بشم: بهتره هیچ وقت ورودی جستجو ی شما در عناصر db قرار نگیره. مخصوصا" وقتی از query استفاده میکنید.شما با استفاده از db برای ورودی جستجو در اصل داده ها رو همزمان دستکاری میکنی . db نیازمند مدیریت حالات insert , edit و .... است که اگه بهش توجه نشه یا با خطا و یا حالات ناخواسته مواجه میشید. دوست عزیز مشکل شما با جایگزینی dbedit ورودی نام با یه edit و استفاده از یه query ساده حل میشه.
a-azad
سه شنبه 21 مهر 1388, 13:49 عصر
آخه جایی هستم که مجبورم dbاستفاده کنم.حالا می خوام از این dbدوتا استفاده کنم
vcldeveloper
سه شنبه 21 مهر 1388, 23:20 عصر
اون dbedit1 به چی وصل هست؟ اگر به adoquery1 وصل هست، خب طبیعی هست که کار نکنه. شما وقتی در dbedit1 شروع به تایپ می کنید، adoquery1 میره به حالت edit، اگر سعی کرده باشید که dbedit1 را خالی کنید (مثلا با استفاده از متدهای Insert یا Append) اون وقت adoquery1 میره به حالت Insert.
وقتی Locate می کنید، کرسر حرکت میکنه، و میره روی رکورد پیدا شده. حرکت کرسر باعث ذخیره رکوردی که در حالت Edit یا Insert قرار داره میشه.
شما باید عبارت مورد جستجو را در یک Edit معمولی بنویسید، و از کامپوننت های Data-Aware فقط برای نمایش یا ورود داده های بانک استفاده کنید.
a-azad
چهارشنبه 22 مهر 1388, 16:04 عصر
سلام
ممنون از راهنمایی همگیتون.راستش بخواین این برنامه من ننوشتم.من فقط دارم تکمیلش می کنم.نمی خوام دی بی حذف کنم.
من می خوام این کار انجام بدم:
وقتی کاربر عبارتی داخل دی بی ادیت تایپ می کنه (دی بی ادیت به دیتا سورس وصل ودیتاسورس به کوئری که تویک فرم دیگه است )بره توکوئری بگرده ببینه این عبارت قبلاًذخیره شده یا نه.اگه ذخیره شده که پیغام بده وبگه قبلاًاین عبارت واردشده وفرم ببنده ویک فرم دیگه باز کنه.کدم به این صورت نوشتم.درست کار می کنه مساله اینه که رکورد اضافه می کنه.اگه ممکن راه حل بدین چیکارکنم رکورداضافه نکنه
if form2.adoquery1.Locate('name',TRIM(dbedit1.Text),[]) then
begin
showmessage('اين اطلاعات قبلاً ثبت نشده است') ;
ModalResult:=mrNo;
form1.Close;
form2.show;
چراModalResult:=mrNo;کارنمی کنه
چطور جلو insertشدن بگیرم با چه کدی؟
young_man1365
چهارشنبه 22 مهر 1388, 21:21 عصر
شاید شما چون برنامه کار یه نفر دیگست تو تغییر کد و استفاده از کامپوننت دیگه شک دارین. واسه امتحان هم که شده این کار رو انجام بدی بد نیست:
یک edit به فرم اضافه کن و برای رویداد OnChange کامپوننت edit از نمونه کدهای زیر استفاده کن. اگر هم از button واسه جستجو استفاده میکنی یه کد شبیه کد زیر رو به رویداد onclick مربوط به button جستجو اضافه کن
form2.adoquery1.SQL.Clear;
form2.adoquery1.SQL.Add('SELECT * FROM TABLE_NAME WHERE name = trim("'+edit1.Text+'");');
form2.adoquery1.open;
واسه چک کردن خالی بودن نتیجه:
if form2.adoquery1.RecordCount=0 then
و یا از همون کدی که خودتون فرستادی استفاده کن، فقط به جای dbedit1.text بنویس edit1.text
vcldeveloper
چهارشنبه 22 مهر 1388, 21:27 عصر
وقتی کاربر عبارتی داخل دی بی ادیت تایپ می کنه (دی بی ادیت به دیتا سورس وصل ودیتاسورس به کوئری که تویک فرم دیگه است )بره توکوئری بگرده ببینه این عبارت قبلاًذخیره شده یا نه.
DBEdit اصلا برای همچین کاری طراحی نشده، در پست قبل توضیح دادم که کامپوننت های Data-aware برای نمایش و ویرایش داده های بانک استفاده میشند. نمیشه که شما همزمان یک رکورد از کوئری را ویرایش کنید، و از طرف دیگه روی همون کوئری جستجو انجام بدید! همین که شما اولین حرف را در DBEdit وارد می کنید، اون AdoQuery به مد Edit میره.
مهم نیست برنامه نویس قبلی چیکار کرده، مهم این هست که شما کاربرد یک کامپوننت خاص را درست درک کنید، و اشتباهات فرد قبلی را اصلاح کنید، نه اینکه روی آنها تاکید کنید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.