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

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

المطلوب نطلع القيمه الناقصه من التسلسل


9 رد (ردود) على هذا الموضوع

#1 GOALONE

GOALONE

    عضو

  • الأعضــاء
  • 9 مشاركة

تاريخ المشاركة 30 March 2008 - 02:36 PM

أنا عندي جدول فيه عمود واحد فيه القيم المتسلسله دية 60 - 61 - 62 - 64 - 65 لاجظ مفيش القيمه 63 انا عايز جملة سيكول على العمود طول مالتسلسل ماشي كويس مفيش مشكله المطلوب يعني نطلع القيمه الناقصه من التسلسل والمفروض ان احنا اصلا مش عارفين القيم والقيم دية مترتبه بس فيه قيمه ناقصه ياريت نعرفها

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


#2 hanyfreedom

hanyfreedom

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,481 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:Chess , Sudoku

تاريخ المشاركة 30 March 2008 - 11:48 PM

الاول هعمل جدول و فى عمود ذى ما انت وصفت :-

create table v ( id number );

insert into v values (1);
insert into v values (2);
insert into v values (4);
insert into v values (5);
insert into v values (6);
insert into v values (8);
insert into v values (9);
insert into v values (10);
insert into v values (11);
insert into v values (12);

SQL> select * from v; ID
----------
1
2
4
5
6
8
9
10
11
12

10 rows selected.

SQL> commit;

Commit complete.


بعد كده هنعمل كود بال PL/SQL علشان نحدد القيم الناقصة ( اللى هى ال 3 وال 7 فى الكود السابق ذكره ) ...... من الصعب عمل select query علشان نحدد القيم الناقصة ... ده على حد علمى المتواضع .


هذا هو الكود الذى سيجد القيم الناقصة :-

DECLARE
v_cursor INTEGER;
v_cur1 INTEGER;

v_val NUMBER;
v_ret INTEGER;
v_tab VARCHAR2(200) := '&Table_Name';
v_pkey VARCHAR2(100) := '&Primary_key';
v_where VARCHAR2(5000) := nvl('&Where_Clause',' ');
v_next_num NUMBER := 1;
v_sql VARCHAR2(6000) := 'SELECT a.'||v_pkey||'+'||v_next_num||

' FROM '||v_tab||' a, '||v_tab||' b
WHERE a.'||v_pkey||'+'||v_next_num||' = b.'||v_pkey||' (+) AND b.'||v_pkey||' IS NULL AND a.'||v_pkey||' <> (SELECT max(z.'||v_pkey||') FROM '||v_tab||' z)
'||v_where||' ORDER BY '||'a.'||v_pkey;
v_new_sql VARCHAR2(8000);
v_value NUMBER;
v_ignore INTEGER;

v_new_value NUMBER;
BEGIN v_cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_cursor,v_sql,DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN(v_cursor,1,v_value);
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('Missing Values');
DBMS_OUTPUT.PUT_LINE('--------------');
DBMS_OUTPUT.PUT_LINE(' ');

v_ignore := DBMS_SQL.EXECUTE(v_cursor);
LOOP
v_ret := DBMS_SQL.FETCH_ROWS(v_cursor);
EXIT WHEN v_ret = 0;
DBMS_SQL.COLUMN_VALUE(v_cursor,1,v_value);
v_next_num:=1;
v_new_value:=v_value-1;
LOOP
v_next_num:=v_next_num+1;
v_new_sql:='SELECT a.'||v_pkey||'+'||v_next_num||'

FROM '||v_tab||' a, '||v_tab||' b
WHERE a.'||v_pkey||'+'||v_next_num||' =
b.'||v_pkey||' (+) AND b.'||v_pkey||' IS NULL AND a.'||v_pkey||' <> (SELECT
max(z.'||v_pkey||') FROM '
||v_tab||' z) AND a.'||v_pkey||' =
'||v_new_value;
v_cur1 := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_cur1,v_new_sql,DBMS_SQL.NATIVE);
v_ignore:=DBMS_SQL.EXECUTE(v_cur1);
v_ret:=DBMS_SQL.FETCH_ROWS(v_cur1);

DBMS_SQL.CLOSE_CURSOR(v_cur1);
IF v_ret = 0 THEN
IF v_next_num = 2 THEN
DBMS_OUTPUT.PUT_LINE(to_char(v_value));
IF DBMS_SQL.IS_OPEN(v_cur1) THEN
DBMS_SQL.CLOSE_CURSOR(v_cur1);
END IF;
EXIT;
END IF;

DBMS_OUTPUT.PUT_LINE(to_char(v_value)||'-'||to_char(v_new_value+v_next_num-1));

IF DBMS_SQL.IS_OPEN(v_cur1) THEN
DBMS_SQL.CLOSE_CURSOR(v_cur1);
END IF;
EXIT;
END IF;
END LOOP;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(v_cursor);
END;
/


المصدر من هذا الرابط :-

http://www.oracle.co...003/090703.html

بس الكود فيه مشكلة فى الموقع .... و انا صلحتها ..... انت ممكن تجرب الكود اللى فى الموقع و كودى المرفق ( او اللى مكتوب فى هذه المشاركة ) و انت تتأكد من كلامى .

فى حاجه كمان انت بعد تنفيذ الكود .... هيطلب منك 3 حاجات .... الاول اسم الجدول و الثانى اسم العمود و ثالث حاجه ابقى دوس Enter على طول من لوحة المفاتيح ..... كما فى الشكل التالى :-

SQL> @missing_number.sql
Enter value for table_name: v
old 7: v_tab VARCHAR2(200) := '&Table_Name';
new 7: v_tab VARCHAR2(200) := 'v';
Enter value for primary_key: id
old 8: v_pkey VARCHAR2(100) := '&Primary_key';
new 8: v_pkey VARCHAR2(100) := 'id';
Enter value for where_clause:
old 9: v_where VARCHAR2(5000) := nvl('&Where_Clause',' ');
new 9: v_where VARCHAR2(5000) := nvl('',' ');
Missing Values
--------------
3
7

PL/SQL procedure successfully completed.


الفكرة فى المطلب الثالث فى انك لو عاوز تحدد القيم الناقصة من رقم اللى رقم معين ، مش على كل العمود .

ارجو ان تكون الفكرة وضحة .

و بالتوفيق .

ملفات مرفقة



#3 Amgad

Amgad

    مشرف عام ومشرف قسم تحليل النظم

  • الفريق الإداري
  • 4,558 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 31 March 2008 - 12:37 AM

الأخ / هاني

شكرا لك .. على مشاركاتك الايجابية بالمنتدى .. وسرعة الاستجابة لاسئلة الاعضاء ... جزاك الله خيرا

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

إضغط هنا : معرفة الفواتير الساقطة من السيريل

وهذه المشاركة ايضا

إضغط هنا : معرفة الارقام الغير ضمن الارقام متسلسلة واستغلالها

مع التحية

لا إله إلا الله الحليم الكريم
لا اله إلا الله العلى العظيم
لا اله إلا الله رب السماوات السبع و رب العرش العظيم
‏اللهم ارزقني قبل الموت توبة وعند الموت شهادة وبعد الموت جنة
اللهم ارزقني حسن الخاتمة
اللهم هون علينا سكرات الموت ... ونور علينا قبورنا
اللهم ارزقني الموت وأنا ساجد لك يا ارحم الراحمين
اللهم ثبتني عند سؤال الملكين
اللهم اجعل قبري روضة من رياض الجنة ولا تجعله حفرة من حفر النار
اللهم اني اعوذ بك من فتن الدنيا
اللهم ارحم ابائنا وامهاتنا واغفر لهما وتجاوز عن سيئاتهما وادخلهم فسيح جناتك ... والحقنا بهما يا رب العالمين
اللهم ارحم موتانا وموتى المسلمين واشفي مرضانا ومرضى المسلمين
اللهم اغفر للمسلمين والمسلمات والمؤمنين والمؤمنات الأحياء منهم والأموات
وبارك اللهم على سيدنا محمد صلى الله عليه وسلم
اللهم آمين ... اللهم آمين ... اللهم آمين


....


#4 ebnalqym

ebnalqym

    عضو

  • الأعضــاء
  • 15 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 31 March 2008 - 08:03 AM

دا اسهل حل
وباستخدام SQL فقط

CREATE TABLE T1 ( C1 NUMBER);
INSERT INTO T1 VALUES(60);
INSERT INTO T1 VALUES(61);
INSERT INTO T1 VALUES(62);
INSERT INTO T1 VALUES(64);
INSERT INTO T1 VALUES(65);
INSERT INTO T1 VALUES(66);
COMMIT;

وبمنتهي البساطة

select v.cc
from (select t1.C1+1 cc
from t1 where t1.C1 not in (select max(t1.C1)
from t1
)
)v , t1 m
where v.cc = m.c1 (+) and m.c1 is null

