PDA

View Full Version : مشکل با فیلدهای AutoInc در DBISAM



MNosouhi
یک شنبه 23 اردیبهشت 1386, 15:42 عصر
ببخشید که عنوان گویای سوالم نیس ، عنوان مناسب به ذهنم نرسید.

فرض کنید من 2 تا جدول دارم ، جدول a و جدول b ، جدول a حاوی یک فیلد کلید از نوع autoinc هستش ، وقتی در جدول a رکورد جدیدی ایجاد میشه ، بلافاصله بعد از ذخیره رکورد جدید ، شماره ای که فیلد کلید جدول a گرفته در جدول b ذخیره می شه (کل این عملیات داخل یک تراکنش صورت می گیره) ، حالا بعضی مواقع می شه که کاربر برنامه ، جدول رو فیلتر کرده ، و رکورد جدیدی رو هم که وارد می کنه در داخل ( یا Range) اون فیلتر قرار نمیگیره ، یعنی بلافاصله بعد از ذخیره ، اون رکورد جدید در dbgrid نشون داده نمیشه ( چون شرایط رکوردهای فیلترشده را نداره ) ، حال اونکه جدول b نیاز به کد کلید رکورد جدید اضافه شده داره ، اما نمیتونه اون رو به دست بیاره ، چون بلافاصله بعد از دستور post ، رکورد نمایش داده نمیشه که جدول b بخاد مقدار مورد نظرش رو به دست بیاره.
قبل از دستور post هم نمیتونم جدول b رو مقدار دهی کنم ، چون مقدار فیلد کلید جدول a فقط بعد از ذخیره شدن مشخص میشه.
مقدار فیلد کلید رو هم نمیشه تا قبل از ذخیره شدن به دست آورد ، چون برنامه تحت شبکه هستش.
سعی کردم رکوردی را که در حال ایجاد آن هستم را با BookMark مشخص کنم تا بعد از ذخیره کردن قادر باشم به اون دستیابی پیدا کنم ، اما جواب نداد (چون اگر BookMark رو در حالی که جدول در حالت insert هست رو بگیری ، بعد از ذخیره شدن رکورد ، دیگه قابل استفاده نیست )
دوستان راهی برای حل این مسئله به نظرتون میرسه؟

mjdeveloper
یک شنبه 23 اردیبهشت 1386, 16:54 عصر
اولا با چه بانکی کار می کنی؟
اگر با Sql Server کار می کنی یه تریگر روی جدول a بنویسید که بعد از insert بیاد و id جدول a رو تو b ذخیره کنه و بعد از جدول b آخرین مقدار اضافه شده رو بخون



create trigger on a
for insert
as
declare @id int
select @id=id from inserted
insert into b values (....,@id)

SYNDROME
یک شنبه 23 اردیبهشت 1386, 20:51 عصر
با سلام
نام تاپیک نام جالبی نیست.:متفکر:
تو می تونی از یک ADOموقت استفاده کنی و بعد از Post مقدار AutoNumberآن را بخوانی.
سپسActive مربوط به ADO که به Grid وصل است را False و True کنی تا در آن ADO نیز اضافه شود.
حالا به خاطر اینکه ADOاصلی به جال قبلی خود برگردد قبل از False و True کردن مقدار AutoNumber را در متغییری ریحته و بعد از False و True کردن بر روی AutoNumber دستور Locate را اجرا می کنیم تا به جای قبلی خود برگردد.

MNosouhi
یک شنبه 23 اردیبهشت 1386, 23:44 عصر
از لطف همه دوستان ممنون.
از بانک dbisam استفاده می کنم.
جواب رو هم پیدا کردم ، میزارم تا اگر کسی به این مشکل برخورد کرد نخواد دوباره سوال کنه ، همه جداولی که در dbisam ساخته میشن خصوصیتی با نام LASTAUTOINC دارن که آخرین مقدار فیلد از نوع autoinc رو در خودش ذخیره میکنه ، کافیه این خصوصیت جدول خونده بشه .