PDA

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



ali_najari
شنبه 05 تیر 1389, 18:05 عصر
من راهنمایی میخواستم راجع به گرفتن شماره سند برای برنامه حسابداری بر روی شبکه!

توضیحات:
من یه جدول دارم که شامل

ID = Autonumber
Sanad_Num = Number
Tarikh = Date
Sharh = Text
Bedehkar = Number
Bestankar = Number


فرض کنید توی شبکه چندتا یوزر وجود داره که دارن اطلاعات رو ذخیره میکنن.
حالا من میخوام یه سند جدید باز کنم و اطلاعاتم رو وارد کنیم و ذخیره کنم پس نیاز به شماره سند دارم.
من شماره سند را از دستور زیر بدست میارم


Select Max(Sanad_num) From Table1


بعد عدد بدست اومده را بعلاوه 1 میکنم میشه شماره سند جدیدم
حالا من میخوام یه کاری کنم که این شماره سند برای من رزرو بشه و بقیه یوزها نتونن به این شماره سند رکوردی ذخیره کنند.
من این کار را تو برنامه تک کاربره انجام دادم ولی توی شکبه که چندین کاربر وجود دارن چطوری شماره سند بگیرم که تداخل نداشته باشه شماره ها با هم ؟

چطوری شماره سند جدید ایجاد کنم توی شبکه؟

غلامرضا شریفی
یک شنبه 06 تیر 1389, 10:34 صبح
اگر در هنگام سند زني نياز به شماره سند داري ميتواني يك فيلد ديگر ايجاد كنيد و اخرين شماره را در آن نگه داريد بعنوان شماره موقت و درهنگام ثبت سند شماره اصلي را به اين سند اختصاص دهيد
ولي اگر در هنگام سند زدن نياز به شماره سند نداريد در آخرين لحضه(همان ثبت) شماره را اختصاص دهيد

ali_najari
یک شنبه 06 تیر 1389, 13:46 عصر
سلام
از شماها ممنون
جناب آقای شریفی میشه لطف کنید منظورتون رو یکم واضح تر بگید؟
متوجه نشدم منظورتون رو!
اگه با یه مثال بگید ممنون میشم!
شما منظورتون اینه که یه فیلد توی جدول باز کنم و شماره سند موقت بزنم؟

ali_najari
یک شنبه 06 تیر 1389, 13:48 عصر
شما برنامه سیبا ی بانک ملی رو درنظر بگیرید
ببینید توی 1 ثانیه ممکنه که چندین هزار نفر اطلاعات وارد کنند.
من میخوام تداخلی بین این اطلاعات نباشه (منظور دادن شمار سند هست.)
ممکنه من هنگامی که شماره را میگیرم یکی دیگه هم همین کار رو بکنه! اینطوری هر دو یه شماره سند داریم و اطلاعات تداخل پیدا میکنه

غلامرضا شریفی
یک شنبه 06 تیر 1389, 18:44 عصر
شما برنامه سیبا ی بانک ملی رو درنظر بگیرید
ميشود توضيح بيشتري بفرماييد كه اين برنامه را چطور بدست بياوريم جهت در نظر گرفتن

ali_najari
یک شنبه 06 تیر 1389, 20:22 عصر
ببینید برنامه سیبا بانک ملی یه برنامه هست که در هر ثانیه هزاران کاربر به اون اطلاعات وارد میکنن و اون برنامه هم باید شماره سند به تک تک بده بدون اینکه تداخلی برای برنامه پیش بیاد

