ورود

View Full Version : از کار انداختن رویداد onCalcFields در زمان دلخواه



M.Ehsanifar
دوشنبه 03 دی 1386, 19:14 عصر
سلام به دوستان عزیز
چطور میشه در زمان اجرا محاسبه فیلد محاسباتی رو غیر فعال کرد . چون این عمل در بعضی جاهای برنامه ای که نوشتم باید غیر فعال باشه .
با هر عمل first یا next یا .. این عمل انجام میشه و من اینو نمی خوام .

در ضمن سایت رو هم جستجو کردم ..

JAFO_IRAN
دوشنبه 03 دی 1386, 19:17 عصر
سلام

TDataSet یک مشخصه داره به نام AutoCalcFields که اگه False باشه بعضی از موارد اجرای این رخداد (شامل همان first و next که شما هم گفتید) رو غیرفعال میکنه. در ضمن توی Help دلفی هم یک سری توضیح بیشتر هست که شاید کمک کنه.

ارادت

M.Ehsanifar
دوشنبه 03 دی 1386, 19:35 عصر
از راهنماییتون متشکرم ..


TDataSet یک مشخصه داره به نام AutoCalcFields که اگه False باشه بعضی از موارد اجرای این رخداد (شامل همان first و next که شما هم گفتید) رو غیرفعال میکنه
اتفاقا دقیقا بعد از اینکه مقدار AutoCalcFields رو false قرار می دم ، یک عمل first روی جدول مورد نظر انجام می دم که همین عمل باعث اجرای رویداد محاسبه این فیلد می شه .


در ضمن توی Help دلفی هم یک سری توضیح بیشتر هست که شاید کمک کنه.


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

JAFO_IRAN
دوشنبه 03 دی 1386, 19:57 عصر
سلام

مطمئن نیستم (خودم هم استفاده نکردم) ولی در help صراحتا گفته شده که وقتی AutoCalcField رو false کنیم، فقط در زمان open، بردن به وضعیت dsEdit و زمان retrieve کردن داده از database رخداد مورد بحث اجرا میشه...

شاید منظور از retrieve کردن، حرکت دادن بافرهای داخلی DataSet هم باشه که اگر اینجوری باشه، OnCalc اجرا میشه - راستی از Server Side Cursor که استفاده نمیکنی؟ میگم شاید اون هم باعث retrieve بشه....

به هر حال امیدوارم مشکلات برطرف بشن...

ارادت

اَرژنگ
دوشنبه 03 دی 1386, 20:08 عصر
When AutoCalcFields is False, OnCalcFields is not called when changes are made to individual fields within a record.

SYNDROME
دوشنبه 03 دی 1386, 21:56 عصر
البته می توانید از یک متغییر استفاده کنید و اگر مقدار آن True بود بگذارید دستورات داخل OncalcFields اجرا و در غیر این صورت داخل IF نشود.
موفق باشید

اَرژنگ
سه شنبه 04 دی 1386, 07:44 صبح
البته می توانید از یک متغییر استفاده کنید و اگر مقدار آن True بود بگذارید دستورات داخل OncalcFields اجرا و در غیر این صورت داخل IF نشود.
موفق باشید
به جایه اینکار میشه از متد پوئینتر استفاده کرد و وقتی که قرار نبود OncalcFields اجرا بشه، OncalcFields=ْnil قرار داد و
قرار بود OncalcFields اجرا بشه، OncalcFields=متدی که اجراش میکند قرار داد.

M.Ehsanifar
سه شنبه 04 دی 1386, 14:30 عصر
البته می توانید از یک متغییر استفاده کنید و اگر مقدار آن True بود بگذارید دستورات داخل OncalcFields اجرا و در غیر این صورت داخل IF نشود.
موفق باشید

این کار رو قبلا انجام داده بودم . ولی چون یه خورده غیر حرفه ای بود دنبال یه راه دیگه بودم .


به جایه اینکار میشه از متد پوئینتر استفاده کرد و وقتی که قرار نبود OncalcFields اجرا بشه، OncalcFields=ْnil قرار داد و
قرار بود OncalcFields اجرا بشه، OncalcFields=متدی که اجراش میکند قرار داد.

متشکرم .. جواب سوال من دقیقا همین بود (nil) .

ولی الان یه مشکل دیگه دارم . من توی یه قسمت برنامه یک جدول رو به انتهای جدول دیگه append می کنم (دو جدول کاملا مثل هم هستند ) . این عمل قبلا درست انجام می شد . ولی بعد از اینکه نوع یکی از فیلد ها به نام "num" رو در هر دو جدول از int به smallint تغییر دادم ، در زمان اجرای عمل append استثنای EOleException با پیغام زیر رخ می ده
"Multiple - step operation generated errors . check each status value"

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

