الانتقال إلى المحتوى
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

بتاريخ:


السلام عليكم الاخوة والاخوات الاعزاء

لدي مشروع لعمل الصادر والوارد ....ولدي سؤالين عن الموضوع

كيف يمكن ان اعمل رقم مسلسل الوارد .. وهو مفتاح الجدول primary key ويكون مسلسل تلقائي يصدر من الحاسب .

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


DO_KEY('create_record');
select nvl(max(no),0)+1 into :income.no from thesis;
set_item_property('income.no',enabled,property_false);
go_item('income.name');



يقوم باضافة تسلسل بصورة تلقائية ....

في جدول الاجراءات المتخذه على المعاملة ( الهوامش ) وهو جدول مرتبط بجدول الوارد الرئيسي كيف يتم تحريك رقم الوارد تلقائيا(من الجزء العلوى من الشاشة ) ...

عند انشاء السجل فى الجدول التفصيلي مع امر pre insert

تم تعديل بواسطة alsaedi

بتاريخ:
DO_KEY('create_record');
select nvl(max(no),0)+1 into :income.no from thesis;
set_item_property('income.no',enabled,property_false);
go_item('income.name');




SELECT MAX(NVL(NO,0))+1 INTO :income.no FROM THESIS WHERE YEAR = :INCOME.YEAR;



بهاذا سيزيد الرقم لكل سنة فقط
2000 -------> 1
2000 -------> 2
2000 -------> 3
2001 -------> 1
2000 -------> 4
2001 -------> 2
وهكذا
ولكن يجب في البداية انا يكون INCOME.NO AND INCOME.YEAR هما المفاتيح الاساسية مع بعضهما البعض

تم تعديل بواسطة rose_4_pretty

بتاريخ:
  • كاتب الموضوع

شكرا لك يا rose_4_pretty على الرد

كيف يمكن ان افعل ذلك اذا كان تاريخ الوارد ورقم الوارد هما المفتاحين الاساسين

بتاريخ:

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

هل تريد السيريل يكون مدمج مع العام (4أرقام ) أم لا
على العموم أنت افترضت إنك تريد اختيار سنة الميلاد فقط (4 أرقام )
وقمت بعمل هذا الكود البسيط أتمنى أن يفي بالغرض هذا سيدمج العام مع السيريل

declare
year_count  number;
begin select count(*) into year_count from your_table where substr(serial,1,4)=to_char(sysdate,'yyyy');
if year_count=0 then
	:serial:=to_char(sysdate,'yyyy')||year_count+1;
else                                       
		:serial:=to_char(sysdate,'yyyy')||year_count+1;
end if;
end;




أدخل اسم جدولك
وانا اعتبرت أن serial هو عمود السيريل الاي يتم فيه التكرار هذا لو كان جمع التاريخ والتزايد معا مثال العام 2009 هيكون أول ترقميم=20091 الثاني 20092 وهكذا لو العام 2010 هيكون أول ترقيم =20101 والثاني 20102 وهكذا
------------------------------------------------------------------
أما لو كنت تريد عمل حقلين أحدهما لل serial مثلا 1-2-3 وهكذا وأحدهما للتاريخ يتم تسجيل فيه تاريخ الوراد فهذا سيكون أسهل عن طريق الاتي

declare
x_serial  number;
begin select count(*) into x_serial from your_table where to_char(s_date,'yyyy')=to_char(sysdate,'yyyy');
if x_serial=0 then
	:serial:=nvl(x_serial,0)+1;
else                                       
		:serial:=x_serial+1;
			end if;
end;



على أساس أنه عندك عمود يتم فيه تخزين تاريخ الوارد وانا سميته في المثال السابق s_date وعمود السيريل اسمه serial
المثال لو مثلا تاريخ اليوم 1-1-2009 سيكون عمود السيريل يأخذ رقم 1 إلى نهاية العام ويستأنف الترقيم الجديد مع العام الجديد



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

بتاريخ:
  • كاتب الموضوع

شكرا لك mustafagamiel على الرد الرائع ...... ولكن

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

وحضرتك ذاكر في الشرط لازم يكون تاريخ الحاسبة للسنة هو نفسه تاريخ القيد السنة !!!!!!!!

وانا لسه ما ادخلت البيانات

بتاريخ:

خلاص مفيش مشكلة
هتشيل sysdate وتضع اسم الايتم الذي يتم إدخال التاريخ فيه وتخليه يأخذ العام منه "الاي المستخدم أدخله"
وطبعا هيكون ده من غير تتدخل من المستخدم

أرجوا لو كانت هذه ليست وجهة نظرك
تقوم بتوضيح سؤالك أكثر وأكثر

بتاريخ:
  • كاتب الموضوع

الشكر كل الشكر والتقدير لك يا اخي العزيز على سعة الصدر والمساعدة

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

انا عاوز اعمل زر اضافة يقوم باضافة تسلسل تلقائي لرقم كل ملف وارد وعند نهاية السنة يبداء تسلسل جديد

مثلا لسنة 2009 عندما اضيف ملف يبدا من 1 الـــــــــــخ

وفي سنة 2010 يبدا تسلسل جديد من 1 ايظا الى نهاية السنة

وعملية الاضافة تتم اول شي اي قبل ان اظيف البيانات ....... بالانتظار