hooooman
دوشنبه 07 تیر 1389, 11:54 صبح
سلام
شما براي دقيق کار کردن فقط 1 راه حل دارين
استفاده ار Locking جدول در زمان ثبت رديف
يعني وقتي شما ميخاين سندتون رو ثبت کنين جدولتون رو Xlock کنين و شماره رديف رو بدين بعد جدول رو باز کنين
اگر هم کاربر خاست از اون سند انصراف بده و شما خاستين شماره اسنادتون رديف پشت سر هم باشه ( که البته حسابداران ترجيح ميدن اينطوري نباشه و شماره موقت باشه تا زمان بستن حسابها که شما 1 پيغام ميدين که همه کاربران از سيستم خارج بشن و دوباره شماره گذاري انجام ميدين) کار سخت تري خاهيد داشت که اگر خاستين اون رو هم ميگم
البته درباره Lock کردن جدول اگر Sql باشه پايگاهتون , استاد ثباتي در تالار Sql بسيار مبسوط در اين مورد توضيح دادن که کاملا کافي خواهد بود

ali_najari
دوشنبه 07 تیر 1389, 13:33 عصر
میشه بگید چطوری lock کنم؟

jahanmanesh
دوشنبه 07 تیر 1389, 15:34 عصر
سلام
من اینا رو خوندم و از حساب داری چیزی سر در نمیارم....ولی یه جورایی اگه شماره سند میشه رندم random
انتخاب کرد چرا اینکاره نکنیم؟اکه هم شماره سند رندم توو جدول بود + 1 شماره رندم دیگه میکنیم و جواب رو پرینت میکنیم

fazelm
دوشنبه 07 تیر 1389, 16:11 عصر
شما برنامه سیبا ی بانک ملی رو درنظر بگیرید
ببینید توی 1 ثانیه ممکنه که چندین هزار نفر اطلاعات وارد کنند.
من میخوام تداخلی بین این اطلاعات نباشه (منظور دادن شمار سند هست.)
ممکنه من هنگامی که شماره را میگیرم یکی دیگه هم همین کار رو بکنه! اینطوری هر دو یه شماره سند داریم و اطلاعات تداخل پیدا میکنه

می تونی برای هر کامپیوتر یک محدوده عدد بذاری
اینطوری قاطی نمیشن

غلامرضا شریفی
دوشنبه 07 تیر 1389, 17:58 عصر
بخاطر اين موضوع با يكي از آشنايان در بانك تماس گرفتم و ايشان فرمودن حسابهاي سيبا هنگام تاييد سند شماره سند ميدهد و اين يعني اگر هزار نفر كاربر هم باشند امكان اينكه در يك لحظه با هم يك سند را ثبت كنند خيلي نادر است و جهت جلوگيري از اين اتفاق ميتوانيد جستجو كنيد اين شماره سند ثبت شده است يا خير اگر منفي بود اين سند را ثبت ميكنيد اگر مثبت بود دوبار شماره سند را بدست بياوريد (+ اخرين شماره سند)
من يك نرم افزار فروش دارم كه همزمان 5 كاربر فعال در حال حاضر دارند فاكتور ميزنند من شماره فاكتور را هنگامي كه دكمه ثبت فاكتور را ميزنند از تيبل مربوطه ميگيرم و اين تاپيك شما باعث شد يك جستجو انجام دهم و حدود 56825 فاكتور زده شده در طول يك سال نيم گذشته همچين اتفاقي نيفتاده كه يك شماره فاكتور براي دو يوزر باشد
زياد سخت نگير امكان اينكه ده نفر همزمان اگر بصورت عمد نباشد يك سند را ثبت نميكنند

ali_najari
سه شنبه 08 تیر 1389, 16:32 عصر
منظورتون اینه که من هنگام ثبت اگه select کنم و Max رو +1 کنم مشکلی پیش نمیاد؟
من از این استفاده کنم بنظرتون جناب آقای شریفی؟

Select Max(sanad_Num) From Hesabdari

Sanad_num.text=max+1

غلامرضا شریفی
سه شنبه 08 تیر 1389, 18:50 عصر
پشت سر select سريع شماره را update كنيد عمل update قبل از هرگونه در خواست ديگري صورت پذيرد تا در بين اين در خواستهاي توسط كاربر ديگر شماره ثبت نشود

