PDA

View Full Version : دریافت آخرین رکورد جدول در برنامه تحت شبکه



mohammad-j
سه شنبه 29 بهمن 1387, 12:02 عصر
با سلام خدمت تمامی برنامه نویسای گل گلاب
من یک برنامه نوشتم به صورت تک کاربره (برنامه آموزش) ولی الان می خواهم فرم های ورودی اطلاعات که کدینگ هستند رو تحت شبکه کنم ، الان برنامه در شبکه جواب می دهد اما مشکلی که من دارم این هست که هر فرمی مثل فرم ثبت دانش آموز در ابتدا می رود اخرین رکورد جدول دانش آموز رو می خونه و به آخرین کد یکی اضافه می کند و اون کد می شه کد جدید . ولی در شبکه وقتی دو تا سیستم همزمان می خواهند دانش آموز تعریف کنند هر دو سیستم کد یکسان می دهد .
این کد :


procedure TFStu.NRecord;
begin
DM.TT_Stu.Cancel;
DM.TT_Stu.Append;
BSave.Enabled := False;
BCancel.Enabled:= False;
BDelete.Enabled := False;
ActiveControl:= TB_ID;
if DM.T_Stu.RecordCount>0 then
begin
DM.T_Stu.IndexFieldNames:='id';
DM.T_Stu.Last;
end;
if DM.T_Stu.RecNo<=0 then
DM.TT_Stu.FieldByName('id').AsInteger:=1
else
DM.TT_Stu.FieldByName('id').AsInteger:=
DM.T_Stu.FieldValues['id']+1;

end;

حالا من چطوری می توانم این مشکل رو برطرف کنم ؟

mohammad-j
یک شنبه 04 اسفند 1387, 19:29 عصر
دوستان در این زمینه کسی نیست ؟
من فقط می خواهم اطلاعات در هر دو سیستم به روز باشه ؟

Unique
دوشنبه 05 اسفند 1387, 12:23 عصر
سلام

ببین دوست عزیز ، بهتره برای اینجور فیلد ها حالت Autoincrement را تعریف کنی و خودت را خلاص کنی ! اجازه بده پایگاه خودش مقادیر Unique را برات ایجاد کنه !

شما مشکلت اینه که اول Append میکنی بعدش مقدار را چک میکنی !



var
lastId : integer;
begin
if myTable.recordcount = 0 then
lastId := 1
else begin
myTable.last;
lastId := myTable.FieldByName('id_field').asinteger + 1;
end;
myTable.append;
....
end;

mohammad-j
شنبه 10 اسفند 1387, 19:36 عصر
یعنی غیر از این کار هیچ راه دیگه ای نداره ؟

Unique
یک شنبه 11 اسفند 1387, 23:31 عصر
چی غیر از این کار راه دیگه ای نداره ؟
بهترین راه برای ایجاد فیلد های یکتا در پایگاه داده ، فیلد های Autoincrement هستند !
در ضمن ایراد کد شما را هم من گفتم ! می تونی از هر کدوم خواستی استفاده کنی ! خود من هم بعضی جاها از روش شما استفاده می کنم !

MSHService
دوشنبه 12 اسفند 1387, 07:29 صبح
سلام عجب نام کاربری آشنایی داری ها(2picher)
گفته همه صحیح و عالی.اما اگه اصرار داری راه خودت رو بری پس...
زمانی که برنامه شما یه عملیات تکراری برروی مجموعه داده ها (dataset) انجام میدهد یا یک عملیات جستجو در مجموعه داده انجام میدهید بهتر است از به روز رسانی اطلاعات در این مدت زمان جلوگیری کنید.جهت انجام اینکار متد DisableControls از عنصر مجموعه داده را به هنگام شروع عملیات تکراری فراخوانی و در پایان این عملیات ، متد EnableControls از همین عنصر را فراخوانی کنید.بهتر است این عمل را در یک بلاک try..Finally انجام دهید.


custTable.disablecontrols
try
custTable.last
.....
finally
custTable.enablecontrols
end;


بر گرفته از مثال1-12 از Learn Delphi Programing (Farsi).pdf

mohammad-j
دوشنبه 12 اسفند 1387, 22:26 عصر
میشه در مثالی که بالا زدم بگید چطوری باید پیاده کنم ؟:گیج:

Unique
سه شنبه 13 اسفند 1387, 20:20 عصر
سلام عجب نام کاربری آشنایی داری ها(2picher)
گفته همه صحیح و عالی.اما اگه اصرار داری راه خودت رو بری پس...
زمانی که برنامه شما یه عملیات تکراری برروی مجموعه داده ها (dataset) انجام میدهد یا یک عملیات جستجو در مجموعه داده انجام میدهید بهتر است از به روز رسانی اطلاعات در این مدت زمان جلوگیری کنید.جهت انجام اینکار متد DisableControls از عنصر مجموعه داده را به هنگام شروع عملیات تکراری فراخوانی و در پایان این عملیات ، متد EnableControls از همین عنصر را فراخوانی کنید.بهتر است این عمل را در یک بلاک try..Finally انجام دهید.

