PDA

View Full Version : رفرش شدن اتوماتیک جدول



AmirEngineer
شنبه 01 دی 1386, 10:09 صبح
سلام
وقتی توی یه برنامه از Table یا AdoTable استفاده میکنم اگه توسط یه برنامه دیگه توی جدول مقداری رو اضافه کنم باید حتما جدول رو تو برنامه اصلی یک بار ببندم و دوباره باز کنم تا رکورد جدید رو نشون بده.
از چه چیزی باید استفاده کنم که احتیاجی به بستن و دوباره باز کردن جدول نباشه؟
اگه کسی میدونه لطفا بهم بگه . ممنون میشم.

Bahmany
شنبه 01 دی 1386, 11:11 صبح
سلام
به نظر بنده شما می توانید با یک trigger کار خود را آسان کنید
و در رویداد AfterUpdate بگوئید مثلا جدول tbl_ChangeFields در ستون خاصی اطلاعاتی اضافه شود و هر گاه اطلاعات اضافه شد شما اطلاعات tbl_ChangeFields را پاک کرده و تمام جدول خود را برحسب نیاز Update می کنید
پس شما با select گرفتن از جدول خیلی کوچکتر هم بار ترافیکی کمتری ایجاد و هم کمتر فشار به سرور می آورید.

arshia_
شنبه 01 دی 1386, 11:16 صبح
adotable.requary
آیا با این روش مشکل شما حل می شه؟

AmirEngineer
شنبه 01 دی 1386, 11:34 صبح
با تشکر از آقای بهمنی و آقای آرشیا.
اما اگه بخام هر موقعی که اطلاعاتی توسط برنامه ای در جدول اضافه میشه و از توی یه برنامه دیگه متوجه بشم که جدول Update شده و یا مقادیری داخلش اضافه شده باید چیکار کنم؟.
اگه بخام از adotable.requary استفاده کنم باید هر چند وقت یکبار این دستور اجرا بشه. چه تغییرات تو جدول اصلی داشته باشم و چه نداشته باشم.

Bahmany
یک شنبه 02 دی 1386, 12:49 عصر
با تشکر از آقای بهمنی و آقای آرشیا.
اما اگه بخام هر موقعی که اطلاعاتی توسط برنامه ای در جدول اضافه میشه و از توی یه برنامه دیگه متوجه بشم که جدول Update شده و یا مقادیری داخلش اضافه شده باید چیکار کنم؟.
اگه بخام از adotable.requary استفاده کنم باید هر چند وقت یکبار این دستور اجرا بشه. چه تغییرات تو جدول اصلی داشته باشم و چه نداشته باشم.

دوباره خدمتون عرض می کنم
یک جدول درست

Create table tbl_change (c_is_changed int);

بعد با دستور create trigger یک trigger درست کنید که هر بار جدولتون Update میشه به جدول tbl_change و ستون c_is_changed یک رقم بده ( نحوه استفاده از trigger در msdn هست سرچ کن به نتیجه می رسی)

بعد شروع کن هر بار از جدول tbl_change کوئری بگیر و محتوایاتش رو در متغییرها ذخیره کن و بعد

var LastChange,CurrentChage:integer;
procedure check;
begin
if LastChange<>CurrentChange then
begin
SELECT * FROM MASTER_TABLE
end;


پس شما با select گرفتن از جدول خیلی کوچکتر هم بار ترافیکی کمتری ایجاد و هم کمتر فشار به سرور می آورید.

vcldeveloper
دوشنبه 03 دی 1386, 03:12 صبح
دوستان، کاربر سوال کننده از Refresh خودکار داده ها در سمت کلاینت پرسیده، نه از Refresh خودکار جداول در سمت سرور که شما دارید درباره Trigger براش توضیح میدید!!

برای سوال شما راه حل آسان و آماده ایی وجود نداره. بطور کلی میشه سه راه حل مطرح کرد:
1- اگر DBMS (نرم افزار مدیریت بانک اطلاعاتی) شما از مقدار ctDynamic در CursorType پشتیبانی کنه، می تونید از اون استفاده کنید.
2- بعضی از DBMS ها مثل MS SQL Server 2005 امکان با خبر کردن کلاینت از تغییرات ایجاد شده در سمت سرور را دارند که برای آن باید سرویس های خاصی در سمت سرور فعال شده و کلاینت ها هم قابلیت دریافت این پیام ها را داشته باشند (اطلاعات کامل تر را از بخش SQL Server بگیرید).
3- اگر خودتون برنامه را بصورت چند لایه طراحی کرده باشید (مثلا با استفاده از DataSnap)، در این صورت Application Server شما می تونه IP هر یک از Client را در سرور ثبت بکنه و در صورت نیاز به ارسال پیام، به آنها پیام بفرسته.

