1- چطور میشه قبل اینکه اطلاعات در بانک ذخیره بشه حدس زد که فیلد Id اون که Auto Number هستش چیه؟
2-چطور میشه بعد از مدتی که با بانک کار میشه و اطلاعات پاک میشن شماره AUTO NUMBER را دوباره از 1 شروع کرد
(لطفا اگه میشه هم تو SQL و هم تو Access)
Printable View
1- چطور میشه قبل اینکه اطلاعات در بانک ذخیره بشه حدس زد که فیلد Id اون که Auto Number هستش چیه؟
2-چطور میشه بعد از مدتی که با بانک کار میشه و اطلاعات پاک میشن شماره AUTO NUMBER را دوباره از 1 شروع کرد
(لطفا اگه میشه هم تو SQL و هم تو Access)
سلام
در SQLServer ...
1) همواره بعد از یک INSERT در جدولی با AutoNumber مقدار متغییر عمومی/تابع IDENTITY@@ برابر خواهد بود با آخرین مقدار Autonumber درج شده.
2) دو راه مشخص برای ریست AutoNumber وجود دارد.
دستور زیر مقدار autonumber را به فید دلخواه ست میکند:
کد:DBCC CHECKIDENT ("Schema.TableName", RESEED, 123);
دستور زیر کل محتویات یک جدول را با سرعت بسیار بیشتر از Delete حذف میکند و هیچ گزارشی در فایلهای تراکنشی هم منعکس نمیشود. (غیر قابل بازگشت) ضمن اینکه AutoNumber را هم ریست میکند.
البته تغییر در AutoNumber نباید نقل و دستورات برنامه نویسی شما شود و فقط باید در موارد خاص و یا در زمان توسعه برنامه و... استفاده شود و برای موارد عادی کارکرد عملی برنامه بهتر است بگذارید کار خودش را انجام دهد.کد:TRUNCATE TABLE Schema.TableName;
(زیاد گیر ندهید که چرا فلان عدد که Delete شد، دیگر اسفاده نشد!!!)
موفق باشید.
این دستور تو Accsess کار نمیکنه
هدف از از اول شروع شدن AutoNumber برای بستن یک دوره مالی در یک نرم افزار حسابداری است چون بعضی جداول دارای ثبت و حذفهای زیادی هستند و شماره AutoNumber آن بسیار بزرگ میشود و همین باعث بزرگ شدن فایل بانک اطلاعاتی میشود و میتواند مشکل زا باشد و با صفر کردن آن مشکل حل میشودکد:DBCC CHECKIDENT ("Schema.TableName", RESEED, 123);
دانستن AutoNumber بعدی هم به این خاطر لازم است که وقتی چکی توسط کاربر نوشته میشود بایدقبل از ذخیره شماره سند آن(منظور همون AutoNumber است) به کاربر نمایش داده شود نه بعد از ذخیره شدن آن
و همان طور که میدانید شماره AutoNumber از روی آخرین AutoNumber بدست نمیاد(البته تا حدودی بدست میاد) چون اگر شماره AutoNumber فعلی مثلا 100 باشد و بعد از آن دو فیلد پاک شده باشد AutoNumber جدید به جای 101 عدد 103 خواهد بود
روش به دست آوردن AutoNumber در فیلدی که قرار است ثبت شود:نقل قول:
MyAdapter.SelectCommand.CommandText = SELECT MAX(ID) FROM MyTable
Dim CurrentID as Integer= MyAdapter.SelectCommand.ExecuteScalar +1
Pn: MyTable= your table name
ID= AutoNumber Field Name
مشکل اولی حل شد
ولی مشکل دومی هنوز هست . البته برای SQL حل شده ولی برای Access هنوز حل نشده
سلام
همانطور که در اول مطالبم بیان کردم، دستورات مختص SQLServer بودند.نقل قول:
این دستور تو Accsess کار نمیکنه
=====
در SQLServer دستور ویژه ای هم برای این کار داریم، که میتواند مقدار عددی بعدی را به دقت بیان کند و مثل MAX مشکل زیر را هم ندارد ...نقل قول:
دانستن AutoNumber بعدی هم به این خاطر لازم است که وقتی چکی توسط کاربر نوشته میشود بایدقبل از ذخیره شماره سند آن(منظور همون AutoNumber است) به کاربر نمایش داده شود
ولی اصلاً این کار را پیشنهاد نمیکنم!نقل قول:
...اگر شماره AutoNumber فعلی مثلا 100 باشد و بعد از آن دو فیلد پاک شده باشد AutoNumber جدید به جای 101 عدد 103 خواهد بود
همانطور که میدانید، برنامه های SQLServer را به راحتی و با تغییرات کوچک در رشته اتصال میتوان تحت شبکه کرد و با زحمت کم این امتیاز را به برنامه اضافه کرد که برنامه تحت شبکه هم کار کند.
اما موردی که شما بیان میکنید یکی از مسائلی است که در کارکرد شبکه ای مشکل ساز میشود و باید از آن پرهیز کنید.
(عادت کنید، برنامه تان را اصولی بنویسید، حتی اگر نخواهید شبکه ای هم باشد!)
به فرض شما عدد بعدی را که همان 103 است به صحت کامل به دست آورید و نمایش هم دادید...
جه تضمینی وجود دارد که فاصله زمانی ثبت اطلاعات، ریسمان یا فرد دیگری روی دیتابیس اقدام نکند و چیزی به آن اضافه نکند و عدد 103 شما استفاده شود؟؟؟ شاید 104 هم و بالاتر هم در این بین استفاده شود؟؟؟
این مشکل میتوانید با فرمان دستی INSERT یک ریسمان یا فرد دیگر پیش آید یا با فرامین جانبی مثل سینک دو دیتابیس ...
بهرحال کار اصولی و محکمی نیست و باید سعی کنید به این کارها عادت نکنید.
این مشکل دو راه حل استاندارد دارد...
که من یکی را پیشنهاد میکنم، آنکه کد ثبت سندتان را بعد از فشاردادن دکمه Save توسط کاربر در فیلد مربوطه نشان دهید.
هیچ ایرادی هم ندارد، خودم در آخرین پروژه ام همین کار را در تمام دیالوگهای مرتبط با بانک انجام دادم...
یعنی فیلد شماره سند هر بخش را ReadOnly کردم و با زدن Save دیتاها درج و فیلد مربوطه پر میشد، هیچ کس هم شاکی نشد!
=====
موفق باشید.
بله. حق با شماست. در برنامه های تحت شبکه، نباید چنین کار هایی صورت گیرد.
اما خب، دوستمون راه حل خواسته بودن، که بنده هم ارائه دادم. البته جناب mtprog ظاهرا" علاقمند به استفاده از اکسس هستند و تنها راهشون هم همونیه که عرض کردم.
سلام
برای ریست autonumber از دو دستور SQL زیر استفاده کنید:نقل قول:
... ولی برای Access هنوز حل نشده
و برای به دست آوردن autonumber بعداز عملیات insert هم از دستور زیر:کد:DELETE FROM [tablename];
ALTER TABLE [tablename] ALTER COLUMN [autonumbercolumnname] COUNTER(1, 1);
البته اگر مورد زیر مد نظرتان باشد...کد:SELECT @@IDENTITY;
موفق باشید.نقل قول:
کد ثبت سندتان را بعد از فشاردادن دکمه Save توسط کاربر در فیلد مربوطه نشان دهید
سلامنقل قول:
و برای به دست آوردن autonumber بعداز عملیات insert هم از دستور زیر:
کد:
SELECT @@IDENTITY;
یک راه دیگه هم برای بدست آوردن مقدار جاری فیلد identity وجود داره:
موفق باشیدنقل قول:
SELECT IDENT_CURRENT('tablename')
از توضیحات خوبتان ممنون
مشکل اینجا بود که اون برنامه حسابداری3 سال پیش با اکسس نوشته شده بود و در حال آپدیتش بودیم برای همین از اکسس سئوال کردم .
ولی برای ورژن جدیدش فایلها رو به sql و در دو نسخه تک کاربره و تحت شبکه ارائه دادیم
با تشـــــــــــــــــــــــ ــــــــکر