ali_najari
سه شنبه 08 تیر 1389, 23:29 عصر
منظورتون اینه که ابتدا سطر اول رو ثبت کنم و بعد شماره سند رو توش Update کنم؟

میتونم اول Select کنم و بعد بلافاصله Insert کنم؟

Ali_Hashemi
چهارشنبه 09 تیر 1389, 00:01 صبح
سلام
من 4 سال بر روی دومین نرم افزار بزرگ حسابداری ایران کار کرده ام.
روشی که در نرم افزار استفاده میکردیم :

در فرم ثبت سند هنگامی که فرم باز میشه , عددی که در TextBox شماره سند قرار میدهیم رو همون لحظه در داخل یک جدول Insert میکنیم. زمانی که کاربر دیگری بر روی شبکه فرم سند رو باز میکنه , نرم افزار Max شماره سند رو بین جدول کمکی و جدول اسناد بدست میاره و به عنوان شماره سند در TextBox قرار داده میشه.

یعنی وقتی 10 سند داریم و یک کاربر بر روی سند 11 کار میکنه , کاربر بعدی که فرم ثبت سند رو باز کنه , شماره سند 12 رو خواهد داشت.
در جدول کمکی , نام کاربر هم ذخیره میشه و حتی زمانی که سند در حال ویرایش هست و کاربر بعدی میخواد روی اون سند کار کنه , برنامه پیغام میده که فلان کاربر بر روی این سند در حال کار است.
در رویداد های Onchange و OnExit مربوط به اون TextBox هم باید این کار انجام بشه و همیشه عددی که در TextBox وجود داره در جدول کمکی قرار بگیره.
جهت اطمینان هنگام ثبت سند نیز جدول کمکی چک می شود که کاربر دیگری بر روی آن کار نکند.
دقت کنید که جدول کمکی که عرض کردم یک جدول اصلی است و Temp نیست.

تعداد کاربران برنامه ما گاهی اوقات به بیش از 20 نفر هم می رسید که در یک زمان بر روی یک فرم کار میکردند و این روش به خوبی پاسخگو بود.
امیدوارم که این روش به شما کمک کنه و بتونید استفاده کنید.

غلامرضا شریفی
چهارشنبه 09 تیر 1389, 09:25 صبح
میتونم اول Select کنم و بعد بلافاصله Insert کنم؟
شماره اولين سند را ميتوانيد insert كنيد سندهاي بعدي بايد update شوند

غلامرضا شریفی
چهارشنبه 09 تیر 1389, 09:30 صبح
سلام
من 4 سال بر روی دومین نرم افزار بزرگ حسابداری ایران کار کرده ام.
روشی که در نرم افزار استفاده میکردیم :

در فرم ثبت سند هنگامی که فرم باز میشه , عددی که در TextBox شماره سند قرار میدهیم رو همون لحظه در داخل یک جدول Insert میکنیم. زمانی که کاربر دیگری بر روی شبکه فرم سند رو باز میکنه , نرم افزار Max شماره سند رو بین جدول کمکی و جدول اسناد بدست میاره و به عنوان شماره سند در TextBox قرار داده میشه.


یعنی وقتی 10 سند داریم و یک کاربر بر روی سند 11 کار میکنه , کاربر بعدی که فرم ثبت سند رو باز کنه , شماره سند 12 رو خواهد داشت.
در جدول کمکی , نام کاربر هم ذخیره میشه و حتی زمانی که سند در حال ویرایش هست و کاربر بعدی میخواد روی اون سند کار کنه , برنامه پیغام میده که فلان کاربر بر روی این سند در حال کار است.
در رویداد های Onchange و OnExit مربوط به اون TextBox هم باید این کار انجام بشه و همیشه عددی که در TextBox وجود داره در جدول کمکی قرار بگیره.
جهت اطمینان هنگام ثبت سند نیز جدول کمکی چک می شود که کاربر دیگری بر روی آن کار نکند.
دقت کنید که جدول کمکی که عرض کردم یک جدول اصلی است و Temp نیست.

