الانتقال إلى المحتوى

كيفية تقسيم الاسم الكامل ... الى الاسم الأول واسم الأب واسم الجد


the past

Recommended Posts

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



انا عندي جدول فيه عمود اسمه name ادخل فيه الاسم عادي مثلا (محمد احمد محمد علي)

المشكلة انه في التقرير


الاسم مقسم بمعنى الاسم الاول : اسم الاب: اسم الجد: اللقب



كيف اقدر اطلع الاسم بهذه الطريقة في التقرير

مع العلم انه عندي داتا كثير جدا وما اقدر امسح


ارجووووووووو المساعدة جزاكم الله خير

رابط هذا التعليق
شارك

  • الردود 25
  • البداية
  • اخر رد

أكثر المشاركين في هذا الموضوع

  • the past

    4

  • MMA

    3

  • Mr_CoBoL

    2

  • mustafagamiel

    1

أكثر المشاركين في هذا الموضوع

السلام عليكم

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

رابط هذا التعليق
شارك

السلام عليكم ورحمة الله وبركاته
اخى ممكن تشوف الحل ده ان شاء الله يساعدك فى مشكلتك .

مثال كامل للتجربة .

CREATE TABLE TMP(NAME VARCHAR2(200));
INSERT INTO TMP VALUES ('على محمود أحمد بكر');
INSERT INTO TMP VALUES ('محمد احمد محمد علي');
COMMIT;


SELECT SUBSTR(NAME,1,INSTR(NAME,' ',1,1)-1 ) FIRST_NAME ,
SUBSTR(NAME,INSTR(NAME,' ',1,1)+1, INSTR(NAME,' ',1,2)-INSTR(NAME,' ',1,1) ) SECOND_NAME ,
SUBSTR(NAME,INSTR(NAME,' ',1,2)+1 , INSTR(NAME,' ',1,3)-INSTR(NAME,' ',1,2) ) THIRD_NAME ,
SUBSTR(NAME,INSTR(NAME,' ',1,3)+1 ) LAST_NAME FROM TMP;
رابط هذا التعليق
شارك

السلام عليكم

الحل اللي كتبه abdou1984 هو الملاذ الوحيد

لكن تبقى مشكله الاسماء المركبه

و لتقليل حدوث هذه المشكله يجب ضبط البيانات قبل تنفيذ عملية التقسيم ويتم ذلك بإستبعاد كل شيء قد يؤدي الى احداث ضرر

مثل

عمل ريبلاس للمسافة في حال تكراراها الى مسافه واحد وعمد ريبليس لمعضم الاسماء المركبه اللتي ستخطر على بالك الى اسم مركب دون مسافات

كالتالي


نفرض ان الجدول اسمه a
وحقل الاسم اسمه n

يبدىء مشوارك الآن





update a set n=replace(n,'  ',' ');
update a set n=replace(n,'   ',' ');
update a set n=replace(n,'عبد الله','عبدالله');
update a set n=replace(n,'عبد الرحمن','عبدالرحمن');
update a set n=replace(n,'عبد الكريم','عبدالكريم');
update a set n=replace(n,'عبد الصمد','عبدالصمد');








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

رابط هذا التعليق
شارك


السلام عليكم

الاخ / Mr_CoBoL

لقد جربت الملف وهو يعمل بشكل جيد جدا

بارك الله فيك وجعله الله فى ميزان حسناتك

رابط هذا التعليق
شارك

  • بعد 4 أسابيع...
  • بعد 1 شهر...


السلام عليكم

الاخ / Mr_CoBoL

لقد جربت الملف وهو يعمل بشكل جيد جدا

بارك الله فيك وجعله الله فى ميزان حسناتك


السلام عليكم ورحمة الله وبركاتة
اخي ENG_HOSSAM_WALLY
حل الاخ Mr_CoBoL جدا رائع لكن لو ادخلنا الاسم عبد الله,او عبد العزيز .........الخ سيظهر عبدكاسم والله كاسم تاني
هنا ستواجهنا مشكلة



