PDA

View Full Version : سوال در رابطه با Multi tier



soroush_vs
سه شنبه 28 آذر 1385, 17:51 عصر
سلام به همگی
در برنامه چند ردیفه برای جلوگیری از ثبت همزمان سند توسط چند کاربر چه روشی را باید اتخاذ نمود؟
یک سند شامل چندیدن ردیف است که یک فیلد به نام سند دارد
برای جلوگیری از ثبت دو سند با یک شماره Midas چه امکانی را محیا کرده است؟
قبلا متشکرم

MNosouhi
سه شنبه 28 آذر 1385, 18:22 عصر
برای جلوگیری از ثبت دو سند با یک شماره Midas چه امکانی را محیا کرده است؟
استفاده از فیلد autoinc.
midas تضمین میکنه که اگر حتی دو نفر همزمان رکوردی رو ثبت کنند ، تداخلی بوجود نیاد.
با Identity@@ هم می تونی مقدارش رو به دست بیاری.

soroush_vs
سه شنبه 28 آذر 1385, 18:27 عصر
نه این نیست
ببینید چند ردیف یک فیلد با شماره یکسان دارن(شماره سند)

ghabil
چهارشنبه 29 آذر 1385, 00:24 صبح
من متوجه نمیشم منظورت اینه که جداولت مستر دیتیل هستند ؟ یکمی دقیقتر توضیح بده لطفا

mzjahromi
چهارشنبه 29 آذر 1385, 06:57 صبح
نه این نیست
ببینید چند ردیف یک فیلد با شماره یکسان دارن(شماره سند)

فکر میکنم مشکل اینجا است که جداولتون master/Detail نیست. اونوقت میتونید این کار رو روی master اعمال کنید که فقط یک رکورد با شماره سند X داره و شماره سند هم PK هست. اونوقت با تدابیری که یکی اش Auto inc هست میتونید کنترل کنیدکه master شماره تکراری نداشته باشه(که البته autoinc طبیعتا تکرار نمیشه) در اینصورت برای Detail ها هم کنترل زیاد مشکل نیست
البته master / detail رو به این دلیل گفتم چون همیشه فیلد هائی هست که برای همه ردیفهای سند یکسان هست و نیازی نیست تکرار بشه

soroush_vs
چهارشنبه 29 آذر 1385, 15:01 عصر
خیر مستر دیتیل نیستند
یک مثال ساده.در نظر بگیدید که هم اکنون چند کاربر مشخول صدور یک فاکتور فروش هستند.
کاربر اول شماره سند 2 و شروع به ورود اطلاعات در فاکتور مینماید ClientDataSet
قبل از ثبت سند(هنوز هیچ اطلاعاتی از این فاکتور در دیتابیس ذخیره نشده است)کاربر دوم اقدام به صدور یک فاکتور میکند شماره سند او نیز 2 خواهد بود چون اصلاعات فاکتور کاربر اول هنوز ثبت نشده است.
حال کاربر 1 اقدام به ثبت سند خود میکند اگر بعد از اقدام به ثبت کاربر 1, کاربر 2 فاکتور را ثبت نماید میتوان تغییرات را اعمال کرد و شماره سند را برای کاربر 2 تغییر داد یعنی شماره سند کاربر 2 را برنامه یک واحد افزایش دهد
اما اگر 2 کاربر همزمان اقدام به ثبت کنند چی؟

mzjahromi
چهارشنبه 29 آذر 1385, 15:05 عصر
کاری به روش که نداشته باشیم
میتونید از قفل گذاری استفاده کنی
مسلما یکی شون زودتر کلید ثبت رو میزنه و جدول رو قفل میکنه و اونیکی صبر میکنه تا جدول باز بشه.

soroush_vs
چهارشنبه 29 آذر 1385, 15:38 عصر
ضمن تشکر فراوان
برای قفل گذاری تا جایی که بنده مطلع هستم باید از دستورات SQL استفاده شود در حالی که در حال حاظر در این قسمت از دستورات مربوط بهClientDataSet استفاده میکنم مانند
ClientDataSet1.Insert
CleintDataset1.Fieldbyname('fac_no').asInteger:=2
ClieintDataSet1.ApplyUpdates
در این مورد آیا راهحلی وجود دارد؟

در ضمن برای استفاده از قفل در دستورات SQL قفل تنها در زمان اجرای یک دستور SQL اجرا میشود در حالی که برای ثبت یک فاکتور به چندین دستور SQL نیاز است حال ممکن است در سیستم عامل اجازه اجرای دستورات به این شکل باشد :
دستور SQL کاربر 1
دستور SQL کاربر 2
دستور SQL کاربر 2
دستور SQL کاربر 1
منظورم رو متوجه میشید یا بد توضیح میدهم؟

