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

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

صورة
- - - - -

مساعدة لكود باستعمال المؤشر


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

#1 NoorAdiga

NoorAdiga

    عضو

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

تاريخ المشاركة 21 July 2008 - 06:58 PM

السلام عليكم
المطلوب مني هو المقارنة بين records
في جدولين مختلفين مع اختلاف بعض الاعمدة ... هذي المشكلة تحل باستعال if
ولكن مشكلتي تكمن انني اريد استعمال مؤشر حتى استعرض الrecords
في الجدول الاول ... واقارن كل ريكور بالجدول التاني
واذا لما اجد ال record
في الجدول الثاني .. اريد ان اعرض view
ان هذا الريكورد ناقص بدون ان اعمل edit
وعند التفكير في المشكلة ... اجدد انني بحاجة لحفظ كل record
من الجدول الاول والغير موجودة في لجدول التاني
فكيف اقوم بهذا او هل استطيع عرضها مباشرة اول باول ..
record by record
?????

اتمنى وجود بعض المساعدة لانه اول برنامج pl sql
اريد كتابته :rolleyes:
شكرا للجميع
:rolleyes:

#2 sameh bakkar

sameh bakkar

    مشرف قسم المبتدئين

  • فريق الإشراف
  • 1,019 مشاركة
  • البـلـد: Country Flag

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

رجاء التوضيح أكثر من ذلك ..

Sameh Bakkar

Principal Oracle Apps Techno-Functional Consultant / Oracle E-Business Suite Certified Trainer

Oracle E-Business R11 Suite Applications Workflow Certified Expert

Oracle E-Business Suite R12 HCM Certified Implementation Specialist

Oracle Certified Professional

ITIL V3 Foundation certified

Microsoft Project certified




الموقع الخاص: AppsLead | Your Honest Guide | Sameh Bakkar


#3 mohooo81

mohooo81

    عضو نشط

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

تاريخ المشاركة 21 July 2008 - 11:09 PM

السلام عليكم
المطلوب مني هو المقارنة بين records
في جدولين مختلفين مع اختلاف بعض الاعمدة ... هذي المشكلة تحل باستعال if
ولكن مشكلتي تكمن انني اريد استعمال مؤشر حتى استعرض الrecords
في الجدول الاول ... واقارن كل ريكور بالجدول التاني
واذا لما اجد ال record
في الجدول الثاني .. اريد ان اعرض view
ان هذا الريكورد ناقص بدون ان اعمل edit
وعند التفكير في المشكلة ... اجدد انني بحاجة لحفظ كل record
من الجدول الاول والغير موجودة في لجدول التاني
فكيف اقوم بهذا او هل استطيع عرضها مباشرة اول باول ..
record by record
?????

اتمنى وجود بعض المساعدة لانه اول برنامج pl sql
اريد كتابته :rolleyes:
شكرا للجميع
:rolleyes:



انا مش فاهم ولا كلمة اللى انتة عايزة دة اورراكل صح؟؟؟؟؟؟؟؟؟
مالا يدرك كلة لا يترك كلة

#4 NoorAdiga

NoorAdiga

    عضو

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

تاريخ المشاركة 22 July 2008 - 07:33 AM

صباح الخير .... اوك راح اعيد المشكلة بتفصيل اكثر ... وان شا الله بمشي الحال

بداية عنا مؤسسة اسمها x بتخزن بيانات خاصة فيها بجدول اسمه x.x
وفي مؤسسة ثانية متعاقدة مع المؤسسة الاولى لتاخد البيانات منها وتعملها interface
باستعمال جدول اخر باسماء column مختلفين
وطريقة توزيع البيانات مختلفة بين الجدولين ...
يعني قد يكون ريكورد واحد في x.x
انتقل ل 2 records
على ال interface table
السبب برجع لطريقة توزيع pk
المطلوب انه اثناء نقل البيانات ... في جزء من ال records
ما انتقل من الجدول x.x لل
interface
انا ما بهمني غير اني اوجد هي الريكوردز اللي مش منتقلة
ما بهمني صحة اللي انتقل او اذا ال interface
فيه بيانات اكتر من الجدول x.x
يعني اتجاه التدقيق بس من
x.x
الى interface