من دارم شاخ در میارم!!!!
منظور شما را اصلا نمیفهمم تا اونجا که بنده حقیر میدونم معمولا این کار را میکنند که جلوی fetch کردن Data در هر Insert را بگیرین و سرعت بالا بره و کنترل هی Update نشه ! اما چه ربطی به این قضیه داره ؟

میشه منو راهنمایی کنین ؟

mohammad-j
چهارشنبه 14 اسفند 1387, 11:04 صبح
آقا من واقعا پاک گیج شدم ، اگر یه مثال عملی بزندید ممنون می شوم

MSHService
چهارشنبه 14 اسفند 1387, 18:58 عصر
سلام
بروبچ عذر می خوام زیاد.(این شکلک عذر خواهی نمی دونم کجاست)
من تازه کارم اما خیلی دوست دارم کمک کنم.
دیدم نوشته میخواد آخرین رکورد رو بخونه گفتم پس بهتره این موقع insert انجام نشه تا رکورد آخرش رو بدست بیاره.
یعنی وقتی خواست رکورد آخر رو بخونه تو این بلوک بخونش (یا چکش کنه)تا مطمئن باشه که درسته.
اونم دیدید که از تو e-book نوشتم از خودم نبود.
بازم اگه بزرگان بی ربط بود ببخشید.
من عاشق این فرومم.

Unique
جمعه 16 اسفند 1387, 01:49 صبح
آقا محمد !
مگه مشکل شما این نبود که کد یکسان می گرفتی ؟
خوب من که توی این Post http://barnamenevis.org/forum/showpost.php?p=684054&postcount=3
گفتم شما داری اول Append میکنی بعد Last میگیری ! که این غلطه ! شما اول برو روی Last و آخرین مقدار را تعین کن بعدش Appned کن ! این فکر نکنم ایراد بگیره !

اما من به طور کلی گفتم بگذار سیستم Autoincrement را بده ! میدو.نی برای چی ؟
فکر کن در یک مثال نسبتا نادر ! دو تا کاربر بد شانس در یک زمان insert کنن که توی سیستم شما امکان اینکه کاربر دوم کد ID تکراری بگیره هست ! اما اگه Autoincerement باشه این اتفاق نمیفته !

mohammad-j
سه شنبه 20 اسفند 1387, 21:48 عصر
اگه یه مثال عملی بزنید به یا کد ممنون می شوم

accpascal
سه شنبه 20 اسفند 1387, 22:17 عصر
محمد جان
قرار نیست برای هر جوابی یک مثال زده شود اینطوری شما خودت کمتر درگیر می شی و فکر می کنم مطلب را نتوانی اصولی یاد بگیری
اما در مورد سوال : تعداد کاربرانی که همزمان از سیستم استفاده می کنند خیلی مهم است بهترین روش اگر نمی خواهی فیلد autonumber استفاده کنی این است که ابتدا یک تابع بنویسی که در آن اولین آی دی قابل استفاده را تعیین کنی و سپس در دستور ذخیره رکورد اگر از پارامتر ها استفاده کرده و مقدار پارامتر فیلد مورد نظر را برابر با تابع فوق الذکر قرار دهی کمترین احتمال فیلد تکراری را خواهید داشت
ضمنا خاصیت عدم تکرار را در فیلد مورد نظر بگذار و دستور insert را هم در داخل try .. except .. end قرار بده که اگر رکورد تکراری بود بتوانی برنامه را کنترل کنی

shahrokhkian
چهارشنبه 21 اسفند 1387, 17:47 عصر
قبل از Insert از کد زیر استفاده کن.


DM.TableName.Resync(rmExact);


برای استفاده از این خط باید DB را در قسمت Uses اضافه کنی.

mohammad-j
دوشنبه 26 اسفند 1387, 12:50 عصر
DM.TableName.Resync(rmExact);

این کد دقیقا چیکار می کنه ؟

shahrokhkian
سه شنبه 27 اسفند 1387, 10:08 صبح
کلیه تغییرات صورت گرفته بر روی بانک را بروز میکند.

mohammad-j
چهارشنبه 28 اسفند 1387, 15:33 عصر
به نگام استفاده از این دستور دلفی خطای زیر رو می ده :


[Error] UFStu.pas(93): Incompatible types: 'TResyncMode' and 'Enumeration'

Unique
یک شنبه 02 فروردین 1388, 16:05 عصر
اینطوری بنویسید :

DM.TableName.Resync([rmExact]);