soroush_vs
چهارشنبه 29 آذر 1385, 15:47 عصر
در ضمن معماری سیستم به این صورت است که برنامه سرور Single Instance است یعنی همون طور که میدانید به ازای هر برنامه Client یک برنامه سرور هم در کامپیوتر سرور اجرا خواهد شد

ghabil
چهارشنبه 29 آذر 1385, 22:51 عصر
ببین بستگی داره تعریفت از شماره سند چی باشه ، اما اصولا چرا شماره سند قبل از تایید سند داده میشه ؟ کاربر سند رو تهیه میکنه بعد از ثبتش شمارش تعیین میشه دیگه این روتین کار هست، که این شماره رو هم دیتابیس میده و به راحتی هم قابل بدست آوردنه.

mzjahromi
پنج شنبه 30 آذر 1385, 07:06 صبح
در ضمن برای استفاده از قفل در دستورات SQL قفل تنها در زمان اجرای یک دستور SQL اجرا میشود در حالی که برای ثبت یک فاکتور به چندین دستور SQL نیاز است حال ممکن است در سیستم عامل اجازه اجرای دستورات به این شکل باشد :
دستور SQL کاربر 1
دستور SQL کاربر 2
دستور SQL کاربر 2
دستور SQL کاربر 1
منظورم رو متوجه میشید یا بد توضیح میدهم؟



Start a transaction
lock records or tables
SQL Command1
SQL Command2
SQLCommand3
Commit the transaction


ببین بستگی داره تعریفت از شماره سند چی باشه ، اما اصولا چرا شماره سند قبل از تایید سند داده میشه ؟ کاربر سند رو تهیه میکنه بعد از ثبتش شمارش تعیین میشه دیگه این روتین کار هست، که این شماره رو هم دیتابیس میده و به راحتی هم قابل بدست آوردنه.
این کاملا درسته.
ولی فکر میکنم از اون روشی که داره استفاده میکنه نتونه این شکلی کار کنه. یا اگر هم بتونه باز نهایتا با همروندی مواجه میشه.
فکر میکنم برای این کار یه تکنیکی رو باید در نظر بگیرد
مثل ثبت اسناد در حال درج در یک جدول دیگر.
شاید دوستان راه حل مناسب تر هم پیشنهاد بدن

soroush_vs
پنج شنبه 30 آذر 1385, 09:08 صبح
ببین بستگی داره تعریفت از شماره سند چی باشه ، اما اصولا چرا شماره سند قبل از تایید سند داده میشه ؟ کاربر سند رو تهیه میکنه بعد از ثبتش شمارش تعیین میشه دیگه این روتین کار هست، که این شماره رو هم دیتابیس میده و به راحتی هم قابل بدست آوردنه.
فرض کنیم که بعد از تهیه سند یا فاکتور شماره سند بدست آورده شود
لطفا در این رابطه توضیح دهید
که چگونه میتوان شماره سند را برای سند جدید بدست آورد?

حرفه ای
پنج شنبه 30 آذر 1385, 09:25 صبح
سروش عزیز
multitier کار می کنی و از این مشکلات داری ؟
این مشکل بیشتر مختص برنامه نویسهایی است که client/ server کار می کنند

پیشنهاد من :

1) می تونی از Identity@@ استفاده کنی
2) می تونی در حالت transaction استفاده کنی

اما راه حل بهتر

یک تابع کنترلی روی لایه سرور بگذار و وظیفه شماره دهی به سند رو به تابع واگذار کن چون همه کاربرها از لایه سرور استفاده می کنند هر عدد به صورت یکتا به هر سند تعلق می گیرد در ضمن از بار ترافبک شبکه نیز به میزان قابل توجهی کم می شود

امتحان کن ضرر نداره

soroush_vs
پنج شنبه 30 آذر 1385, 10:07 صبح
ممنون از جوابت
اما من در این قسمت از SQL استفاده نکردم در ضمن کلاینت ها تنها به یک سرور متصل نمیشوند برای هر کلاینت یک نمونه برنامه سرور در کامپیوتر سرور Run میشود

mzjahromi
پنج شنبه 30 آذر 1385, 10:11 صبح
چقدر خوبه که قبل از جواب دادن به یه سوال پستهای قبلی رو بررسی کنیم

ghabil
پنج شنبه 30 آذر 1385, 11:20 صبح
فرض کنیم که بعد از تهیه سند یا فاکتور شماره سند بدست آورده شود
لطفا در این رابطه توضیح دهید
که چگونه میتوان شماره سند را برای سند جدید بدست آورد?

