الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

طلب كود برمجي لجمع معلومات الشهر الحالي مع معلومات الشهر السابق والشهر القادم نفس العملية

بدأه كمال العراقي في 23 مارس 2016 · 11 رد · 618 مشاهدة · في قواعد بيانات Visual FoxPro
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

الاخوة الكرام حياكم الله قمت بالبحث في المنتدى عن سؤالي فلم اجد له جواب 

وسؤالي هو : احصائية لعدد ساعات العمل للموظفين لشهر شباط لسنة 2016 ظهر مثلا 20

ولشهر اذار لنفس السنة ظهر 30

المطلوب جمع نتيجة الشهر الحالي مع نتيجة الشهر السابق واذا جاء شهر نيسان يقوم بجمع ثلاثة اشهر (شباط+اذار+نيسان) وهكذا لبقية الاشهر

ارجو ان يكون السؤال واضحا ؟

#2

وعليكم السلام ورحمة الله وبركاته

يصعب اعطاء حل فعلي بدون معرفة طريقة تنظيم الجداول لديك، ولكن كفكرة قد يفيدك التالي :

على افتراض ان الجدول التالي يحتوي على البيانات المراد فرزها والمكونة من التاريخ وعدد ساعات الدوام ورقم الموظف

CREATE CURSOR Atnd ( EmpId i, dDate d, hHours n(20,3))

 

- نبدأ بانشاء جدول مؤقت لغايات حفظ النتائج حسب الشهر والموظف، ممكن أن يكون على النحو التالي :

CREATE CURSOR crsTest (EmpId i(4), EmpName c(30),;
	M1 N(20,3) DEFAULT 0, M2 N(20,3) DEFAULT 0, M3 N(20,3) DEFAULT 0, M4 N(20,3) DEFAULT 0,;
	M5 N(20,3) DEFAULT 0, M6 N(20,3) DEFAULT 0, M7 N(20,3) DEFAULT 0, M8 N(20,3) DEFAULT 0,;
	M9 N(20,3) DEFAULT 0, M10 N(20,3) DEFAULT 0, M11 N(20,3) DEFAULT 0, M12 N(20,3) DEFAULT 0,;
	TOTAL N(20,3) DEFAULT 0)

- ثم نبدأ  بجمع وفرز عدد ساعات دوام الموظفين حسب الشهر والاسم   :

SELECT a.EmpId, a.nMonth, SUM(a.hHours) AS hHours FROM ;
( SELECT EmpId, MONTH(dDate) AS nMonth, hHours FROM Atnd ) a;
	GROUP BY nMonth, EmpId;
	INTO CURSOR crsTemp ORDER BY EmpId

وننتهي بتعبئة النتائج في الجدول المؤقت على النحو التالي :

حفظ ارقام واسماء الموظفين في الجدول المؤقت -  حتى يكون جاهز مباشرة لعمل Update في الخطوة التالية 

INSERT INTO crsTest (EmpId) SELECT DIST(EmpId) FROM crsTemp

ثم عمل Update للبيانات حسب التالي :

SELECT crsTemp
GO TOP
SCAN
	m.eId = NVL(EmpId,0)
	m.Mon = NVL(nMonth,0)
	m.Hor = NVL(hHours,0)
	lcField = "M"+TRANSFORM(m.Mon)
	UPDATE crsTest SET &lcField=m.Hor WHERE EmpId = m.eId
ENDSCAN

SELECT crsTest
REPLACE TOTAL WITH M1+M2+M3+M4+M5+M6+M7+M8+M9+M10+M11+M12 ALL
GO TOP
BROW

 

مع التحية

أستغفر الله العظيم و أتوب إليه

#3

جزاك الله خيرا ساقوم بتجربة الكود وارى النتيجة شكرا على الاجابة وبارك الله فيك اخي

#5

اخي العزيز كمال الرجاء منك ومن جميع الأعضاء الكرام إرفاق مثال او العمل الذي يبحث عن الإجابة عنه لسرعه الإجابة 

وتحياتي للجميع

#6

العفو اعزائي

أخي كمال كل ما عليك عمله هو ايصال البيانات الخاصة بك للجدول المؤقت الأول المسمى Atnd

وأضف له اسم الموظف ليصبح على النحو التالي :

CREATE CURSOR Atnd ( EmpId i, EmpName c(100), dDate d, hHours n(20,3))

وغيّر أمر 

INSERT INTO crsTest (EmpId) SELECT DIST(EmpId) FROM crsTemp

ليصبح

INSERT INTO crsTest (EmpId, EmpName) SELECT DIST(EmpId), EmpName FROM Atnd

وذلك لاظهار الأسماء مع الأرقام مرة واحد

أستغفر الله العظيم و أتوب إليه

#7

اشكركم على حسن متابعتكم

ساضع المثال التالي لكي يكون الامر واضحا

عندنا عدد الموظفين الكلي= 2000 موظف

