PDA

View Full Version : سوال: اتصال دو برنامه در شبکه



as987498749874
یک شنبه 27 مرداد 1392, 22:45 عصر
سلام دوستان
یه برنامه هست با بانک اکسس
این بانک قراره روی سرور باشه و کلاینت ها بهش وصل بشن

مشکلی که هست بحث کد اشخاصه
مکانیزم اینه که در فرم اشخاص یه کد به هر نفر داده میشه که غیر تکراری و پشت سر همه (مثل بقیه)
حالا اگه سه سیستم همزمان اطلاعات سه شخص رو وارد کنن میشه سه کد مشابه!!! اشتباهه
اگه هر سیستمی هم که دکمه جدید رو زد و کد جدید ثبت بشه (قبل از ثبت نهایی) که نفر بعدی کدش فرق کنه مشکل اینجاست اگه اولی انصراف داد از نوشتنش یعنی کد ثبت نشده و این کد خالی میمونه

راهکار دوستان چیست؟
مر30

m.4.r.m
یک شنبه 27 مرداد 1392, 23:16 عصر
قبل از ثبت کد جست و جو کنه اگه جست و جو برابر صفر بود ذخیره کنه با یک دستور ساده SQL در ضمن اکسس تو شبکه زیاد به درد بخور نیستا امنیت پایگاه دادت صفر هم نباشه نزدیکه به صفره

vbhamed
دوشنبه 28 مرداد 1392, 09:29 صبح
سلام
دقيقا قبل از ثبت ركورد خودتون، با يك دستور Sql بزرگترين كد موجود در بانك رو در بياريد، يكي بهش اضافه كنيد و بعد ثبت كنيد، اينم دستور SQL كه كدي كه بايد استفاده كنيد رو برمي‌گردونه
Select Max(Code & "")+1 From Table1

as987498749874
جمعه 01 شهریور 1392, 08:26 صبح
از دوستان متشکرم
ولی مشکلی که هست اینه که این کد شخصی هر نفر هست که هنگام ثبت مشخصات باید دیده بشه و روی پرونده اش بنویسم

کلا راه دیگه نیست ؟ نرم افزارهای حسابداری که تحت شبکه کار میکنن یا هر نرم افزار دیگه ای که با شبکه و بانک اطلاعاتی کار میکنه چطوری کد جدید تولید می کنن؟

مر 30 از دوستان

رامین مرادی
جمعه 01 شهریور 1392, 11:49 صبح
فكر كنم اينجاست كه تراكنش ها به درد ميخوره خوب هنگام ثبت كد جديد مگه نمي خوره .تو لحظه ثبت بهش كد بده اگه داري دستي كد ميدي اگه كه اتوماتيكه خوب خوده پايگاه داده كنترل ميكنه.

m.4.r.m
جمعه 01 شهریور 1392, 12:26 عصر
بله دقیقا شما نباید دستی کد بدی چون می تونه تراکنش همزمان رخ بده و خطا بوجود بیاد این کار رو بسپارید دست بانک اطلاعاتی شما فقط قبل از ذخیره حتما آخرین رکورد رو چک کنید بعدش ذخیره کنید .

vbhamed
شنبه 02 شهریور 1392, 09:14 صبح
سلام
هر چند راههاي قبلي بهتره اما يك راه ديگه هم هست، ابتدا در بانكتون دو جدول به نامهاي ReserveId و FreeId ايجاد كنيد كه هر كدوم يك فيلد به نام Id دارن و جدول ReserveId يك فيلد زمان هم داره، كاربرد جداول هم اينه كه آيدي هايي كه براي استفاده رزرو شدن در جدول ReserveId و آيدي هاي رزرو شده كه به هر دليل استفاده نشدن در جدول FreeId ثبت ميشن

حالا موقع اضافه كردن يك ركورد جديد :

1 - جدول ReserveId رو چك كنيد ببينيد اگر ركوردي هست كه بيشتر از n دقيقه از ثبتش داخل جدول گذشته (با توجه به فيلد زمان اين جدول) اون ركورد رو در جدول FreeID ثبت كنيد و از جدول ReserveId پاك كنيد (n، زمان مورد نياز براي ثبت يك پرونده هست) اين كار براي اينكه كه اگر در حين ثبت اطلاعات برق رفت آيدي هاي رزرو شده از دست نرن و دوباره از اونها استفاده بشه

2 - جدول FreeId رو چك كنيد ببينيد ركوردي داخلش هست يا نه، اگر ركوردي وجود داشت مي‌تونيد از اولين ركورد به عنوان كد شخص استفاده كنيد، اون Id رو از جدول FreeId پاك كنيد و در جدول ReserveId به همراه و زمان جاري سيستم (تاريخ و ساعت) درج كنيد
اگر داخل جدول FreeId ركوردي وجود نداشت ولي در جدول ReserveId ركورد وجود داشت با تابع Max كه در پست قبلي هم توضيح داده شد از جدول ReserveId يك Id جديد بدست بياريد و اون رو در خود جدول ReserveId درج كنيد
Select Max(Id & "")+1 As NewId From ReserveId
اگر هر دو جدول FreeId و ReserveId خالي بوده و ركوردي نداشتند با دستوري مشابه بالا از جدول اصلي اطلاعات يك Id جديد بدست بياريد و اون رو در جدول ReserveId به همراه زمان درج كنيد

