PDA

View Full Version : فیلدهای از نوع Calculated



davoodmz
یک شنبه 10 اردیبهشت 1385, 08:40 صبح
با سلام

چگونه می شود بعد از انجام عملیات روی فیلدی از نوع Calculated آنرا به فیلد ثابتی از جدول اضافه کرد یعنی اگر جمع فیلدهای 1 و2 را در فیلد 3 از نوع Calculated ریختیم بعد از آن فیلد 4 را با محتویات فیلد Calculated پر کنیم در همان رویداد on Calculated
با تشکر
داود

SH.Daneshvar
یک شنبه 10 اردیبهشت 1385, 09:15 صبح
دوست عزیز اگر از پایگاه اطلاعاتی قوی مثل MS-SQL Server و یا InterBase استفاده
میکنید. استفاده از Trigger ها راهش هست.
من از On Calculated استفاده نکردم اما فکر نکنم بشه. چون ممکن DataSet شما توی Mode
Browse باشه و در این حالت شما نمیتونید چیزی روی فیلد ها بنویسید.

davoodmz
یک شنبه 10 اردیبهشت 1385, 09:55 صبح
با سلام آقای دانشور
از MS-SQL Server استفاده میکنم و کار با Trigger ها را بلد نیستم
لطفاً اگر امکان دارد کمک کنید
باتشکر
داود

ghabil
یک شنبه 10 اردیبهشت 1385, 11:46 صبح
خب چرا بعد از امام کار یک لوپ نمیزنی دیتارو Save کنی ؟، در OnCalculate فکر نکنم بشه این کار رو انجام داد .... استفاده از تریگر هم به این معنی که باید حتما تمام محاسبات بجای دلفی در دیتابیس انجام بشه .

mzjahromi
دوشنبه 11 اردیبهشت 1385, 08:34 صبح
چگونه می شود بعد از انجام عملیات روی فیلدی از نوع Calculated آنرا به فیلد ثابتی از جدول اضافه کرد یعنی اگر جمع فیلدهای 1 و2 را در فیلد 3 از نوع Calculated ریختیم بعد از آن فیلد 4 را با محتویات فیلد Calculated پر کنیم در همان رویداد on Calculated
با تشکر
اگر می خوای این کار رو بکنی چه لزومی به استفاده از Calc Field است و اگر می خوای از CalcField استفاده کنی چه لزومی برای انجام این کار هست. اگر فیلدها در زمان اجرا قابل محاسبه هستند نیازی به ذخیره اونها در بانک نیست. ضمن اینکه این کار باعث عدم همخوانی داده ها میشه.

davoodmz
دوشنبه 11 اردیبهشت 1385, 09:23 صبح
فیلدهای در جدول mablagh-mablagh1-mablagh2 و فیلد محاسباتی sum می باشد.

کد در on calculated

adotable1.FieldByName('sum').Value := adotable1.FieldByName('mablagh').Value * adotable1.FieldByName('mablagh1').Value ;

حالا می‌خواهم فیلد sum ( از نوع calculated fild ) را در یک فیلد سومی به نام mablagh2 بریزم
این کار را می شود به این روش انجام داده که بعد از کد بالا خط زیر را اضافه کنیم

edit1.Text:=adotable1.FieldByName('sum').Text;
یعنی در یک edit ریختیم حالا در رویداد on change خود edit بنویسیم

adotable1.FieldByName('mablagh2').Value := edit1.Text;

به این روش محتویات edit در فیلد mablagh2 قرار می گیرد.
آیا این روش کار درست است ؟ - لطفاً راهنمایی کنید. خطایی هم ندارد
با تشکر داود

ghabil
دوشنبه 11 اردیبهشت 1385, 16:20 عصر
بجای این کار تو BeforePost دیتاست فیلد سوم رو محاسبه کن و بزن ، چرا لقمه رو میچرخونی دوره سرت (Trigger از BeforePost هم بهتره ولی اگه سخته واست...) دیگه اصلا فیلد Calc هم نمیخواد

این کاری که کردی خیلی باحاله ;)

mzjahromi
سه شنبه 12 اردیبهشت 1385, 07:00 صبح
بجای این کار تو BeforePost دیتاست فیلد سوم رو محاسبه کن و بزن ، چرا لقمه رو میچرخونی دوره سرت (Trigger از BeforePost هم بهتره ولی اگه سخته واست...) دیگه اصلا فیلد Calc هم نمیخواد

ولی این کار همیشه عملی نیست.

ghabil
سه شنبه 12 اردیبهشت 1385, 16:19 عصر
خب دلیلشم بوگو دیگه

nilufari
سه شنبه 12 اردیبهشت 1385, 17:50 عصر
همون فیلد Sum رو در بانکت ایجاد کن و خودتو راحت کن !

mzjahromi
چهارشنبه 13 اردیبهشت 1385, 06:46 صبح
خب دلیلشم بوگو دیگه

یکی اش اینه که شاید با Query توی جداول Insert کنن
به نظر من اصلا نیازی به ذخیره فیلدهای Calculated درون بانک نیست و یه کار اشتباهه

davoodmz
چهارشنبه 13 اردیبهشت 1385, 09:14 صبح
با سلام
دلایلی که در befor post عملی نیست:
1- تا قبل از زدن کلید post هیچ عمل محاسباتی انجام نمی شود.
2- فیلدها اگر از نوع currency باشند محاسبات با خطا روبرو می‌شود
3- دلیل اینکه از calfild استفاده شده این است که در هر لحظه هر کدام از فیلدها تغییر کند عملیات آناً انجام می‌شود و نیاز به زدن کلیدی نیست
و حالا خواهشم می‌کنم یکی بگه روش که در بالا ذکر کردم درست است یانه
با تشکر
داود