نلاحظ انو الاسماء المركبة دائما تاتي بعد الاسم عبد
اذا ممكن نعدل الدالة عليها السطر هذا
:BLOCK3.NAM :=replace (:BLOCK3.NAM,'عبد ','عبد');

وتقبل تحاياي
رابط هذا التعليق
شارك

  • بعد 2 شهور...
  • بعد 3 أسابيع...

فكرة رائعة وممتازة ، ولكن لدي تحفظ أتمني الإستماع إليها جيداً دون زعل !!!

الإسم المركب (عبد الله - عبد السلام - عبد الحميد - عبد الرزاق - ...................... الي آخرة) ، ليس فقط هو الوحيد الإسم المركب !!!

لديك مثلاً شخص أعرفة جيداً سمي إسم إبنته الي (وحدة وادي النيل) ، وأبوها (محمد) ، وجدها (عبد الله) ........ تخيل ثلاثة أسماء في إسم واحد :)

وفية ناس تانية بتحب تسمي أسماء أولادها بأسماء الزعماء ، زي مثلاً (جمال عبد الناصر - الناصر صلاح الدين - أنور السادات - صدام حسين - ............ الي آخرة) :(

فـ (جمال عبد الناصر) ، و (الناصر صلاح الدين) ، ثلاثة أسماء في إسم واحد !!!!

ههههههههههههههههه ، وفية واحد مسمي إبنه أبو فرو ، أو أبو خاروف ، ههههههههههههههههههههههههههههه

طيب ما الحل في مثل هذه المشكلة !!!!


إذاً لا يصح إلا الصحيح !!!!

تحليل نظم قواعد البيانات بتقول أن إسم الإنسان يكون حقل مركب (الإسم - إسم الأب - إسم الجد - إسم العائلة أو اللقب) ، وكل حقل له حجم مناسب

إذاً فالحل المدرج حل مؤقت لحين تحويل النماذج والتقارير الخاصة بك أخ the past ... فالتعالج مشكلتك من جزورها حتي لا يظهر لك أي مشاكل أخري مستقبلاً





أما بخصوص فكرتك أخ Mr_CoBoL ، فهي فعلاً أكثر من رائعة وقد أستفدت منها كثييييييييييييييييييييييييييير جداً ، وجزاك الله كل خير .... والله أستفدت منها



بالتوفيق للجميع وجزاكم الله خير الجزاء

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

رابط هذا التعليق
شارك


أخي الكريم Mr_CoBoL

ممكن شرح للكود وكيفية تطبيقه على جدول به 1500 موظف


في الجزء الأول من الكود نقوم بعمل فلترة للأسم المراد تجزئته وذلك بإزالة المسافات الزائدة وتغيير حالة بعض الحروف مثل "أ" إلى "ا" ..
في الجزء الثاني من الكود وهو ...

	begin
e_x := 1 ;
ss := 1;
For ss IN 1..LENGTH(:BLOCK3.nam) LOOP	
     L := substr(:BLOCK3.nam, ss, 1);
    	if e_x = 1 then w1 := w1 || L; end if;     
     if L  = ' ' then 	e_x := e_x + 1; end if;
     if e_x = 2 then w2 := w2 || l; end if;
     if e_x = 3 then w3 := w3 || l; end if;
     if e_x = 4 then w4 := w4 || l; end if;
     if e_x = 5 then w5 := w5 || l; end if;
     if e_x = 6 then w6 := w6 || l; end if;
     if e_x = 7 then w7 := w7 || l; end if;
    		end loop;



توجد متغيرات عملها كالتالي ...

ex هو المتغير المسئول عن عدد تقسيمات الاسم الكامل ... مثلا تريد تقسيم الاسم الى 4 او 5 تقسيمات في هذا المثال يمكن تقسيم الى 7 تقسيمات
ss يقوم بقراءة طوال الحقل المراد تقسيمه
ll يقوم بقراءة الحقل المراد تقيسمه حرف بـ حرف ثم يأتي دور نقل كل حرف من الحروف إلى ترتيبه حسب التقسيم أعلاه ...


يمكنك تطبيقه على أي جدول وأي عدد من الاسماء فقط قم بتغيير ما يلزم في الكود



أخي MMA وباقي الأخوة الاعزاء ...
ملحوظاتكم في مكانها الصحيح بالفعل توجد اسماء مركبة ولا يصلح لها الكود الموضح أعلاه لكنني أردت وضع تصوري ربما يساعد أخونا صاحب المشكلة


تحياتي

اخوكم
حسن الحسيني

رابط هذا التعليق
شارك

-- الجدول الذى سيتم العمل عليه

create table emp_full_names (id number (6), full_name varchar2(100),
first_name varchar2(25), second_name varchar2(25), third_name varchar2(25), fourth_name varchar2(25));



-- ازالة المسافات من يسار الاسم الكامل
update emp_full_names
set full_name = ltrim(full_name);


-- ازالة المسافات من يمين الاسم الكامل
update emp_full_names
set full_name = rtrim(full_name);


-- ازالة المسافات المتجاروة من الاسم الكامل
-- يتم التكرار حتى خمس مرات لضمان ازالة المسافات المتجاروة حتى لو كان 8 مسافات
begin
for i in 1..7 loop
update emp_full_names
set full_name = replace (full_name,'  ',' ');
end loop;
end;
/


create or replace procedure separate_names
is
v_position_1 number (3) :=0;
v_position_2 number (3) :=0;
v_position_3 number (3) :=0;
CURSOR      emp_names_cursor IS
          	SELECT  *
          	from emp_full_names
          	FOR UPDATE;
BEGIN

FOR 	emp_record IN  emp_names_cursor     	LOOP
               v_position_1 := instr(emp_record.full_name,' ',1,1);-- مكان أول مسافة
               v_position_2 := instr(emp_record.full_name,' ',1,2);-- مكان ثانى مسافة
               v_position_3 := instr(emp_record.full_name,' ',1,3);-- مكان ثالث مسافة

          	UPDATE          emp_full_names
          	SET         	first_name      = substr(full_name,1,v_position_1),
                          	second_name 	= substr(full_name,v_position_1+1,v_position_2-v_position_1-1),
                          	third_name      = substr(full_name,v_position_2+1,v_position_3-v_position_2-1),
                          	fourth_name 	= substr(full_name,v_position_3+1)
          	WHERE       	CURRENT OF emp_names_cursor;
END LOOP;

END;
/ 

رابط هذا التعليق
شارك

أخي MMA وباقي الأخوة الاعزاء ...
ملحوظاتكم في مكانها الصحيح بالفعل توجد اسماء مركبة ولا يصلح لها الكود الموضح أعلاه لكنني أردت وضع تصوري ربما يساعد أخونا صاحب المشكلة


شكراً أخي الكريم علي سعة الصدر

ولكن إسمح لي إضافتاً لفكرتك الأكثر من الرائعة أن أترك فكرتي الخاصة لعل وعسي أن تفيد بعض الشيء !!!

فما رأيك لو جعلنا الوضع أكثر ديناميكية !!!

أنظر المثال المرفق

وبالتوفيق للجميع

SQL.zip

رابط هذا التعليق
شارك

وهذه طريقة أخري لنفس الفكرة

بالإضافة الي إستخدام الفكرة داخل PL/SQL كي يتم التعديل علي جدول محدد
حيث يعتمد كلياً علي Table فقط لا غير دون Object وهو الأسهل


شكراً لكم

وبالتوفيق للجميع

SQL.zip

رابط هذا التعليق
شارك

  • بعد 3 شهور...
  • بعد 3 شهور...

جزاكم الله خير الجزاء

رابط هذا التعليق
شارك

  • بعد 9 شهور...

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل



×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية