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

جملة Select لإظهار 3 سجلات متتالية من نوع محدد داخل stored procedure

بدأه majed123 في 29 نوفمبر 2009 · 13 رد · 2,208 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

جدول مكون من 3 حقول ولتكن مثلا

ID , Card_ID, Type_ID

أريد جملة select تكون بشرط card_id=1 مثلا ، وأستعرض أي 3 سجلات متتالية من نوع السداد type_id =44 ، بشرط أن تكون على التوالي لا يفصل بينهم نوع آخر مثلا السحب رقم 46

الهدف من هذه الجملة هي أن عندي بطاقات فيزا وجدول للعمليات التي يقوم بها العميل اسمه transactions وفيه الحقول الثلاث السابقة

وأريد أن أعرف إذا قام العميل بعملية سداد 3 مرات متتالية أو أكثر بحيث لا يفصل بينهم عملية سحب

لتقريب الحل حاولت استخدام cursor وجملة fetch فربما تكون هي الأقرب لإيجاد الحل ولكن لم أصل للحل

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

للتواصل silver_75@hotmail.com

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#2


select * from dbo.EMP_TAB_VICTION_MAIN as q
where START_DATE in (
SELECT TOP 3 START_DATE
FROM EMP_TAB_VICTION_MAIN
where EMP_TAB_VICTION_MAIN.CODE_EMP = EMP_TAB_VICTION_MAIN.CODE_EMP
ORDER BY START_DATE DESC)

اخي الكريم دعوة صادة تكفي لخدمة الجميع

oracle@arabdb.org

#3

أخي الكريم

جزاك الله خيرا، وأشكر ردك ومحاولتك، والمبلغ المطروح كهدية زيادة على الدعوة.

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

SELECT Transaction_ID, Transaction_Date, Transaction_Amount, Card_ID, Merchant_ID, Transaction_Type_ID

FROM CST_Transactions AS q

WHERE (Transaction_ID IN

(SELECT TOP (3) Transaction_ID

FROM CST_Transactions

WHERE (Transaction_Type_ID = 435)

ORDER BY Transaction_ID DESC))

ويتضح بالضبط محتويات الجدول، وأريدك ملاحظة أن تشترط عملية السداد رقم 435 بالتوالي بحيث لا تتخللها عمليات من نوع آخر أما إذا تخللها عملية رقم 436 مثلا فلا أريد أن تظهر أي نتيجة

أعتقد والله أعلم أن الحل يكمن باستخدام Cursor ولست متأكدا من ذلك

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#4

اخي الكريم ماهي النتجية التي ظهرت لك

وهل في الجدول تصنيف لكل سجل هل هو تسديد أو غيره

الحل السابق تم تجربتها على اخر ثلاث موظفين حصلوا على اجازة

oracle@arabdb.org

#5

نعم هناك تصنيف لكل عملية كما أوضحت من خلال الحقل Transaction_Type_ID وهو مرتبط بجدول آخر.

النتيجة هو إظهار آخر 3 عمليات وهذا ليس صعبا ولكن أريد إظهار أي 3 عمليات متتالية مصنفة بالسداد سواء كانت الأخيرة أو الأولى أو في أي مكان

هل عرفت لماذا طرحت هدية متواضعة؟ لأن الأمر ليس بسيطاً

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#6

أخي الفاضل Majed123

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

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

أولاً سنقوم بعرض جميع الحقول لكي نعرف ما يحويه الجدول من أنواع معاملات وهي النوع 44 والنوع 45

post-46243-12594850096679_thumb.jpg

ثانياً والان سنقوم بكتابة الاجرء الذي سيجلب لنا الثلاثة معاملات الاولي والتي تعتمد علي نوع معاملة رقم 44 وفي نفس الوقت لا يظهر مع جملة الاستعلام المعاملات المخالفة

post-46243-12594851407543_thumb.jpg

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 29 نوفمبر 2009 في 12:02

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#7

أخي الفاضل ماجد

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

أولاً: - سنقوم بعمل باضافة حقل جديد في الجدول اسمة Zdate وذلك لادارج التاريخ والوقت وقت حدوث الحركة سواء حركة صرف أو ايداع

ثم نقوم بالذهاب الي خصائص الحقل ووضع هذه الدالة في خانة Default Value or binding وكما هو موضح بالصورة وذلك لادارج التاريخ والوقت اوتوماتيكيا وقت وقوع الحدث

post-46243-12594914506993_thumb.jpg

GetDate()

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

1 - أول ثلاثة سجلات

2 - ما بين تاريخ ووقت محدد وهذه هي مكمن المشكلة لان الوقت والتاريخ هي الوسيلة الوحيده لاظهار البيانات بشكل متسلسل علي حسب عدد المرات التي استخدم فيها الشخص كارت الفيزا الخاص به

3 - بشرط أن يكون حقل Type_id = 44 أو يساوي القيمة الذي ستم وضعها في الـ Parameter

من هنا نفهم أن جملة الاستعلام لدينا سنتقسم الي ثلاثة مقاطع وكما شرحت أعلاه

ثانياً:- سنقوم عمل اجراء مخزن Stored Procedure لاجراء هذه المسأله كالتالي

سنقوم بعمل ثلاثة Parameter لكي نضع بداخلها القيم المراد الاستعلام عنها سواء تاريخ أو نوع معاملة من خلال هذه الجملة

 Create Proc Get_Data_in_specific_time @FDate datetime,@TDate datetime,@Type_id int

وهذه ثلاثة متغيرات للاستعلام عن حقل التاريخ والوقت ونوع المعاملة

ثم نقوم بكتابة بعد ذلك جملة الاستعلام

 as begin select top (3) Id,Card_id,Type_id,Zdate from Tbl_trans

ثم جملة الشرط والذي ستحقق من خلالها المطلوب

 where Zdate between @FDate and @TDateand Type_id = @Type_id end

ليصبح الشكل النهائي للاجراء المخزن هو

 

Create Proc Get_Data_in_specific_time



@FDate datetime

,@TDate datetime

,@Type_id int



as begin



select top (3) Id,Card_id,Type_id,Zdate from Tbl_trans



where Zdate between @FDate and @TDate

and Type_id = @Type_id



end

والان ليس مطلوب مننا غير تشغيل الاستعلام ووضع المتغيرات المطلوبة كما في الصورة لنشاهد النتائج

post-46243-12594918437046_thumb.jpg

والان نتيجة الاستعلام

ستجد أن الاستعلام سجلب لك التالي

أول ثلاثة سجلات في الجدول مسلسلة تلقائيا حسب التواريخ الذي قام بها الشخص وقت عملية الايداع وهي حركة رقم 44

post-46243-12594919088916_thumb.jpg

فقد تمت حركة رقم 44 بتاريخ 2009-11-29 12:21:12

فقد تمت حركة رقم 44 بتاريخ 2009-11-29 12:21:18

فقد تمت حركة رقم 44 بتاريخ 2009-11-29 12:21:24

في الثانية 12 و 18 و 24

كذلك سيتم جلب النتيجة اذا كانت العمليات في تواريخ مختلفة

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#8

شكرا جزيلا على جهودك ومواصلتك في الماسنجر

ولكن كما أخبرتك أن هذا ليس هو الحل ، فأنا أحتاج عرض السجلات التي نوعها رقم 44 وتكون مرتبة وراء بعضها البعض، أما إن كان في وسطها سجل من نوع رقم 45 كما في مثالك فالمفروض أن لا يتم عرض سجلات

أرجوا من الجميع محاولة إرسال الحل

الفكرة أنني أريد أن أعرف من العميل الذي قام بعملية إيداع في البنك ب 3 مرات متتالية من خلال بطاقة الصراف الآلي.

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#9

اخي الكريم هل عمليات الايداع في تاريخ واحد أو مختلفة

اخر ثلاث عمليات هل هي في تاريخ واحد

oracle@arabdb.org

#10

عمليات الإيداع سواءا كانت بنفس التاريخ أو غيرها فمقياس الشرط ليس التاريخ وإنما هو من خلال الترتيب المتتالي

وأنا لم أطلب آخر 3 عمليات ولا أولها، بمعنى ليس شرطا أن تكون آخر أو أول أو وسط وإنما الشرط كما كررت هو تكرار عملية الإيداع 3 مرات متتالية

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#11

سأرفع قيمة الهدية إلى 200 ريال لصاحب أول حل

علما بأن الحل كما قلت هو باستخدام cursor ووضع الجملة داخل stored procedure

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#12

ماذا لو قام العميل بثلاث عمليات سحب متتالية وبعد فترة قام بأربع أو خمس عمليات سحب متتالية ، ماذا سيكون الناتج؟

تم تعديل هذه المشاركة بواسطة المبرمج أحمد في 30 نوفمبر 2009 في 12:28

سبحان الله وبحمده ... سبحان الله العظيم

#13

الشرط المطروح هو للإيداع المتكرر وليس للسحب، علماً بأنني أحتاج نفس الشرط ولكن للسحب المتكرر

والمطلوب 3 عمليات أو أكثر ولكن إذا وجد صعوبة من كلمة أو أكثر فيمكنك تجاوزها

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

#14

<A name=OLE_LINK2>شكرا جزيلا لمن حاول مساعدتي، ولكني والفضل لله توصلت للحل أخيراً، راحت عليكم الهدية

وهذا هو الحل

 

ALTER PROCEDURE [Select_Role_3_A]

AS

SET NOCOUNT ON

Declare @Transaction_ID1 int , @Transaction_Type_ID1 int , @Card_ID1 int

Declare @Transaction_ID2 int , @Transaction_Type_ID2 int , @Card_ID2 int

Declare @Transaction_ID3 int , @Transaction_Type_ID3 int , @Card_ID3 int

DECLARE authors_cursor SCROLL CURSOR

FOR SELECT Transaction_ID,Transaction_Type_ID,Card_ID

FROM CST_Transactions

OPEN authors_cursor

WHILE @@FETCH_STATUS = 0

BEGIN

FETCH NEXT FROM authors_cursor INTO @Transaction_ID1, @Transaction_Type_ID1,@Card_ID1

if @Transaction_Type_ID1 = 435

begin

FETCH NEXT FROM authors_cursor INTO @Transaction_ID2, @Transaction_Type_ID2, @Card_ID2

FETCH NEXT FROM authors_cursor INTO @Transaction_ID3, @Transaction_Type_ID3, @Card_ID3

if @Transaction_Type_ID1 = @Transaction_Type_ID2 and @Transaction_Type_ID1 = @Transaction_Type_ID3 and @Card_ID1 = @Card_ID2 and @Card_ID1 = @Card_ID3

begin

SELECT Transaction_ID, Card_ID, Transaction_Type_ID

where Transaction_ID = @Transaction_ID1 or Transaction_ID = @Transaction_ID2 or Transaction_ID = @Transaction_ID3

end

end

set @Transaction_Type_ID1 = @Transaction_Type_ID
END

CLOSE authors_cursor



DEALLOCATE authors_cursor

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 1 ديسمبر 2009 في 10:07

PMI_Logo_1.jpg

مدير مشاريع محترف - PMP
محلل أنظمة معتمد
مدير فريق برمجة تطبيقات ويب .Net

======|||||=====

======@ @====
==o0o== ( ) ==o0o===
================
كل منا يحتاج إلى الإرادة حتى يستطيع أن يقوم بعمله

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