PDA

View Full Version : تبديل فرمول رشته اي به فرمول قابل محاسبه



K.Mohammadreza
سه شنبه 10 آذر 1388, 07:19 صبح
با سلام
اين سوال واقعا حياتي و بسيار مهمه
من تمامي فرمولهاي محاسباتي در پروژه ام را بدليل اينکه دائما در حال تغيير هستند در جدولي به نام جدول فرمولها ذخيره کردم و متغييرهاي استفاده شده در فرمولها را در جدولي به نامه جدول متغييرها. حالا چگونه در دلفي از اين فرمولها استفاده کنم و آيا راه حل ديگري وجود دارد؟

مثلا فرمول H=Round(m-a)/15 يک فرموله که من در جدول فرمولها ذخيره کردم و در جدول متغيير ها H, M, A‌را تعريف کردم که چه معني مي دهند

اگر روشي براي حل مشکل بالا يا روش جديدي براي حل مشکل من مي شناسيد لطفا دريغ نفرمائيد. ولي حتما بايد فرمولها قابل تغيير باشند

با تشکر و آرزوي موفقيت

hadisalahi2
سه شنبه 10 آذر 1388, 09:53 صبح
استفاده از فرمولها به صورت های سفارشی ، کاملا در اختیار برنامه نویسه که چطوری اونها رو تعریف کنه و از اونها استفاده کنه.
پس قاعده و روش خاصی برای این کار وجود نداره.
شما برای این کار باید همانند پارسرها عمل کنید و فرمولها رو بسته به نیاز خودتون تعریف و استفاده کنید.
پس این روشی که استفاده کرده خودش یک روش کار با فرمولهای سفارشیه.

K.Mohammadreza
سه شنبه 10 آذر 1388, 12:01 عصر
با سلام و تشکر از جواب
ولي من فرمولها را در قالب يک فيلد رشته اي ذخيره مي کنم و با يک جدا کننده متغير از عملگر متغيرها را بدست مي آورم حال روشي براي بدست آوردن عملگر ميخواهم منظورم +و*و/و... نيست منظورم توابعي مثل Round هست که در فرمولها استفاده کردم.

اصلا مشکل من را در نظر نگيريد
فرض کنيد قرار است که در برنامه تمام فرمولهاي محاسباتي بصورت ديناميک باشند چکار کنيم؟
من منتظرم

Felony
سه شنبه 10 آذر 1388, 12:04 عصر
باید به وسیله ی یک Case پیغام ها رو پردازش کنید .

tdkhakpur
سه شنبه 10 آذر 1388, 12:29 عصر
فکر کنم این کار برای برنامه های حقوق و دستمزد استفاده داشته باشد ولی شما میتوانید یا برنامه ای برای تجزیه و تحلیل رشته طراحی کنید تا نتیجتا محاسبه را برای شما انجام دهد و یا اینکه توسط dll این محاسبه را به برنامه ارسال کنید و شما احتیاجی به این نداشته باشید که کل برنامه را به خاطر تعویض فرمول مجددا کامپایل کنید.
اگر نوع دوم را مد نظر دارید بطور کل تابعی را بصورت export داخل dll برای اینکار ایجاد کنید و برنامه این تابع را از dll فراخوانی و نتیجه را ازش بگیرید و شما اگر خواستسد فرمول را تعویض کنید فقط کافیست dll را تغییر داده و به شرکتهایی که محاسبات کاریشان با فرمول تغییر کرده است ارسال کنید.

K.Mohammadreza
سه شنبه 10 آذر 1388, 12:41 عصر
فکر کنم این کار برای برنامه های حقوق و دستمزد استفاده داشته باشد.
دقيقا درست است
اما من در برنامه اي ديدم که فرمولها درون يک جدول بودند و توسط برنامه تحليل و اجرا مي شدند حتي گزارشات برنامه هم ديناميک بود و کاربر انتخاب مي کرد چه فيلدهايي نمايش داده شوند و شيوه نمايش در صفحه (بصورت افي يا عمودي) و حتي تنظيمات صفحه هم ديناميک بود و برنامه هم با VB 6.0 نوشته شده بود و حجم برنامه هم 45 کيلو بود که فکر کنم بي نظير و يا حتي عالي بود