برای کسب اطلاعات بیشتر درباره هر یک از موارد فوق، کلمات پر رنگ شده را در سایت جستجو کنید.

mohsen24000
پنج شنبه 31 فروردین 1391, 23:00 عصر
- اگر خودتون برنامه را بصورت چند لایه طراحی کرده باشید (مثلا با استفاده از DataSnap)، در این صورت Application Server شما می تونه IP هر یک از Client را در سرور ثبت بکنه و در صورت نیاز به ارسال پیام، به آنها پیام بفرسته.با عرض معذرت از آقای کشاورز عزیز.
وقتی کلاینت ما از طریق اینترنت به Application Server وصل میشه چطور میشه به آی پی اون که ولید نیست (منظور آی پی های اشتراکی) پیام ارسال کرد!؟ تا خودش رو آپدیت کنه...
راهی نیست که SQLConnection یا DSServer یا DSTCPServerTransport سمت سرور به کلاینت مورد نظر اطلاعاتی ارسال کنند یا حتما باید از سوکت جدا استفاده کرد؟ و این که کلاینتهایی که از طریق اینترنت بدون آی پی ولید به سرور متصل می شوند را می تواند جهت ارسال پیام شناسایی کرد؟
از لطف شما سپاسگزارم.

vcldeveloper
جمعه 01 اردیبهشت 1391, 09:05 صبح
وقتی کلاینت ما از طریق اینترنت به Application Server وصل میشه چطور میشه به آی پی اون که ولید نیست (منظور آی پی های اشتراکی) پیام ارسال کرد!؟

همه سیستم های متصل به اینترنت IP Valid دارند. اما ممکنه که یک IP توسط چند سیستم به صورت اشتراکی استفاده بشه؛ مثل استفاده از NAT.
اگر از NAT استفاده شده باشه، در صورتی که پورت مورد استفاده دو یا چند سیستم پشت NAT مشابه باشه، NAT خودش به طور خودکار پورت ها را تغییر میده تا تداخل بوجود نیاد. پس شما باید علاوه بر ذخیره آدرس IP کلاینت ها تون، آدرس پورتی که از اون کلاینت به سرور شما اتصال برقرار شده را هم ذخیره کنید.

mohsen24000
جمعه 01 اردیبهشت 1391, 09:26 صبح
آدرس پورتی که از اون کلاینت به سرور شما اتصال برقرار شده را هم ذخیره کنید.
راهی نیست که مشخصاتی رو که فرمودید رو از SQLConnection یا DSServer یا DSTCPServerTransport سمت سرور استخراج کرد و چگونه به کلاینت مورد نظر اطلاعاتی ارسال کنند یا حتما باید از سوکت جدا استفاده کرد؟
باتشکر

vcldeveloper
جمعه 01 اردیبهشت 1391, 09:33 صبح
راهی نیست که مشخصاتی رو که فرمودید رو از SQLConnection یا DSServer یا DSTCPServerTransport سمت سرور استخراج کرد و چگونه به کلاینت مورد نظر اطلاعاتی ارسال کنند یا حتما باید از سوکت جدا استفاده کرد؟
تا جایی که یادم هست، DataSnap جدید (2010 به بعد) و RemObjects SDK امکان تعریف و اجرای callback function داشتند؛ یعنی کلاینت میتونست یک تابع به سرور ارسال کنه که سرور در مواقع نیاز آن تابع را فراخوانی کنه، و تابع مربوطه در سمت کلاینت اجرا بشه. ممکنه اطلاعات مربوط به اتصال هم توسط هر یک از این ها قابل برگشت باشه، ولی الان امکان بررسی اش را ندارم.

mohsen24000
جمعه 01 اردیبهشت 1391, 12:06 عصر
در دلفی XE2 توابعی چون BroadcastMessage و امکاناتی چون DSClientCallbackChannelManager تعبیه شده که خیلی کاربردی و مفید هستند.
با این وصف باید برای این کار از DataSnap دلفی XE2 استفاده کرد.