3 - Id رو به كاربر نشون بديد و روي پروندش بنويسيد

4 - بقيه اطلاعات رو وارد كنيد و پرونده رو ذخيره كنيد

5 - Id استفاده شده رو از جدول ReserveId پاك كنيد

6 - اگر فرم به هر دليل ذخيره نشد و انصراف داديد Id رو در جدول FreeId درج كنيد و از جدول ReserveId پاك كنيد

7 - وقتي قراره يك Id رو از جدول ReserveId پاك و در FreeId ثبت كنيد و برعكس، بايد براي اينكار از دستورات Commit و Trans استفاده كنيد تا تضمين كنه كه هر دو عمليات حتما انجام ميشه و اينطوري نباشه كه يكيش انجام بشه و ديگري به هر دليل مثلا قطع برق انجام نشه



حالا ببينيم چه اتفاقي ميفته

فرض كنيم هر دو جدول FreeId و ReserveId خاليه و اولين كاربر مي‌خواد ركورد اضافه كنه، پس با تابع Max اولين شماره يعني مثلا 1 رو از جدول اصلي اطلاعات مي‌گيره و اون رو در جدول ReserveId ثبت مي‌كنه و مشغول ثبت بقيه اطلاعات ميشه

در همين حين دومين كاربر مياد كه ركورد جديدي ثبت كنه، با توجه به اينكه جدول FreeId خاليه، سراغ جدول ReserveId ميره و يك Id جديد با تابع Max و دستور بالا مي‌گيره يعني Id = 2 و همين Id رو در جدول ReserveId درج ميكنه

اگر در همين حين سومين كاربر هم بياد كه ركورد جديدي ثبت كنه، با توجه به اينكه جدول FreeId خاليه، سراغ جدول ReserveId ميره و يك Id جديد ديگه با تابع Max و دستور بالا مي‌گيره يعني Id = 3 و همين Id رو در جدول ReserveId درج ميكنه و الي آخر...

حالا فرض كنيم كاربر دوم يعني Id = 2 ركوردش رو ثبت مي‌كنه پس عدد 2 از جدول ReserveId پاك ميشه

بعدش كاربر 1 يعني Id = 1 از ثبت انصراف ميده پس عدد 1 در جدول FreeId ثبت ميشه و از جدول ReserveId پاك شده
كاربر سوم هم هنوز در حال ويرايش ركوردش هست

اگر حالا چهارمين كاربر بياد براي ثبت ركورد جديد، چون جدول FreeId خالي نيست اول بايد اون رو چك كنه و بعد از چك كردن طبق الگوريتم، عدد 1 رو از جدول FreeId گرفته و در جدول ReserveId ثبت مي‌كنه و از FreeId پاك مي‌كنه يعني عدد 1 كه قبلا رزرو شده ولي استفاده نشد به كاربر 4 اختصاص داده شد و به همين ترتيب كار ادامه پيدا مي‌كنه

با استفاده از الگوريتم بالا هر آيدي كه كاربري قصد استفاده از اون رو داره به صورت موقت قفل ميشه تا بقيه نتونن استفاده كنن، اگر كاربر از آيدي استفاده كرد كه هيچ وگرنه آيدي هاي استفاده نشده به اولين كاربراني كه درخواست ثبت ركورد داشته باشن اختصاص داده ميشه

اگر در حين ثبت اطلاعات برق بره، اتوماتيك Id جديد اختصاص داده ميشه اما اگر از زمان زدن دكمه جديد تا رفتن برق و اومدن برق و روشن كردن كامپيوتر و باز كردن برنامه و زدن مجدد دكمه جديد بيشتر از n دقيقه بگذره، ممكنه Id جديد برابر Id قبل از قطع برق بشه كه شانس شماست براي اينكه پروندتون خط خوردگي نداشته باشه‌، مي‌تونيد اين شانس رو بالا ببريد به اينصورت كه ابتدا مرحله شماره 1 رو انجام بديد سپس قسمتي براي برنامه طراحي كنيد كه آيدي درخواستي شما رو چك كنه ببينه در جدول FreeId هست يا نه و اگر بود در جدول ReserveId به همراه زمان جاري ثبت و از جدول FreeId پاك كنه و بعد از اينكار به جاي مرحله 2 به مرحله 3 الگوريتم بريد

زمان n دقيقه رو مي‌تونيد خيلي راحت زياد كنيد مثلا 1440 دقيقه معادل يك روز، با اينكار يك كاربر مي‌تونه دكمه جديد رو بزنه و آيدي اختصاص داده شده تا آخر روز مال خودش هست به شرطي كه برق قطع نشه، البته اگر زمان رو خيلي زياد كنيد ترتيب شماره پرونده هاي ثبت شده نظم كمتري داره كه خيلي هم مهم نيست