ورود

View Full Version : سوال: دستیابی به داده رکورد قبلی در زمان Insert



delphitor
جمعه 26 آذر 1389, 19:48 عصر
با سلام
من در Event On New Record کدی نوشتم که آی دی آخرین رکورد رو می خونه و یکی اضافه می کنه و در dbedit قرار می ده برای درج رکورد بعدی


function TfrmMenu.Get_LastID: integer;
var
SavePlace: TBookmark;
PrevValue: Variant;
begin
with dmK.qryFood do
begin
SavePlace := GetBookmark;
try
FindPrior;
PrevValue := Fields[0].Value;
GotoBookmark(SavePlace);
Fields[0].Value := PrevValue;
finally
FreeBookmark(SavePlace);
end;
end;
end;



ولی با این error مواجه میشم


Either BOF or EOF is True or the current record has been deleted

کسی راه دیگه ای می دونه؟ یا رفع این error؟

delphitor
سه شنبه 30 آذر 1389, 20:40 عصر
هیچ کسی بلد نیست؟
کمکی راهنمایی ؟
بابا حداقل یه چیزی بگین؟

m_h_2007
چهارشنبه 01 دی 1389, 00:06 صبح
سلام دوست عزیز من این کار رو خیلی انجام داده ام اما به شرطی که فیلد id که میگین میخواین آخرین مقدارش رو در آخرین رکورد نگهدارین index و یا primery key باشه که آخرین مقدارش یعنی بزرگترین در بین تمام رکوردها باشه اگه اینطور باشه من همیشه از این روش استفاده می کنم :
به جای DBedit یک Edit معمولی قرار بده و از همون جدولی که میخوای آخرین مقدار id اش رو بدست بیاری توسط ADOQUERY یک Select بگیر و سپس با متد Last به آخرین رکورد برو و بعد فیلد id اون رو بخون و بریز داخل Edit که قرار دادی من برنامه هایی نوشتم که از این روش استفاده کردم و 2 سال مه هیچ مشکلی بر نخوردم

vcldeveloper
چهارشنبه 01 دی 1389, 00:36 صبح
به جای DBedit یک Edit معمولی قرار بده و از همون جدولی که میخوای آخرین مقدار id اش رو بدست بیاری توسط ADOQUERY یک Select بگیر و سپس با متد Last به آخرین رکورد برو و بعد فیلد id اون رو بخون و بریز داخل Edit که قرار دادی من برنامه هایی نوشتم که از این روش استفاده کردم و 2 سال مه هیچ مشکلی بر نخوردم چرا لقمه را دور سر پیچاندید؟! اگه قراره آخرین مقدار درج شده برای یک فیلد به دست بیاد، نیازی نیست از کل اون جدول SELECT بگیرید، و سپس به آخرین رکوردش برید! شما فقط به یک رکورد نیاز دارید، برای اون رکورد میرید کل داده موجود در جدول رو از بانک می گیرید؟! اگر قرار بر نوشتن همچین کوئری بود، کافی بود SELECT مشابه کد زیر می نوشتید:

SELECT Max(MyField) FROM MyTable

خروجی این کوئری یک رکورد تک فیلدی هست که بالاترین مقدار فیلد MyField را برگشت میده.

اما همچین کاری برای بانک های اطلاعاتی که به طور همزمان چند کاربر به آنها وصل میشند و داده ها را ویرایش می کنند، درست نیست؛ چون اگر شما و کاربر دیگه همزمان بخواید مقدار آخرین فیلد ID ثبت شده را درخواست کنید، مقدار مشابهی دریافت می کنید. اون وقت اگر شما به اون مقدار یک واحد اضافه کنید، هم شما و هم کاربر دیگه دارید سعی می کنید یک مقدار تکراری برای اون فیلد ID وارد کنید، که موجب خطا میشه. یکی از موارد ثبت میشه، اما دومی با خطا مواجه میشه. در همچین مواردی، بهتره که مقدار فیلد ID از طریق بانک تعیین بشه، یعنی یا بانک از نوع داده Auto Inc پشتیبانی کنه و مقدار اون فیلد را به طور خودکار افزایش بده، یا بانک از Generators پشتیبانی کنه، و اجازه بده که شما خودتون تابعی برای تولید مقدار فیلد ID براش بنویسید، یا اینکه از Trigger برای مقداردهی به اون فیلد استفاده کنید.