وعدد ايام الاجازات لجميع الموظفين خلال الشهر الواحد = 9998

المطلوب 1- عدد ساعات العمل لجميع الموظفين حسب هذه المعادلة (عدد الموظفين * 22 * 8) - مجموع عدد ايام الاجازات خلال الشهر لجميع الموظفين  . (حيث 22 ايام عمل الموظفين الحقيقي ، مطروحا منه ايام العطل وهي 8 ايام ، و8 عدد ساعات العمل خلال اليوم والواحد) 

يعني (2000 * 22 * 8 ) - 9998   المعادلة الاولى = 342002

2- بعد اظهار نتيجة المعادلة الاولى ، نحتاج الى ايجاد المتراكم من عدد ساعات العمل للشهر الحالي مضافا اليه نتيجة عدد ساعات العمل للشهر الماضي 

يعني 342002  +  نتيجة الشهر الماضي وليكن 342000 وهكذا بالنسبة للشهر القادم يقوم بجمع الشهر الاول مع الشهر الثاني مع الشهر الثالث وهكذا كل شهر يقوم بجمع الشهر الحالي زائدا الاشهر الماضية 

 

ارجو ان يكون المثال واضحا

#8

بالنسبة للنقطة الاولى : موضوعها عندك،

أي عليك استخراج الأرقام النهائية لكل شهر / والتي قمت بالتعويض عنها بالأمثلة التالية بالمتغيرات m.nMonth1 ولغاية 12 

أما الثانية فحاول الاستفادة من الأمثلة التالية : 

المثال الأول لاظهار النتائج في سجل واحد

 

STORE 0 TO m.nMonth1, m.nMonth2, m.nMonth3, m.nMonth4, m.nMonth5,;
	m.nMonth6, m.nMonth7, m.nMonth8, m.nMonth9, m.nMonth10,;
	m.nMonth11, m.nMonth12
m.nMonth1 = 500
m.nMonth2 = 600
m.nMonth3 = 700
m.nMonth4 = 800
m.Total = 0
CREATE CURSOR crsTest (;
	M1 N(20,3) DEFAULT 0, M2 N(20,3) DEFAULT 0, M3 N(20,3) DEFAULT 0, M4 N(20,3) DEFAULT 0,;
	M5 N(20,3) DEFAULT 0, M6 N(20,3) DEFAULT 0, M7 N(20,3) DEFAULT 0, M8 N(20,3) DEFAULT 0,;
	M9 N(20,3) DEFAULT 0, M10 N(20,3) DEFAULT 0, M11 N(20,3) DEFAULT 0, M12 N(20,3) DEFAULT 0)
APPEND BLANK
FOR i = 1 TO 12
	lcMotnh = "nMonth"+TRANSFORM(i)
	IF &lcMotnh > 0
		m.Total = m.Total + &lcMotnh
		lcField = "M"+TRANSFORM(i)
		REPLACE &lcField WITH m.Total
	ENDIF
NEXT
Brow

المثال الثاني لاظهار نتائج كل شهر في سجل خاص 

STORE 0 TO m.nMonth1, m.nMonth2, m.nMonth3, m.nMonth4, m.nMonth5,;
	m.nMonth6, m.nMonth7, m.nMonth8, m.nMonth9, m.nMonth10,;
	m.nMonth11, m.nMonth12
m.nMonth1 = 500
m.nMonth2 = 600
m.nMonth3 = 700
m.nMonth4 = 800
m.Total = 0
CREATE CURSOR crsTest ( nMonth INT AUTOINC, Amount N(20,3), Total N(20,3) )
FOR i = 1 TO 12
	APPEND BLANK
	lcMotnh = "nMonth"+TRANSFORM(i)
	IF &lcMotnh > 0
		m.Total = m.Total + &lcMotnh
		REPLACE Amount WITH &lcMotnh, Total WITH m.Total
	ENDIF
NEXT
brow

أستغفر الله العظيم و أتوب إليه

#9

شكرا اخي عالفكرة طبقتها ولكنه يريد مني ادخال بيانات الاشهر السابقة ، وانا اريد ان تظهر النتيجة انيا ، وقد وجدت الحل والحمد لله بمساعدة احد الاخوة اضعه بين ايديكم لكي تستفيدوا منه فهو برنامج سهل وفعال 100 %

re1=0

re2=0

GO top

DO WHILE NOT EOF()

STORE result TO re1

re2=re2+re1

REPLACE amount WITH re2

SKIP

enddo

#10

العفو عزيزي... والحمد لله انها حُلّت

أستغفر الله العظيم و أتوب إليه

#11

شكري وتقديري للأخ عبدالله الجلاد للمجهود الرائع والأمثلة الرائعه التي لانحتاج الى أضافه لها ولهذا اكتفيت بالمتابعة معهٌ

وشكرا للأخ كمال على تبادل المعلومات

#12

العفو أخي فراس..

أستغفر الله العظيم و أتوب إليه

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…