بتخيل هيك وضحكت المشكلة ..... انا فكرت باستعمال SQL
لاعرض الريكورد اللي ما انتقلو ... وضيعت وقتي ع الفاضي بهي القصة
لما سالت حكولي لازم استعمل plsql
واعمل مؤشر يمشي من الجدول x.x
ويقارن الداتا بال interface

انا ما عندي خبرة بال pl sql
انما بعرف اعمل مؤشر ومش عارفة لما الاقي record
مش موجود بال interface
بقدر اعرضه مباشرة او اخزنه بمكان ؟ وازا بدي اخزنه .. كيف ؟؟


مشـــــــــــــكورين .... شكرا ... شكرا


#5 MMA

MMA

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

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 22 July 2008 - 07:51 AM

والله يا أخي أنا كذلك مش فاهم ، بس هحاول أترجم :D :D

ولكن مشكلتي تكمن انني اريد استعمال مؤشر حتى استعرض الrecords
في الجدول الاول ... واقارن كل ريكور بالجدول التاني


أنت تقصد أنك عايز تعمل 2 Cursor ، بحيث أن كل كيرسور يرتجع مجموعة معينة من السجلات من جدول مناسب ، وطبعاً كل كيرسور يحتوي علي نفس أعمدة الكيرسور الآخر علشان تتم عملية المقارنة !!!

أوك ، نفرض أننا لدينا جدولين ، الأول Emp1 والثاني Emp2 ، كما يحتويان علي حقلين Emp_No, Emp_Name .... علشان تقارن بين الجدولين إليك الطريقة الصحيحة :

Declare
   Cursor C1 Is Select * From Emp1 Order By Emp_No;
   Cursor C1 Is Select * From Emp2 Order By Emp_No;

   ID_No1  Emp1.Emp_No%Type;
   ID_Name1 Emp1.Emp_Name%Type;

   ID_No2  Emp2.Emp_No%Type;
   ID_Name2 Emp2.Emp_Name%Type;
Begin
   Open C1;
   Open C2;
   Fetch C1 Into ID_No1, ID_Name1;
   Fetch C2 Into ID_No2, ID_Name2;
   While C1%Found
   Loop
	  Fetch C1 Into ID_No1, ID_Name1;
	  If(C2%NotFound)Then
		 Fetch C2 Into ID_No2, ID_Name2;
	  End If;
	  If(ID_No1 = ID_No2)Then
		 DBMS_Output.Put_Line(ID_No1);
	  End If;
	  If(ID_Name1 = ID_Name2)Then
		 DBMS_Output.Put_Line(ID_Name1);
	  End If;
   End Loop;
   Close C1;
   Close C2;
End;
/

واذا لما اجد ال record
في الجدول الثاني .. اريد ان اعرض view
ان هذا الريكورد ناقص بدون ان اعمل edit


الذي فهمته من هذا الكلام أنك عايز ترتجع القيم المتساوية علي هيئة سجلات يمكنك إستخدامها في أي وقت من خارج القاعدة !!!

لكن المثال السابق الذي أدرجته لك لا يقوم بهذه المهمة ، بل كل مهمته هو عرض ناتج التساوي مباشرتاً علي نافذة الـ SQL*Plus ، لكنها لا ترتجع مجموعة سجلات !!!

الحل في هذه الحالة أنك تعمل Function يقوم بإرتجاع الجدول المطلوب ( أبحث بالمنتدي فستجد أمثلة متعددة ) ... عموماً هذا هو التعديل علي المثال السابق :