SH.Daneshvar
جمعه 15 اردیبهشت 1385, 17:24 عصر
دوست عزیز راه معقول و عملی و راهی که قبلا برای اینجور مشکلات گذاشتن :
1.همونطور که دوست عزیزم گفت اگر فیلدی حاصل جمع چند فیلد دیگر هست
درست نیست به صورت ثابت توی جدول شما ذخیره به شه چون ممکن هست بعدا مقادیر
تغییر کند. اون وقت شما مجبور هستین همجا این تغییرلت رو بدین. و ...
2.من پیشنهاد میکنم شما فقط فیلد های پایه را در جدول ذخیره و مقادیر محاسباتی رو توی
یک Query محاسبه و توی جدول نمایش بدین.و بهتر هست Query توی SQL Server ساخته
و تمام محاسبات اونجا باشه.

موفق باشید.
یا حق.

davoodmz
شنبه 16 اردیبهشت 1385, 08:47 صبح
با سلام
آقای دانشور من هم هیمن را می‌گم ولی اطمینان ندارم که درست باشد این راه
باتشکر از شما
داود

SH.Daneshvar
شنبه 16 اردیبهشت 1385, 11:21 صبح
درست هست.
چون همیشه پیشنهاد میشه که تا میتونید محاسبات رو ببرید توی Server به چند صد دلیل
1.اگر یه وقتی محاسبات عوض شده با تغییر توی سرور به همجا اعمال میشه
2.چون قدرت سرور بیشتر هست و سریعتر به داده‌ها دسترسی داره سرعت محاسباتش
خیلی سریعتر هست.
3.توی Delphi سروکله زدن با DataSet کمی خطرناکه
به این دلیل که ممکن سیستم کاربر به هم بریزه وسط کار برق قطع بشه و ...
اما توی سرور علاوه بر اینکه ازش محافظت بیشتری میشه SQL Server ها طوری طراحی
شده اند که در وقوع خطر از داده‌ها محافظت میکنن و ...
4....

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

موفق باشید.
یا حق.

ghabil
شنبه 16 اردیبهشت 1385, 23:10 عصر
اینکه ذخیره فیلدهای محاسباتی در جدول غلطه در اکثر موارد درسته بجز چند مورد .

اما
دلایلی که در befor post عملی نیست:
1- تا قبل از زدن کلید post هیچ عمل محاسباتی انجام نمی شود.

سوال این بود : "چگونه می شود بعد از انجام عملیات روی فیلدی از نوع Calculated آنرا به فیلد ثابتی از جدول اضافه کرد " ، پس فیلد محاسباتی وجود داره و الان بحث اضافه کردنش به دیتابیس هست .

2- فیلدها اگر از نوع currency باشند محاسبات با خطا روبرو می‌شود

کدی که باهاش به خطا خوردین رو بدین شاید بتونیم مشکلتون رو حل کنیم !!

3- دلیل اینکه از calfild استفاده شده این است که در هر لحظه هر کدام از فیلدها تغییر کند عملیات آناً انجام می‌شود و نیاز به زدن کلیدی نیست

رک : 1

در مورد درج اطلاعات با Query هم برنامه نویس باید سناریو خودش رو بشناسه و اگر داره اطلاعات رو با Query درج میکنه میتونه همونجا محاسبات رو هم بدون هیچ مشکلی انجام بده و اضافه بکنه .

به هر حالا Eventهای دیتاست در دلفی بسیار کارامد و بدرد بخور هستند و برعکس نظر بعضی از دوستان بسیار هم تست شده اند و قابل استفاده هستند .

اما به دلایلی که دوستمون گفت منهای قطع برق و بعلاوه حفظ Consistency اطلاعات (که بسیار مهم هست ) انجام محاسب در سرور بسیار بسیار توصیه شده تر هست همیشه باید در نظر داشت که حتی ممکنه یک نفر بره پشت مثلا EnterpriseManager بشینه و اطلاعت رو وارد کنه ، حتی در این شرایط هم نباید اطلاعات ما غلط بشوند.

babak869
یک شنبه 17 اردیبهشت 1385, 20:08 عصر
حتی ممکنه یک نفر بره پشت مثلا EnterpriseManager بشینه و اطلاعت رو وارد کنه ، حتی در این شرایط هم نباید اطلاعات ما غلط بشوند.
آفرین به نکته جالب و مهمی اشاره کردی.دقیقا این نکته ای است که یک برنامه نویس حرفه ای باید در نظر داشته باشه و تمام را های خطا رو بروی کاربر ببنده.در هر صورت من فیلد Calculated رو برای پروژه های بزرگ نمی پسندم
موفق باشید

davoodmz
دوشنبه 18 اردیبهشت 1385, 09:38 صبح
با سلام بر دوستان
در فیلدهای calculated بعضی مواقع باید دیتا در مد edit باشد و این هم یک مشکل
باتشکر
داود

SH.Daneshvar
دوشنبه 18 اردیبهشت 1385, 10:57 صبح
به نظر من شما از Trigger های Database بایستی استفاده کنید.
چون درسترین راه همین هست.

موفق باشید.
یا حق.