من چگونه اينکار را انجام بدم يهني هم گزارش ديناميک و هم فرمولهاي محاسباتي ديناميک و قابل تغيير توسط کاربر

K.Mohammadreza
سه شنبه 10 آذر 1388, 12:44 عصر
باید به وسیله ی یک Case پیغام ها رو پردازش کنید .
با تشکر ولي
با روش شما ميليونها خط کد لازمه که تشخيص بدم که اولا منعي متغير چيه و ثانيا تحليل توابع بسيار مشکل ميشه

tdkhakpur
سه شنبه 10 آذر 1388, 12:58 عصر
من چگونه اينکار را انجام بدم يهني هم گزارش ديناميک و هم فرمولهاي محاسباتي ديناميک و قابل تغيير توسط کاربر
برای گزارش داینامیک مشکلی نیست فقط شما باید نحوه گزارش شما مشخص شده باشد.
ولی در مورد محاسبات داینامیک شما باید برنامه ای برای تحلیل فرمول بنویسید مثل برنامه تحلیل فرمول های ماشین حساب ولی با کمی تغییر و پیشرفته تر.(بهترین راه)
و یا اینکه از dll استفاده کنید که ساده ترین راه هست. فقط ایرادش اینه که کاربر یا مشتری حق ایجاد فرمول را ندارد بلکه شما باید همیشه از برنامه پشتیبانی کنید.
ولی اگر کارتان چندان ضرورتی نداشته باشد فرمولها را ارسال کنید شاید تونستیم برایتان طراحی کنیم.

K.Mohammadreza
سه شنبه 10 آذر 1388, 13:50 عصر
ولی اگر کارتان چندان ضرورتی نداشته باشد فرمولها را ارسال کنید شاید تونستیم برایتان طراحی کنیم.
ممنون از لطفتون ولي کارم بسيار ضروريه و يک نمونه از فرمولها اينه EZ=Round(SK-K0-O0)*1.4*SE/176) که براي محاسبه مثلا اضافه کاره من بايد تابع Round و ... را تشخيص بدم و گرنه پيدا کردن پرانتر و +و * و/ کار زيادي نداره:اشتباه:
در مورد گزارش متغيير و کاملا ديناميک بيشتر بنويسيد:متفکر:

hadisalahi2
سه شنبه 10 آذر 1388, 16:18 عصر
دوست عزیز به عبارتی شما میخواهید کار پارسرها رو انجام بدید.
خود برنامه ها و کامپایلرها از روش پارسر برای این کار استفاده میکنند .
شما برای این که تشخیص بدید که چه تابعی رو خوندید و چه کاری باید با اون تابع انجام بدید، لازمه تا حتما عمل مقایسه رو انجام بدید حالا به قول دوستمون یا با Case یا با If
بعتره در مورد نحوه کار پارسرها مطالعاتی داشته باشید.
یا علی

tdkhakpur
سه شنبه 10 آذر 1388, 17:17 عصر
يک نمونه از فرمولها اينه EZ=Round(SK-K0-O0)*1.4*SE/176) که براي محاسبه مثلا اضافه کاره من بايد تابع Round و ... را تشخيص بدم و گرنه پيدا کردن پرانتر و +و * و/ کار زيادي نداره:اشتباه:
در مورد گزارش متغيير و کاملا ديناميک بيشتر بنويسيد:متفکر:
خب اگر مشکلتان roundو سایر اعمال به غیر از (پرانتر و +و * و/) هست شما میتوانید از علامتهایی نظیر #, ^ و غیره به جای آنها استفاده کنید و در پردازش هم نوع کار آنها را در نظر بگیرید تا محاسبه انجام گیرید.مثلا


