الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

بتاريخ:

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



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

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


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



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

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


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

  • الردود 25
  • المشاهدات 24.1k
  • البداية
  • اخر رد

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

بتاريخ:

السلام عليكم

هي ممكن بإنك تتحسس المسافات بين الكلمات باستخدام مثلا 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,'عبد الصمد','عبدالصمد');








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

بتاريخ:

السلام عليكم ورحمة الله وبركاته
راجع الملف المرفق
CHKNAM.rar

بتاريخ:


السلام عليكم

الاخ / Mr_CoBoL

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

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

بتاريخ:

حل رائع هكذا هم الرجال المعطائة

أكثر الله من امثالك أخي

  • بعد 4 أسابيع...
بتاريخ:

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

بتاريخ:

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

  • بعد 1 شهر...
بتاريخ:


السلام عليكم

الاخ / Mr_CoBoL

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

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


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



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

وتقبل تحاياي
بتاريخ:

يمكنك عد المقاطع الناتجة من substr واذا كانت اكثر من 4 ادمج اول 2

  • بعد 2 شهور...
بتاريخ:

SELECT SUBSTR ('Ahmed Sobhy Ahmed', 1, 5) first_name,
SUBSTR ('Ahmed Sobhy Ahmed', 7, 5) second_name,
SUBSTR ('Ahmed Sobhy Ahmed', 13, 5) last_name
FROM DUAL

  • بعد 3 أسابيع...
بتاريخ:

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

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

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

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

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

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

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


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

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

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





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



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

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

بتاريخ:

أخي الكريم Mr_CoBoL

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

بتاريخ:

أخي الكريم 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 شهور...
بتاريخ:

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

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

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

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

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

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.