PDA

View Full Version : سوال: چک کردن تکراری بودن مقدار فیلد(ها)



mehdimdp
پنج شنبه 15 بهمن 1388, 00:03 صبح
سلام
یک سئوال فنی
من میخوام وقتی فرم در حالت Insert یا Edit یک جدول، هنگام ورود اطلاعات در یک dbedit ، چک کنم که آیا این مقدار وارد شده، تکراری هست یا خیر.
من از روش زیر میخوام استفاده کنم:
بعداز اینکه مقدار وارد dbedit شد بیام با استفاده از یک کوئری مقدار وارد شده رو در جدول بررسی کنم .
حالا سئوال اصلی
آیا در هنگام Insert یا Edit روی یک جدول ، نوشتن یک کوئری روی همان جدول ، مشکلی ایجاد نخواهد کرد؟
یا اصلا این روش من اصولی هست یا نه؟

AliReza Vafakhah
پنج شنبه 15 بهمن 1388, 02:05 صبح
شما باید یک تابع بنویسید که این کار را براتون انجام بده و اون رو در موقع OnExit شی DBEdit فراخونی کنید .

(توجه کنید که در تابع شما باید یک متغییر از نوع TADOQuery تعریف کنید و با اون برای یافتن مقدار تکراری کار کنید تا داده هایی که در سایر اشیا به نمایش گذاشته می شوند به هم نخورند )

من خودم از این تابع را در یکی از پروژه هام استفاده کردم :

function TFrmAddDrivers.SearchDuplicate(const TabelName, FieldName,
Value: string;NumericType:Boolean=False): Boolean;
var
SQLRun:TADQuery;
begin
try
SQLRun:=TADQuery.Create(Self);
SQLRun.Connection:=FrmMain.ADConnection1;
if (not NumericType) then
SQLRun.SQL.Add('Select * From '+TabelName+' Where '+
FieldName +'='+QuotedStr(Value))
else
begin
SQLRun.SQL.Add('Select * From '+TabelName);
SQLRun.Active:=True;
Result:=SQLRun.Locate(FieldName,Value ,[loCaseInsensitive]);
FreeAndNil(SQLRun);
Exit;
end;
SQLRun.Active:=True;
if (SQLRun.RecordCount>0)then
Result:=True
else
Result:=False;
finally
FreeAndNil(SQLRun);
end;
end;


آیا در هنگام Insert یا Edit روی یک جدول ، نوشتن یک کوئری روی همان جدول ، مشکلی ایجاد نخواهد کرد؟

من هنوز مشکلی در این زمینه پیدا نکردم

SYNDROME
پنج شنبه 15 بهمن 1388, 07:00 صبح
با سلام
به نظر من بهتر است چک کردن داده های تکراری را زمانی انجام بدید که کاربر دکمه ذخیره اطلاعات را کلیک کرده است.
موفق باشید

حسین شهریاری
شنبه 17 بهمن 1388, 09:54 صبح
سلام
علاوه بر روشی که دوستمون فوقا ذکر فرمودند شما همچنین میتونین علاوه بر اون Table که توسط اون عمل ذخیره و ویرایش را انجام میدید یه Table دیگه روی فرم قرار بدید و توسط اون قبل از ذخیره اطلاعات چک کنین که آیا این رکورد سابقه ذخیره قبلی دارد یا نه؟ مثلا:

if adotable1.locate('code',dbedit1.text,[]) then
showmessage('Record tekrari ast!!')
else
adotable2.post;

alinikaein
شنبه 17 بهمن 1388, 18:54 عصر
سلام دوست عزيز؛

راه بهتر اينه كه داخل خود بانك اطلاعاتي اين كار را انجام بديد و خطاهاي صادره از بانك را مديريت كنيد. (توي بانك بر روي فيلدها قيد عدم تكرار بذاريد و يا به صورت كليد معرفي كنيد، در اين صورت به هيچ وجه امكان وجود ركوردهاي تكراري وجود نخواهد داشت).

توجه كنيد قرار نيست همه‌ي كارها را توي دلفي انجام بديم. برخي از كارها را بهتره به مدير بانك اطلاعاتي (منظورم DBMS هست)، بسپاريم.


يا علي... موفق باشيد...

mehdimdp
چهارشنبه 21 بهمن 1388, 10:34 صبح
شما باید یک تابع بنویسید که این کار را براتون انجام بده و اون رو در موقع OnExit شی DBEdit فراخونی کنید .
...
سلام
اتفاقا من از همین روش استفاده می کنم و می خواستم بدون که این روش برا بانک و یا پایگاه مشکلی ایجاد نمیکنه که با جواب شما تقریبا خیالم راحت شد.

AliReza Vafakhah
چهارشنبه 21 بهمن 1388, 13:44 عصر
سلام
اتفاقا من از همین روش استفاده می کنم و می خواستم بدون که این روش برا بانک و یا پایگاه مشکلی ایجاد نمیکنه که با جواب شما تقریبا خیالم راحت شد.

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

موفق باشید

mehdimdp
چهارشنبه 21 بهمن 1388, 22:33 عصر
سلام دوست عزیز؛

توجه کنید قرار نیست همه‌ی کارها را توی دلفی انجام بدیم. برخی از کارها را بهتره به مدیر بانک اطلاعاتی (منظورم DBMS هست)، بسپاریم.

یا علی... موفق باشید...

سلام
میشه یه کم در این رابطه توضیح و مثالی بزنید؟

pezhvakco
شنبه 24 بهمن 1388, 19:15 عصر
درود :
مدیریت تکراری بودن اطلاعات در خود بانک اطلاعاتی وقتی فعال است که شما هنگام طراحی بانک، شناسه بودن آن را تایید کرده باشی .