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

معرفة اسماء الموظفين التابعين للمدير

مغلق
بدأه AbuZakaria في 15 يناير 2006 · 12 رد · 2,213 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي جدول للموظفين به الحقول الاتية

رقم الموظف , اسمه , رقم مديره

اريد طريقة للحصول على اسماء الموظفين التابعين لاي مدير تبعية مباشرة او غير مباشره

مثال

رقم الموظف        اسمه           رقم المدير

1                     سعيد            NULL

2                     محمود                4

3                    مدحت                  2

4                    هبة                    1

5                   جورج                  4

6                  حسام                   1

فلو اردت معرفة الموظفين التابعين لهبة مثلا يجب ان تكون النتيجة

محمود ,مدحت,جورج

لو اردت معرفة الموظفين التابعين لسعيد مثلا تكون النتيجة

هبة ,محمود,مدحت ,جورج,حسام

برجاء المساعدة لما به فائدة لاعصاء المنتدى

تم تعديل هذه المشاركة بواسطة AbuZakaria في 15 يناير 2006 في 23:57

#2

هل من الممكن ان ترينا ماذا قمت به من تجارب ؟

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#3

هل ممكن تجرب هذا الكود

لو كان المدير هبة ورقمها 4

select emp_name from table_name where mang_no = 4

فما الرأى

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#4

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

بالنسبة للأخ طارق ابراهيم فقد عملت كود يحضر أي حتى عدد 4 مستويات و ممكن بالطبع الزيادة و لكن ما اريده هو طريقة ديناميكية بحيث يحسب لوحده عدد المستويات

و كما ترى الطريقة معقدة جدا و انا في اعتقادي ان الطرق المعقدة غير جيدة

أعتقد ان الحل لا بد ان يكون به Recargion

CREATE PROCEDURE dbo.BossEmps
@BigBossNo INT
AS

BEGIN
  SELECT  EmpNo,  Name,    BossNo FROM  EmpData
WHERE
  (BossNo = @BigBossNo) OR
  (BossNo IN (SELECT EmpNo FROM EmpData WHERE (BossNo = @BigBossNo))) OR
  (BossNo IN (SELECT EmpNo FROM EmpData WHERE (BossNo IN (SELECT EmpNo FROM EmpData WHERE (BossNo = @BigBossNo))))) OR
  (BossNo IN  (Select EmpNo From EmpData Where BossNo IN (SELECT EmpNo FROM EmpData WHERE (BossNo IN (SELECT EmpNo FROM EmpData WHERE (BossNo = @BigBossNo))))))
END

تم تعديل هذه المشاركة بواسطة AbuZakaria في 16 يناير 2006 في 20:06

#5

جزاك الله كل الخير على الكود

هل جربته ونجح معك؟

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#6

نعلم الكود نجح و لكن كما قلت نريد كود افضل

#7

السلام عليكم

كما لاحظتم الكود الذي وصلت الية ملئ بجمل الاستعلام مما يجعله بطئ جدا كيف يمكن عمل كود اسرع و اكثر فعالية يا شباب

#8

فى حال كان ال BossNo و ال EmpNo مفاتيح رئيسية فى جدول المديرين و جدول الموظفين فهم إذاً Clustered Index فراجع ال Estimated Time للتنفيذ لترى اين البطء فى التنفيذ و ربما تكون المشكلة من التصميم الفيزيائى لقاعدة البيانات Physical Design

لا يمكننا التحديد بالضبط ما دمنا لا نعلم عن اعدادات بيئتك

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#9

أولا شكرا اخ طارق على الرد

لقد فهمت من كلامك اننا يمكن ان نعرف اين هو البطء في الكود فهل من الممكن ان توضح اكثر عن الطريقة المتبعة بشئ من التفصيل

و لكننى اعتقد ان سبب البطء الشيد هو العدد الكبير من الSelect داخل الكود مع العلم ان جدول الموظفين يحتوى على 55000 سجل

برجاء المساعدة

تم تعديل هذه المشاركة بواسطة AbuZakaria في 16 فبراير 2006 في 17:05

#10

بسم الله الرحمن الرحيم

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

http://msdn.microsoft.com/library/?url=/li...tml/sql03b8.asp

وأيضا هذا الينك دلتنى عليه أحدى الأخوات وأعتقد انه به الحل

http://www.sqlteam.com/item.asp?ItemID=8866

وفقك الله ان شاء الله

تم تعديل هذه المشاركة بواسطة enjyshahin في 16 يوليو 2006 في 00:27

يا حى يا قيوم برحمتك أستغيث اصلح لى شأنى كله ولا تكلنى إلى نفسى طرفة عين

اللهم أعنا على ذكرك وشكرك وحسن عبادتك

اللهم انك عفو كريم حليم تحب العفو فاعفو عنا

اللهم إنى أسألك رضاك والجنة وأعوذ بك من سخطك والنار

اللهم إرحمنا فوق الأرض وإرحمنا تحت الأرض وإرحمنا وإعتق رقابنا يوم العرض

اللهم لا تدع لنا ذنبًا إلا غفرته ولا همًا إلا فرجته ولا مريضًا ولا دينًا إلا قضيته ولا عيبا إلا سترته ولا حاجًا هى لك رضا إلا قضيتها