Create Or Replace Type O_Emp Is Object(Emp_No Number(10), Emp_Name VarChar2(20));
/
Create Or Replace Type T_Emp Is Table Of O_Emp;
/
Create Or Replace Function Get_Emp Return T_Emp
As
   Cursor C1 Is Select * From Emp1 Order By Emp_No;
   Cursor C1 Is Select * From Emp2 Order By Emp_No;

   ID_No1  Emp1.Emp_No%Type;
   ID_Name1 Emp1.Emp_Name%Type;

   ID_No2  Emp2.Emp_No%Type;
   ID_Name2 Emp2.Emp_Name%Type;

   P_Return   T_Emp := T_Emp();
Begin
   Open C1;
   Open C2;
   Fetch C1 Into ID_No1, ID_Name1;
   Fetch C2 Into ID_No2, ID_Name2;
   While C1%Found
   Loop
	  Fetch C1 Into ID_No1, ID_Name1;
	  If(C2%NotFound)Then
		 Fetch C2 Into ID_No2, ID_Name2;
	  End If;
	  If(ID_No1 = ID_No2) And (ID_Name1 = ID_Name2)Then
		 P_Return(P_Return.Count) := O_Emp(ID_No1,ID_Name);
	  End If;
   End Loop;
   Close C1;
   Close C2;

   Return P_Return;
End;
/

ولإستدعاء هذا الفنكشن يمكنك كما يلي :

Select * From Table(Get_Emp);

وعند التفكير في المشكلة ... اجدد انني بحاجة لحفظ كل record
من الجدول الاول والغير موجودة في لجدول التاني


من واضح أنك عايز تبحث في الجدول الثاني ، لو كان السجل مش موجود في الجدول الأول تأخذ البيانات من الجدول الثاني وتدرجة في الجدول الأول ( بس أنت كدة شقلبت السؤال ، وشقلبت دماغي كمان ) :rolleyes: :rolleyes: :rolleyes:

علي العموم لو كان هذا ما تقصدة غير الكود السابق كما يلي :

If(ID_No1 = ID_No2) And (ID_Name1 = ID_Name2)Then
		 Insert Into Emp1(Emp_No1, Emp_Name1) Values(ID_No1,ID_Name);
		 Commit;
	  End If;

ولكن بالطبع بتلغي عملية الإرتجاع كجدول ، يعني تلغي الـ Function وتجعلة Procedure !!!



يارب أكون عرفت أترجم


مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#6 NoorAdiga

NoorAdiga

    عضو

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

تاريخ المشاركة 24 July 2008 - 09:33 AM

شكـــــــــــــــــرا كتير كتير كتير ع الرد المميز ... كتير استفدت من الكود اللي بعتلي اياه :lol:
:D :) :D :)
انا حبيت احط المشكلة بالتفصيل مع حلها مشان اي حد تاني يستفيد ان شا الله

بداية ... عندي جدولين ... بدي اقارن ال
records فيهم
واطلع السجلات الناقصة ... وبس اعرضها بال
output
هو الصعوبة بالموضوع انو ممكن سجل جوا ال banner
يماثل من سجل لخمسة جوا ال kh
حسب الايام ... هي طريقة ضعيفة لانشاء جدول .. انما الجدول موجود جاهز وعلينا نتعايش معه



اول خطوة ... بدي اعمل الجدولين على
SQL
create table banner(
term_code varchar2(10),
crn varchar2(10),
building varchar2(6),
room varchar2(6),
start_time number(4)not null,
end_time number(4)not null,
u varchar2(1),
m varchar2(1),
t varchar2(1),
w varchar2(1),
s varchar2(1),
primary key(term_code,crn,building,room,start_time,end_time)) ;


create table kh(
term_code varchar2(10),
crn varchar2(10),
building varchar2(6),
room varchar2(6),
start_time number(4)not null,
end_time number(4)not null,
weekday number(1)not null,
primary key(term_code,crn,building,room,start_time,end_time,weekday));



