PDA

View Full Version : رتبه بندی عملکرد در گزارش



iransim
سه شنبه 19 اسفند 1399, 20:45 عصر
سلام دوستان
قبل از طرح سئوال عرض کنم که مورد درخواستی رو زیاد جستجو کردم ، ولی متاسفانه مطلب مد نظرم رو پیدا نکردم

در فایل ضمیمه ، من یک گزارش عملکردی رو بر اساس توابع ( Dcount و DSum ) از بانک اطلاعاتی درست کردم و بر اساس فرمول درصد عملکرد رو در دو بخش ( عملکرد کل سنوات و عملکرد سال جاری ) رو در ستون عملکرد مربوط به خود محاسبه کردم

حالا میخوام در ستون های ( رتبه عملکرد سنوات ) و ( رتبه عملکرد سال جاری ) رتبه هر ناحیه در ستون رتبه عملکرد در هر بخش مقابل خودش بر اساس یک عدد از ( 1 تا 6 ) درج بشه

مثلا ( ناحیه وحدتیه : چون درصد عملکرد سنوات آن 120.83% ( رتبه اول ) است ، در ستون رتبه عملکرد سنوات عدد ( 1 ) درج شود و چون درصد عملکرد سال جاری آن 46.75% ( رتبه سوم ) است در ستون رتبه عملکرد سال جاری عدد ( 3 ) درج شود .

ممنون و سپاسگزارم راهنمائی بفرمائید.

iransim
پنج شنبه 21 اسفند 1399, 22:44 عصر
از دوستان کسی نیست ی راهنمائی کوچک هم بکنه ( خواهشا خیلی کارم گبر افتاده )

mazoolagh
پنج شنبه 21 اسفند 1399, 23:58 عصر
برنامه تون رو دیدم.

اول اینکه نیازی نیست محاسبات رو hardcode کنین، بهتره اینکار رو بعهده کوئری ها بگذارین.
محاسبه رتبه بندی رو هم خود کوئری ها میتونن براتون انجام بدن ولی قدری پیچیده است و نیاز به توضیح داره.
در sql رتبه بندی راحت هست و در واقع تمهیداتش دیده شده ولی در اکسس نیاز هست خودمون انجام بدیم.
فرصت کنم براتون کوئری ها رو مینویسم.
شکل گزارش رو البته باید تغییر بدین و به کوئری ها bound کنین.

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

mazoolagh
جمعه 22 اسفند 1399, 00:12 صبح
برای شروع، بخش عملکرد پروژه ها (کل سنوات) رو در نظر بگیرین.

برای سادگی کار رو به مراحل کوچکتر میشکنیم و در آخر کنار هم قرار میدیم.

اول یک کوئری ساده برای محاسبه پروژه های ابلاغ شده (EBLAGH_PROJECT) مینویسیم:
SELECT NAHI , COUNT(NUMPRO) AS E
FROM TBLSABT
WHERE POL > 0
GROUP BY NAHI

و یک کوئری هم برای محاسبه پروژه های تغییر تحول شده (TAHVIL_PROJECT):
SELECT NAHI , COUNT(NUMPRO) AS TTF
FROM TBLSABT
WHERE (POL > 0 AND EMTIAZ > 0)
GROUP BY NAHI

mazoolagh
جمعه 22 اسفند 1399, 00:22 صبح
حالا از روی این دو کوئری، کوئری محاسبه عملکرد پروژه ها (AMALKARD_PROJECT) رو مینویسیم:
SELECT EP.NAHI , EP.E , TP.TTF , TP.TTF/EP.E AS X
FROM EBLAGH_PROJECT EP INNER JOIN TAHVIL_PROJECT TP ON EP.NAHI = TP.NAHI

mazoolagh
جمعه 22 اسفند 1399, 00:27 صبح
حالا رتبه رو روی خود همین کوئری عملکرد میتونیم محاسبه کنیم:
SELECT A.NAHI , A.E , A.TTF , A.X , COUNT(*) AS ROTBEH
FROM AMALKARD_PROJECT AS A
LEFT JOIN AMALKARD_PROJECT AS B ON A.X <= B.X
GROUP BY A.NAHI , A.E , A.TTF , A.X

mazoolagh
جمعه 22 اسفند 1399, 00:35 صبح
فکر کنم همین بعنوان راهنمایی برای شما کافی باشه،تنها نیاز هست که مشابه همین رو برای اعتبارات بنویسین و برای شرط سال هم کافی هست در دو کوئری اول اون رو اضافه کنین.
بعد دو گزارش جدا یکی برای پروژه ها و یکی هم برای اعتبارات طراحی میکنین.
کوئری عملکرد سال رو با کوئری عملکرد کلی JOIN میکنین و بعنوان دیتاسورس گزارش عملکرد پروژه ها قرار میدین و مشابه همین برای اعتبارات.

iransim
جمعه 22 اسفند 1399, 09:55 صبح
فکر کنم همین بعنوان راهنمایی برای شما کافی باشه،تنها نیاز هست که مشابه همین رو برای اعتبارات بنویسین و برای شرط سال هم کافی هست در دو کوئری اول اون رو اضافه کنین.
بعد دو گزارش جدا یکی برای پروژه ها و یکی هم برای اعتبارات طراحی میکنین.
کوئری عملکرد سال رو با کوئری عملکرد کلی JOIN میکنین و بعنوان دیتاسورس گزارش عملکرد پروژه ها قرار میدین و مشابه همین برای اعتبارات.

سلام و سپاس فراوان از توجه و وقتی که گذاشتید
آقا خیلی عالی و دقیقا همونی که میخواستم فقط اینکه :
من با استفاده از راهنمائی و کدهائی که نوشته بودید ، گزارش رتبه بندی درسال جاری رو نیز ساختم فقط با دو مسئله روبرو شدم
1- مجبور شدم مقدار سال جاری رو به صورت ثابت ( 1399 ) در شرط Sql وارد کنم ، چطور میتونم مقدار این شرط ( سال ) رو مثل نمونه خودم مقدار 1399 رو با استفاده ازتابع Left از باکس 13991222=shamsi برگردونه و به عنوان شرط سال داخل کوئری قرار بده که نیاز به وارد کردن سال جاری و یا مقدار دهی ثابت در کوئری نباشیم

2 - چطور میتونم هر دو گزارش کلیه سنوات و سال جاری رو کنار هم در یک گزارش نشون بدم ( شبیه گزارش نمونه ارسالی خودم )

در ضمن تعداد نواحی که فرمودید ، همیشه ثابت و همین شش ناحیه است .
بازم ممنون از توجه شما

mazoolagh
شنبه 23 اسفند 1399, 10:43 صبح
سلام و روز خوش،
خوشحالم جواب گرفتین.
یک نمونه میگذارم و روی همون روش کار رو نشون میدم.

iransim
شنبه 23 اسفند 1399, 13:23 عصر
سلام و روز خوش،
خوشحالم جواب گرفتین.
یک نمونه میگذارم و روی همون روش کار رو نشون میدم.

سپاس فراوان از قبول زحمت

mazoolagh
یک شنبه 24 اسفند 1399, 09:43 صبح
سپاس فراوان از قبول زحمت
شما لطف دارین، در واقع من اینجا پرسش مشابه به چشمم نخورده بود، برای همین این یک نمونه ای هست که آموزنده است و ممکنه برای دیگران هم مفید باشه.

1- در برنامه پیوست، بخش "اعتبار" نیومده ، چون ساختار کوئری ها دقیقا مشابه "تعداد پروژه" است و زحمتش به دوش استارتر محترم تاپیک گذاشته شد.
2- به جز کوئری های محاسبه رتبه، محاسبه اعتبار رو میشه در همین کوئری ها ترکیب کرد که برای سادگی مطلب کنار گذاشته شده.
3- روش محاسبه رتبه رو تغییر دادم (نسبت به اونچه که در پست 6 آمده) ، دلیلش رو بعنوان میگذارم که خودتون پیدا کنین.
4- ارسال مقدار سال به کوئری های مربوط از طریق tempvar انجام میشه، میتونین از هر روش که مناسبتر دونستین انجام بدین.
5- گزارش باید از طریق فرم بازبشه (برای انتخاب سال)، ولی اگر مستقیم هم باز بشه بصورت پیش فرض از آخرین (بزرگترین) مقدار سال استفاده میکنه.

mazoolagh
یک شنبه 24 اسفند 1399, 09:52 صبح
SELECT A.NAHI, A.E, A.X, A.TTF,
(SELECT COUNT (*)+1 FROM (SELECT X FROM AMALKARD_PROJECT_KOL) AS B WHERE A.X<B.X) AS ROTBE
FROM AMALKARD_PROJECT_KOL AS A
ORDER BY A.NAHI;


/* AMALKARD_PROJECT_KOL */
SELECT EP.NAHI, EP.E, TP.TTF, TP.TTF/EP.E AS X
FROM EBLAGH_PROJECT_KOL AS EP INNER JOIN TAHVIL_PROJECT_KOL AS TP ON EP.NAHI=TP.NAHI;

/* TAHVIL_PROJECT_KOL */
SELECT TblSabt.Nahi, Count(TblSabt.NumPro) AS TTF
FROM TblSabt
WHERE (((TblSabt.Pol)>0) AND ((TblSabt.Emtiaz)>0))
GROUP BY TblSabt.Nahi;

mazoolagh
یک شنبه 24 اسفند 1399, 09:56 صبح
نمونه خروجی

153147

mazoolagh
یک شنبه 24 اسفند 1399, 10:03 صبح
برنامه نمونه:

mazoolagh
یک شنبه 24 اسفند 1399, 10:04 صبح
سرفرصت روش رتبه بندی در SQL SERVER رو هم میگذارم تا ببینید چقدر کار راحتتر و کدها خواناتر هست.

iransim
یک شنبه 24 اسفند 1399, 10:34 صبح
شما لطف دارین، در واقع من اینجا پرسش مشابه به چشمم نخورده بود، برای همین این یک نمونه ای هست که آموزنده است و ممکنه برای دیگران هم مفید باشه.

1- در برنامه پیوست، بخش "اعتبار" نیومده ، چون ساختار کوئری ها دقیقا مشابه "تعداد پروژه" است و زحمتش به دوش استارتر محترم تاپیک گذاشته شد.
2- به جز کوئری های محاسبه رتبه، محاسبه اعتبار رو میشه در همین کوئری ها ترکیب کرد که برای سادگی مطلب کنار گذاشته شده.
3- روش محاسبه رتبه رو تغییر دادم (نسبت به اونچه که در پست 6 آمده) ، دلیلش رو بعنوان میگذارم که خودتون پیدا کنین.
4- ارسال مقدار سال به کوئری های مربوط از طریق tempvar انجام میشه، میتونین از هر روش که مناسبتر دونستین انجام بدین.
5- گزارش باید از طریق فرم بازبشه (برای انتخاب سال)، ولی اگر مستقیم هم باز بشه بصورت پیش فرض از آخرین (بزرگترین) مقدار سال استفاده میکنه.



سلام و عرض ادب و تشکر بابت همه توجه و وقتی که برای این تاپیک گذاشتید
خوشحالم میشم که این تاپیک بتونه با زحمت و صرف وقتی که شما تقبل کردید نکات جدید و آموزنده ای را به همه دوستان ارائه کند.

iransim
یک شنبه 24 اسفند 1399, 23:01 عصر
سرفرصت روش رتبه بندی در SQL SERVER رو هم میگذارم تا ببینید چقدر کار راحتتر و کدها خواناتر هست.

سلام و عرض ادب مجدد
بی صبرانه منتظر قبول زحمت و دیدن نمونه کار و تجربه شما هستم

منم فایل آخرین تغییرات رو که با استفاده از راهنمائی و نمونه شما پیاده کردم رو به پیوست میفرستم بخش اعتبارات رو نیز اضافه کردم البته با ی تغییر ( امید است به دوستان علاقه مند کمک کنه )
درضمن من گزارش رتبه بندی قبلی خودم رو نیز اضافه کردم ( البته با ی تغییر که اضافه کردن ضریب وزنی است )
هرچند به شما خیلی زحمت دادیم ولی ی سئوال
آیا امکانش هست که از روش شما در گزارش ( عملکرد با اعمال ضریب وزنی ) : عملکرد رو در یک عدد ثابت ( ضریب وزنی ) که هر ناحیه ضریب وزنی خاص خودش رو داره ضرب کرد و بعد بر اساس مقدار جدید عملکرد که حاصل ( عملکرد * ضریب وزنی ) بدست میاد رتبه بندی رو انجام داد ؟

mazoolagh
دوشنبه 25 اسفند 1399, 09:07 صبح
سلام و عرض ادب مجدد
بی صبرانه منتظر قبول زحمت و دیدن نمونه کار و تجربه شما هستم

منم فایل آخرین تغییرات رو که با استفاده از راهنمائی و نمونه شما پیاده کردم رو به پیوست میفرستم بخش اعتبارات رو نیز اضافه کردم البته با ی تغییر ( امید است به دوستان علاقه مند کمک کنه )
درضمن من گزارش رتبه بندی قبلی خودم رو نیز اضافه کردم ( البته با ی تغییر که اضافه کردن ضریب وزنی است )
هرچند به شما خیلی زحمت دادیم ولی ی سئوال
آیا امکانش هست که از روش شما در گزارش ( عملکرد با اعمال ضریب وزنی ) : عملکرد رو در یک عدد ثابت ( ضریب وزنی ) که هر ناحیه ضریب وزنی خاص خودش رو داره ضرب کرد و بعد بر اساس مقدار جدید عملکرد که حاصل ( عملکرد * ضریب وزنی ) بدست میاد رتبه بندی رو انجام داد ؟

سلام و روز خوش
بله شدنی هست، اجازه بدین برنامه تون رو سر فرصت یک نگاه بندازم.

mazoolagh
دوشنبه 25 اسفند 1399, 09:16 صبح
سرفرصت روش رتبه بندی در SQL SERVER رو هم میگذارم تا ببینید چقدر کار راحتتر و کدها خواناتر هست.

رتبه بندی در SQL با تابع RANK انجام میشه. همین جدول در SQL اگر بود میتونستیم به شکل زیر عمل کنیم:
CREATE PROCEDURE [dbo].[Rank] @SAL int AS
BEGIN
SET NOCOUNT ON;


WITH EK AS ( /* PROJECTS EBLAGH KOL */
SELECT NAHI,COUNT(NUMPRO) AS E FROM TblSabt WHERE POL>0 GROUP BY NAHI)
,
ES AS ( /* PROJECTS EBLAGH SAL */
SELECT NAHI,COUNT(NUMPRO) AS E FROM TblSabt WHERE (POL>0 AND SAL=@SAL) GROUP BY NAHI)
,
PK AS ( /* PROJECTS TAHVIL KOL */
SELECT NAHI,COUNT(NUMPRO) AS TTF FROM TblSabt WHERE (POL>0 AND EMTIAZ>0) GROUP BY NAHI)
,
PS AS ( /* PROJECTS TAHVIL SAL */
SELECT NAHI,COUNT(NUMPRO) AS TTF FROM TblSabt WHERE (POL>0 AND EMTIAZ>0 AND SAL=@SAL) GROUP BY NAHI)
,
APK AS (/* AMALKARD PROJECT KOL */
SELECT EK.NAHI,EK.E,PK.TTF,CAST([TTF] AS FLOAT)/CAST([E] AS float) AS X FROM PK INNER JOIN EK ON EK.NAHI=PK.NAHI)
,
APS AS (/* AMALKARD PROJECT SAL */
SELECT ES.NAHI,ES.E,PS.TTF,CAST([TTF] AS FLOAT)/CAST([E] AS float) AS X FROM PS INNER JOIN ES ON ES.NAHI=PS.NAHI)


SELECT APK.NAHI , APK.E , APK.TTF , APK.X , APS.E , APS.TTF , APS.X,
RANK() OVER (ORDER BY APK.X DESC) RK, /* ROTBE KOL */
RANK() OVER (ORDER BY APS.X DESC) RS /* ROTBE SAL*/
FROM APK INNER JOIN APS ON APK.NAHI=APS.NAHI
ORDER BY APK.NAHI
END
GO

mazoolagh
دوشنبه 25 اسفند 1399, 09:19 صبح
EXEC [dbo].[Rank] @SAL = 1398

153151

iransim
دوشنبه 25 اسفند 1399, 13:16 عصر
EXEC [dbo].[Rank] @SAL = 1398

153151
احسنت بر شما
سعی میکنم بانک رو با ساختار SQL در بیارم ( البته تجربه ای ندارم ) و از روش شما در اون استفاده کنم

iransim
دوشنبه 25 اسفند 1399, 13:17 عصر
سلام و روز خوش
بله شدنی هست، اجازه بدین برنامه تون رو سر فرصت یک نگاه بندازم.

اگه میشه که واقعا عالی و کمک بزرگی تو برنامه ام میکنه
مجدد سپاسگزارم :خجالت:

mazoolagh
سه شنبه 26 اسفند 1399, 12:13 عصر
آیا امکانش هست که از روش شما در گزارش ( عملکرد با اعمال ضریب وزنی ) : عملکرد رو در یک عدد ثابت ( ضریب وزنی ) که هر ناحیه ضریب وزنی خاص خودش رو داره ضرب کرد و بعد بر اساس مقدار جدید عملکرد که حاصل ( عملکرد * ضریب وزنی ) بدست میاد رتبه بندی رو انجام داد ؟

فرمولی که برای محاسبه عملکرد وزنی استفاده کردین مطمئنین درسته؟
اگر همین باشه که دیدم، چون باید بر مبنای عملکرد میانگین باشه، بهتره روش محاسبه رو قدری تغییر بدیم.
اصول محاسبه رتبه البته همین هست و تفاوتی نمیکنه.÷

iransim
سه شنبه 26 اسفند 1399, 13:43 عصر
فرمولی که برای محاسبه عملکرد وزنی استفاده کردین مطمئنین درسته؟
اگر همین باشه که دیدم، چون باید بر مبنای عملکرد میانگین باشه، بهتره روش محاسبه رو قدری تغییر بدیم.
اصول محاسبه رتبه البته همین هست و تفاوتی نمیکنه.÷

فکر کنم درست باشه چون ضریب و زنی فقط نقش یک ضریب رو داره و عملکرد هر ناحیه در همان سال نسبت به کل عملکرد همون سال محاسبه میشه ( چون در آخر جمع کل عملکردی که با اعمال ضریب وزنی بدست میاد با جمع درصد عملکردی بدون ضریب یکی درمیاد

بازم اگه شما روش محاسبه دیگری مد نظرتون هست بفرمائید شاید من اشتباه میکنم

mazoolagh
چهارشنبه 27 اسفند 1399, 09:52 صبح
این فرمول که استفاده کردین نادرست هست، چون برای هر ناحیه یک عدد ثابت (عملکرد کل) رو در ضریب وزنی ضرب کردین، در نتیجه همیشه رتبه وزنی به ترتیب وزن ها بدست میاد و ثابت هست.
باز هم شما دوباره چک کنین شاید من دقت نکردم.

درسش این هست که عملکرد هر ناحیه در ضریب وزنی ضرب بشه تا یک عملکرد وزنی داشته باشیم، و بعد روی این رتبه بندی کنیم.

من بر همین اساس یک نمونه براتون آماده میکنم.

iransim
چهارشنبه 27 اسفند 1399, 20:01 عصر
این فرمول که استفاده کردین نادرست هست، چون برای هر ناحیه یک عدد ثابت (عملکرد کل) رو در ضریب وزنی ضرب کردین، در نتیجه همیشه رتبه وزنی به ترتیب وزن ها بدست میاد و ثابت هست.
باز هم شما دوباره چک کنین شاید من دقت نکردم.

درسش این هست که عملکرد هر ناحیه در ضریب وزنی ضرب بشه تا یک عملکرد وزنی داشته باشیم، و بعد روی این رتبه بندی کنیم.

من بر همین اساس یک نمونه براتون آماده میکنم.

سلام
دقیقا من منظورم همین روش محاسبه رتبه بندی است ولی احتمالا در نحوه بیان و یا محاسبات آن اشتباه کردم
پیشاپیش بابت قبول زحمت نمونه مد نظرتون متشکرم

mazoolagh
پنج شنبه 28 اسفند 1399, 10:01 صبح
اول یک جدول نواحی درست میکنیم که ضرایب وزنی رو بتونیم نگهداری کنیم:
153154

احتمالا چنین جدولی رو دارین خودتون، چون در جدول ثبت کد نواحی هم دیده میشه.

mazoolagh
پنج شنبه 28 اسفند 1399, 10:10 صبح
طراحی کوئری ها قدری تغییر میکنه و گروه بندی رو بر اساس کدناحیه (بجای ناحیه) انجام میدیم که اصولی تر هست.


/* EBLAGH_PROJECT_KOL */
SELECT TblSabt.IDNahi, Count(TblSabt.NumPro) AS PEK
FROM TblSabt
WHERE (((TblSabt.Pol)>0))
GROUP BY TblSabt.IDNahi;

/* TAHVIL_PROJECT_SAL */
SELECT TblSabt.IDNahi, Count(TblSabt.NumPro) AS PTS
FROM TblSabt
WHERE (((TblSabt.Pol)>0) And ((TblSabt.Emtiaz)>0) And ((TblSabt.Sal)=TEMPVARS!SAL))
GROUP BY TblSabt.IDNahi;

/* AMALKARD_PROJECT_KOL */
SELECT EP.IDNAHI, EP.PEK, TP.PTK, [TP].[PTK]/[EP].[PEK] AS PAK, [NAVAHI].[VAZN]*[PAK] AS PAWK
FROM (EBLAGH_PROJECT_KOL AS EP INNER JOIN TAHVIL_PROJECT_KOL AS TP ON EP.IDNAHI = TP.IDNAHI) INNER JOIN Navahi ON EP.IDNahi = Navahi.IDNahi;

/* AMALKARD_PROJECT_SAL_ROTBE */
SELECT A.IDNAHI, A.PES, A.PTS,
A.PAS, (SELECT COUNT (*)+1 FROM (SELECT PAS FROM AMALKARD_PROJECT_SAL) AS B WHERE A.PAS<B.PAS) AS PRS,
A.PASW, (SELECT COUNT (*)+1 FROM (SELECT PASW FROM AMALKARD_PROJECT_SAL) AS B WHERE A.PASW<B.PASW) AS PRSW
FROM AMALKARD_PROJECT_SAL AS A;

mazoolagh
پنج شنبه 28 اسفند 1399, 10:13 صبح
و کوئری نهایی:

/* AMALKARD_PROJECT */
SELECT Navahi.Nahi, Navahi.vazn, K.PEK, K.PTK, K.PAK, K.PRK, K.PAWK, K.PRWK, S.PES, S.PTS, S.PAS, S.PRS, S.PASW, S.PRSW
FROM (AMALKARD_PROJECT_KOL_ROTBE AS K INNER JOIN AMALKARD_PROJECT_SAL_ROTBE AS S ON K.IDNAHI = S.IDNAHI)
INNER JOIN Navahi ON K.IDNAHI = Navahi.IDNahi
ORDER BY Navahi.Nahi;

mazoolagh
پنج شنبه 28 اسفند 1399, 10:13 صبح
و خروجی:
153155

mazoolagh
پنج شنبه 28 اسفند 1399, 10:16 صبح
برنامه نمونه:

کدها رو از نظر درست بودن مقادیر و فرمول ها چک کنین!

iransim
یک شنبه 01 فروردین 1400, 13:43 عصر
سلام و عرض ادب
ابتدا حلول سال 1400 و نوروز باستانی رو خدمت شما تبربک عرض میکنم
دربعد مجددا بابت قبول زحمت تهیه نمونه گزارش بسیار بسیار ممنون و سپاسگزارم
مثل همیشه خیلی مختصر و عالی
بابت کدها که روی برنامه خودم پیاده کردم مثل ساعت کار میکنه
بابت چک کردن فرمولها و محاسبه درصدها و عملکرد اونم چشم حتما با اون نحوه محاسبه مدنظر چک میکنم و اگر سئوالی بود با اجازتون بازم مزاحم میشم
فقط تا فراموش نکردم بپرسم که چرا گزارش عملکردی که از طریق فرم لود میشه قابلیت تغییر در نوع فونت رو نداره ( در واقع فونتهای فارسی رو هر چند درحالت ویرایش قبول میکنه ولی زمانی که فرم رو اجرا میکنم مجددا فرمتها به حالت اولیه برمیگرده )
بازم ممنون از وقت و حو صله ای که گذاشتید.

iransim
چهارشنبه 04 فروردین 1400, 11:35 صبح
جناب Mazoolagh سلام و عرض ادب
با پوزش بابت زحمت مجدد
در نمونه زیر با استفاده از نمونه گزارش شما دو عملکرد و رتبه بندی ( رتبه گروه A , رتبه گروه B ) رو میخواستم انجام بدم ، برای این کار نیاز به جمع کل پروژه های ابلاغی و جمع کل پروژه های تحویلی در سال انتخابی دارم که هر کاری کردم نتونستم با تابع SUM در کوئری اون رو محاسبه کنم
اگر در خصوص نحوه محاسبه جمع کل راهنمائی کنید ممنون میشم
البته این نکته رو هم بگم عملکرد و رتبه بندی که در نمونه های قبلی انجام دادیم در واقع همون رتبه بندی گروه B هست ، ولی در گروه A عملکرد : نسبت پروژه های تحویلی هر ناحیه به کل پروژه های ابلاغی مدیریت در سال انتخابی میباشد
یعنی (جمع کل ابلاغی مدیریت در سال انتخابی / تحویلی ناحیه در سال انتخابی = A گروه )

مثلا برای ناحیه آبپخش درصد عملکرد باید عملکرد گروه ( A = 63*100/529 =11.91 ) و با ضریب وزنی (11.91%)(21%) که عدد 529 جمع کل پروژه های ابلاغی مدیریت میباشد .

mazoolagh
شنبه 14 فروردین 1400, 11:25 صبح
در نمونه زیر با استفاده از نمونه گزارش شما دو عملکرد و رتبه بندی ( رتبه گروه A , رتبه گروه B ) رو میخواستم انجام بدم ، برای این کار نیاز به جمع کل پروژه های ابلاغی و جمع کل پروژه های تحویلی در سال انتخابی دارم که هر کاری کردم نتونستم با تابع SUM در کوئری اون رو محاسبه کنم
...
...


سلام و روز خوش
نوروز شما و همه اعضا مبارک

سر فرصت برنامه تون رو نگاه میکنم.
هر چند پیوست برنامه کار خیلی خوبی هست، ولی اینجور مواقع اگر اسکرین شات هم بگذارید و روی اون مشکل یا خواسته رو نشون بدید خیلی موثر هست.

جمع مواردی که گفتین در هر دو برنامه آمده، تا جایی که یادم هست همه محاسبات پروژه ها رو آوردم، فقط محاسبه اعتبارات رو گذاشتم خودتون تکمیل کنین چون دقیقا فرمول ها مشابه هست.

iransim
شنبه 14 فروردین 1400, 14:03 عصر
سلام و روز خوش
نوروز شما و همه اعضا مبارک

سر فرصت برنامه تون رو نگاه میکنم.
هر چند پیوست برنامه کار خیلی خوبی هست، ولی اینجور مواقع اگر اسکرین شات هم بگذارید و روی اون مشکل یا خواسته رو نشون بدید خیلی موثر هست.

جمع مواردی که گفتین در هر دو برنامه آمده، تا جایی که یادم هست همه محاسبات پروژه ها رو آوردم، فقط محاسبه اعتبارات رو گذاشتم خودتون تکمیل کنین چون دقیقا فرمول ها مشابه هست.

سلام و عرض ادب
عرض شود خدمت شما که چون منظور همان برنامه پیوست در پست 31 بود که زحمت کشیده بودید از پیوست مجدد خودداری کردم
منظور از سئوال این بود که برای رتبه گروه A و B تغییراتی انجام بشه که برای ( رتبه گروه A تعداد پروژه تحویل شده هر ناحیه در کل سنوات تقسیم بر کل تحویل شده در کل سنوات محاسبه میشود ) و برای ( رتبه گروه B تعداد پروژه تحویل شده هر ناحیه در سال جاری تقسیم بر کل تحویل شده مدیریت در همان سال جاری محاسبه میشود )
در واقع محاسبات بروی تحویل شده هر ناحیه نسبت به تحویل شده کل در کل سنوات و سال جاری مد نظر میباشد . ( در رتبه بندی های قبل نسبت تحویل شده به ابلاغی محاسبه میشد )

یا به عبارت دیگر
رتبه گروه A : محاسبه نسبت تحویل تحول انجام شده توسط هر ناحیه به کل تحول تحول انجام شده در مدیریت در سال انتخابی
رتبه گروه B : محاسبه نسبت تحویل تحول انجام شده توسط هر ناحیه به کل تحول تحول انجام شده همان ناحیه در سال انتخابی

mazoolagh
یک شنبه 15 فروردین 1400, 13:18 عصر
فکر کنم منظور شما این خطا بوده:
153195

علتش این هست که در زیرلایه های کوئری نهایی از sum استفاده شده و دوباره sum گرفتن روی اون پیچیده است.

شما میتونین یک جدول با ساختار همین کوئری نهایی بسازین و از این جدول بعنوان سورس گزارش استفاده کنین.

mazoolagh
یک شنبه 15 فروردین 1400, 13:26 عصر
1- لازم نیست که این جدول رو دستی طراحی کنین، کافی هست کد زیر رو یک بار اجرا کنین:
SELECT * INTO Tbl_AB_ROTBEH FROM AB_ROTBEH

2- record source گزارش رو به جدول Tbl_AB_ROTBEH تغییر بدین

3- در فرم FrmFirst ماکرو که برای رخداد باتن تعریف کردین بردارین و بجاش کد زیر رو بگذارین:
Private Sub Command7_Click()
DoCmd.RunSQL "DELETE FROM Tbl_AB_ROTBEH"
DoCmd.RunSQL "INSERT INTO Tbl_AB_ROTBEH SELECT * FROM AB_ROTBEH"
DoCmd.OpenReport "AB_Rotbeh", acViewReport
End Sub

mazoolagh
یک شنبه 15 فروردین 1400, 13:44 عصر
این تغییرات رو در برنامه پیوست اعمال کردم.
فکر کنم بعد از این دیگه مشکل خاصی نداشته باشین.

میتونستیم از ابتدا بجای استفاده از کوئری های متعدد، مستقیما با پردازش جدول TblSabt و ریختن نتایج در یک جدول (میتونه همین جدول نواحی باشه که فیلدهای لازم رو بهش اضافه کردیم) هم به جواب برسیم.
البته تفاوت در این هست که باید کد بنویسیم.
من برای تکمیل بحث و امکان مقایسه این دو روش، سر فرصت یک برنامه دیگه بر این اساس مینویسم.

iransim
دوشنبه 16 فروردین 1400, 13:09 عصر
این تغییرات رو در برنامه پیوست اعمال کردم.
فکر کنم بعد از این دیگه مشکل خاصی نداشته باشین.

میتونستیم از ابتدا بجای استفاده از کوئری های متعدد، مستقیما با پردازش جدول TblSabt و ریختن نتایج در یک جدول (میتونه همین جدول نواحی باشه که فیلدهای لازم رو بهش اضافه کردیم) هم به جواب برسیم.
البته تفاوت در این هست که باید کد بنویسیم.
من برای تکمیل بحث و امکان مقایسه این دو روش، سر فرصت یک برنامه دیگه بر این اساس مینویسم.

عرض سلام و ادب مجدد
و بازم تشکر به خاطر پیگیری بحث و نمونه ای که ارائه کردید.

خطا در تابع Sum دقیقا همونی بود که گفتید و بازم منتظر نمونه کاری که فرمودید هستم .
فقط در توضیح بیشتر اینکه : همانطور که در پست 35 اشاره کردم در رتبه بندی گروه های A و B
در واقع در کوئری AMALKARD : برای گروه A فیلد PAS (عملکرد ناحیه نسبت به کل عملکرد مدیریت در سال جاری ) به جای فرمول ( PAS: [TP].[PTS]/[EP].[PES] ) باید به شکل ( جمع کل تحویل و تحول مدیریت در سال /تحویل و تحول ناحیه در سال : PAS ) محاسبه شود
و برای گروه B فیلد PAS (عملکرد ناحیه نسبت به خود ناحیه در سال جاری ) به جای فرمول ( PAS: [TP].[PTS]/[EP].[PES] ) باید به شکل ( ابلاغی ناحیه در سال / تحویل و تحول ناحیه در سال : PAS ) محاسبه شود

فایل تصویر پیوست نیز برای توضیح بیشتر محاسبات ضمیمه کردم

mazoolagh
پنج شنبه 19 فروردین 1400, 08:10 صبح
1- دوباره برنامه پیوست شما در پست 33 رو چک کردم.
اونچه باعث میشه نتونین روی رکوردها sum بگیرین اینه که کوئری نادرست بعنوان دیتاسورس گزارش تعریف کردین:
شما از کوئری رتبه بندی استفاده کردین در حالی که باید کوئری عملکرد باشه (برنامه پست 31)
این مورد رو من هم دقت نکرده بودم، بنابراین برنامه پست 38 کلا موضوعیت نداره و همون برنامه پست 31 رو مبنای کار قرار بدین.

2- وقتی که جمع پروژه ها (و اعتبارات) رو دارین (چه کل سنوات و چه سال انتخابی) برای مابقی محاسبات دیگه نباید مشکلی باشه.
این جمع ها رو میتونین با dsum یا یک کوئری گروه بندی شده بدست بیارین و در فرمولها قرار بدین.

3- قولی که در پست 38 دادم (یک جدول بجای چندین کوئری) سر جای خودش هست و اگر مشکلی پیش نیاد امروز آماده میکنم.

mazoolagh
پنج شنبه 19 فروردین 1400, 16:41 عصر
1- یک جدول موقتی TEMP_AMALKARD میسازیم برای محاسبه تعداد پروژه و اعتبار هر ناحیه (IDNAHI , N , E)

2- یک جدول موقتی TEMP_RANKS میسازیم برای محاسبه رتبه (IDNAHI , RANK)

3- همه فیلدهای لازم رو به جدول نواحی اضافه میکنیم.
برای راحتی کار فیلدهای جمع رو هم اضافه میکنیم، بعنوان مثال PTS_SUM برای جمع پروژه های تحویل شده در سال.

دیگه فرم و ریپورت طراحی نکردم و گذاشتم بعهده خودتون،
ولی روتین محاسبه (CALC) رو میتونین هر جا نیاز داشتین صدا بزنین، فقط کافی هست مقدار سال رو بهش معرفی کنین.

mazoolagh
پنج شنبه 19 فروردین 1400, 16:44 عصر
Option Compare Database
Option Explicit
Const WhrE = "Pol>0" ' EBLAGH
Const WhrT = "Pol>0 And Emtiaz>0" ' TAHVIL


Const Make_Temp_Amalkard = "INSERT INTO Temp_Amalkard (IDNahi,N,E) " & _
"SELECT IDNahi,Count(NumPro) AS N, Sum(Pol) AS E " & _
"FROM TblSabt WHERE (@WHR) " & _
"GROUP BY IDNahi"

Const Update_From_Temp_Amalkrd = "UPDATE NAVAHI as N INNER JOIN Temp_Amalkard AS T ON N.IDNAHI=T.IDNahi " & _
"SET @F1=T.N, @F2=T.E"

Const Make_Temp_Ranks = "INSERT INTO Temp_Ranks (IDNahi,Rank) " & _
"SELECT A.IDNahi, (SELECT COUNT (*)+1 FROM (SELECT @X FROM NAVAHI) AS B WHERE A.@X<B.@X) AS Rank " & _
"FROM NAVAHI AS A"

Const Update_From_Temp_Ranks = "UPDATE Navahi AS N INNER JOIN Temp_Ranks AS T ON N.IDNahi=T.IDNahi " & _
"SET N.@X = T.Rank"
Public Sub CALC(SAL As Long)

PROCESS WhrE, "PEK", "EEK"
PROCESS WhrT, "PTK", "ETK"
PROCESS WhrE & " AND SAL=" & SAL, "PES", "EES"
PROCESS WhrT & " AND SAL=" & SAL, "PTS", "ETS"

Calc_Rank "PAK", "PRK"
Calc_Rank "PASB", "PRSB"
Calc_Rank "EAK", "ERK"
Calc_Rank "EASB", "ERSB"

Calc_Rank "PAWK", "PRWK"
Calc_Rank "PAWSB", "PRWSB"
Calc_Rank "EAWK", "ERWK"
Calc_Rank "EAWSB", "ERWSB"

Calc_Rank "PASA", "PRSA"
Calc_Rank "PAWSA", "PRWSA"

Calc_Rank "EASA", "ERSA"
Calc_Rank "EAWSA", "ERWSA"

DoCmd.RunSQL ("UPDATE NAVAHI SET PTS_SUM=" & DSum("PTS", "NAVAHI"))
DoCmd.RunSQL ("UPDATE NAVAHI SET ETS_SUM=" & DSum("ETS", "NAVAHI"))

End Sub


Private Sub PROCESS(WHR As String, Fld1 As String, Fld2 As String)
DoCmd.RunSQL ("DELETE FROM Temp_Amalkard")
DoCmd.RunSQL (Replace(Make_Temp_Amalkard, "@WHR", WHR))
DoCmd.RunSQL (Replace(Replace(Update_From_Temp_Amalkrd, "@F1", Fld1), "@F2", Fld2))
End Sub


Private Sub Calc_Rank(FldA As String, FldR As String)
DoCmd.RunSQL ("DELETE FROM Temp_Ranks")
DoCmd.RunSQL (Replace(Make_Temp_Ranks, "@X", FldA))
DoCmd.RunSQL (Replace(Update_From_Temp_Ranks, "@X", FldR))
End Sub

mazoolagh
پنج شنبه 19 فروردین 1400, 16:49 عصر
طبق معمول نتایج رو چک کنین!

iransim
پنج شنبه 19 فروردین 1400, 22:21 عصر
طبق معمول نتایج رو چک کنین!

سلام و عرض ادب : لازم میدونم قبل از چک و کنترل برنامه از لطف و همراهی شما تشکر کنم و طبق معمول اگر سئوالی بود که مزاحم میشم

iransim
شنبه 21 فروردین 1400, 12:08 عصر
1- دوباره برنامه پیوست شما در پست 33 رو چک کردم.
اونچه باعث میشه نتونین روی رکوردها sum بگیرین اینه که کوئری نادرست بعنوان دیتاسورس گزارش تعریف کردین:
شما از کوئری رتبه بندی استفاده کردین در حالی که باید کوئری عملکرد باشه (برنامه پست 31)
این مورد رو من هم دقت نکرده بودم، بنابراین برنامه پست 38 کلا موضوعیت نداره و همون برنامه پست 31 رو مبنای کار قرار بدین.

2- وقتی که جمع پروژه ها (و اعتبارات) رو دارین (چه کل سنوات و چه سال انتخابی) برای مابقی محاسبات دیگه نباید مشکلی باشه.
این جمع ها رو میتونین با dsum یا یک کوئری گروه بندی شده بدست بیارین و در فرمولها قرار بدین.

3- قولی که در پست 38 دادم (یک جدول بجای چندین کوئری) سر جای خودش هست و اگر مشکلی پیش نیاد امروز آماده میکنم.


سلام و عرض ادب
دوست عزیز متاسفانه مشکل اصلی من هم همین بند 2 هست
یعنی در انتهای جدول با تابع DSUM مقادیر جمع کل ابلاغی و تحویل شده در سال را برای محاسبه عملکرد گروه A بدست آوردم ، ولی متاسفانه قادر به محاسبه و رتبه بندی این عملکرد نیستم ( با تغییر دیتا سورس از رتبه به عملکرد نیز موفق نشدم چون فرمول رتبه بندی A در کوئری عملکرد و رتبه آورده نشده در نتیجه قابل رتبه بندی هم نبود )
اگه ی نگاهی به نمونه پیوست کنید ممنون میشم

mazoolagh
شنبه 21 فروردین 1400, 15:11 عصر
سلام و عرض ادب
دوست عزیز متاسفانه مشکل اصلی من هم همین بند 2 هست
یعنی در انتهای جدول با تابع DSUM مقادیر جمع کل ابلاغی و تحویل شده در سال را برای محاسبه عملکرد گروه A بدست آوردم ، ولی متاسفانه قادر به محاسبه و رتبه بندی این عملکرد نیستم ( با تغییر دیتا سورس از رتبه به عملکرد نیز موفق نشدم چون فرمول رتبه بندی A در کوئری عملکرد و رتبه آورده نشده در نتیجه قابل رتبه بندی هم نبود )
اگه ی نگاهی به نمونه پیوست کنید ممنون میشم

سلام و روز خوش
در این برنامه آخر (پست 43) هم رتبه بندی گروه A و B هست و هم محاسبات اعتبار (علاوه بر پروژه)
همین رو ملاک قرار بدین چون کامل هست، فقط مقادیر و فرمول ها رو چک کنین.

برنامه های قبلی هم sum رو درست انجام میدن و در ریپورت هم میتونید ببینین،
شما همون ها رو هم میتونین استفاده کنین ولی باید محاسبات رو خودتون اضافه کنین که این آخری دیگه نیاز نداره.

iransim
سه شنبه 24 فروردین 1400, 08:47 صبح
سلام و عرض ادب
بازم بابت ایده و نمونه برنامه آخر تشکر میکنم ، دارم از اون برای برنامه خودم استفاده میکنم ولی هنوز کامل موفق نشدم ولی مشکلی که باهاش برخورد کردم اینه که :
در نمونه برنامه های قبلی ( نمونه پیوست ) با مشکلی مواجه شدم
در سال 1400 یک پروژه ای ابلاغ شده ولی وقتی سال 1400 رو از لیست انتخاب میکنم هیچ اطلاعاتی در گزارش نمایش داده نمیشه ممنون میشم که اگه مثل همیشه لطف کنید راهنمائی بفرمائید .

iransim
سه شنبه 24 فروردین 1400, 11:45 صبح
در ضمن نکته ای رو که فراموش کردم ، نمونه ای رو که زحمت کشیدید ( پست 43 ) وقتی باز میکنم و میخوام جداول رو باز کنم این خطا رو میده ( تصویر پیوست ) در صورتی که قبلا همین نمونه رو که در پستهای قبل ضمیمه کرده بودید باز کردم و هیچ خطائی هم نداشت

mazoolagh
یک شنبه 29 فروردین 1400, 12:48 عصر
سلام و روز خوش
پیام خطا به دلیل ورژن اکسس هست، نمونه پیوست رو چک کنین:

iransim
چهارشنبه 01 اردیبهشت 1400, 12:46 عصر
سلام و روز خوش
پیام خطا به دلیل ورژن اکسس هست، نمونه پیوست رو چک کنین:

سلام دوست عزیز
ممنون بابت قبول زحمت ، میریم که ببینیم چه کار میتونیم بکنیم با نمونه شما

iransim
یک شنبه 05 اردیبهشت 1400, 11:18 صبح
دوست عزیز جناب mazoolagh (https://barnamenevis.org/member.php?9893-mazoolagh) سلام و عرض ادب
طاعات و عبادات قبول باشه
با عرض پوزش بابت زحمت مجدد ، باور کنید این چند روز هر راهی رو امتحان کردم نشد ، راستش دیگه کلافه شدم
من ایده شما رو که خواستم تو برنامه خودم پیاده کنم با ی مشکل مواجه شدم ( برنامه پیوست )
برای گزارشم نیاز به پارامترهای محاسباتی جدول TblNahi دارم ( مثل PAK , PRK , PASW ,PRSW ,PASB , PRSB , PAWSB , PRWSB ) در صورتی که جدول ارتباطی با گزارش ( Tbl_AB_ROTBEH و AB_ROTBEH ) این فیلدها رو نداره و نمیتونم ارتباط بین اونا رو برقرار کنم
در ضمن از Temp_Amalkard و Temp_Ranks هم متوجه نشدم که کجا استفاده کنم
میشه زحمت بکشید و ی نگاهی به برنامه بندازید ؟ ( میخام فیلدهائی که تو جدول لینک کردم رو داشته باشم )
سپاس فراوان

mazoolagh
دوشنبه 06 اردیبهشت 1400, 14:26 عصر
سلام و روز خوش
1- در همون پست 41 توضیح دادم که TEMP_AMALKARD , TEMP_RANKS دو جدول موقتی هستن، یعنی فقط در زمان محاسبه استفاده میشن ولی خودشون در خروجی استفاده نمیشن.
ولی باید باشن و نمیشه اونها رو پاک کرد.
2- هر بار که روتین CALC رو اجرا میکنین، با توجه به آرگومان سال (SAL) ، تمام نتایج در همون جدول NAVAHI میشینه.
3- نیاز به هیچ جدول یا کوئری دیگه نیست، باید مستقیما جدول NAVAHI رو بعنوان رکوردسورس گزارش قرار بدین.
4- روشی که در این برنامه به کار رفته (پست 43 یا پست 49) با نمونه های قبلی کلا متفاوت هست، اون ها برای پرسش اولیه هستن و کارشون هم تموم شده - ابجکتهای اونها رو با این یکی ادغام نکنین!
5- نمونه پیوست همون برنامه پست 43 (یا پست 49) هست فقط فرم انتخاب سال و گزارش هم بهش اضافه شده.

اگر در فرمول ها و نتایج مشکلی هست خبر بدین، وگرنه که این بخش هم مختومه است.

153264

iransim
سه شنبه 07 اردیبهشت 1400, 10:06 صبح
سلام و روز خوش
1- در همون پست 41 توضیح دادم که TEMP_AMALKARD , TEMP_RANKS دو جدول موقتی هستن، یعنی فقط در زمان محاسبه استفاده میشن ولی خودشون در خروجی استفاده نمیشن.
ولی باید باشن و نمیشه اونها رو پاک کرد.
2- هر بار که روتین CALC رو اجرا میکنین، با توجه به آرگومان سال (SAL) ، تمام نتایج در همون جدول NAVAHI میشینه.
3- نیاز به هیچ جدول یا کوئری دیگه نیست، باید مستقیما جدول NAVAHI رو بعنوان رکوردسورس گزارش قرار بدین.
4- روشی که در این برنامه به کار رفته (پست 43 یا پست 49) با نمونه های قبلی کلا متفاوت هست، اون ها برای پرسش اولیه هستن و کارشون هم تموم شده - ابجکتهای اونها رو با این یکی ادغام نکنین!
5- نمونه پیوست همون برنامه پست 43 (یا پست 49) هست فقط فرم انتخاب سال و گزارش هم بهش اضافه شده.

اگر در فرمول ها و نتایج مشکلی هست خبر بدین، وگرنه که این بخش هم مختومه است.

153264

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

mazoolagh
چهارشنبه 08 اردیبهشت 1400, 16:53 عصر
سلام و روز خوش
خوشحالم که تاپیک به نتیجه رسید و شما هم به اونچه که مد نظرتون بود رسیدین.
تلاش و پشتکار خودتون رو هم دست کم نگیرین.
امیدوارم برای دوستانی هم که بحث رو پیگیری میکردن مفید بوده باشه.

mazoolagh
چهارشنبه 08 اردیبهشت 1400, 17:07 عصر
گرچه تاپیک به نتیجه رسیده، ولی روش دیگه ای هم برای حل این نوع مسائل (محاسبات انباشته) هست.
به این صورت که تمامی محاسبات مستقیما هنگام افزودن رکورد به جدول (insert) ، یا ویرایش (update) و یا پاک کردن رکورد از جدول (delete) و درون خود جدول انجام میشه.
بنابراین همیشه نتایج آماده است و نیازی نیست که قبل از باز کردن ریپورت یا فرم، محاسباتی رو که ممکنه وقت گیر هم باشه، انجام بدیم.

فرصت کنم برای این هم یک نمونه میگذارم.

iransim
پنج شنبه 09 اردیبهشت 1400, 01:41 صبح
گرچه تاپیک به نتیجه رسیده، ولی روش دیگه ای هم برای حل این نوع مسائل (محاسبات انباشته) هست.
به این صورت که تمامی محاسبات مستقیما هنگام افزودن رکورد به جدول (insert) ، یا ویرایش (update) و یا پاک کردن رکورد از جدول (delete) و درون خود جدول انجام میشه.
بنابراین همیشه نتایج آماده است و نیازی نیست که قبل از باز کردن ریپورت یا فرم، محاسباتی رو که ممکنه وقت گیر هم باشه، انجام بدیم.

فرصت کنم برای این هم یک نمونه میگذارم.

سلام و عرض ادب
ضمن تشکر از ابراز لطف شما ، خیلی خوشحالم که با دوستی چون شما که مطلع و پیگیر هستید آشنا شدم
هر چند باعث زحمت و صرف وقت گرانبهای شماست ولی مشتاقانه منتظر ارائه نمونه و راهکار جدید شما هستم
بازم ممنون و سپاسگزارم .