اللهم انى أسألك موجبات رحمتك وعزائم مغفرتك والسلامة من كل إثم والغنيمة من كل بر والفوز بالجنة و النجاة من النار اللهم أمين يا رب العالمين

#11

اخي العزيز

جرب هذه الطريقة

ارجو ان تكون مفيدة

CREATE TABLE dbo.Emp
(
	EmpID		int	PRIMARY KEY,
	EmpName		varchar(30),
	MgrID		int	FOREIGN KEY REFERENCES Emp(EmpID)
)
GO

CREATE NONCLUSTERED INDEX NC_NU_Emp_MgrID ON dbo.Emp(MgrID)
GO

INSERT dbo.Emp SELECT 1, 'President', NULL
INSERT dbo.Emp SELECT 2, 'Vice President', 1
INSERT dbo.Emp SELECT 3, 'CEO', 2
INSERT dbo.Emp SELECT 4, 'CTO', 2
INSERT dbo.Emp SELECT 5, 'Group Project Manager', 4
INSERT dbo.Emp SELECT 6, 'Project Manager 1', 5
INSERT dbo.Emp SELECT 7, 'Project Manager 2', 5
INSERT dbo.Emp SELECT 8, 'Team Leader 1', 6
INSERT dbo.Emp SELECT 9, 'Software Engineer 1', 8
INSERT dbo.Emp SELECT 10, 'Software Engineer 2', 8
INSERT dbo.Emp SELECT 11, 'Test Lead 1', 6
INSERT dbo.Emp SELECT 12, 'Tester 1', 11
INSERT dbo.Emp SELECT 13, 'Tester 2', 11
INSERT dbo.Emp SELECT 14, 'Team Leader 2', 7
INSERT dbo.Emp SELECT 15, 'Software Engineer 3', 14
INSERT dbo.Emp SELECT 16, 'Software Engineer 4', 14
INSERT dbo.Emp SELECT 17, 'Test Lead 2', 7
INSERT dbo.Emp SELECT 18, 'Tester 3', 17
INSERT dbo.Emp SELECT 19, 'Tester 4', 17
INSERT dbo.Emp SELECT 20, 'Tester 5', 17
GO

CREATE PROC dbo.ShowHierarchy
(
	@Root int
)
AS BEGIN SET NOCOUNT ON DECLARE @EmpID int, @EmpName varchar(30)

	SET @EmpName = (SELECT EmpName FROM dbo.Emp WHERE EmpID = @Root)
	PRINT REPLICATE('-', @@NESTLEVEL * 4) + @EmpName

	SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root)

	WHILE @EmpID IS NOT NULL
	BEGIN EXEC dbo.ShowHierarchy @EmpID
		SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID)
	END
END
GO

ثم قم بإختبار ما كتبته

EXEC dbo.ShowHierarchy 1
GO

فتكون النتيجة كالتالي

---President
------Vice President
---------CEO
---------CTO
------------Group Project Manager
---------------Project Manager 1
------------------Team Leader 1
---------------------Software Engineer 1
---------------------Software Engineer 2
------------------Test Lead 1
---------------------Tester 1
---------------------Tester 2
---------------Project Manager 2
------------------Team Leader 2
---------------------Software Engineer 3
---------------------Software Engineer 4
------------------Test Lead 2
---------------------Tester 3
---------------------Tester 4
---------------------Tester 5

EXEC dbo.ShowHierarchy 5
GO

---Group Project Manager
------Project Manager 1
---------Team Leader 1
------------Software Engineer 1
------------Software Engineer 2
---------Test Lead 1
------------Tester 1
------------Tester 2
------Project Manager 2
---------Team Leader 2
------------Software Engineer 3
------------Software Engineer 4
---------Test Lead 2
------------Tester 3
------------Tester 4
------------Tester 5

وهكذا

#12

السلام عليكم

أخيرا وجد الحل الامثل الموجود فقط في SQL2005

لنفترض ان لدينا جدول الموظفين MainEmpData

(EmpNo,EmpName,BossNo) حيث يكون الBossNo هو رقم مدير الموظف و الذي هو ايضا موظف فيكون الحل كالاتي

WITH BossEmps (EmpNo, EmpName, BossNo)  AS
 (

  SELECT
	 a.EmpNo, a.EmpName, a.BossNo 
   FROM MainEmpData a
   WHERE EmpNo=1222
  UNION ALL
   SELECT
	a.EmpNo, a.EmpName, a.BossNo

   FROM MainEmpData a
	 INNER JOIN BossEmps b ON a.BossNo = b.EmpNo

 )
SELECT * FROM BossEmps
#13

ممكن تجرب الإستعلام دى أنا بستخدمة كتير جدا و شغال تمام الحمد لله

لنفترض أن لدينا جدول Empinfo و بة الحقلول التالية (id,name,reportsto )

Select a.name as EmpNAME,b.name AS ManName
from  Empinfo a inner join
EmpInfo b
ON a.reportsto = b.id

أنا أسف جدا جدا جدا أنا فهمت السؤال غلط

تم تعديل هذه المشاركة بواسطة MAHGOOP في 8 يونيو 2007 في 09:51

------------------------------------------------

لا إله إلا أنت سبحانك أني كنت من الظالمين

-----------------------------------

27e64a660f.gif

هذا الموضوع مغلق.

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