09-07-20, 11:49 AM (آخر تعديل لهذه المشاركة : 09-07-20, 11:50 AM {2} بواسطة freehego.)
السلام عليكم أهل المنتدى الكرام
عندى مشكلة لم أجد لها حلاً رغم كثرة البحث عبر الأنترنت وهى باختصار أننى أعمل على مشروع محاسبى وعندى فورم به شجرة الحسابات TreeView وأقوم باستدعاء البيانات من الداتا بيز بسهولة وعمليات الحفظ والحذف كذلك والترى فيو يستقى معلوماته من جدول Accounts من خلال قاعدة بيانات Access 2010
ولكن المشكلة أننى منشئ جدول يسمى Charts وهو عبارة عن جدول مستويات الحسابات من L1 حتى L9 بحيث يكون للمستخدم الحرية فى إدخال عدد الديجيت لكل مستوى من المستويات السابقة
وعليه أريد إضافة النود الجديد أوتوماتيك طبقاً لاختيار المستخدم من الترى فيو سواء اختار نود رئيسى أو نود فرعى فيقوم البرنامج بالنظر فى جدول Charts وتحديد أى مستوى هو وعليه يتم إضافة النود الجديد بترتيبه طبقاً لل Parent
أرفقت برنامج مصغر للمطلوب
للمعلومة قمت بتحويل قاعدة البيانات إلى تنسيق Access 2003
(10-07-20, 05:54 AM)Mohamad Anan كتب : و عليكم السلام و رحمة الله و بركاته
المثال المعدل في المرفقات
أشكرك جزيلا اخى على مجهودك ولكن للأسف لم يزبط معى حيث أن الأكواد تعمل فقط مع الجذور(أى الحسابات التى لها أبناء) ولكن عند إضافة أبن لأى جذر تظهر رسالة خطأ "Conversion from type 'DBNull' to type 'String' is not valid." وجرب بنفسك إضافة مثلا نوع حساب جديد تحت بنك القاهرة حساب مرتبات وليكن أسمه جارى مرتبات فلن يقبل ويظهر الخطأ السابق ، كذلك أغفلت فى الأكواد التحقق من مستوى الحساب من خلال جدول Chart وهو المعيار الرئيسى للمضاهاة عند إضافة حساب جديد سواء أكان أب أو أبن أو حفيد
عذراً أخى وفى الأخير أشكرك مرة أخرى على تعبك
السلام عليكم اخي الكريم
مع جزيل الشكر للاخ محمد عنان لمساعدته في الاجابة
اخي الكريم البرنامج شغال بعد تعديل الاخ محمد وهذه صورة من اضافة نقظة جديدة وللامانة جربت كل المستويات
يبدو ان لديك مشكلة ما لا اعرف
اعمل الخير وأجرك لا تنتظره فالله خير من إليك يرده
البرمجة ليست مجرد كود بل هي منهج تفكير منطقي لحل المشكلات
(10-07-20, 05:54 AM)Mohamad Anan كتب : و عليكم السلام و رحمة الله و بركاته
المثال المعدل في المرفقات
أشكرك جزيلا اخى على مجهودك ولكن للأسف لم يزبط معى حيث أن الأكواد تعمل فقط مع الجذور(أى الحسابات التى لها أبناء) ولكن عند إضافة أبن لأى جذر تظهر رسالة خطأ "Conversion from type 'DBNull' to type 'String' is not valid." وجرب بنفسك إضافة مثلا نوع حساب جديد تحت بنك القاهرة حساب مرتبات وليكن أسمه جارى مرتبات فلن يقبل ويظهر الخطأ السابق ، كذلك أغفلت فى الأكواد التحقق من مستوى الحساب من خلال جدول Chart وهو المعيار الرئيسى للمضاهاة عند إضافة حساب جديد سواء أكان أب أو أبن أو حفيد
عذراً أخى وفى الأخير أشكرك مرة أخرى على تعبك
مرحبا أخي الكريم
بداية الشكر للأستاذ ابراهيم على مروره الكريم
أخي كلامك صحيح تماما لأن تحليل برنامج لمبرمج آخر أصعب من برمجته من الصفر
أسماء الحقول عندك غير واضحة و غير معبرة عن محتواها
أخذت القيم التي وضعتها حضرتك في ادوات النصوص و استخدمت حقولها فقط لإضافة سجل جديد
الترقيم التلقائي لكود الفرع الجديد يعتمد على أعلى كود للأبناء مع اضافة 1 وطبعا سيحدث خطأ عند عدم وجود أبناء
و لو كان ترقيم تلقائي سيحدث تعارض مثلا كود 111 هل هو 11 و 1 او 1 و 11
مهمتك معالجة هذه الامور و منع التكرار لرمز الحساب بالكود لأنك تعتمد بالربط على الرمز و لا تعتمد على معرف ID
اذا تريد ممكن ارفقلك شجرة لا متنهاية بجدول واحد فقط فيه 4 حقول
السلام عليكم ورحمةالله وبركاته
اخي محمد فعلا انا لم انتبه الى هذه الجزئية في حال لايوجد ابناء
ولكن الا يمكننا التحقق اولا من وجود ابناء فان وجد يمكننا الاضافة من الرقم الاكبر +1
وان لم يكن له ابناء نأخذ مرتبة الاب نفسه وضع لها صفر او واحد حسب طريقة الترقيم
اعمل الخير وأجرك لا تنتظره فالله خير من إليك يرده
البرمجة ليست مجرد كود بل هي منهج تفكير منطقي لحل المشكلات
(10-07-20, 10:02 PM)ابراهيم ايبو كتب : السلام عليكم ورحمةالله وبركاته
اخي محمد فعلا انا لم انتبه الى هذه الجزئية في حال لايوجد ابناء
ولكن الا يمكننا التحقق اولا من وجود ابناء فان وجد يمكننا الاضافة من الرقم الاكبر +1
وان لم يكن له ابناء نأخذ مرتبة الاب نفسه وضع لها صفر او واحد حسب طريقة الترقيم
اشكرك أخى محمد وأخى إبراهيم ,احب أن أقتبس جملة من كلام الأخ إبراهيم مع التعديل ان سمح لى وهى تلخص ما أريد
" الاضافة من الرقم الاكبر +1" ولكن أنا أريد تعديلها لتكون " الاضافة من الرقم الاكبر +مستوى الحساب طبقاً لجدول Chart"
حيث أن الإضافة تكون ليست +1 وإنما تكون حسب جدول المستويات فمن الممكن أن تكون +1 أو +2 أو +3 ...الخ
(10-07-20, 10:02 PM)ابراهيم ايبو كتب : السلام عليكم ورحمةالله وبركاته
اخي محمد فعلا انا لم انتبه الى هذه الجزئية في حال لايوجد ابناء
ولكن الا يمكننا التحقق اولا من وجود ابناء فان وجد يمكننا الاضافة من الرقم الاكبر +1
وان لم يكن له ابناء نأخذ مرتبة الاب نفسه وضع لها صفر او واحد حسب طريقة الترقيم
و عليكم السلام و رحمة الله و بركاته
مرحبا استاذ ابراهيم
أخي الكريم عادة يطلب من المستخدم ادخال الرمز و يكون الحقل اختياري
في حال ترك المستخدم مكان الرمز فارغ او كرر رمز مستخدم تعود الخيارات للمبرمج
عادة من المستوى الثالث تكون الزيادة لاول سجل 100 او 1 لا فرق
و الخطأ يحدث من استعلام عن اعلى قيمة لحقل الرمز عندما يتطابق رمز الاب
اذا كانت النتيجة DBNull يمكن ترميز اول حقل عوضا عن زيادة نتيجة الاستعلام
أنا حاولت بكتابة الكود التالى ولكن لإضافة الحسابات بطريقة يدوية وهى فى حدث المغادرة لتكست كود الحساب
كود :
Private Sub AccID_Leave(sender As Object, e As EventArgs) Handles AccID.Leave
Try
Dim da As New OleDbDataAdapter("select * from Accounts where AccId = " & AccID.Text, con)
Dim dt As New DataTable
da.Fill(dt)
If dt.Rows.Count > 0 Then
MsgBox("هذا الحساب موجود في دليل الحسابات", vbCritical, "المبرمج ")
Exit Sub
End If
Static myl(9) As Integer
Dim DA1, DA2, DA3, DA4, DA5, DA6, DA7, DA8, DA9 As New OleDbDataAdapter
Dim DT1, DT2, DT3, DT4, DT5, DT6, DT7, DT8, DT9 As New DataTable
Dim mylen, myclen, mylevel, i As Integer
Dim myac1, myac2 As String
DA1 = New OleDbDataAdapter("SELECT L1 from Chart", con)
DA1.Fill(DT1)
myl(1) = DT1(0)(0)
DA2 = New OleDbDataAdapter("SELECT L2 from Chart", con)
DA2.Fill(DT2)
myl(2) = DT2(0)(0)
DA3 = New OleDbDataAdapter("SELECT L3 from Chart", con)
DA3.Fill(DT3)
myl(3) = DT3(0)(0)
DA4 = New OleDbDataAdapter("SELECT L4 from Chart", con)
DA4.Fill(DT4)
myl(4) = DT4(0)(0)
DA5 = New OleDbDataAdapter("SELECT L5 from Chart", con)
DA5.Fill(DT5)
myl(5) = DT5(0)(0)
DA6 = New OleDbDataAdapter("SELECT L6 from Chart", con)
DA6.Fill(DT6)
myl(6) = DT6(0)(0)
DA7 = New OleDbDataAdapter("SELECT L7 from Chart", con)
DA7.Fill(DT7)
myl(7) = DT7(0)(0)
DA8 = New OleDbDataAdapter("SELECT L8 from Chart", con)
DA8.Fill(DT8)
myl(8) = DT8(0)(0)
DA9 = New OleDbDataAdapter("SELECT L9 from Chart", con)
DA9.Fill(DT9)
myl(9) = DT9(0)(0)
myac1 = AccID.Text
mylen = Len(Trim(myac1))
myclen = 0
mylevel = 0
For i = 1 To 9
myclen = myclen + myl(i)
If myclen >= mylen Then
mylevel = i
myclen = myclen - myl(i)
myac2 = Strings.Left(myac1, myclen)
Exit For
End If
Next i
REM '-----------------------------'
AccLevel.Text = mylevel
Dim DAA As New OleDbDataAdapter("select ArAccDes,EnParDes,AccLevel from Accounts where AccID =" & myac2, con)
Dim DTT As New DataTable
DAA.Fill(DTT)
If IsDBNull(DTT(0)(0)) = True Then
MsgBox("كود الاب غير موجود اختار كود رئيسى صحيح", vbCritical, "رسالة خطأ")
ParAcc.Text = " "
ArAccDes.Text = " "
Else
ParAcc.Text = myac2
ArParDes.Text = DTT.Rows(0).Item("ArAccDes")
EnParDes.Text = DTT.Rows(0).Item("EnParDes")
End If
ArAccDes.Focus()
If IsPrimary.Checked = True Then
acc_descr.Text = "رئيسى"
Else
acc_descr.Text = "فرعى"
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
ولكن أريد تحويله ليتم إضافة الحسابات الجديدة طبقاً لما يتم اختياره من الترى فيو مقارنة بمستواه فى جدول Chart