تعداد کاربران برنامه ما گاهی اوقات به بیش از 20 نفر هم می رسید که در یک زمان بر روی یک فرم کار میکردند و این روش به خوبی پاسخگو بود.
امیدوارم که این روش به شما کمک کنه و بتونید استفاده کنید.

در اين روش اگر يكي از كاربران سندش را تكميل نكند و از سيتم خارج شود ترتيب اسناد بهم ميخورد
در پاسخ دو اين تاپيك همچين حالتي را توضيح دادم كه همين ايراد در ان صدق ميكند ضمنا ترتيب شماره سند در حسابداري از اصول است و نمي توان شمارهها يكي در ميان باشد

hooooman
چهارشنبه 09 تیر 1389, 16:03 عصر
سلام
من 4 سال بر روی دومین نرم افزار بزرگ حسابداری ایران کار کرده ام.
روشی که در نرم افزار استفاده میکردیم :

در فرم ثبت سند هنگامی که فرم باز میشه , عددی که در TextBox شماره سند قرار میدهیم رو همون لحظه در داخل یک جدول Insert میکنیم. زمانی که کاربر دیگری بر روی شبکه فرم سند رو باز میکنه , نرم افزار Max شماره سند رو بین جدول کمکی و جدول اسناد بدست میاره و به عنوان شماره سند در TextBox قرار داده میشه.

یعنی وقتی 10 سند داریم و یک کاربر بر روی سند 11 کار میکنه , کاربر بعدی که فرم ثبت سند رو باز کنه , شماره سند 12 رو خواهد داشت.
در جدول کمکی , نام کاربر هم ذخیره میشه و حتی زمانی که سند در حال ویرایش هست و کاربر بعدی میخواد روی اون سند کار کنه , برنامه پیغام میده که فلان کاربر بر روی این سند در حال کار است.
در رویداد های Onchange و OnExit مربوط به اون TextBox هم باید این کار انجام بشه و همیشه عددی که در TextBox وجود داره در جدول کمکی قرار بگیره.
جهت اطمینان هنگام ثبت سند نیز جدول کمکی چک می شود که کاربر دیگری بر روی آن کار نکند.
دقت کنید که جدول کمکی که عرض کردم یک جدول اصلی است و Temp نیست.

تعداد کاربران برنامه ما گاهی اوقات به بیش از 20 نفر هم می رسید که در یک زمان بر روی یک فرم کار میکردند و این روش به خوبی پاسخگو بود.
امیدوارم که این روش به شما کمک کنه و بتونید استفاده کنید.






ببخشين ميشه توضيح بدين که اگه سروري که پايگاه اطلاعاتي روشه کرش کنه يا يهو برق بره و کلاينت اون کاربري که داره روي سند کار ميکنه خاموش بشه, تکليف اون جدول کمکي و رکوردي که توش ثبت شده چي ميشه؟

hooooman
چهارشنبه 09 تیر 1389, 16:12 عصر
من معتقدم که روش قفل کردن و تنظيم CommandTimeOut و کنترل Transaction مناسب ترين راه باشه
قبلا هم از اين روش توي سيستم فروش چند پايانه اي استفاده کردم و جواب گرفتم
تنها مشکل کمي افت سرعته که اون هم با تنظيم دقيق TimeOut بطور کلي قابل حله
در عوض شما از يکتا بودن شماره سند , در اختيار بودن سند , رعايت توالي و .... که در حسابداري بسيار مهم هستش مطمئن خواهيد بود
در ضمن من بايد برم توي سورسهام بگردم 1 کدي که همچين شرايطي داشته پيدا کنم و براتون اينجا قرار بدم .سعي ميکنم سريع اينکارو بکنم
در ضمن شما به تالار اس کيو ال و پاسخ استاد ثباتي در باره "همزماني کاربران" سري بزنين بسيار آموزنده و بدردبخور هستن

