ورود

View Full Version : آپدیت اتوماتیک Dbgrid بعد از هر بار عمل Insert در برنامه کلاینت / سرور



m_h_2007
سه شنبه 30 آذر 1389, 00:37 صبح
با سلام - من برنامه ای کلاینت سروری نوشته ام حال می خواه کاری کنم که اگر درون یکی از کلاینت ها اگه شخصی رکوردی را در برنامه درج کرد تمام DbGrid های دیگر در تمام کلاینت ها که مربوط به همان است اتوماتیک آپدیت شود و رکورد جدید را بلافاصیه نمایش دهد . لطفا راهنمایی کنید

ghabil
سه شنبه 30 آذر 1389, 22:22 عصر
سیستم آپدیت میداس تا جایی که من میدونم خودش این رو ساپورت نمیکنه، میتونی یک سیستم مسیجینگ بین سرور و کلاینتها مثلا با ایندی یا با کامپونتهای عادی ساکتینگ درست کنی و در زمان اعمال آپدیتها از طرف سرور به کلاینتها یک پیغام بفرستی تا اونا خودشون رو آپدیت کنند. ولی کلا این کار استانداردی نیست، مشکلت رو دقیقا بگو شاید روش بهتری برای حل مشکلت باشه.

hossein_h62
سه شنبه 30 آذر 1389, 23:27 عصر
اگر درون یکی از کلاینت ها اگه شخصی رکوردی را در برنامه درج کرد تمام DbGrid های دیگر در تمام کلاینت ها که مربوط به همان است اتوماتیک آپدیت شود و رکورد جدید را بلافاصیه نمایش دهد
معمولا اینکار انجام نمیدن، چون performance سیستم و شبکه رو تحت تاثیر قرار میده.
یه دکمه بازیابی بزارین و توسط خود کاربر اطلاعات رو رفرش کنید. نمیدونم دلیلتون چیه؟ اگر انگیزتون برای این کار جلوگیری از ثبت های تکراری هست راههای بهتری پیدا میشه.

m_h_2007
سه شنبه 30 آذر 1389, 23:28 عصر
راستش مشکلم اینه که یه برنامه دیتابیسی نوشتم که کل داده ها بر روی بانک و sql server که روی سرور هست ریخته میشه یعنی برنامه کلاینت سروری کار می کنه ، این نرم افزار روی 50 کلاینت همزمان در حال اجراست و تمام این 50 تا داده هایشان را روی همان بانکی که روی سرور attach شده و همان sql servere سیستم سرور ذخیره می کنن و نیز می خوانند . حال اگر یکی از این کلاینت ها مثلا کلاینت شماره 32 یک رکورد مثلا یک کتاب جدید را درج کرد بایستی هم خودش و هم همه کلاینت های دیگر آن رکورد جدید را بلافاصله درون dbgrid مربوطه ببینند لطفا راهنمایی کنید چون هیچ الگوریتمی جواب نداد

ghabil
سه شنبه 30 آذر 1389, 23:42 عصر
چیزهایی که حسین گفته کاملا درست هستند، سیستمی که 50 نا کلاینت داره با این روش مرتبا کاربرها وسط کارشون اطلاعاتشون ریفرش میشه و به احتمال زیاد تو کاری که دارند انجام میدهند اختلال ایجاد میشه! اگر شما قوانین برنامه رو در سرور یا ازون بهتر در دیتابیس چک کنید دیگه مشکل خاصی بدلیل آپدیت نشدن اطلاعات نخواهید داشت، همونطوری که گفتم این کار کار استانداردی نیست

behzadboloori
چهارشنبه 01 دی 1389, 08:32 صبح
راستش مشکلم اینه که یه برنامه دیتابیسی نوشتم که کل داده ها بر روی بانک و sql server که روی سرور هست ریخته میشه یعنی برنامه کلاینت سروری کار می کنه ، این نرم افزار روی 50 کلاینت همزمان در حال اجراست و تمام این 50 تا داده هایشان را روی همان بانکی که روی سرور attach شده و همان sql servere سیستم سرور ذخیره می کنن و نیز می خوانند . حال اگر یکی از این کلاینت ها مثلا کلاینت شماره 32 یک رکورد مثلا یک کتاب جدید را درج کرد بایستی هم خودش و هم همه کلاینت های دیگر آن رکورد جدید را بلافاصله درون dbgrid مربوطه ببینند لطفا راهنمایی کنید چون هیچ الگوریتمی جواب نداد
اگه تعداد رکوردهای شما 15 میلیون باشه معنیش اینه که کسی نمیتونه توی گرید دنبال یه رکورد بگرده. شما احتمالا میخوای که در صورت جستجو اطلاعات ثبت شده نفر قبلی مشاهده بشه که این کار بدون هیچ عمل اضافه ای بعد از Insert و تنها با یک کوئری انجام میشه. من پیشنهاد میکنم که گرید رو برداری و بجاش محیط مناسب جستجو ایجاد کنی