تاني خطوة ... بندخل بيانات جواتهم .. بصير شكلهم كالتالي
TERM_CODE CRN BUILDI ROOM START_TIME END_TIME U M T W S
---------- ---------- ------ ------ ---------- ---------- - - - - -
200910 10003 MQ17 104 900 1215 U T
200910 10003 MQ12 104 800 9000 U T
200910 12345 MQ23 123 1100 1250 M W
200910 12099 MQ23 103 800 900 S


TERM_CODE CRN BUILDI ROOM START_TIME END_TIME WEEKDAY
---------- ---------- ------ ------ ---------- ---------- ----------
200910 10003 MQ17 104 900 1215 1
200910 10003 MQ17 104 900 1215 2
200910 12099 MQ23 103 800 900 5
200910 10003 MQ12 104 800 9000 2
200910 10003 MQ12 104 800 9000 4
200910 12099 MQ23 M103 800 900 1


واخر خطوة هي pl sql
declare

/*declare the counters for banner and for kh */
kh_counter number := default Null;
banner_counter number(3);

/* declare banner cursor */
cursor banner_cur is
select * from banner where term_code= '200910';
/* declare banner record */
banner_rec banner_cur%ROWTYPE;


/* declare kh cursor which is a cursor with parameter */
cursor kh_cur (p_term_code varchar2, p_crn varchar2, p_building varchar2,
p_start_time number, p_end_time number)
is select * from kh where term_code= p_term_code and crn= p_crn and building = p_building and start_time = p_start_time and end_time= p_end_time;
/* declare kh record */
kh_rec kh_cur%ROWTYPE;


BEGIN DBMS_output.PUT_LINE('Lets start');

/* open the banner cursor if its not already opened */

IF NOT banner_cur%ISOPEN
THEN open banner_cur;
END IF;


/* fetch the banner cursor into the banner record and then start the loop */


loop
FETCH banner_cur INTO banner_rec; EXIT WHEN banner_cur%NOTFOUND;


/* we want to know that this record how many record it will present in kh table depending on the days
the we store this value in the banner_counter*/

banner_counter := 0; /* intialize the counter to zerp */

IF banner_rec.u = 'U' /* if the value is null then it will be treated as false*/
Then :banner_counter := banner_counter +1 ;
END IF;

IF banner_rec.m = 'M'
Then :banner_counter := banner_counter +1 ;
END IF;

IF banner_rec.t = 'T'
Then :banner_counter := banner_counter +1 ;
END IF;

IF banner_rec.w = 'W'
Then :banner_counter := banner_counter +1 ;
END IF;

IF banner_rec.s = 'S'
Then :banner_counter := banner_counter +1 ;
END IF;

/* open the kh cursor and passing it's argument from banner record to make sure we have
the same records in the ACTIVE SET to the current record in banner */

open kh_cur (banner_rec.term_code, banner_rec.crn, banner_rec.building, banner_rec.start_time,
banner_rec.end_time);

/*intialize the kh counter for the match records to zero then
we will start a counter
to fetch all the records in the active set till the active set is empty and the number of records
are stored int he kh_counter*/

kh_counter := 0;

loop
FETCH kh_cur INTO kh_rec; EXIT WHEN kh_cur%NotFOUND;
:kh_counter := kh_counter +1 ;
END LOOP;

close kh_cur;


/* now 2 check for missing record all what we need to do is to compare the two counters value */

IF banner_counter > kh_counter
THEN
DBMS_output.PUT_LINE( 'The CRN = ' || banner_rec.crn ||'have missing record/records in khadamat table ');
END IF;

END LOOP;

CLOSE banner_cur;
END;



ارفقت صورتين لتوضيح طريقة عمل الكود .... اي سؤال او استفسار انا جاهزة
ومرة تانية ... شكرا لكل اللي رد على سؤالي
:D

نـــــــــــــــــور

ملفات مرفقة

  • ملف مرفق  task2_1.JPG   54.62كيلو   34 عدد مرات التحميل
  • ملف مرفق  task2_2.JPG   42.33كيلو   27 عدد مرات التحميل