EZ=Round(SK-K0-O0)*1.4*SE/176;
به
EZ=#(SK-K0-O0)*1.4*SE/176;
منظور شما را از تفاوت گزارشها نمی دانم ولی شما باید گزارشتان بر اساس پارامتر هایی باشد که تقاضا میکنید تا از روی آنها گزارش تهیه شود مثلا گزارش حقوق افرادی که از مزایای عائله مندی برخوردار هستند و یا سایر شرایط دیگر.
در مورد داینامیک خوب همان گزارشهایی که از یک دیتابیس توسط دیبی گرید گرفته میشود به نوعی داینامیک است.البته با توجه به تحلیل کاری نرم افزار میتوانید معنای متفاوتی هم داشته باشد .

K.Mohammadreza
سه شنبه 10 آذر 1388, 18:47 عصر
مشکلم حل شد
حالا برنامه ميتونه بدون اينکه نياز به کار خاص يا کد خاص باشه فرمول را بشناسه و اونو محاسبه کنه و نتيجه را نشان بده همچنين کاربر نيز ميتونه فرمول را ويرايش کنه و نيازي به اينکه فرمول را طبق شرايط خاص بنويسه هم نيست و فکر کنم عالي شد. البته با کمک کامپوننتي که پيدا کردم و برنامه نيز محدوديت در تعداد متغييرهاي فرمول نداره و ميتونه هر تعدا متغيير که وجود داشت را پيدا کنه و اونها را تشخيص بده و خالاصه اينکه بسيار عالي شد

K.Mohammadreza
سه شنبه 10 آذر 1388, 18:53 عصر
در مورد داینامیک خوب همان گزارشهایی که از یک دیتابیس توسط دیبی گرید گرفته میشود به نوعی داینامیک است.البته با توجه به تحلیل کاری نرم افزار میتوانید معنای متفاوتی هم داشته باشد .
منظورم از گزارش ديناميک اين نيست که نتيجه در DBGride نشان داده بشه منورم اينه که يک صفحه باز بشه و فيلدهاي جدول البته بشکل فارسي نشان داده بشن و کاربر هر فيلدي را که خواست انتخاب کنه و در آخر شرط خود را هم اضافه کنه و دکمه ايجاد گزارش را بزنه و سپس نتيجه بصورت يک فايل ورد يا اکسل نشان داده بشه در ضمن گزارش بايد بتونه از چندين جدول گرفته بشه البته باز هم به سليقه کاربر يعني اينکه ر صفحه گزارش متغيير تمامي جداول نشان داده بشن و کاربر هر جدولي که دوست داشت انتخاب کنه و هر فيلدي که دوست داشت هم انتخاب کنه و شرط خود را هم بنويسه و گزارش گرفته بشه بدون اينکه کاربر اطلاعات در زمينه دستورات اس کيو ال و ... داشته باشه و کاملا هم ويژوال باشه من برنامه اي با Vb 6.0 با همين شيوه عملکرد دارم و کار ميکنه ولي سورسش را ندارم آيا در دلفي ميتوان اينکار را انجام داد؟:اشتباه::متفکر:

tdkhakpur
سه شنبه 10 آذر 1388, 19:47 عصر
کاربر هر فيلدي را که خواست انتخاب کنه و در آخر شرط خود را هم اضافه کنه و دکمه ايجاد گزارش را بزنه و سپس نتيجه بصورت يک فايل ورد يا اکسل نشان داده بشه در ضمن گزارش بايد بتونه از چندين جدول گرفته
همه این موارد شما به برنامه نویسی و کنترل خروجی بستگی دارد که چه ابزاری را برای خروجی گزارش استفاده میکنید.
و در مورد شرط هم باز شما میتوانید جدول و همچنین فیلدها و نیز رکورد خواص را فیلتر کرده تا در گزارش قید نشود همگی این اعمال برای گزارش سازی جزو گزارشهای متغییر هشتند.تا اونجایی که من از مطالب شما متوجه شدم اینه که منظورتان از داینامیک این هست که راحتتر بتوان گزارش را ساخت و کد کمتری برای خارج ساختن گزارش به کار برد.که برای این کار هم باید به آماده سازی ابزاری پرداخته شود که این اعمال را توسط یک پروسه انجام دهد.

