بتاريخ: 15 مايو 200916 سنة comment_156868 السلام عليكم الاخوة والاخوات الاعزاءلدي مشروع لعمل الصادر والوارد ....ولدي سؤالين عن الموضوع كيف يمكن ان اعمل رقم مسلسل الوارد .. وهو مفتاح الجدول 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 تم تعديل 15 مايو 200916 سنة بواسطة alsaedi تقديم بلاغ
بتاريخ: 15 مايو 200916 سنة comment_156869 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 -------> 12000 -------> 22000 -------> 32001 -------> 12000 -------> 42001 -------> 2وهكذاولكن يجب في البداية انا يكون INCOME.NO AND INCOME.YEAR هما المفاتيح الاساسية مع بعضهما البعض تم تعديل 15 مايو 200916 سنة بواسطة rose_4_pretty تقديم بلاغ
بتاريخ: 15 مايو 200916 سنة كاتب الموضوع comment_156870 شكرا لك يا rose_4_pretty على الرد كيف يمكن ان افعل ذلك اذا كان تاريخ الوارد ورقم الوارد هما المفتاحين الاساسين تقديم بلاغ
بتاريخ: 15 مايو 200916 سنة comment_156878 الاخ الكريم السلام عليكم ورحمة الله وبركاتههل تريد السيريل يكون مدمج مع العام (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 إلى نهاية العام ويستأنف الترقيم الجديد مع العام الجديدأختار ماتريد وأبلغنا بنا توصلت إليه وأتمنى لك الاستفادة تقديم بلاغ
بتاريخ: 15 مايو 200916 سنة كاتب الموضوع comment_156889 شكرا لك mustafagamiel على الرد الرائع ...... ولكنانا اريد ان اعمل كود اضافة يتم فيه عمل اوتونمبر من خلال الحاسوب بدون تدخل اليوزر وحضرتك ذاكر في الشرط لازم يكون تاريخ الحاسبة للسنة هو نفسه تاريخ القيد السنة !!!!!!!!وانا لسه ما ادخلت البيانات تقديم بلاغ
بتاريخ: 15 مايو 200916 سنة comment_156893 خلاص مفيش مشكلة هتشيل sysdate وتضع اسم الايتم الذي يتم إدخال التاريخ فيه وتخليه يأخذ العام منه "الاي المستخدم أدخله"وطبعا هيكون ده من غير تتدخل من المستخدمأرجوا لو كانت هذه ليست وجهة نظرك تقوم بتوضيح سؤالك أكثر وأكثر تقديم بلاغ
بتاريخ: 15 مايو 200916 سنة كاتب الموضوع comment_156897 الشكر كل الشكر والتقدير لك يا اخي العزيز على سعة الصدر والمساعدةالموضوع ببساطة اني عامل فورم للوارد وكما تعرف فان الوارد يصفر كل نهاية سنة اي يبداء تسلسل جديد للنظام انا عاوز اعمل زر اضافة يقوم باضافة تسلسل تلقائي لرقم كل ملف وارد وعند نهاية السنة يبداء تسلسل جديد مثلا لسنة 2009 عندما اضيف ملف يبدا من 1 الـــــــــــخ وفي سنة 2010 يبدا تسلسل جديد من 1 ايظا الى نهاية السنة وعملية الاضافة تتم اول شي اي قبل ان اظيف البيانات ....... بالانتظار تم تعديل 15 مايو 200916 سنة بواسطة alsaedi تقديم بلاغ
بتاريخ: 15 مايو 200916 سنة comment_156898 أخي موضوعك بسيط والحل في مشاركتي السابقة لمعرفة كيفية وضعه يعني في أي تريجر انظر هذه المشاركةhttp://www.araboug.org/ib/index.php?showtopic=34034وعلى العموم لو وجدت صعوبة قم بإرفاق الفورم الخاص بك مع الجداول وسيتم وضعه كما تشاء إن شاء اللهومرحبا ألف بأهل العراق تقديم بلاغ
بتاريخ: 15 مايو 200916 سنة comment_156920 الأخ مصطفي الغالي إسمح لي بالمشاركة وآسف جداً جداً علي المقاطعة !!!--------------------------------------------------------------------------------------مهندس بلال الكريم ، تحية طيبة وبعدبالطبع أنت تتحدث عن نظام مخزون سلعي "وارد/صادر" !!!!بدايتاً نادراً ما تعمل شركة علي أساس سنوات طويلة لنفس قاعدة البيانات ، ولكن بيتم تقسيم عملية قاعدة البيانات الي أجزاء كل سنة أو نصف سنة أو ربع سنة "حسب ضغط البيانات"أما بخصوص السنة ، فمن المفضل التعامل مع تاريخ السيرفر وليس تاريخ الكلاينت ، وتسيب الشركة تتحكم في الوضع حسب مزاجها ، ويكون موظف الـ 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_END2- إنشاء 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; وبالطبع دة مجرد فكرة ، لكن الأفكار الحلوة كثيرة ملحوظة ، لم أجرب الكود ولكنني سرت ورائة بالمنطق ، وصنعت هذا من قبل ، فيا ريت تفهم الكود ولن تجربة بعينةوآسف مرة ثانية لمقاطعتك أخ مصطفيبالتوفيق تقديم بلاغ
بتاريخ: 15 مايو 200916 سنة كاتب الموضوع comment_156931 شكرا لك اخي mustafagamiel وشكرا للاخ mma على الرد وسلامي لاهلنا في مصر تقديم بلاغ
بتاريخ: 15 مايو 200916 سنة comment_156936 thanksssssssssssssssssssssssssssssssssssssssssssssss تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.