اینجا (http://www.barnamenevis.org/forum/showthread.php?t=57552&page=2)قشنگ بحث شده

ghabil
پنج شنبه 30 آذر 1385, 11:26 صبح
اما راه حل بهتر

یک تابع کنترلی روی لایه سرور بگذار و وظیفه شماره دهی به سند رو به تابع واگذار کن چون همه کاربرها از لایه سرور استفاده می کنند هر عدد به صورت یکتا به هر سند تعلق می گیرد در ضمن از بار ترافبک شبکه نیز به میزان قابل توجهی کم می شود

امتحان کن ضرر نداره

این راه حل بهتر نیست :
1) دیتابیس شما Consistance نیست
2) کاری رو که خود دیتابیس میتونه بصورت نیتیو انجام بده رو داره میاری یک لایه عقب تر .
3) به بار ترافیک شبکه چه ربطی داره؟!! بالاخره که کد باید برگرده طرف کلاینت

حداقل میگفتی یک StoredProcedure تعریف کنیم باز میگفتم تو بعضی شرایط یک چیزی....

soroush_vs
پنج شنبه 30 آذر 1385, 11:26 صبح
بنابراین روش استفاده از متد های ClienDataSet رو فراموش میکنم و از SQL و روشی که در لینک قبل استفاده شد استفاده میکنم.البته این باعث میشه که من مجبور به تغییر حجم زیادی از این قسمت هارو در برنامه بشوم.=>دنبال راه حلی هستم که با این روش جواب بگیرم و مجبور به تغییر نشوم

ghabil
پنج شنبه 30 آذر 1385, 11:37 صبح
بنابراین روش استفاده از متد های ClienDataSet رو فراموش میکنم و از SQL و روشی که در لینک قبل استفاده شد استفاده میکنم.البته این باعث میشه که من مجبور به تغییر حجم زیادی از این قسمت هارو در برنامه بشوم.=>دنبال راه حلی هستم که با این روش جواب بگیرم و مجبور به تغییر نشوم

چرا بیخیال بشی ، فیلد شمار سند رو autoInc تعریق کن بعد که ثبت کنی سند رو مقدارش رو برات برمیگردونه خود میداس ، اگر برنگردوند طبق گفته یکی از دوستان (من که اینجا میبینم برمیگرده) فوقش یک Refresh میکنی دیگه .

mzjahromi
پنج شنبه 30 آذر 1385, 12:04 عصر
اون برای وقتیه که شماره سند به تنهائی کلید باشه.
ولی در شرایطی که دوستمون میخواد باید حتما جودلش رو بشکنه که بتونه از autoNumber استفاده کنه
سروش جان
مشکل از ساختاره
باید master/detailesh کنی اونوقت همین که آقای کوشا میگه جواب میده

soroush_vs
پنج شنبه 30 آذر 1385, 15:44 عصر
حتی الامکان میخاستم که مجبور نشم Table دیگری رو ایجاد کنم
ولی یک راه حل فقط طریقه پیاده سازیش رو نمیدونم.
اینکه SQL server رو در حالتی قرار بدهیم که برای Manipulate کردن (Insert , Update , Delete)در هر زمان تنها یک کاربر حق Execute کردن Command داشته باشد.اما برای Query کردن(Select) محدودیتی نباشد
آیا این امکان وجود دارد؟
یعنی این امکان را یا خود SQL server در اختیار ما قرار دهد یا به گونه ای ایجاد کنیم
مثلا یک تابع بنویسیم که Table رو لاک کنه بعد که کارهامون رو انجام دادیم Lock رو باز کنیم. مثلا Exclusive use کنیم .
در ضمن AutoInc محدودیت هایی دارد:
مثلا در برنامه لازم است کاربر شماره سند را خود وارد کند یعنی قابل تغییر باشد.

soroush_vs
جمعه 01 دی 1385, 19:00 عصر
این امکان وجود ندارد؟
حتما باید راه حلی وجود داشته باشد
شما در نظر بگیرید که کاربر تصمیم بگیرد اسناد 4و 5 را حذف نماید این در حالی است که اسناد شماره 6و 7 هم اکنون در دیتابیس هستند.بعد از حذف تصمیم به صدور سند جدید میگیرد در این حالت او قصد دارد که شماره سند را 5 بگذارد و سند را ثبت نماید (یعنی لازم است کاربر خود شماره را وارد کنید)در حالی که AutoInc اتوماتیک شکاره سند را 8 قرار خواهد داد.

mzjahromi
شنبه 02 دی 1385, 06:42 صبح
این امکان وجود داره.
در راهنمای SQL Server انواع Lock رو ببین بررسی کن کدومش بدردت میخوره

babak_delphi
دوشنبه 04 دی 1385, 03:28 صبح
خودتون هم میتونید AutoInc رو شبیه سازی کنید تا این کار رو انجام بدید
اما اصولا : سند قطعی نباد حذف بشه و باید سند اصلاحیه بزنید