غلامرضا شریفی
چهارشنبه 09 تیر 1389, 19:16 عصر
در ضمن شما به تالار اس کيو ال و پاسخ استاد ثباتي در باره "همزماني کاربران" سري بزنين بسيار آموزنده و بدردبخور هستن
جستجو كردم نتوانستم پيدا كنم اگر لطف كنيد لينك بدهيد متشكرم

Ali_Hashemi
چهارشنبه 09 تیر 1389, 20:32 عصر
در اين روش اگر يكي از كاربران سندش را تكميل نكند و از سيتم خارج شود ترتيب اسناد بهم ميخورد
در پاسخ دو اين تاپيك همچين حالتي را توضيح دادم كه همين ايراد در ان صدق ميكند ضمنا ترتيب شماره سند در حسابداري از اصول است و نمي توان شمارهها يكي در ميان باشدخیر , این اتفاق خیلی به ندرت ممکنه اتفاق بیفته و گذشته از اون یکی از پیش پا افتاده ترین امکانات یک سیستم حسابداری , "شماره گذاری اسناد" هست که مشکلی که گفتید رو حل میکنه.
ضمن اینکه این فاصله بین اسناد در صورت حذف یک سند از میان اسناد دیگر هم هم بوجود میاد(در صورتی که اسناد باز باشند) و این یه اشکال نیست و در موقع لزوم با شماره گذاری اسناد رفع میشود.


ببخشين ميشه توضيح بدين که اگه سروري که پايگاه اطلاعاتي روشه کرش کنه يا يهو برق بره و کلاينت اون کاربري که داره روي سند کار ميکنه خاموش بشه, تکليف اون جدول کمکي و رکوردي که توش ثبت شده چي ميشه؟ خیلی ساده هست. همیشه زمانی که نرم افزار اجرا میشه , همه رکوردهایی که در این جدول وجود دارد و مربوط به کلاینت فوق است , حذف میشه.

در ضمن در سیستمی که عرض کردم بجز اسناد حسابداری , شماره سند های فروش , حواله , رسید , نقدینگی و ... هم به همین صورت مدیریت می شوند.

hero4000
پنج شنبه 10 تیر 1389, 08:13 صبح
خیر , این اتفاق خیلی به ندرت ممکنه اتفاق بیفته و گذشته از اون یکی از پیش پا افتاده ترین امکانات یک سیستم حسابداری , "شماره گذاری اسناد" هست که مشکلی که گفتید رو حل میکنه.
ضمن اینکه این فاصله بین اسناد در صورت حذف یک سند از میان اسناد دیگر هم هم بوجود میاد(در صورتی که اسناد باز باشند) و این یه اشکال نیست و در موقع لزوم با شماره گذاری اسناد رفع میشود.

خیلی ساده هست. همیشه زمانی که نرم افزار اجرا میشه , همه رکوردهایی که در این جدول وجود دارد و مربوط به کلاینت فوق است , حذف میشه.

در ضمن در سیستمی که عرض کردم بجز اسناد حسابداری , شماره سند های فروش , حواله , رسید , نقدینگی و ... هم به همین صورت مدیریت می شوند.

دوست عزيز پاسخهاي شما اصلا منطقي نيست

اينکه يک شماره سند جا بيفته يک باگ براي برنامه محسوب ميشه

اگه کاربر خودش يک سند رو حذف کنه خيلي فرق داره تا اينکه شماره سند به علت برنامه نويسي نادرست بپره
اين حرف شما منطقي نيست که فاکتورهاي فروش رو هم با اين سيستم شماره گذاري ميکنين

نميدونم از شرايط اداره محترم دارائي براي اين قضيه خبر دارين يا نه