در ضمن چند وقتیه که من از هر پاسخی تشکر می کنم برام پیغام "شما قبلا از این پست تشکر کرده اید " می یاد . نمی دونم چرا .. برای همین نتونستم از شما بوسیله برنامه سایت تشکر کنم .. شرمنده ..

JAFO_IRAN
سه شنبه 04 دی 1386, 16:51 عصر
سلام

اینجور وقت ها (multiple)، ممکنه بیش از یک خطا وجود داشته باشه. اگه از ADO استفاده میکنید، میشه اینجوری بقیه خطاها رو هم ببینید:

ADOConn دارای یک مشخه به نام Errors هست که Count داره و خودش هم یک collection هستش که میشه اندیسش کرد و در هر item هم یک مشخصه به نام Description داره؛ مثل



AStr := '';
for i := 0 to AnADOConn.Errors.Count - 1
AStr := AStr + AnADOConn.Errors[i].Description + #13;

if AStr <> '' then raise Exception.Create(AStr);


تا شاید ببینیم خطا واقعا چیه...

ارادت

M.Ehsanifar
سه شنبه 04 دی 1386, 18:48 عصر
اینجور وقت ها (multiple)، ممکنه بیش از یک خطا وجود داشته باشه. اگه از ADO استفاده میکنید، میشه اینجوری بقیه خطاها رو هم ببینید:

ADOConn دارای یک مشخه به نام Errors هست که Count داره و خودش هم یک collection هستش که میشه اندیسش کرد و در هر item هم یک مشخصه به نام Description داره؛ مثل


بوسیله یک try except تعداد و متن استثنا رو بدست آوردم . یعنی اینکه دستوری رو که باعث خطا می شد رو در try قرار دادم و در except دستوراتی رو که شما نوشته بودید قرار دادم . یک خطا وجود داشت و متن اون هم همونه که گفته بودم ..
شاید باید از روش دیگه تعداد خطا و متن اونها رو بدست بیارم . ؟؟
اگه یک خطا رخ داده پس چرا می نویسه Multiple ؟؟

M.Ehsanifar
سه شنبه 04 دی 1386, 20:39 عصر
مشکلم حل شد ..

فیلد "num" که نوع اون رو از int به smallint تغییر داده بودم رو از field Editor جدول مربوطه پاک کردم و دوباره اون رو تعریف کردم و در حین تعریف نوع smallint رو براش قرار دادم . قبل از این کار مقدار این فیلد به صورت سرریز شده (در قالب int) نمایش داده می شد .(در sql برای فیلد مورد نظر نوع smallint رو به جای int قرار داده بودم ولی در field editor همان نوع int بکار گرفته می شد )

از همه دوستان متشکرم ..

ولی هنوز هم خطای multiple مشخص نیست . که چرا یک خطا رو بصورت چند خطا برداشت کرده بود .

JAFO_IRAN
چهارشنبه 05 دی 1386, 10:21 صبح
سلام

حق با شما است - این خطا multiple نیست - بلکه یک خطا است که اینجوری گزارش شده - ببین اینها به دردت میخوره، شاید یکی از این داستانها مشکل شما هم باشه:

http://www.mssqlcity.com/FAQ/Trouble/error_80040e21.htm

http://support.microsoft.com/kb/247029/en-us

http://support.microsoft.com/kb/279888/en-us

ارادات

M.Ehsanifar
پنج شنبه 06 دی 1386, 01:27 صبح
سلام

حق با شما است - این خطا multiple نیست - بلکه یک خطا است که اینجوری گزارش شده - ببین اینها به دردت میخوره، شاید یکی از این داستانها مشکل شما هم باشه:

http://www.mssqlcity.com/FAQ/Trouble/error_80040e21.htm

http://support.microsoft.com/kb/247029/en-us

http://support.microsoft.com/kb/279888/en-us

ارادات

از راهنماییتون ممنونم .. همون اولیه بود .. البته خودم هم قبلا نوشته بودم ..


فیلد "num" که نوع اون رو از int به smallint تغییر داده بودم رو از field Editor جدول مربوطه پاک کردم و دوباره اون رو تعریف کردم و در حین تعریف نوع smallint رو براش قرار دادم . قبل از این کار مقدار این فیلد به صورت سرریز شده (در قالب int) نمایش داده می شد .(در sql برای فیلد مورد نظر نوع smallint رو به جای int قرار داده بودم ولی در field editor همان نوع int بکار گرفته می شد )

JAFO_IRAN
پنج شنبه 06 دی 1386, 05:39 صبح
سلام

وقتی پست قبلی رو مینوشتم صفحه دوم رو نخوندم - پوزش و ارادت