jadquraan بتاريخ: 8 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 8 أغسطس 2009 (معدل) السلام عليكم لاحظت ان الكثير يبحث عن كود مرن وقوي لعملية التفقيط اهديكم هذا الكود طبعا يتكون من 2 function سأقوم بإرفاق functions في المرفقات طبعا هذا الكود يقبل لغاية 9999999999999999999999999999999999999999 اي 41 خانة اي ما يعادل تسعة مائة وتسعة وتسعون فيمتون وتسعة مائة وتسعة وتسعون تسرسليون وتسعة مائة وتسعة وتسعون سرسليون وتسعة مائة وتسعة وتسعون فريليون وتسعة مائة وتسعة وتسعون تريليون وتسعة مائة وتسعة وتسعون مليار وتسعة مائة وتسعة وتسعون مليون وتسعة مائة وتسعة وتسعون ألف وتسعة مائة وتسعة وتسعون الـ function الاول CREATE OR REPLACE Function Digits3_Word( nNum Number ) Return Varchar2 IS vReturn Varchar2(500) := NULL; Digit3 Number := 0; i1 Number := 0; j1 Number := 0; k1 Number := 0; nInNum Number := 0; vTemp Varchar2(50) := NULL; Type Digit1Array is table of Varchar2(50); Type Digit2Array is table of Varchar2(50); Type Digit3Array is table of Varchar2(50); -- Digit1Str Digit1Array := Digit1Array('واحد', 'إثنان', 'ثلاثة', 'أربعة', 'خمسة', 'ستة', 'سبعة', 'ثمانية', 'تسعة', 'عشرة', 'إحدى عشرة', 'إثنا عشر', 'ثلاثة عشر', 'أربعة عشر', 'خمسة عشر', 'ستة عشر', 'سبعة عشر', 'ثمانية عشر', 'تسعة عشر' ); Digit2Str Digit2Array := Digit2Array('', 'عشرون', 'ثلاثون', 'أربعون', 'خمسون', 'ستون', 'سبعون', 'ثمانون', 'تسعون' ); Digit3Str Digit3Array := Digit3Array('مائة', 'مائتان', 'ثلاث مائة', 'أربع مائة', 'خمس مائة', 'ست مائة', 'سبع مائة', 'ثمان مائة', 'تسعة مائة' ); Begin nInNum := nNum; If nInNum>999 Then nInNum := 0; End If; vTemp := LPAD( To_Char( nInNum ), 3, 0 ); Digit3 := To_Number( SubStr( vTemp, 1, 1 ) ); If Digit3>0 Then vReturn := Digit3Str( Digit3 ); End If; i1 := To_Number( SubStr( vTemp, 2, 2 ) ); j1 := To_Number( SubStr( vTemp, 2, 1 ) ); k1 := To_Number( SubStr( vTemp, 3, 1 ) ); If Digit3>0 AND (j1>0 OR k1>0) Then vReturn := vReturn||' و'; End If; If i1>0 and i1<20 Then vReturn := vReturn||Digit1Str(i1); End If; If j1>=2 Then If k1>0 Then vReturn := vReturn||Digit1Str(k1)||' و'; End If; vReturn := vReturn||Digit2Str(j1); End If; If nInNum=0 Then vReturn := 'صفر'; End If; Return vReturn; End Digits3_Word; الـ function الثاني CREATE OR REPLACE Function Tafqeet( nNum Number, vIntegerCurrency Varchar2 := 'دينار', vDecimalCurrency Varchar2 := 'فلــــــــس' ) Return Varchar2 IS vReturn Varchar2(1000); nInNum Number := 0; nInteger Number := 0; nDecimal Number := 0; nDecimal_V varchar2(10) :=null; vChar Varchar2(100); vTemp Number := 0; Type NamesArray is table of Varchar2(500); NameStr NamesArray := NamesArray ( '', 'ألف', 'مليون', 'مليار', 'تريليون', 'فريليون', 'سرسليون', 'تسرسليون', 'فيمتون' ); Begin nInNum := ABS( nNum ); nInteger := Trunc( nInNum ); nDecimal := nInNum - nInteger; nDecimal_V:=substr(to_char(nDecimal,'9D9999'),4,3); vChar := To_Char( nInteger ); For I in 1..NameStr.Count Loop If vChar is NULL Then Exit; End If; vTemp := To_Number( SubStr( vChar, (Length( vChar )-2), 3) ); If vTemp>0 Then vReturn := Digits3_Word( vTemp )||' '||NameStr( I )||' و'||vReturn; End If; vChar := SubStr( vChar, 1, ( Length( vChar )-3 ) ); End Loop; vReturn := SubStr( vReturn, 1, ( Length( vReturn )-1 ) ); vReturn := LTrim(RTrim(vReturn)); If nNum>=1000 and nNum<2000 Then vReturn := SubStr( vReturn, 5, Length( vReturn ) ); End If; If nNum>=2000 and nNum<3000 Then vReturn := 'ألفان'||SubStr( vReturn, 11, Length( vReturn ) ); End If; If nNum>=3000 and nNum<=10000 Then vReturn := SubStr( vReturn,1,(INSTR( vReturn,'ألاف' )-1) )|| 'ألف'|| SubStr( vReturn, (INSTR( vReturn, 'ألف')+3), Length( vReturn ) ); End If; vReturn := LTrim(RTrim(vReturn)); If nDecimal>0 Then if vDecimalCurrency is null then vReturn := vReturn||' '||vIntegerCurrency||' و فلـــ '|| nDecimal_v || ' ــس' || ' فقط لا غير'; else vReturn := vReturn||' '||vIntegerCurrency||' و '|| nDecimal_v || ' ' || vDecimalCurrency || ' فقط لا غير'; end if; Else vReturn := vReturn||' '||vIntegerCurrency || ' فقط لا غير'; End If; If nInteger>0 Then vReturn := vReturn; ElsIf nInteger=0 and nDecimal>0 Then if vDecimalCurrency is null then vReturn:=nDecimal; vReturn := 'فلــ '|| nDecimal_v || ' ــس ' || ' فقط لا غير'; else vReturn := nDecimal_v || ' ' || vDecimalCurrency || 'فقط لا غير'; end if; else vReturn:='صفر '||vIntegerCurrency || ' فقط لا غير'; End If; Return (LTrim(RTrim(vReturn))); End Tafqeet; امثله على طريقة استدعاء عملية التفقيط select Tafqeet(1524552) from dual; واحد مليون وخمس مائة وأربعة وعشرون ألف وخمس مائة وإثنان وخمسون دينار فقط لا غير select Tafqeet(1524552.525) from dual; واحد مليون وخمس مائة وأربعة وعشرون ألف وخمس مائة وإثنان وخمسون دينار و 525 فلــــــــس فقط لا غير select Tafqeet(1524552,'ريال','هلله') from dual; واحد مليون وخمس مائة وأربعة وعشرون ألف وخمس مائة وإثنان وخمسون ريال فقط لا غير select Tafqeet(1524552.656,'ريال','هلله') from dual; واحد مليون وخمس مائة وأربعة وعشرون ألف وخمس مائة وإثنان وخمسون ريال و 656 هلله فقط لا غير select Tafqeet(1524552.658,'دولار','سنت') from dual; واحد مليون وخمس مائة وأربعة وعشرون ألف وخمس مائة وإثنان وخمسون دولار و 658 سنت فقط لا غير دمتم بخير Tafqeet.rar تم تعديل 8 أغسطس 2009 بواسطة jadquraan اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ORA-2008 بتاريخ: 8 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 8 أغسطس 2009 مرحبــــاشكـــــــــــــــــــــــرا يا حلـــــــــــــــــــــــــــو اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
jadquraan بتاريخ: 8 أغسطس 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 8 أغسطس 2009 العفو اخي هذا اقل واجب اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmad.Hasan بتاريخ: 10 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 10 أغسطس 2009 ماشاءالله..مجهود رائع أخي جاد...بارك الله فيــــــــك...تحياتي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
abdu1_far بتاريخ: 11 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 11 أغسطس 2009 بجد تسلم أيدك ربنا يجزيك خير اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
MR.DIAB بتاريخ: 11 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 11 أغسطس 2009 جزاك الله عنا كل خير اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
جلال شواقفه بتاريخ: 11 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 11 أغسطس 2009 شكرا جزيلا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
weloooo بتاريخ: 19 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 19 أغسطس 2009 السلام عليكم.جزاك الله خيرا. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
حسن ماستر بتاريخ: 23 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 23 أغسطس 2009 تسلم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
misho911 بتاريخ: 25 أغسطس 2009 تقديم بلاغ مشاركة بتاريخ: 25 أغسطس 2009 شكرا على المجهودو لكن هناك مشكلة بالكود من 3000 الى 10000 لا يعمل بشكل صحيح اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
jadquraan بتاريخ: 6 أكتوبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 6 أكتوبر 2009 هذا الكود انا استخدمه في انظمتي وهي تتعامل مع مبالغ كبيرة ويتكرر فيها التعامل مع الفترة المحددة من قبلك ولكن لم يشتكي اي من المستفيدين من ذلك لكن سأتفقده قد يكون يحتوي على خطأ اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mmsalman87 بتاريخ: 7 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 7 أكتوبر 2009 مشكور على المجهود الرائع اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ahmed_fatthy بتاريخ: 7 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 7 أكتوبر 2009 الأخ العزيز الكود فعلا لايعمل مع الأرقام من 3000 الي 10000 كما قال الأخ مشكورا نرجو مراجعتة اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmed Zain بتاريخ: 7 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 7 أكتوبر 2009 السلام عليكم ورحمة الله وبركاتهبعد التحيةاخي فاللهوفقك الله الى ماتحب ويرضيمجهود ممتاذاخوك فالله اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
khatab2010 بتاريخ: 7 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 7 أكتوبر 2009 (معدل) الكود أكثر من رائع يا أخي العزيزولكن لايعمل فعلاً من رقم 3000 إلى 10000 أرجو مراجعة هذا الكود If nNum>=3000 and nNum<=10000 Then vReturn := SubStr( vReturn,1,(INSTR( vReturn,'ألاف' )-1) )|| 'ألف'|| SubStr( vReturn, (INSTR( vReturn, 'ألف')+3), Length( vReturn ) ); End If; ولي سؤال أنا أريد عندما أكتب 1.20 تكون النتيجة واحد ريال و20 هللة وليس واحد ريال و200 هللة تم تعديل 7 أكتوبر 2009 بواسطة khatab2010 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
jadquraan بتاريخ: 7 أكتوبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 7 أكتوبر 2009 احسنت اخي يوجد خطأ في الفئة 3000 ولغاية 10000ولتصحيح الخطأ يرجى استبدال If nNum>=3000 and nNum<=10000 Then vReturn := SubStr( vReturn,1,(INSTR( vReturn,'ألاف' )-1) )|| 'ألف'|| SubStr( vReturn, (INSTR( vReturn, 'ألف')+3), Length( vReturn ) ); End If; بهذا الكود If nNum>=3000 and nNum<=19999 Then vreturn:= replace(vReturn,'ألف','آلاف') ; End If; اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mmsalman87 بتاريخ: 7 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 7 أكتوبر 2009 ممكن ان تضع لنا الكود بعد التعديل وشكرا لك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
jadquraan بتاريخ: 7 أكتوبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 7 أكتوبر 2009 (معدل) ولا يهمك هي الكودبعد التعديل CREATE OR REPLACE Function Digits3_Word( nNum Number ) Return Varchar2 IS vReturn Varchar2(500) := NULL; Digit3 Number := 0; i1 Number := 0; j1 Number := 0; k1 Number := 0; nInNum Number := 0; vTemp Varchar2(50) := NULL; Type Digit1Array is table of Varchar2(50); Type Digit2Array is table of Varchar2(50); Type Digit3Array is table of Varchar2(50); -- Digit1Str Digit1Array := Digit1Array('واحد', 'إثنان', 'ثلاثة', 'أربعة', 'خمسة', 'ستة', 'سبعة', 'ثمانية', 'تسعة', 'عشرة', 'إحدى عشرة', 'إثنا عشر', 'ثلاثة عشر', 'أربعة عشر', 'خمسة عشر', 'ستة عشر', 'سبعة عشر', 'ثمانية عشر', 'تسعة عشر' ); Digit2Str Digit2Array := Digit2Array('', 'عشرون', 'ثلاثون', 'أربعون', 'خمسون', 'ستون', 'سبعون', 'ثمانون', 'تسعون' ); Digit3Str Digit3Array := Digit3Array('مائة', 'مائتان', 'ثلاث مائة', 'أربع مائة', 'خمس مائة', 'ست مائة', 'سبع مائة', 'ثمان مائة', 'تسعة مائة' ); Begin nInNum := nNum; If nInNum>999 Then nInNum := 0; End If; vTemp := LPAD( To_Char( nInNum ), 3, 0 ); Digit3 := To_Number( SubStr( vTemp, 1, 1 ) ); If Digit3>0 Then vReturn := Digit3Str( Digit3 ); End If; i1 := To_Number( SubStr( vTemp, 2, 2 ) ); j1 := To_Number( SubStr( vTemp, 2, 1 ) ); k1 := To_Number( SubStr( vTemp, 3, 1 ) ); If Digit3>0 AND (j1>0 OR k1>0) Then vReturn := vReturn||' و'; End If; If i1>0 and i1<20 Then vReturn := vReturn||Digit1Str(i1); End If; If j1>=2 Then If k1>0 Then vReturn := vReturn||Digit1Str(k1)||' و'; End If; vReturn := vReturn||Digit2Str(j1); End If; If nInNum=0 Then vReturn := 'صفر'; End If; Return vReturn; End Digits3_Word; CREATE OR REPLACE Function Tafqeet( nNum Number, vIntegerCurrency Varchar2 := 'دينار', vDecimalCurrency Varchar2 := null ) Return Varchar2 IS vReturn Varchar2(1000); nInNum Number := 0; nInteger Number := 0; nDecimal Number := 0; nDecimal_V varchar2(10) :=null; vChar Varchar2(100); vTemp Number := 0; Type NamesArray is table of Varchar2(500); NameStr NamesArray := NamesArray ( '', 'ألف', 'مليون', 'مليار', 'تريليون', 'فريليون', 'سرسليون', 'تسرسليون', 'فيمتون' ); Begin nInNum := ABS( nNum ); nInteger := Trunc( nInNum ); nDecimal := nInNum - nInteger; nDecimal_V:=substr(to_char(nDecimal,'9D9999'),4,3); vChar := To_Char( nInteger ); For I in 1..NameStr.Count Loop If vChar is NULL Then Exit; End If; vTemp := To_Number( SubStr( vChar, (Length( vChar )-2), 3) ); If vTemp>0 Then vReturn := Digits3_Word( vTemp )||' '||NameStr( I )||' و'||vReturn; End If; vChar := SubStr( vChar, 1, ( Length( vChar )-3 ) ); End Loop; vReturn := SubStr( vReturn, 1, ( Length( vReturn )-1 ) ); vReturn := LTrim(RTrim(vReturn)); If nNum>=1000 and nNum<2000 Then vReturn := SubStr( vReturn, 5, Length( vReturn ) ); End If; If nNum>=2000 and nNum<3000 Then vReturn := ' ألفان '||SubStr( vReturn, 11, Length( vReturn ) ); End If; If nNum>=3000 and nNum<=19999 Then /* vReturn := SubStr( vReturn,1,(INSTR( vReturn,' ألاف' )-1) )|| ' ألف'|| SubStr( vReturn, (INSTR( vReturn, ' ألف')+3), Length( vReturn ) ); */ vreturn:= replace(vReturn,'ألف','آلاف') ; End If; vReturn := LTrim(RTrim(vReturn)); If nDecimal>0 Then if vDecimalCurrency is null then vReturn := vReturn||' '||vIntegerCurrency||' و فلـــ '|| nDecimal_v || ' ــس' || ' فقط لا غير'; else vReturn := vReturn||' '||vIntegerCurrency||' و '|| nDecimal_v || ' ' || vDecimalCurrency || ' فقط لا غير'; end if; Else vReturn := vReturn||' '||vIntegerCurrency || ' فقط لا غير'; End If; If nInteger>0 Then vReturn := vReturn; ElsIf nInteger=0 and nDecimal>0 Then if vDecimalCurrency is null then vReturn:=nDecimal; vReturn := 'فلــ '|| nDecimal_v || ' ــس ' || ' فقط لا غير' ; else vReturn := nDecimal_v || ' ' || vDecimalCurrency || 'فقط لا غير' ; end if; else vReturn:='صفر '||vIntegerCurrency || ' فقط لا غير'; End If; Return (LTrim(RTrim(vReturn))); End Tafqeet; ايضا الكود في المرفقات Tafqeet.txt تم تعديل 7 أكتوبر 2009 بواسطة jadquraan اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mmsalman87 بتاريخ: 7 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 7 أكتوبر 2009 مشكور يا حبيب اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
colla بتاريخ: 12 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 12 أكتوبر 2009 مجهود ممتاز جدا جدا وربنا يوفقك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ANAS-ORA بتاريخ: 12 أكتوبر 2009 تقديم بلاغ مشاركة بتاريخ: 12 أكتوبر 2009 تسلم ايديك و تسلم الطفيلة .... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
jadquraan بتاريخ: 16 أكتوبر 2009 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 16 أكتوبر 2009 تسلم يا الغالي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
eman_abdalla78 بتاريخ: 3 أبريل 2010 تقديم بلاغ مشاركة بتاريخ: 3 أبريل 2010 اشكرك على هذا الإبداع اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
shar120032002 بتاريخ: 1 يونيو 2010 تقديم بلاغ مشاركة بتاريخ: 1 يونيو 2010 أين يحرر الكود ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Ahmed_diab1983 بتاريخ: 1 يونيو 2010 تقديم بلاغ مشاركة بتاريخ: 1 يونيو 2010 شكرا عمل جميل والله ، ربنا يوفقك لما فية الخير للاسلام والمسلمين اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.