bootshow
یک شنبه 05 دی 1389, 15:12 عصر
این مشکلو دوستمون خیلی جدی نیست.
ولی مثلا اگر در یک برنامه رستوران از طرف باجه (اونجایی که پول میگیرن) سفارش مشتری ویرایش شود، آشپزخانه باید سریع تغییرات را ببینه.راه استانداردی برای این کار هست؟آیا میشه فقط یک رکورد یا مجموعه ای از رکوردها را که احتیاج داریم، آپدیت(دریافت اطلاعات از سرور یا کلاینت) کنیم؟
من تازه کار با برنامه های کلاینت/سرور را شروع کردم و این جور مشکلات زیاد در برنامه پیش میاد.دوستان تجربه های خودشون رو در مورد این جور مشکلات بزارن اینجا ما هم استفاده کنیم.یکی از مشکلاتی که من باهاش برخوردم عدم استفاده از دستورات sql در برنامه است و برای دیدن لیست سفارشات مستقیما از ttable کامپوننت dbisam استفاده کردم.البته ناگفته نماند برنامه خیلی خوبی نوشتما :لبخند: ولی برای اجرا در محیط کلاینت/سرور مشکلات زیادی داره.:متعجب:

ghabil
پنج شنبه 09 دی 1389, 20:58 عصر
در این مورد خاص، شما میتونید از سمت کلاینت هرچند ثانیه یکبار مثلا با یک تایمر کلاینت رو ریفرش کنید، یا از اون بهتر اول یک کوئری به سرور بفرستید و اگر رکورد جدید بود اون موقع ریفرش کنید.
اتفاقا در مورد شما که آشپز قرار نیست اطلاعات رو ویرایش کنه کار خیلی ساده تر هست.

mahdy.asia
جمعه 10 دی 1389, 07:52 صبح
بهترین راه این است که بروز رسانی اطلاعات در اختیار کاربر باشد و روی رویدادهای مرتبط مثلاً جستجو قبل از انجام عملیات جستجو بروزرسانی انجام گردد

bootshow
دوشنبه 13 دی 1389, 13:12 عصر
تو برنامه در رویداد Afterpost کامپوننت dbisamtable هر وقت که کاربر رکوردی ایجاد کرد، یک پیغام متنی تحت شبکه به همه کلاینتها فرستاده میشود(رشته حداکثر 10 کاراکتر) و هر کلاینت بنابر نیاز خود که در چه قسمتی از برنامه باشد، دوباره اطلاعات را بروز میکند .با تغییراتی در سورس کد، هر کلاینت فقط اون رکوردی که تغییر کرده را بازیابی میکند.راه استانداردی پیدا نکردم.از TbOrder.Database.DataSets[0].Resync([]); استفاده کردم و تابع Resync را دستکاری کردم.دوستان راه استانداردی سراغ ندارند؟مثلا query اطلاعات 1000 رکورد را Select کرده، با استفاده از کد بالا مثلا فقط رکورد شماره 450 بازیابی میشود و در بافر query قرار میگیرد.
یا اینکه در رویداد onediterror اگر کاربر نتونست اطلاعات را ویرایش کند، دوباره اطلاعات فقط همان رکورد را بروز میکند.
یکی از تجربیاتی که بدست آوردم اینه که خیلی خیلی بهتره که بجای استفاده از Table از query استفاده کنید.چون با اینکه table در بعضی از موارد (اینارو امتحان کردم) ممکن است بهتر از query عمل کند ولی در کل مخصوصا در محیط کلاینت/سرور سرعت کار با دیتابیس به شدت کاهش پیدا میکند مخصوصا زمانیکه از فیلتر استفاده کرده باشیم.

از

eastprogrammer
شنبه 18 دی 1389, 11:44 صبح
من پيشنهاد مي كنم در مورد change notification مطالعه بكني
من اين كار رو در سيستم اتوماسيون اداري انجام دادم و بدون رفرش كردن اطلاعات گريدم آپ ديت مي شه
اين امكان در sql server 2005 و ورژن بالاتر وجود داره و مطمئنا نياز شما رو به بهترين شكل برآورده مي كنه
اگه سوالي بود من در خدمتم

فقط
در سمت كلاينت به sql native client احتياج داري
در سمت سرور بايد سرويس broker رو روي ديتابيست فعال كني

fahimi
شنبه 04 آذر 1391, 14:10 عصر
1- broker سرویس در Sql Server 2008 چگونه فعال می شود
2- sql native client چگونه در دلفی می شود، استفاده کرد

stn-it
چهارشنبه 16 اسفند 1391, 11:42 صبح
با سلام خدمت دوستان
من در برنامه ای که نوشته ام، دیتا بیس روی سرور قرار داره ، و کاربران از این طریق به دیتا بیس وصل میشن،یه قسمت از برنامه به این صورت هست که کابران به صورت آفلاین برای هم پیغام میذارن، من یه جدول برای همین پیغامها طراحی کردم،و این اطلاعات رو در dbgrid نمایش دادم، مشکل من اینجاست که مثلا الن کاربری پیمامی ارسال کرده باشه، سریع طرف مقابل اون پیغام رو ببینه! می خواستم ببینم به چه صورت اطلاعات به صورت اتوماتیک آپدیت بشن