K.Mohammadreza
سه شنبه 10 آذر 1388, 20:02 عصر
تا اونجایی که من از مطالب شما متوجه شدم اینه که منظورتان از داینامیک این هست که راحتتر بتوان گزارش را ساخت و کد کمتری برای خارج ساختن گزارش به کار برد.که برای این کار هم باید به آماده سازی ابزاری پرداخته شود که این اعمال را توسط یک پروسه انجام دهد.
خير
منظور من اينه که کاربر با توجه به اطلاعات وارد شده بتواند هر گزارشي که دوست داشت از اطلاعات بانک بگيره مثلا اطلاعات مشتري را وارد کرده
حالا يک کاربر دوست داره گزارش بگيره و مشترياني که سن اونها بزرگتر از 50 است و يا نام انها هم محمد و يا در هران زندگي مي کنند و يا ... و يا ... و يا ... . ووووووو
برنامه نويس که نميتونه هزاران فرم گزارش درست کنه در ثاني کاربر ممکن نخواد يکسري فيلدها ديده بشنمثلا کاربر دوست داره فقط نام و نام خانوادگي ديده بشن و کاربر ديگر دوست داره فيلدهاي بيشتر يا کمتر ديده بشن و غيره:اشتباه:

tdkhakpur
سه شنبه 10 آذر 1388, 21:22 عصر
حالا يک کاربر دوست داره گزارش بگيره و مشترياني که سن اونها بزرگتر از 50 است و يا نام انها هم محمد و يا در هران زندگي مي کنند و يا ... و يا ... و يا ... . ووووووو
برنامه نويس که نميتونه هزاران فرم گزارش درست کنه در ثاني کاربر ممکن نخواد يکسري فيلدها ديده بشنمثلا کاربر دوست داره فقط نام و نام خانوادگي ديده بشن و کاربر ديگر دوست داره فيلدهاي بيشتر يا کمتر ديده بشن و غيره:اشتباه:
من نمی دانیم شما چقدر با اصول مهندسی نرم افزار آشنایید ولی مطمئئنا شما هم باید بدانید که نرم افزار این نیست که به دلخواه تک تک مشتریان ساخته بشود بلکه نرم افزار بصورت استاندارد ساخته میشود تا از یک سری قوانین پیروی کند شما اگر نرم افزار حسابداری مالی را در نظر بگیرید باید طوری طراحی شود که یک کارشناس حسابداری با قوائد کاری آن آشنا بوده و به درستی حسابها را درج کند.
البته کاری که شما در پیش دارید کار مشتری را راحت میکند ولی استاندارد نیست.خوب اگر به عنوان تحلیل گر به برنامه نگاه کنید همه نرم افزار ها از جامعه یکی از سازمانها نشات گرفته اند یعنی پیروی از یه سری قوانین.
موفق باشید.

khoshblagh
دوشنبه 16 آذر 1388, 07:07 صبح
مشکلم حل شد
حالا برنامه ميتونه بدون اينکه نياز به کار خاص يا کد خاص باشه فرمول را بشناسه و اونو محاسبه کنه و نتيجه را نشان بده همچنين کاربر نيز ميتونه فرمول را ويرايش کنه و نيازي به اينکه فرمول را طبق شرايط خاص بنويسه هم نيست و فکر کنم عالي شد. البته با کمک کامپوننتي که پيدا کردم و برنامه نيز محدوديت در تعداد متغييرهاي فرمول نداره و ميتونه هر تعدا متغيير که وجود داشت را پيدا کنه و اونها را تشخيص بده و خالاصه اينکه بسيار عالي شد
با سلام خدمت دوست عزیز
میشه این کامپوننت را برای استفاده سایرین ارائه بدهید؟ متشکرم.