تم تعديل بواسطة alsaedi

بتاريخ:

أخي موضوعك بسيط
والحل في مشاركتي السابقة
لمعرفة كيفية وضعه يعني في أي تريجر
انظر هذه المشاركة
http://www.araboug.org/ib/index.php?showtopic=34034
وعلى العموم لو وجدت صعوبة
قم بإرفاق الفورم الخاص بك مع الجداول وسيتم وضعه كما تشاء إن شاء الله

ومرحبا ألف بأهل العراق

بتاريخ:

الأخ مصطفي الغالي إسمح لي بالمشاركة وآسف جداً جداً علي المقاطعة !!!

--------------------------------------------------------------------------------------

مهندس بلال الكريم ، تحية طيبة وبعد

بالطبع أنت تتحدث عن نظام مخزون سلعي "وارد/صادر" !!!!

بدايتاً نادراً ما تعمل شركة علي أساس سنوات طويلة لنفس قاعدة البيانات ، ولكن بيتم تقسيم عملية قاعدة البيانات الي أجزاء كل سنة أو نصف سنة أو ربع سنة "حسب ضغط البيانات"

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

بإختصار شديد فكرة الـ SysDate أللي وصفها لك الأخ "مصطفي" ، هي أفضل فكرة لجلب السنة الحالية حسب ضبط الـ Server !!!



أما بقي لو عايز تعمل ترقيم بهذا الشكل فمن المفروض أنك لديك 2 حقل ، الأول المفتاح الرئيسي Primary Key والثاني تاريخ الوارد ... فعلشان تظبط الموضوع دة تجلب أكبر قيمة في المفتاح الرئيسي وتضيف عليها قيمة ( 1 ) ، ولكن بشرط أن يكون السنة الحالية هي نفس السنة الموجودة علي الحاسب السيرفر كما يلي :

Select NVL(Max(Invoice_ID),0) + 1
From Invoice
Where To_Char(Invoice_Date,'yyyy') = To_Char(SysDate,'yyyy')



وبكدة المشكلة أتحلت



لكن فية شيء عايز أسألك عنه !!!!!!!

المفروض أن السنة المالية مبتبدأش في 1/1 وتنتهي في 31/12 ، لكن بتبدأ في 1/7 وبتنتهي في 30/6 للسنة التالية ؟؟؟؟؟

يبقي عملية الترقيم هتختلف حسب السنة المالية وليس السنة الحالية !!!!

لذلك يجب إشراك الشهر في الموضوع ، من السنة السابقة بتاريخ 1/7 الي السنة التالية بتاريخ 30/6

أنظر الي طريقة الترقيم كيف تكون :

SELECT NVL(MAX(INVOICE),0) + 1
FROM INVOICE
WHERE TO_CHAR(INVOICE_DATE,'YYYY/MM') BETWEEN 
		 TO_CHAR(SYSDATE,'YYYY') || '/07' AND
		 TO_CHAR(SYSDATE + 365.25,'YYYY') || '/06'




ملحوظة الكود السابق مجرد مثال وليس صحيح بالمعني الصحيح ، ولكن أصح شيء عمل التالي :

1- يجب عليك إدراج حقيقن في جدول منفصل يحدد فية العميل بداية ونهاية السنة المالية علشان متضغطش علي نفسك كثيراً ... هفرض أننا عندنا جدول معلومات الشركة وفيها حقلين ، الأول بداية السنة المالية COMINFO_START والثاني نهاية السنة المالية COMINFO_END
2- إنشاء Function خفيف يستقبل تاريخ الوارد ثم يجلب تاريخ البداية وتاريخ النهاية للسنة المالية ، ثم يقارن بينها ويرتجع قيمة Boolean ، مثال :

CREATE FUNCTION TEST_YEAR(IN_DATE  DATE) RETURN BOOLEAN
AS
ID_RETURN  BOOLEAN;
ID_START	DATE;
ID_END		DATE;
BEGIN
--1: Get start and end year.
SELECT COMINFO_START, COMINFO_END
INTO ID_START, ID_END
FROM COMINFO;
--2: Test date.
IF(IN_DATE BETWEEN(ID_START,ID_END))THEN
	ID_RETURN  :=  TRUE;
ELSE
	ID_RETURN  :=  FALSE;
END;

RETURN ID_RETURN;
END;
/



بعد كدة تصنع الجملة التالية لإجراء عملية الترقيم التلقائي من داخل الفورم مثلاً في حدث PRE-INSERT :


SELECT NVL(MAX(INVOICE_ID),0) + 1
INTO :INVOICE.INVOICE_ID
FROM INVOICE
WHERE TEST_YEAT(SYSDATE) = TRUE;




وبالطبع دة مجرد فكرة ، لكن الأفكار الحلوة كثيرة



ملحوظة ، لم أجرب الكود ولكنني سرت ورائة بالمنطق ، وصنعت هذا من قبل ، فيا ريت تفهم الكود ولن تجربة بعينة






وآسف مرة ثانية لمقاطعتك أخ مصطفي



بالتوفيق

بتاريخ:
  • كاتب الموضوع

شكرا لك اخي mustafagamiel وشكرا للاخ mma على الرد وسلامي لاهلنا في مصر

بتاريخ:

thanksssssssssssssssssssssssssssssssssssssssssssssss

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

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

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

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

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

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.