دریافت آخرین رکورد جدول در برنامه تحت شبکه
با سلام خدمت تمامی برنامه نویسای گل گلاب
من یک برنامه نوشتم به صورت تک کاربره (برنامه آموزش) ولی الان می خواهم فرم های ورودی اطلاعات که کدینگ هستند رو تحت شبکه کنم ، الان برنامه در شبکه جواب می دهد اما مشکلی که من دارم این هست که هر فرمی مثل فرم ثبت دانش آموز در ابتدا می رود اخرین رکورد جدول دانش آموز رو می خونه و به آخرین کد یکی اضافه می کند و اون کد می شه کد جدید . ولی در شبکه وقتی دو تا سیستم همزمان می خواهند دانش آموز تعریف کنند هر دو سیستم کد یکسان می دهد .
این کد :
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;
حالا من چطوری می توانم این مشکل رو برطرف کنم ؟
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
دوستان در این زمینه کسی نیست ؟
من فقط می خواهم اطلاعات در هر دو سیستم به روز باشه ؟
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
سلام
ببین دوست عزیز ، بهتره برای اینجور فیلد ها حالت 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;
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
یعنی غیر از این کار هیچ راه دیگه ای نداره ؟
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
چی غیر از این کار راه دیگه ای نداره ؟
بهترین راه برای ایجاد فیلد های یکتا در پایگاه داده ، فیلد های Autoincrement هستند !
در ضمن ایراد کد شما را هم من گفتم ! می تونی از هر کدوم خواستی استفاده کنی ! خود من هم بعضی جاها از روش شما استفاده می کنم !
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
سلام عجب نام کاربری آشنایی داری ها(2picher)
گفته همه صحیح و عالی.اما اگه اصرار داری راه خودت رو بری پس...
زمانی که برنامه شما یه عملیات تکراری برروی مجموعه داده ها (dataset) انجام میدهد یا یک عملیات جستجو در مجموعه داده انجام میدهید بهتر است از به روز رسانی اطلاعات در این مدت زمان جلوگیری کنید.جهت انجام اینکار متد DisableControls از عنصر مجموعه داده را به هنگام شروع عملیات تکراری فراخوانی و در پایان این عملیات ، متد EnableControls از همین عنصر را فراخوانی کنید.بهتر است این عمل را در یک بلاک try..Finally انجام دهید.
custTable.disablecontrols
try
custTable.last
.....
finally
custTable.enablecontrols
end;
بر گرفته از مثال1-12 از Learn Delphi Programing (Farsi).pdf
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
میشه در مثالی که بالا زدم بگید چطوری باید پیاده کنم ؟:گیج:
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
نقل قول:
سلام عجب نام کاربری آشنایی داری ها(2picher)
گفته همه صحیح و عالی.اما اگه اصرار داری راه خودت رو بری پس...
زمانی که برنامه شما یه عملیات تکراری برروی مجموعه داده ها (dataset) انجام میدهد یا یک عملیات جستجو در مجموعه داده انجام میدهید بهتر است از به روز رسانی اطلاعات در این مدت زمان جلوگیری کنید.جهت انجام اینکار متد DisableControls از عنصر مجموعه داده را به هنگام شروع عملیات تکراری فراخوانی و در پایان این عملیات ، متد EnableControls از همین عنصر را فراخوانی کنید.بهتر است این عمل را در یک بلاک try..Finally انجام دهید.
من دارم شاخ در میارم!!!!
منظور شما را اصلا نمیفهمم تا اونجا که بنده حقیر میدونم معمولا این کار را میکنند که جلوی fetch کردن Data در هر Insert را بگیرین و سرعت بالا بره و کنترل هی Update نشه ! اما چه ربطی به این قضیه داره ؟
میشه منو راهنمایی کنین ؟
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
آقا من واقعا پاک گیج شدم ، اگر یه مثال عملی بزندید ممنون می شوم
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
سلام
بروبچ عذر می خوام زیاد.(این شکلک عذر خواهی نمی دونم کجاست)
من تازه کارم اما خیلی دوست دارم کمک کنم.
دیدم نوشته میخواد آخرین رکورد رو بخونه گفتم پس بهتره این موقع insert انجام نشه تا رکورد آخرش رو بدست بیاره.
یعنی وقتی خواست رکورد آخر رو بخونه تو این بلوک بخونش (یا چکش کنه)تا مطمئن باشه که درسته.
اونم دیدید که از تو e-book نوشتم از خودم نبود.
بازم اگه بزرگان بی ربط بود ببخشید.
من عاشق این فرومم.
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
آقا محمد !
مگه مشکل شما این نبود که کد یکسان می گرفتی ؟
خوب من که توی این Post https://barnamenevis.org/showpo...54&postcount=3
گفتم شما داری اول Append میکنی بعد Last میگیری ! که این غلطه ! شما اول برو روی Last و آخرین مقدار را تعین کن بعدش Appned کن ! این فکر نکنم ایراد بگیره !
اما من به طور کلی گفتم بگذار سیستم Autoincrement را بده ! میدو.نی برای چی ؟
فکر کن در یک مثال نسبتا نادر ! دو تا کاربر بد شانس در یک زمان insert کنن که توی سیستم شما امکان اینکه کاربر دوم کد ID تکراری بگیره هست ! اما اگه Autoincerement باشه این اتفاق نمیفته !
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
اگه یه مثال عملی بزنید به یا کد ممنون می شوم
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
محمد جان
قرار نیست برای هر جوابی یک مثال زده شود اینطوری شما خودت کمتر درگیر می شی و فکر می کنم مطلب را نتوانی اصولی یاد بگیری
اما در مورد سوال : تعداد کاربرانی که همزمان از سیستم استفاده می کنند خیلی مهم است بهترین روش اگر نمی خواهی فیلد autonumber استفاده کنی این است که ابتدا یک تابع بنویسی که در آن اولین آی دی قابل استفاده را تعیین کنی و سپس در دستور ذخیره رکورد اگر از پارامتر ها استفاده کرده و مقدار پارامتر فیلد مورد نظر را برابر با تابع فوق الذکر قرار دهی کمترین احتمال فیلد تکراری را خواهید داشت
ضمنا خاصیت عدم تکرار را در فیلد مورد نظر بگذار و دستور insert را هم در داخل try .. except .. end قرار بده که اگر رکورد تکراری بود بتوانی برنامه را کنترل کنی
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
قبل از Insert از کد زیر استفاده کن.
DM.TableName.Resync(rmExact);
برای استفاده از این خط باید DB را در قسمت Uses اضافه کنی.
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
DM.TableName.Resync(rmExact);
این کد دقیقا چیکار می کنه ؟
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
کلیه تغییرات صورت گرفته بر روی بانک را بروز میکند.
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
به نگام استفاده از این دستور دلفی خطای زیر رو می ده :
[Error] UFStu.pas(93): Incompatible types: 'TResyncMode' and 'Enumeration'
نقل قول: دریافت آخرین رکورد جدول در برنامه تحت شبکه
اینطوری بنویسید :
DM.TableName.Resync([rmExact]);