MOJTABAATEFEH
پنج شنبه 17 دی 1388, 23:56 عصر
مشکلم حل شد
حالا برنامه ميتونه بدون اينکه نياز به کار خاص يا کد خاص باشه فرمول را بشناسه و اونو محاسبه کنه و نتيجه را نشان بده همچنين کاربر نيز ميتونه فرمول را ويرايش کنه و نيازي به اينکه فرمول را طبق شرايط خاص بنويسه هم نيست و فکر کنم عالي شد. البته با کمک کامپوننتي که پيدا کردم و برنامه نيز محدوديت در تعداد متغييرهاي فرمول نداره و ميتونه هر تعدا متغيير که وجود داشت را پيدا کنه و اونها را تشخيص بده و خالاصه اينکه بسيار عالي شد

لطفا اگر امكان داره كامپوننت رو اينجا قرار بدين

با تشكر

Sataorg
پنج شنبه 09 اردیبهشت 1389, 12:20 عصر
این آقای محمد رضا خیلی با حال بدون اینکه بگه چتوری تونسته مشکل فرمولها را حل کنه یا از چه کامپوننتی استفاده کرده قضیه را ییهو فراموش کرد بابا دمت گرم به ما هم بگو چیکار کردی من هم مشکل خودتو دارم

Felony
پنج شنبه 09 اردیبهشت 1389, 13:11 عصر
http://www.bestcode.com/html/tbcparser.html

vahid_1360
جمعه 17 اردیبهشت 1389, 02:49 صبح
لطفا اگر امكان داره كامپوننت رو اينجا قرار بدين

با تشكر


با سلام خدمت دوستان
من هم این مشکل رو داشتم و راه حل
var i: double;
begin
i:= ADOConnection.Execute('SELECT (هر جمله محاسباتی که دلتون میخواد)').Fields.Item[0].Value;
بدون نیاز به هیچ کامپوننتی

یا علی

صابر طهماسبی
شنبه 18 اردیبهشت 1389, 18:13 عصر
سلام
چیزی که شما می فرمایید در زبانهایی مثل JavaScript و LISP و php من دیدم پیشفرض پیاده سازی شده مثلا در لیسپ با ماکروها و در JavaScript و PHP با تابع eval .
اما از دلفی اطلاع چندانی ندارم اما می دانم برای پیاده سازی این چنین کاری باید به مباحث نظریه زبانها و ماشین ها و طراحی کامپایلر از مباحث مهندسی نرم افزار کاملا مسلط باشید و نوشتن دستورات شرطی جوابگوی این نیاز نخواهد بود.

K.Mohammadreza
یک شنبه 20 تیر 1389, 07:03 صبح
با سلام
http://www.barnamenevis.org/forum/showthread.php?t=231661
به این تاپیک یه سر بزنید

moh_maj
جمعه 29 خرداد 1394, 08:16 صبح
با سلام به همه
من دنبال کامپوننتی هستم که در این پست معرفی شده اسمش هست tbcparser. من نسخه 2.8 رو از سایتهای خارجی دانلود کردم ولی توی تعداد متغیر محدودیت داره یعنی دو متغیر X و Y رو بیشتر قبول نمی کنه. من نسخه 3.4 اون رو از سایتش دانلود کردم که یه event داره و وقتی که بخوایم بیش از دو متغیر در فرمول استفاده کنیم با استفاده از اون بهشون مقدار دهی می کنیم. حالا مشکل اینجاست که این نسخه 3.4 فقط توی محیط IDE دلفی قابل استفاده هست و فایل اجرایی برنامه بدلیل اینکه نسخه نمایشی هست قابل اجرا نیست. هر جا رو که فکر میکردم رفتم دنبالش ولی فقط نسخه 2.8 رو بصورت فول سورس دیدم. از دوستان اگر کسی این کامپوننت رو سراغ داره لطفاً من را دریابد.
با تشکر.یا علی مدد