نجوم المشاركات
Popular Content
Showing content with the highest reputation on 04/12/25 in all areas
-
معلمي وأستاذي الفاضل / محمد صالح السلام عليكم ورحمة الله وبركاته لقد أثلج صدري تعليقكم الذي هو بمثابة بلسم يداوي الجروح ولكن أحببنا فقط أن نلفت الانتباه لحسن الأسلوب في التوجيه لما قد نغفل عنه أحيانا دون قصد أو عمد. ولنا في سيدنا رسول الله (صل الله عليه وسلم) أسوة حسنة حينما قال ربنا سبحانه وتعالى في محكم كتابه الكريم قرآنا يتلى إلى أن يرث الله الأرض ومن عليها في حق رسولنا الكريم: (فَبِمَا رَحۡمَةٖ مِّنَ ٱللَّهِ لِنتَ لَهُمۡۖ وَلَوۡ كُنتَ فَظًّا غَلِيظَ ٱلۡقَلۡبِ لَٱنفَضُّواْ مِنۡ حَوۡلِكَۖ ...) آل عمران (159) § ولله الحمد والمنة أنه تم استبدال عبارة (أفضل إجابة) بعبارة (تمت الإجابة) فكل من أدلى بدلوه يستحق كل الشكر وعظيم الاحترام والتقدير؛ وكوني كنت معلما فأعرف للمعلم قدره جيدا وتبجليه؛ ولله در الشاعر (أحمد شوقي) حينما قال: قُم لِلمُعَلِّمِ وَفِّهِ التَبجيلا ... كادَ المُعَلِّمُ أَن يَكونَ رَسولا أَعَلِمتَ أَشرَفَ أَو أَجَلَّ مِنَ الَّذي ... يَبني وَيُنشِئُ أَنفُساً وَعُقولا سُبحانَكَ اللَهُمَّ خَيرَ مُعَلِّمٍ ... عَلَّمتَ بِالقَلَمِ القُرونَ الأولى § وأشهد الله أن في هذا المنتدى المحبب إلى قلبي ونفسي من جاوبنا وعلمنا ما جهلنا دون أن يعرف بعضنا بعضا بصفة شخصية؛ وإن تقابلت الوجوه يوما ما لقبلت رؤوسهم وأيديهم تقديرا واحتراما لفضلهم علينا وكيف لا و (من علمني حرفا صرت له عبدا) وأذكر منهم: ü الأستاذ الفاضل / ابراهيم الحداد ü الأستاذ الفاضل / محمد صالح ü الأستاذ الفاضل / Ali Mohamed Ali ü الأستاذ الفاضل / محمد هشام. ü الأستاذ الفاضل / عبدالله بشير عبدالله فلكم جميعا مني كل الشكر و التقدير والاحترام وجزاكم الله عنا خير الجزاء. v أستاذي الفاضل / محمد صالح ما أجمل قولك حينما ختمت أحد موضوعاتك الرائعة: لو بخل بها غيرك ما وصلت إليك ... فلا تبخل بها على غيرك بعد معرفتك بها v وأذكر في هذا المقام: · (... عن علمه فيما عمل به ...) · (تعلم فليس المرء يولد عالما ... وليس أخو علم كمن هو جاهل) v أما وإن ذكرت قول الله تعالى: (... وَلۡيَعۡفُواْ وَلۡيَصۡفَحُوٓاْۗ أَلَا تُحِبُّونَ أَن يَغۡفِرَ ٱللَّهُ لَكُمۡۚ وَٱللَّهُ غَفُورٞ رَّحِيمٌ) النور (22) فقد عفونا. (انتهى)3 points
-
السلام عليكم ورحمة الله وبركاته ، أخواني وأساتذتي ومعلمينا ( دون استثناء ) أشارككم اليوم دالة لتفقيط التواريخ أو الفرق بين تاريخين بعدة أساليب وأنماط . حيث تهدف إلى حساب الفارق الزمني بين تاريخين وتقديم النتيجة بشكل نصي وبالعربية . هذا الكود يتضمن العديد من المزايا التي تسمح بإخراج النتيجة بأشكال متعددة حسب رغبة المستخدم. 💥 الفكرة العامة للدالة الدالة الأساسية التي تم إنشاؤها هي DurationToFullWords ، وهي تقوم بحساب الفارق بين تاريخين معينين (StartDate و EndDate) وتنسيق النتيجة بشكل نصي باستخدام الوحدات الزمنية مثل "سنة" ، "شهر" ، و "يوم" . كما تدعم العديد من الخيارات لتخصيص المخرجات مثل تحديد تنسيق النتيجة وإظهار الأرقام مع الكلمات العربية . 1️⃣ الجزء الأول تعريف المعاملات والتأكد من صحة البيانات المدخلة :- وقد تم تعديل الفكرة بحيث يستقبل الكود التاريخين الأصغر أولاً ثم الأكبر بغض النظر عن ما اذا كان مربع النص الأول يضم تاريخ أكبر أم أصغر .. If IsNull(StartDate) Or IsNull(EndDate) Then DurationToFullWords = "لم يتم إدخال تاريخين للمقارنة" Exit Function End If If EndDate < StartDate Then tempDate = StartDate StartDate = EndDate EndDate = tempDate End If حيث StartDate و EndDate هما التاريخان اللذان يتم مقارنة الفارق بينهما . أولاً يتم التأكد من أن كلا التاريخين مدخلين بشكل صحيح (غير فارغين) . ثم يقارن اي القيمتين أسغر لجعلها بداية والأكبر نهاية 😁 . 2️⃣ الجزء الثاني حساب الفارق بين التواريخ :- y = DateDiff("yyyy", tempDate, EndDate) m = DateDiff("m", tempDate, EndDate) d = DateDiff("d", tempDate, EndDate) totalDays = DateDiff("d", StartDate, EndDate) حيث DateDiff هي دالة تستخدم لحساب الفرق بين التواريخ بوحدات مختلفة مثل السنوات (yyyy) ، الأشهر (m) ، و الأيام (d) . فيتم حساب الفرق بالسنوات أولاً ، ثم الأشهر ، وأخيراً الأيام . ثم يتم جمع totalDays لحساب الفارق الإجمالي بالأيام بين التاريخين . 3️⃣ الجزء الثالث المعالجة الخاصة للأشهر والأيام :- If RoundResults Then If m = 11 And d >= 25 Then y = y + 1 m = 0 d = 0 ElseIf m = 5 And d >= 25 Then m = 6 d = 0 End If حيث RoundResults هو خيار اختياري لتقريب النتائج . فإذا كان هذا الخيار مفعلًا ، يتم تعديل الأشهر أو الأيام ليتم تقريبها بشكل منطقي . فإذا كانت الأشهر 11 شهراً والأيام 25 أو أكثر ، يتم زيادة السنة بمقدار واحد . وإذا كانت الأشهر 5 والأيام 25 أو أكثر ، يتم تحويل الأشهر إلى 6 . 4️⃣ الجزء الرابع تنسيق النتائج حسب الخيارات :- Select Case FormatOption Case "Y" ' تنسيق الفرق بالسنوات فقط Case "M" ' تنسيق الفرق بالأشهر فقط Case "D" ' تنسيق الفرق بالأيام فقط Case "M/D" ' تنسيق الفرق بالأشهر والأيام Case "Y/M" ' تنسيق الفرق بالسنوات والأشهر Case Else ' تنسيق كامل (سنوات، أشهر، أيام) End Select التوضيح على شكل نقاط :- تعتمد الدالة على FormatOption لتحديد التنسيق الذي يجب أن تظهر به النتيجة ، كالتالي :- Y : يعرض النتيجة بالسنوات فقط . M : يعرض النتيجة بالأشهر فقط . D : يعرض النتيجة بالأيام فقط . M/D : يعرض النتيجة بالأشهر والأيام . Y/M : يعرض النتيجة بالسنوات والأشهر . القيمة الافتراضية : يعرض النتيجة كاملة (سنوات ، أشهر ، أيام) . 5️⃣ الجزء الخامس الدوال المساعدة :- Function SimpleUnit(Number As Long, UnitName As String) As String وتقوم هذه الدالة بـ :- بتنسيق الأرقام مع الوحدات الزمنية مثل "سنة" ، "شهر" ، أو "يوم" . تتعامل مع العدد بصيغة الجمع أو المفرد حسب الرقم المدخل . على سبيل المثال ، إذا كان العدد 1 ، يتم إرجاع "1 سنة" أو "1 شهر"، وإذا كان العدد 2 يتم إرجاع "سنتين" أو "شهرين" ... إلخ . Function FormatNumberWithWord(Number As Long, UnitName As String, OnlyNumbers As Boolean, ShowNumberWithWord As Boolean) As String وتقوم هذه الدالة بتنسيق الأرقام مع الوحدات بشكل معين . على سبيل المثال :- OnlyNumbers : إذا كان True ، تعرض الأرقام فقط . ShowNumberWithWord : إذا كان True ، تعرض الرقم مع الكلمة باللغة العربية في قوسين مثل : "5 (خمسة) سنوات" . Function NumberToArabicWords(ByVal Number As Long, Optional IsFeminine As Boolean = False) As String وتقوم هذه الدالة بتحويل الرقم إلى كلمة باللغة العربية . كما أنها تدعم الكلمة بصيغة المذكر أو المؤنث حسب القيمة المدخلة في IsFeminine . Function NumberWithUnitArabic(Number As Long, UnitName As String) As String وتقوم هذه الدالة بتحويل الرقم إلى كلمة باللغة العربية مع الوحدة المناسبة (مثل "سنة واحدة" ، "شهران" ، "أيام") . 6️⃣ الجزء السادس التعامل مع الحروف العطف (مثل "و" ) .في الجزء :- If Right(result, 3) = " و " Then result = Left(result, Len(result) - 3) End If فبعد تنسيق النتيجة ، يتم إزالة الفاصلة الزائدة "و" في النهاية إذا كانت موجودة . 7️⃣ الجزء السابع : النتيجة النهائية :- If result = "" Then result = "أقل من يوم" DurationToFullWords = result في حال كانت النتيجة فارغة ( قيمة بفارق 0 ) ، يتم تعيين النتيجة إلى "أقل من يوم" . 💢 تم إضافة دالة تقوم بتفقيط التاريخ بأكثر من شكل ( 3 تنسيقات ) ، على سبيل المثال ، تاريخ اليوم هو 08/04/2025 والنتيجة له :- الثامن من شهر نيسان لعام ألفين وخمسة وعشرين م الثامن من شهر أبريل لعام ألفين وخمسة وعشرين م والجزء الجديد هو قراءة التاريخ بالأشهر الهجرية :- الثامن من شهر ربيع ثان لعام ألفين وخمسة وعشرين هـ 📛 الآن الكود العام في مديول منفرد :- '********************************************** '*** *** '*** FFFFFF OOO KK KK SSSS HH HH *** '*** FF O O KK KK SS HH HH *** '*** FFFFF O O KKK SS HHHHHH *** '*** FF O O KK KK SS HH HH *** '*** FF OOO KK KK SSSSS HH HH *** '*** *** '********************************************** Option Compare Database Option Explicit Function DurationToFullWords(StartDate As Variant, EndDate As Variant, _ Optional FormatOption As String = "", _ Optional ShortFormat As Boolean = False, _ Optional OnlyNumbers As Boolean = False, _ Optional ShowNumberWithWord As Boolean = False, _ Optional RoundResults As Boolean = False) As String If FormatOption = "" Then FormatOption = "FullWords" Dim y As Long, m As Long, d As Long Dim tempDate As Date Dim Result As String Dim totalMonths As Long Dim totalDays As Long Dim weeks As Long If IsNull(StartDate) Or IsNull(EndDate) Then DurationToFullWords = "لم يتم إدخال تاريخين للمقارنة" Exit Function End If If EndDate < StartDate Then tempDate = StartDate StartDate = EndDate EndDate = tempDate End If tempDate = StartDate totalDays = DateDiff("d", StartDate, EndDate) y = DateDiff("yyyy", tempDate, EndDate) If DateAdd("yyyy", y, tempDate) > EndDate Then y = y - 1 tempDate = DateAdd("yyyy", y, tempDate) m = DateDiff("m", tempDate, EndDate) If DateAdd("m", m, tempDate) > EndDate Then m = m - 1 tempDate = DateAdd("m", m, tempDate) d = DateDiff("d", tempDate, EndDate) totalMonths = (y * 12) + m weeks = totalDays \ 7 If ShortFormat Then If y > 0 Then Result = Result & SimpleUnit(y, "سنة") & " و " If m > 0 Then Result = Result & SimpleUnit(m, "شهر") & " و " If d > 0 Then Result = Result & SimpleUnit(d, "يوم") & " و " Else If RoundResults Then If m = 11 And d >= 25 Then y = y + 1 m = 0 d = 0 ElseIf m = 5 And d >= 25 Then m = 6 d = 0 End If End If Select Case FormatOption Case "Y" If y > 0 Then Result = Result & FormatNumberWithWord(y, "سنة", OnlyNumbers, ShowNumberWithWord) Else If m < 6 Then Result = "أقل من نصف سنة" ElseIf m = 6 And d = 0 Then Result = "نصف سنة" ElseIf m = 6 And d > 0 Then Result = "أكثر من نصف سنة" ElseIf m > 6 Then Result = "أكثر من نصف سنة" End If End If Case "M" If totalMonths > 0 Then Result = FormatNumberWithWord(totalMonths, "شهر", OnlyNumbers, ShowNumberWithWord) ElseIf d > 0 Then If d = 30 Or d = 31 Then Result = "شهر" ElseIf d < 30 Then Result = "أقل من شهر" End If Else Result = "أقل من شهر" End If Case "D" Result = FormatNumberWithWord(totalDays, "يوم", OnlyNumbers, ShowNumberWithWord) Case "M/D" If totalMonths > 0 Then Result = Result & FormatNumberWithWord(totalMonths, "شهر", OnlyNumbers, ShowNumberWithWord) If d > 0 Then Result = Result & " و " End If If d > 0 Then If d >= 7 And totalMonths = 0 Then Select Case weeks Case 1 Result = Result & "أسبوع" Case 2 Result = Result & "أسبوعان" Case 3 To 4 Result = Result & FormatNumberWithWord(weeks, "أسبوع", OnlyNumbers, ShowNumberWithWord) Case Else Result = Result & FormatNumberWithWord(d, "يوم", OnlyNumbers, ShowNumberWithWord) End Select Else Result = Result & FormatNumberWithWord(d, "يوم", OnlyNumbers, ShowNumberWithWord) End If End If Case "Y/M" If y > 0 Then Result = Result & FormatNumberWithWord(y, "سنة", OnlyNumbers, ShowNumberWithWord) & " و " If m > 0 Then Result = Result & FormatNumberWithWord(m, "شهر", OnlyNumbers, ShowNumberWithWord) Case Else If y > 0 Then Result = Result & FormatNumberWithWord(y, "سنة", OnlyNumbers, ShowNumberWithWord) & " و " If m > 0 Then Result = Result & FormatNumberWithWord(m, "شهر", OnlyNumbers, ShowNumberWithWord) & " و " If d > 0 Then Result = Result & FormatNumberWithWord(d, "يوم", OnlyNumbers, ShowNumberWithWord) End Select End If If Right(Result, 3) = " و " Then Result = Left(Result, Len(Result) - 3) End If If Result = "" Then Result = "أقل من يوم" DurationToFullWords = Result End Function Function SimpleUnit(Number As Long, UnitName As String) As String Select Case Number Case 1 SimpleUnit = "1 " & UnitName Case 2 If UnitName = "سنة" Then SimpleUnit = "2 سنتين" ElseIf UnitName = "يوم" Then SimpleUnit = "2 يومين" Else SimpleUnit = "2 " & UnitName & "ين" End If Case 3 To 10 If UnitName = "سنة" Then SimpleUnit = Number & " سنوات" ElseIf UnitName = "شهر" Then SimpleUnit = Number & " أشهر" ElseIf UnitName = "يوم" Then SimpleUnit = Number & " أيام" Else SimpleUnit = Number & " " & UnitName End If Case Else SimpleUnit = Number & " " & UnitName End Select End Function Function FormatNumberWithWord(Number As Long, UnitName As String, OnlyNumbers As Boolean, ShowNumberWithWord As Boolean) As String If OnlyNumbers Then FormatNumberWithWord = SimpleUnit(Number, UnitName) ElseIf ShowNumberWithWord Then FormatNumberWithWord = Number & " (" & NumberToArabicUnit(Number, UnitName) & ")" Else FormatNumberWithWord = NumberToArabicUnit(Number, UnitName) End If End Function Function NumberToArabicWords(ByVal Number As Long, Optional IsFeminine As Boolean = False) As String Dim UnitsMasc, UnitsFem, Tens, TeensMasc, TeensFem, Hundreds UnitsMasc = Array("", "واحد", "اثنان", "ثلاثة", "أربعة", "خمسة", "ستة", "سبعة", "ثمانية", "تسعة") UnitsFem = Array("", "واحدة", "اثنتان", "ثلاث", "أربع", "خمس", "ست", "سبع", "ثمان", "تسع") TeensMasc = Array("عشرة", "أحد عشر", "اثنا عشر", "ثلاثة عشر", "أربعة عشر", "خمسة عشر", "ستة عشر", "سبعة عشر", "ثمانية عشر", "تسعة عشر") TeensFem = Array("عشر", "إحدى عشرة", "اثنتا عشرة", "ثلاث عشرة", "أربع عشرة", "خمس عشرة", "ست عشرة", "سبع عشرة", "ثماني عشرة", "تسع عشرة") Tens = Array("", "عشرة", "عشرون", "ثلاثون", "أربعون", "خمسون", "ستون", "سبعون", "ثمانون", "تسعون") Hundreds = Array("", "مئة", "مئتان", "ثلاثمئة", "أربعمئة", "خمسمئة", "ستمئة", "سبعمئة", "ثمانمئة", "تسعمئة") Dim Words As String Dim n As Long Dim h, t, u As Integer If Number = 0 Then NumberToArabicWords = "صفر" Exit Function End If If Number = 10 Then NumberToArabicWords = IIf(IsFeminine, "عشر", "عشرة") Exit Function End If If Number > 999 Then Dim Thousands As Long Thousands = Number \ 1000 Words = NumberToArabicWords(Thousands, False) & " ألف" n = Number Mod 1000 If n > 0 Then Words = Words & " و " & NumberToArabicWords(n, IsFeminine) NumberToArabicWords = Words Exit Function End If h = Number \ 100 t = (Number Mod 100) \ 10 u = Number Mod 10 If h > 0 Then Words = Hundreds(h) If (Number Mod 100) >= 11 And (Number Mod 100) <= 19 Then If Words <> "" Then Words = Words & " و " If IsFeminine Then Words = Words & TeensFem((Number Mod 100) - 10) Else Words = Words & TeensMasc((Number Mod 100) - 10) End If Else Dim UnitsArray UnitsArray = IIf(IsFeminine, UnitsFem, UnitsMasc) If t > 1 Then If u > 0 Then If Words <> "" Then Words = Words & " و " Words = Words & UnitsArray(u) & " و " & Tens(t) Else If Words <> "" Then Words = Words & " و " Words = Words & Tens(t) End If ElseIf u > 0 Then If Words <> "" Then Words = Words & " و " Words = Words & UnitsArray(u) End If End If NumberToArabicWords = Words End Function Function NumberWithUnitArabic(Number As Long, UnitName As String) As String Dim Result As String Select Case UnitName Case "سنة" Select Case Number Case 1: Result = "سنة واحدة" Case 2: Result = "سنتان" Case 3 To 10: Result = Number & " سنوات" Case Else: Result = Number & " سنة" End Select Case "شهر" Select Case Number Case 1: Result = "شهر واحد" Case 2: Result = "شهران" Case 3 To 10: Result = Number & " أشهر" Case Else: Result = Number & " شهر" End Select Case "يوم" Select Case Number Case 1: Result = "يوم واحد" Case 2: Result = "يومان" Case 3 To 10: Result = Number & " أيام" Case Else: Result = Number & " يوم" End Select Case Else Result = Number & " " & UnitName End Select NumberWithUnitArabic = Result End Function Function NumberToArabicUnit(Number As Long, UnitName As String) As String Dim word As String Dim feminine As Boolean Select Case UnitName Case "سنة": feminine = True Case "شهر": feminine = False Case "يوم": feminine = False End Select Select Case Number Case 1 word = UnitName & " " & IIf(feminine, "واحدة", "واحد") Case 2 If feminine Then word = "سنتان" Else If UnitName = "يوم" Then word = "يومان" Else word = UnitName & "ان" End If End If Case 3 To 10 word = NumberToArabicWords(Number, feminine) If UnitName = "يوم" Then word = word & " أيام" ElseIf UnitName = "سنة" Then word = word & " سنوات" ElseIf UnitName = "شهر" Then word = word & " أشهر" End If Case Else word = NumberToArabicWords(Number, feminine) & " " & UnitName End Select NumberToArabicUnit = word End Function Function ConvertDateToText(ByVal DateValue As Date, _ Optional ByVal CalendarType As String = "Gregorian", _ Optional ByVal MonthNameStyle As String = "Standard") As String Dim dayNumber As Integer Dim monthNumber As Integer Dim yearNumber As Integer Dim dayText As String Dim monthText As String Dim yearText As String If LCase(CalendarType) = "hijri" Then dayNumber = Val(Format$(DateValue, "dd", vbCalHijri)) monthNumber = Val(Format$(DateValue, "mm", vbCalHijri)) yearNumber = Val(Format$(DateValue, "yyyy", vbCalHijri)) Else dayNumber = day(DateValue) monthNumber = month(DateValue) yearNumber = year(DateValue) End If Select Case dayNumber Case 1: dayText = "الأول" Case 2: dayText = "الثاني" Case 3: dayText = "الثالث" Case 4: dayText = "الرابع" Case 5: dayText = "الخامس" Case 6: dayText = "السادس" Case 7: dayText = "السابع" Case 8: dayText = "الثامن" Case 9: dayText = "التاسع" Case 10: dayText = "العاشر" Case 11: dayText = "الحادي عشر" Case 12: dayText = "الثاني عشر" Case 13: dayText = "الثالث عشر" Case 14: dayText = "الرابع عشر" Case 15: dayText = "الخامس عشر" Case 16: dayText = "السادس عشر" Case 17: dayText = "السابع عشر" Case 18: dayText = "الثامن عشر" Case 19: dayText = "التاسع عشر" Case 20: dayText = "العشرين" Case 21: dayText = "الحادي والعشرين" Case 22: dayText = "الثاني والعشرين" Case 23: dayText = "الثالث والعشرين" Case 24: dayText = "الرابع والعشرين" Case 25: dayText = "الخامس والعشرين" Case 26: dayText = "السادس والعشرين" Case 27: dayText = "السابع والعشرين" Case 28: dayText = "الثامن والعشرين" Case 29: dayText = "التاسع والعشرين" Case 30: dayText = "الثلاثين" Case 31: dayText = "الحادي والثلاثين" Case Else: dayText = CStr(dayNumber) End Select If LCase(CalendarType) = "hijri" Then monthText = Choose(monthNumber, _ "محرم", "صفر", "ربيع أول", "ربيع ثان", "جمادى أول", "جمادى ثان", _ "رجب", "شعبان", "رمضان", "شوال", "ذو القعدة", "ذو الحجة") ElseIf LCase(MonthNameStyle) = "syriac" Then monthText = Choose(monthNumber, _ "كانون الثاني", "شباط", "آذار", "نيسان", "أيار", "حزيران", _ "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول") Else monthText = Choose(monthNumber, _ "يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", _ "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر") End If yearText = NumberToArabicText(yearNumber) Dim eraSuffix As String If LCase(CalendarType) = "hijri" Then eraSuffix = " هـ" Else eraSuffix = " م" End If ConvertDateToText = dayText & " من شهر " & monthText & " لعام " & yearText & eraSuffix End Function Function NumberToArabicText(ByVal TheNumber As Long) As String Dim MyArray1(0 To 9) As String Dim MyArray2(0 To 9) As String Dim MyArray3(0 To 9) As String Dim Result As String Dim Hundreds As String Dim Tens As String Dim Ones As String Dim AndConnector As String AndConnector = " و" MyArray1(0) = "" MyArray1(1) = "مائة" MyArray1(2) = "مائتين" MyArray1(3) = "ثلاثمائة" MyArray1(4) = "أربعمائة" MyArray1(5) = "خمسمائة" MyArray1(6) = "ستمائة" MyArray1(7) = "سبعمائة" MyArray1(8) = "ثمانمائة" MyArray1(9) = "تسعمائة" MyArray2(0) = "" MyArray2(1) = " عشر" MyArray2(2) = "عشرين" MyArray2(3) = "ثلاثين" MyArray2(4) = "أربعين" MyArray2(5) = "خمسين" MyArray2(6) = "ستين" MyArray2(7) = "سبعين" MyArray2(8) = "ثمانين" MyArray2(9) = "تسعين" MyArray3(0) = "" MyArray3(1) = "واحد" MyArray3(2) = "اثنين" MyArray3(3) = "ثلاثة" MyArray3(4) = "أربعة" MyArray3(5) = "خمسة" MyArray3(6) = "ستة" MyArray3(7) = "سبعة" MyArray3(8) = "ثمانية" MyArray3(9) = "تسعة" If TheNumber = 0 Then NumberToArabicText = "صفر" Exit Function End If Dim HundredsDigit As Integer Dim TensDigit As Integer Dim OnesDigit As Integer HundredsDigit = (TheNumber Mod 1000) \ 100 TensDigit = (TheNumber Mod 100) \ 10 OnesDigit = TheNumber Mod 10 If HundredsDigit >= 0 And HundredsDigit <= 9 Then Hundreds = MyArray1(HundredsDigit) Else Hundreds = "" End If If TensDigit = 1 Then Select Case OnesDigit Case 0: Tens = "عشرة" Case 1: Tens = "إحدى عشرة" Case 2: Tens = "إثنتا عشرة" Case Else: Tens = MyArray3(OnesDigit) & MyArray2(TensDigit) End Select Else Ones = MyArray3(OnesDigit) Tens = MyArray2(TensDigit) If Ones <> "" And Tens <> "" Then Tens = Ones & AndConnector & Tens Else Tens = Ones & Tens End If End If If Hundreds <> "" And Tens <> "" Then Result = Hundreds & AndConnector & Tens Else Result = Hundreds & Tens End If If TheNumber > 999 Then Dim Thousands As Long Dim Remainder As Long Thousands = TheNumber \ 1000 Remainder = TheNumber Mod 1000 Dim ThousandsText As String ThousandsText = NumberToArabicText(Thousands) If Thousands = 1 Then ThousandsText = "ألف" ElseIf Thousands = 2 Then ThousandsText = "ألفين" ElseIf Thousands >= 3 And Thousands <= 10 Then ThousandsText = NumberToArabicText(Thousands) & " آلاف" Else ThousandsText = NumberToArabicText(Thousands) & " ألف" End If If Remainder > 0 Then Result = ThousandsText & AndConnector & NumberToArabicText(Remainder) Else Result = ThousandsText End If End If NumberToArabicText = Result End Function ولتسهيل فهم الموضوع عند الإستدعاءات المختلفة ، تم انشاء نموذج بسيط يضم 22 زر ولكل زر طريقة استدعاء مختلفة تسهيلاً للمستخدم كي تتوضح له آلية العمل . كما تم اضافة 3 مربعات نص كل منها يعرض التفقيط بشكل مختلف . ♻ المرفق :- Date Duration to Arabic Words.accdb2 points
-
تم حل المشكلة ولله الحمد شكرا لك استاذ نافل على طرح فكرة الاستاذ جعفر وذكرتني بها علما انها كانت عندي وكنت ناسيها مع جزيل الشكر ايضا للاستاذ Foksh على المجهودات المبذوله لتلبيه حاجيات الاخوة .2 points
-
السلام عليكم ورحمة الله تعالى وبركاته سوف اقدم لكم اليوم ان شاء الله تعالى فكرة أتمتة عمليات البيع بكل الطرق (FIFO , LIFO , HighestPrice , LatestPrice) ولكن أولا مقدمه بشكل نظرى عن هذه العبارة لتوضيح هذه المصطلحات هى تعنى أن النظام أو البرنامج يقوم بشكل آلي (تلقائي) باختيار الكمية المناسبة من المخزون عند تنفيذ عملية البيع، بناءً على طريقة معينة وذلك لتحديد أي دفعة (Batch) من المخزون سيتم السحب منها. هذه الطرق هي ما تُعرف بـ "سياسات تقييم المخزون أو صرف المخزون"، وشرحها كالتالي: FIFO (First In, First Out - الوارد أولاً يصرف أولاً) تعني أن النظام سيبدأ في بيع الكميات من أول دفعة تم شراؤها أو إدخالها للمخزون تخصم الكميات التي تُباع أولاً من أول دفعة تم شرائها. تستخدم غالبًا في المنتجات القابلة للتلف (مثل الطعام أو الدواء). مثال: اشتريت 100 وحدة بـ10 جنيه، ثم 100 وحدة بـ12 جنيه. عند بيع 50 وحدة، سيتم بيعهم من الدفعة الأولى (10 جنيه). LIFO (Last In, First Out - الوارد أخيراً يصرف أولاً) تعني أن النظام سيبدأ في بيع الكميات من آخر دفعة تم شراؤها تخصم الكميات التي تُباع أولاً من آخر دفعة تم شرائها. تُستخدم في بعض الأنظمة المحاسبية عند توقع ارتفاع الأسعار. مثال: نفس المثال السابق. عند بيع 50 وحدة، سيتم بيعهم من الدفعة الثانية (12 جنيه). HighestPrice (أعلى سعر أولاً) يعني أن النظام سيبدأ في بيع الكميات من الدُفَع ذات السعر الأعلى تخصم الكميات التي تُباع أولاً من الدفع ذات السعر الأعلى. مفيد في حالات تحسين الربحية أو تقليل الخسائر تُستخدم في حالات معينة عند الرغبة في التخلص من البضاعة ذات التكلفة الأعلى لتقليل الخسائر أو تقليل التكاليف المخزنية المرتفعة. مثال: عندك 3 دفعات بأسعار 10، 12، 15. النظام يبدأ البيع من الدفعة بسعر 15. LatestPrice (أحدث دفعة أولاً) المقصود هنا بيع الكمية من أحدث تاريخ شراء تخصم الكميات التي تُباع أولاً من الدفع ذات تاريخ الشراء الأحدث. يختلف عن LIFO بإنه يعتمد على تاريخ الشراء وليس ترتيب الإدخال. مفيد عندما تكون تواريخ الشراء غير مرتبة أو النظام يسمح بإدخال متأخر. التطبيق يعتمد على التالى جدول يحتوي على إعدادات طريقة البيع : tblSalesSettings المفروض الجدول يحتوى على سجل واحد فقط ويتم تحديد طريقة البيع حسب الرغبة او حسب النظام المحاسبى المتبع جدول المنتجات : tblProducts - يحتوي على بيانات المنتجات الأساسية. جدول الواردات : tblPurchaseBatches - يتبع كل دفعة شراء لمنتج معين. جدول لتسجيل عمليات الارتجاع : tblReturns - يتبع كل عمليات الإرتجاع بعد إتمام عملية شراء لمنتج معين. جدول تفاصيل كميات المبيعات حسب الدفعات : tblSaleBatchDetails- يتبع كل دفعة بيع لمنتج معين حسب الكمية وتبعا لمعرف الدغعات. جدول تفاصيل المبيعات : tblSaleDetails - يتبع كل المنتجات التى يتم بيعها داخل الفاتورة. جدول المبيعات : tblSales - يحتوي على إجمالي كل فاتورة. وأخيرا المرفق للتجربــــــــــــة ملاحظة لم أهتم بأى تفاصيل لا للحذف أو للارتجاع لانها لن يكون لها أى تأثير يذكر لأن الكميات يتم حسابها بناء على معرف الدفعات بشكل ديناميكى حسب المبيعات و بناء على الواردات للدفعات ما تم الاهتمام به فقط هو التعامل مع طرق البيع المختلفة لاصدار الفواتير او صرف الكميات حسب الطرق المحاسبية بشكل صحيح ومرن وبناء عليه حصر الكميات المتبقية يعنى ببساطه بيع وجرد فى نفس الوقت على اساس محاسبى صحيح بمرونة وفاعليه نسيت توضيح شئ مهم : مثلا يوجد وارد لمنتج بأكثر من دفعه ولكل دفعه سعر بيع وسعر شراء طيب لنفترض ان الدفعه 1 للمنتج 101 عدد الكميات لها 5 الدفعه 2 للمنتج 101 عدد الكميات لها 10 اذا اجمال الكميات هو 15 طيب عند اصدار الفاتورة مع الاختيار : FIFO من جدول اعدادت طرق البيع لنفترض اننا نريد بيع 8 قطع من ها المنتج فى هذه الحاله يتم عمل التالى صرف 5 من الدفعه 1 وصرف 3 من الدفعه 2 طيب سعر بيع الدفعه الاولى لو 120 وسعر بيع الدفعه الثانيه 130 يكون ( 5*120 ) + ( 3 * 130 ) = 600 + 390 = يكون الناتج 990 وفى هذه الحاله لا يتم كتابة سعر للوحده فى الفاتورة بل يتم حساب المتوسط أتمتة عمليات البيع بكل الطرق .accdb1 point
-
1 point
-
اسف اخي على التأخير في الرد كنت في إجازة إن شاء الله سوف أحاول تعديل الملف وإعادة رفعه عن قريب بإدن الله1 point
-
عذرا طلبك واضح ولكنى لم انتبه عن طريق كود كتابة اسماء الفصول بالارقام العربية.xlsb1 point
-
وعليكم السلام ورحمة الله وبركاته .. أولاً يجب تنبيهك الى ضرورة حذف المسافة الزائدة من الاختيار الرابع من الكومبوبوكس C8 الآن في حدث بعد التحديث ، استعمل الكود التالي :- Private Sub C8_AfterUpdate() Me.s1 = False Me.s2 = False Me.s3 = False Me.s4 = False Select Case Me.C8.Value Case "سكن اجتماعي" Me.s1 = True Case "سكن أقارب" Me.s2 = True Case "سكن مؤجر" Me.s3 = True Case "محل غير قابل للسكن (مستودع، فوضوي، قبو)" Me.s4 = True End Select End Sub حيث استخدمت الدالة Case بدلاً من الجمل الشرطية If وطبعاً يوجد حل آخر بعيد عن تحديد القيم النصية من الكومبوبوكس ( وخصوصاً أنها باللغة العربية ) ، بحيث نستخدم الـ Index أو فهرس الكومبوبوكس نفسه كالتالي :- Private Sub C8_AfterUpdate() Me.s1 = False Me.s2 = False Me.s3 = False Me.s4 = False Select Case Me.C8.ListIndex Case 0 Me.s1 = True Case 1 Me.s2 = True Case 2 Me.s3 = True Case 3 Me.s4 = True End Select End Sub وهذا أيضاً حل ثالث :- Private Sub C8_AfterUpdate() Me.s1 = (Me.C8.Value = "سكن اجتماعي") Me.s2 = (Me.C8.Value = "سكن أقارب") Me.s3 = (Me.C8.Value = "سكن مؤجر") Me.s4 = (Me.C8.Value = "محل غير قابل للسكن (مستودع، فوضوي، قبو)") End Sub IF.accdb1 point
-
وعليكم السلام اخي @Ahmed_J انا من اشوف جداول بالعربية اشعر بالقشعريرة 😍 جرب هذه المحاولة فقط لنموذج مبيعات ..وجرب نموذج سند القبض لان سند الصرف يعمل على المشتريات تستطيع تطوير البرنامج من خلال عمل نص اظهار رصيد المادة مثلا Amed.rar1 point
-
وهذه فكرة كما أشرت لك بتغيير نوع مربع نص Gender إلى مربع تحرير وسرد حيث سيكون له الحدث بعد التحديث = Private Sub Gender_AfterUpdate() If Me.Gender.Value = "ذكر" Then Me.الديانه.RowSource = "مسلم;مسيحي" Me.الديانه.Value = "مسلم" Me.الحالة_الاجتماعية.RowSource = "متزوج;أعزب;مطلق;أرمل" Me.الحالة_الاجتماعية.Value = "متزوج" ElseIf Me.Gender.Value = "أنثى" Then Me.الديانه.RowSource = "مسلمة;مسيحية" Me.الديانه.Value = "مسلمة" Me.الحالة_الاجتماعية.RowSource = "متزوجة;آنسة;مطلقة;أرملة" Me.الحالة_الاجتماعية.Value = "متزوجة" End If End Sub بيانات المدرسين (1).mdb1 point
-
1 point
-
اشكرك استاذ @Foksh ☕🌹 مشاركة اللطيفة يكون صحيح حسب سطح مفهومك يحب الفهم الساذج والبسيط والمخارج متفرعة وليس له فهم آخر كما لا يفرق المبدأ ان كان دكتور او دكتورة يهدف للمطورين او المعقدين وهو بسيط للغاية نموذج لا اكثر حاولت الدمج بستيعاب العمل السريع العنوان لا يكفي ؟ !! اعلم يوجد نقص في تركيبة وبناء الجمل جرب حاول ان تكمل ؟! يمكن نصل الى استعياب آخر اقصد ثاني ولا اعلم نظرتك للاستاذي @ابو جودي 🌹❤️☕☕ مفهو استنباط الفهم بالدوال وشرحات1 point
-
تفكير بصوت مرتفع قد يثري النقاش اولا : رأس الهرم في الموضوع الطالب ومعرفه ( وهو الذي سيجرى عليه التوزيع ) .. المدرسة والصف يأتي تبع نأتي للتوزيع : اما توزع على مستوى الطلاب ككل بغض النظر عن المدرسة والصف وإما توزع على مستوى الطلاب ككل على مستوى الصفوف بغض النظر عن المدارس وإما توزع على مستوى مدرسة محددة بغض النظر عن الصفوف وإما توزع الطلاب على مستوى الصف والمدرسة ------------------------------------------- كل ما ذكر اعلاه يجب عند اعداد الطريقة مراعاة توفر العدد المناسب للتوزيع1 point
-
(قول معروف ... خير من صدقة يتبعها أذى ...) إلى: حضرة المحترم الذي أرسل لنا بهذه الرسالة (السلام عليكم ورحمة الله وبركاته) كاملة · لقد تخطينا الثانية والستين من العمر؛ فهلا خاطبتنا وخاطبت غيرنا بأسلوب أيسر وألين من ذلك! · هلا تركت أسلوب الأمر ولفت نظرنا لما غفلنا عنه دون قصد وليس عن عمد بأسلوب أفضل من هذا! · ولا داعي مطلقا أن تمن علينا بما ليس لك فيه فضل سواء من قريب أو بعيد. · من أدراك أني لا أحمد ربي على كل حال في السراء والضراء؛ حتى تعطي لنفسك الحق أن تقول لي ذلك! · ولتضع نصب عينيك أننا نطلب حاجتنا بعزة النفس؛ وإن كان الوضع كذلك فلا حاجة لنا به. · ولتعلم أن "فوق كل ذي علم عليم"؛ فقد تعلم أشياء ويغيب عنك أشياء أخرى كثيرة؛ "وما أوتيتم من العلم إلا قليلا" · ولتعلم أن انضمامنا لهذا المنتدي شرف لنا وفضل لكم بما عهدناه لدى القائمين على هذا المنتدي من رقي وسمو أخلاق في تقديم المعلومة خالصة لوجه الله تعالى لمن يسأل عنها دونما تأخير أو تأفف أو تضجر ولم يحدث من قبل هذا مطلقا أن قام أحد الأساتذة الأفاضل والمحترمين بالمن علينا أو تعنيفنا بكلمة تجرح مشاعرنا أو تؤذينا نفسيا. · ولتعلم أننا عندما نلجأ لمنتدانا هذا لا نجبر أحدا على الإجابة ولكن يتفضل علينا من عنده علم بإجابتنا إن أراد ذلك؛ وله كل الشكر والتقدير والاحترام وجزاهم الله خير الجزاء عما علمونا ما جهلناه. · هذا وإن كنت ولا بد قائلا فلتقل خيرا أو لتصمت. عن معاذ بن جبل -رضي الله عنه وأرضاه- قال: قال رسول الله (صل الله عليه وسلم): "تعلموا العلم؛ فإن تعلمه لله خشية، وطلبه عبادة، ومذاكرته تسبيح، والبحث عنه جهاد، وتعليمه لمن لا يعلمه صدقة، وبذله لأهله قربة؛ لأنه معالم الحلال والحرام، ومنار سبل أهل الجنة، وهو الأنيس في الوحشة، والصاحب في الغربة، والمحدث في الخلوة، والدليل على السراء والضراء، والسلاح على الأعداء، والزين عند الأخلاء، يرفع الله به أقواماً، فيجعلهم في الخير قادة وأئمة، تُقتص آثارهم، ويقتدى بفعالهم، ويُنتهى إلى رأيهم، ترغب الملائكة في خلتهم، وبأجنحتها تمسحهم، يستغفر لهم كل رطب ويابس، وحيتان البحر وهوامه، وسباع البر وأنعامه؛ لأن العلم حياة القلوب من الجهل، ومصابيح الأبصار من الظلم، يبلغ العبد بالعلم منازل الأخيار، والدرجات العلا في الدنيا والآخرة. التفكر فيه يعدل الصيام، ومدارسته تعدل القيام، به توصل الأرحام، وبه يعرف الحلال من الحرام، وبه يطاع الله، وبه يعبد، وبه يمجد، وبه يتورع، وهو إمام العمل، والعمل تابعه، يلهمه السعداء، ويحرمه الأشقياء".1 point
-
1 point
-
1 point
-
السلام علبكم 🙂 بسبب اختلاف تنسيقات ملفات الاكسل (او CSV) ، وخصوصا تلك التي من مواقع وزارة التعليم في المملكة العربية السعودية ، كنا نضطر ان نتعامل بالكود مع كل تنسيق بطريقة تختلف عن الملف الآخر ، مما يجعل الحل لا يتناسب مع التنسيقات الملفات الاخرى ، وهذا الكود ليس بالسهل تعديله. ولكن ، تقريبا جميع مستخدمي الاكسس يعرفون التعامل مع الاستعلام ، لهذا السبب دعونا نتعامل مع بيانات الاكسل في استعلام ، استعلام مسقط 🙂 هذه واجهة النموذج الذي يتم كل شيء عن طريقه: 1. لتصفح الملفات ، واختيار ملف الاكسل (xls, xlsx, xlsm, csv) ، وسيظهر اسم الملف الذي تم اختيارة في الحقل رقم 2 ، 3. ستظهر قائمة بأسماء الاوراق (Sheets) الموجودة في الملف ، ويجب اختيار الورقة المطلوبة ، 4. هذا نموذج جدولي ، و ستظهر بيانات ورقة الاكسل هنا ، ويمكننا التعامل مع فرز وتصفية البيانات هنا ، وبعدة طرق ، 5. سيظهر استعلام مناداة ورقة الاكسل هنا (بدون فرز وتصفية) ، على شكل SQL ، وبأسماء حقول الورقة ، والتي يمكن نسخها لأي قاعدة بيانات خارجية ، 6. سيظهر استعلام مناداة ورقة الاكسل هنا (بدون فرز وتصفية) ، على شكل SQL ، وبدون أسماء حقول الورقة ، والتي يمكن نسخها لأي قاعدة بيانات خارجية ، 7. يجب النقر هنا حتى نرى نتائج الفرز والتصفية كجزء من الاستعلام في الحقول 8 و 9 ، 8. سيظهر استعلام مناداة ورقة الاكسل هنا (بالفرز والتصفية) ، على شكل SQL ، وبأسماء حقول الورقة ، والتي يمكن نسخها لأي قاعدة بيانات خارجية ، 9. سيظهر استعلام مناداة ورقة الاكسل هنا (بالفرز والتصفية) ، على شكل SQL ، وبأسماء حقول الورقة ، والتي يمكن نسخها لأي قاعدة بيانات خارجية ، 10. يمكنك عمل استعلام جاهز (للورقة بدون فرز وتصفية) او جدول ، سواء في قاعدة البيانات هذه ، او اختيار قاعدة بيانات خارجية (يجب ان تكون مغلقة حتى تستطيع تصدير استعلام او جدول لها) ، وسيكون اسم الاستعلام نفس اسم الورقة ، مثلا اسم الورقة ABC ، فيصبح اسم الاستعلام: qry_ABC ، او يكون جدول بإسم tbl_ABC حسب اختيارك من الرقم 11 ، او حتى الحاق بيانات الاستعلام الى جدول موجود سابقا (طبعا يجب مراعاة ان يكون الجدول بنفس حقول الورقة) ، 12. لنسخ الاستعلام الى ذاكرة الكمبيوتر ، بحيث يمكنك استعمال لصق ctrl+v لكائن الاستعلام (انظ الفيديو التوضيحي) ، 13. عادة لا نغير اي شيء هنا. طريقة العمل: . نرى من اعلاه: 1. انه تم عمل استعلام ياسم qry_Sheet1 في قاعدة البيانات الخارجة Testing.accdb ، 2. كذلك نسخنا استعلام التصفة الى ذاكرة الكمبيوتر (تابع في الفيديو التالي) . ممكن خلط عمل الفرز و التصفية بعدة طرق ، منها كما في الفيديو اعلاه ، و الصور التاليه . . لنفتح قاعدة البيانات الخارجية ونرى ما فيها ، هنا نحن نتعامل مع استعلام اكسس عادي ، فيمكننا حذف الحقول التي لا نريدها ، او نخفي اخرى ، او .... . عند فتح قاعدة البيانات الخارجية ، وحصلت على رسالة الخطأ هذه ، فهذا معناه ان برنامج "استعلام مسقط" لايزال مفتوح ، وملف الاكسل مفتوح به ، لذا يجب اغلاق برنامج "استعلام مسقط" قبل استعمال ملف الاكسل : . البرنامج يتعامل مع ملف واحد فقط ، ويعمل له استعلام ، واذا اردنا ان نتعامل مع اكثر من ورقة اكسل ، فيمكننا عمل مجموعة من استعلامات ، ثم نعمل امر لتنفيذها واحدة تلو الاخرى ، وبما انه عندنا استعلام ، فيمكننا تحويله الى جميع انواع الاستعلامات ، سواء استعلام الحاق ، او استعلام اضافة ، او استعلام لعمل جدول. هناك عدة ميزات في استعمال هذه الطريقة عن ربط الاكسل كجدول : 1. اسرع بكثير ، 2. عند استيراد كائنات قاعدة البيانات الى قاعدة اخرى ، فالاكسس يتوقف كثيرا عند الجداول الاكسل المرتبطة ، بينما لا يأخذ اي وقت لهذا الاستعلام 3. اختار الحقول اللي تريدها فقط ، جعفر Muscat_Query.zip1 point
-
وعليكم السلام ورحمة الله وبركاته جرب التعديل التالي في الخلايا الصفراء تعديل كود تنقيط.xlsm1 point
-
1 point
-
السلام عليكم و رحمة الله و بركاته شكرا جزيلا لمروركم و مناقشة موضوعي و انك وجدتم لي الحل جازاكم الله خيرا و اسال هل سيتغير العداد اذا دخلت السنة الجديدة و يصبح الرقم من جديد على هذا الشكل 202600001 ؟1 point
-
وعليكم السلام ورحمة الله وبركاته .. الأمر بسيط أخي الكريم إن شاء الله . اولاً سننشئ الدالة التالية في مديول :- Public Function GenerateID(TableName As String, fieldName As String) As Long Dim currentYear As Integer Dim yearPrefix As String Dim maxID As Long Dim serialPart As Long currentYear = Year(Date) yearPrefix = currentYear & "" maxID = Nz(DMax(fieldName, TableName, fieldName & " LIKE '" & yearPrefix & "*'"), yearPrefix & "00") serialPart = CLng(Mid(maxID, Len(yearPrefix) + 1)) GenerateID = CLng(yearPrefix & (serialPart + 1)) End Function ثم في مربع النص داخل النموذج سنقوم بجعل القيمة الإفتراضية لهذا المربع النصي = الإستدعاء التالي ( على اعتبار ان الجدةل اسمه Tbl_Cust والحقل الرقمي الخاص بالترقيم = ID ) .. =GenerateID("Tbl_Cust","ID") المرونة في الإستدعاء ستكون انه يمكنك استخدام الترقمي لأكثر من جدول . فقط بتغيير اسم الجدول وحقل الترقيم . وهذا مثال في ملف مرفق :- GenerateID.accdb1 point
-
طيب يا فؤش انا مش عارف انت فاهم واللا انت بتحلب الاجابه علشان تكون كامله هو مش مقصود انى انزل الاجابة ناقصه بقدر ما هو مقصود ان تقتصر القاعدة على الفكرة المحاسبية فقط اه وشئ تانى علشان نقول عاوزين كل شئ يبقى بنتكلم فى برنامج كبير ما هو نقطه هتجر وراها نقطه تانيه مرتبطه بيها وده مش موضوعنا مبدئيا هو مينفعش ومش منطقى ان نفس المنتج فى فاتورة واحده يتكرر يعنى كل ما تيحب تعمل عملية بيع لنفس المنتج للتجربه فى كل مره تضيف سجل جديد لعمل فاتورة جديده يا فؤش أفندى صحصح وركز كده وانا قلت ملاحظة ان القاعدة تعتمد على شئ واحد فقط ضبط الحسابات بطريقة دقيقه ومرنه للحساب لرصد وجرد المبيعات بشكل صحيح نحلل كلامك ده يا فؤش أفندي تحليل كلامك بخصوص (سيناريو الشراء المتعدد بأسعار مختلفة) الدُفعة الكمية سعر الشراء الكمية المباعة الكمية المتبقية 1 24 10 4 20 2 24 12 10 14 3 24 9 0 24 المتبقي بالمخزون: 20 + 14 + 24 = 58 وحدة بثلاث أسعار مختلفة و أنت تتساءل: لما أبيع بعد كده… أبيع بأي سعر؟ هل أبيع بالسعر الأخير (9)؟ ولا الأعلى (12)؟ ولا (10)؟ هنا نرجع لفكرة "طريقة البيع" أو "طريقة صرف المخزون"، وهي شيء مهم جدًا يعتمد عليه النظام: الطرق المدعومة في جدول اعداد طرق البيع "طريقة صرف المخزون" : الطريقة شرح FIFO بيع من الدفعة الأقدم أولًا (10 جنيه أولًا ثم 12 ثم 9) LIFO بيع من الأحدث أولًا (9 جنيه أولًا ثم 12 ثم 10) HighestPrice بيع من الدُفعة الأعلى سعرًا أولًا LatestPrice بيع من أحدث دفعة (حسب التاريخ) وبالتالي: السعر الذي يظهر في الفاتورة عند إدخال الكمية يعتمد على طريقة البيع المختارة من الإعدادات. ما المشكلة اللي حصلت معاك؟ انت قلت : السعر اللي اتحدد في الفاتورة عند الرجوع ليها كان 109! وأن أنت مش متأكد هل هو متوسط ولا إيه... هنا فيه احتمالين: إما فى جدول الاعدادات لطريقة البيع تم اختيار طريقة البيع LatestPrice → وبالتالي تم اختيار أحدث دفعة (وسعرها ممكن يكون 109). أو فيه خطأ منطقي حصل أثناء إعادة تحميل الفاتورة (مثلاً: إعادة الحساب تم بطريقة مختلفة بعد الحفظ) هراجع الكود تانى اما بالنسبه للنقطه دى انا اعتمد فى عملى على المرونه وعلى الدقه بتقليل الاخطاء بقدر المستطاع يبقى النقطه اللى انت بتقولها غير انها هتزود خطوات الا ان المستخدم او الكاشير او البائع ممكن يغلط ليه انا بقه من الاول ما اسدد كل الثغرات اللى ممكن يحدث من ورائها اخطاء مقصودة او غير مقصودة يا فؤش افندى ولو تركت للبائع التحكم يا فؤش افندى ممكن يبيع مره من ده ومره أخرى من ده على المزاج بقه او بالنيه او بحسن وسوء الظن او حسب الغزاله جاى تهزر حضرتك يا افندم طيب انا قدمت فكرة وتطبيق عملى على اساس محاسبى صحيح وفى حالة رغبه صاحب العمل فى تغيير النظام المحاسبى يتم ذلك بدون التدخل فى تعديل الاكواد وفى النهايه اللى حابب ينفذ اى اقتراحات اخرى يمكنه عمل ذلك ما هو أنا مش هأقول لحد لا تنفذ اقتراحاتك التى تلبى رغباتك بكل بساطه تعتمد فكرتى على اختيار النظام المحاسبى لالية البيع من جدول اعداد خاص بذلك تحديد سعر الشراء وسعر البيع للدفعة وتاريخ وارد هذه الدفعه عند شرائها لعدم تدخل البائع فى كتابة السعر لتلافى اى مشكل محاسبية احتساب الكميات اليا وديناميكا بدون تدخل امكانية حساب الربح والخسارة بسهولة جدا جدا جدا بناء على ما سبق ومن واقع جدول الفواتير او التفاصيل وبناء على ما سبق عمل جرد مفصل لكل منتج حتى مع اختلاف اسعار البيع والشراء وتعدد الدفعات و تواريخ شراء الدفعات المختلفة طيب جرب المرفق ده يا فؤش أفندى ملاحظة أخيره الاستعلامات المستخدمه فى الأكواد هى : qryAvailableBatchesByProduct , qryAvailableByProduct أما بقية الاستعلامات مجرد استعلامات خدميه يمكن استخدامها فى : التقارير او فى عمل الجرد أو فى عمل حساب المبيعات والمشتريات لمعرفة هامش الربح أو الخسارة لم أهتم بموضوع ضبط الاكواد فى حالة التعديل على الفاتورة او المرتجعات أنا لست بصدد تقديم برنامج ولا بصدد تطبيق هذه الأفكار أنا فقط موضوعى هو اتمتتة عمليات البيع وفق التحكم بختيار طريقة البيع من جدول الاعدادات وفق الاصول المحاسبية التاليه وذلك على حسب فهمى المتواضع من البحث على الانترنت فى هذه الجزئية لإانا لست محاسب ولا أعلم شيئا عن المحاسبة ولا التكالبف قد أكون مخطئا أو مصيبا لذلك يرجى التأكد من أهل الإختصاص .. انا نصحتك وأنت براحتك علشان متجيش تزعق لى بعد كده FIFO بيع من الدفعة الأقدم أولًا (10 جنيه أولًا ثم 12 ثم 9) LIFO بيع من الأحدث أولًا (9 جنيه أولًا ثم 12 ثم 10) HighestPrice بيع من الدُفعة الأعلى سعرًا أولًا LatestPrice بيع من أحدث دفعة (حسب التاريخ) أتمتة عمليات البيع بكل الطرق (V 1.2).accdb1 point
-
استاذى الكريم الجموعى الفكرة ليست فى السالب او الموجب الفكرة ان رقم 7 نفسة غلط من تاريخ 2014/8/5م الى 2015/1/5 م الفرق هو 5 شهور فقط وليس 7 يمكن الحل من خلال هذه المعادله =IF(MONTH(B1)<MONTH(A1);MONTH(B1)+12-MONTH(A1);MONTH(B1)-MONTH(A1)) تقبل منى وافر الاحترام والتقدير اخوكم حسام1 point
-
عزيزي راعي الرحل هل هذا ما تقصده مفيد برنامج الجداول المدرسية.rar1 point