وشكرا

#5 hanyfreedom

hanyfreedom

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,481 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:Chess , Sudoku

تاريخ المشاركة 31 March 2008 - 12:08 PM

اخى العزيز ebnalqym
شكراً لمشاركتك ...... و لكن كودك غير دقيق للأسف ....... حيث لم يأتى بالقيم المتتالية الناقصة ..... بمعنى :-

SQL> select * from v;
--
ID
----------
1
2
4
5
6
8
9
10
11
12
13

ID
----------
14
18
19
20

15 rows selected.

SQL> SELECT h.cc
2 FROM (SELECT v.id + 1 cc
3 FROM v 4 WHERE v.id NOT IN (SELECT MAX (v.id)
5 FROM v)) h,
6 v m
7 WHERE h.cc = m.id(+) AND m.id IS NULL;

CC
----------
3
15
7

SQL> @missing_number.sql
Enter value for table_name: v
old 7: v_tab VARCHAR2(200) := '&Table_Name';
new 7: v_tab VARCHAR2(200) := 'v';
Enter value for primary_key: id
old 8: v_pkey VARCHAR2(100) := '&Primary_key';
new 8: v_pkey VARCHAR2(100) := 'id';
Enter value for where_clause:
old 9: v_where VARCHAR2(5000) := nvl('&Where_Clause',' ');
new 9: v_where VARCHAR2(5000) := nvl('',' ');
Missing Values
--------------
3
7
15-17

PL/SQL procedure successfully completed.


انا ضفت قيم متسلسلة لجدولى مع اسقاط ال 15 ، 16 ، 17 ........ كودك جاب رقم 15 لكن لم يحدد الأرقام الاخرى الناقصة
لكن الكود الذى احضرته من موقع اوراكل دقيق للغاية حيث حدد القيم الناقصة كما رأيت ( 15-17 ) .

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

و شكراً

#6 ebnalqym

ebnalqym

    عضو

  • الأعضــاء
  • 15 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 31 March 2008 - 04:18 PM

الاخ الكريم
انا كنت بجاوب السؤال اللى الاخ GOALONE كاتبه حرفيا
هو عاوز اول قيم بتضرب لما يحصل على خلل في التسلسل
واعتقد ان الكود الصغير دا كافي
ولكن اجابتك ممتازة مقلتش حاجة وبتجيب كل القيم امفقودة

#7 mohamedhanyhekal

mohamedhanyhekal

    عضو

  • الأعضــاء
  • 20 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 31 March 2008 - 04:25 PM

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

(اللهم لا علم إلا ماعملتنا إنك أنت العليم الخبير)

#8 llord

llord

    مشترك

  • الأعضــاء
  • 114 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 01 April 2008 - 08:52 AM

السلام عليكم
----------------------

بإستخدام مثال الاخ هانى ممكن عمل هذا الاستعلام ليحدد القيم الناقصة

SELECT ROWNUM missing_values
FROM dict WHERE ROWNUM < (SELECT MAX (ID)
FROM v) MINUS
SELECT ID
FROM v;



ولكن مع ملاحظة استخدام جدول يحتوع على صفوف كتيرة ( فى هذا المثال اسخدمت dict او dictionary )
--------------------------------------------

#9 hanyfreedom

hanyfreedom

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,481 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:Chess , Sudoku

تاريخ المشاركة 01 April 2008 - 09:36 PM

أخى الكريم llord

شكراً لكودك الجيد ..... و لكن ماذا اذا كانت عدد صفوف العمود الذى به القيم الناقصة اكثر من صفوف جدول ال Dictionary !!!!!!!!

انا عندى حل لكودك ....... ده كودك بعد معالجته بالطريقة الملائمة :-

SELECT     ROWNUM missing_values
FROM DUAL CONNECT BY LEVEL < (SELECT MAX (ID)
FROM v) MINUS
SELECT ID
FROM v;


و شكراً

#10 GOALONE

GOALONE

    عضو

  • الأعضــاء
  • 9 مشاركة

تاريخ المشاركة 02 April 2008 - 04:12 PM

شكرا جزيلا يا مهندسين على الحلول والمناقشات الرائعه والتي قد افادتني كثيرا واتمنى التوفيق لكم جميعل واعذروني لعدم المشاركه المستمره هذه الأيام بسبب ظروف الامتحانات .
سلامي الى الجميع