اداره محترم دارائي نرم افزاري که شماره هاي فاکتور فروشش توسط کاربر تعيين بشه و يا وسط شماره ها جاخالي بيفته رو رد ميکنه و به عنوان نرم افزار استاندارد قبول نداره

موفق باشيد:لبخندساده:

golshiri
پنج شنبه 10 تیر 1389, 10:52 صبح
با سلام و خسته نباشيد . به نظر بنده يك جدول سند موقت ايجاد كنيد و ركوردها را در اين جدول درج نمائيد . با توجه به نام كاربر هم اسناد كاربران مختلف تفكيك گردد وقتي زمان ذخيره سند فرا رسيد سند موقتي كه ايجاد كرده ايد را به جدول اصلي انتقال داده و ركوردهاي موجود در جدول موقت را حذف نمائيد . در صورت قطع برق يا هر اتفاق پيش بيني نشده هميشه در جدول موقت آخرين سند از هر كاربر كه ناتمام باشد موجود است لذا مشكل شماره سند نيز نخواهيد داشت چون در هنگام ثبت نهايي آخرين شماره گرفته ميشود و ركوردها بلافاصله در جدول نهايي با شماره نهايي ثبت ميگردند.

Ali_Hashemi
پنج شنبه 10 تیر 1389, 17:30 عصر
دوست عزيز پاسخهاي شما اصلا منطقي نيست

اينکه يک شماره سند جا بيفته يک باگ براي برنامه محسوب ميشه

اگه کاربر خودش يک سند رو حذف کنه خيلي فرق داره تا اينکه شماره سند به علت برنامه نويسي نادرست بپره
اين حرف شما منطقي نيست که فاکتورهاي فروش رو هم با اين سيستم شماره گذاري ميکنين

نميدونم از شرايط اداره محترم دارائي براي اين قضيه خبر دارين يا نه

اداره محترم دارائي نرم افزاري که شماره هاي فاکتور فروشش توسط کاربر تعيين بشه و يا وسط شماره ها جاخالي بيفته رو رد ميکنه و به عنوان نرم افزار استاندارد قبول نداره با احترام به نظر شما, ولی دید شما کمی اشتباهه. یعنی در اصل درسته ولی فقط در تئوری و در صورتی که همه چیز به صورت قانونی و اصولی و بدون کلک پیش بره.
آیا شما جایی رو میشناسید که به صورت لحظه ای به دارایی گزارش بدن؟ خیر. این اتفاق در بازه های چند ماهه و همچنین در آخر سال میفته و قبل از اون اسناد بررسی میشه و شماره گذاری انجام میشه.و کلی اصلاحات و زیرآبی ها قبل از اون انجام میشه.
شماره گذاری اسناد هم مغایرتی با قوانین دارایی نداره ودقیقا برای همین هست.
(البته ما برای فاکتورها شماره گذاری نداریم ها , این دیگه خیلی غیر قانونیه:اشتباه:)

البته برنامه مذکور به تایید وزارت دارایی رسیده و شرکن از سال 1368 به فروش سیستهای حسابداری بازرگانی و صنعتی میپردازه و تا بحال مشکلی در این رابطه وجود نداشته.هرچند که در اصل حرف شما صحیحه ولی متاسفانه چیزی نیست که در حال حاظر وجود داره و اعمال میشه.
ضمنا این روشیه که در طی سالها تجربه به اینجا رسیده و مطمئنا در صورت وجود اشکال, تا بحال از روش دیگری استفاده می شد. (نمیگم که روشهای بهتری وجود نداره)

البته در مورد اینکه دارایی فاکتور های فروشی که ذکر کردید رو قبول نداره , بله شما درست میگید. هم ما این رو میدونیم هم مشتریان ما وهم شما. برای رفع این نوع مشکلات یه امکانات بسیار خاصی در برنامه قرار داده شده که گرچه استاندارد نیستند ولی با روشهایی این مشکلات رو حل میکنند :خجالت: