الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف احسب قيمة سجل تعتمد على السجل السابق,

مغلق
بدأه ابوطلال في 15 يوليو 2006 · 7 رد · 700 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

وضعت الموضوع في قسم مبرمجي الاوفيس ولم اجد اي رد فارجوا المساعدة من الجميع

كيف احسب قيمة سجل تعتمد على السجل السابق, هذه العملية ممكنه في الاكسل ولكن كيف انفذها في الفيجوال

b1 ليس فيها تغيير تساوي a1

اما الخلاي التي تليها فتكون حسب المعادلة B2=A2+B1 أي اننا نعتمد على قيمة الخلية السابقة

المطلوب

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

والحقيقة انني استفيد من هذه المتسلسلة في الرسم البياني كما هو موضح

طبعا بتكون قاعدة البيانات اكسس

هل هناك دالة تعطيني قيمة السجل السابق او استعلام

ولكم جزيل الشكر

file.zip

#2

السلام عليكم

هل تقصد اخر سجل في قاعدة البيانات ام ماذا ؟

اذا كان ذلك هو المقصود فاستخدم الوظيفة IDENT_CURRENT التي من خلالها نستطيع جلب أخر سطر وفقاً لقيمتها

هذه الوظيفة تعود بأخر قيمة للمفتاح الاساسي في الجدول. شاهد المثال التالي.

 Dim strSql As String = _
		"SELECT * FROM MyTable " & _
		"WHERE ID =(SELECT IDENT_CURRENT('MyTable'))"
		Dim cnn As New SqlConnection(My.Settings.cnn)
		Dim cmd As New SqlCommand(strSql, cnn)
		Dim da As New SqlDataAdapter(cmd)
		Ds.Clear()
		da.Fill(Me.Ds.MyTable)

بالتوفيق إن شاء الله.

في المثال يتضح المقال

#3

اؤيد الاخ الغملاسي خصوصا اذا كنت تتعامل مباشرة مع قاعدة البانات ، اما اذا كنت تتعامل مع ال Offline Model اي ال DataSet وال DataTable، فانني اقترح عليك الكود التالي:

بافتراض وجود DataGrid ولتكن DG

وافتراض وجود DataTable وليكن T

Private T As DataTable

	Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

		T = New DataTable("Sheet")

		T.Columns.Add("A", Type.GetType("System.Decimal"))
		T.Columns.Add("B", Type.GetType("System.Decimal"))

		T.AcceptChanges()

		DG.DataSource = T

	End Sub

	Private Sub DG_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DG.CellValueChanged
		DG.Item("B", e.RowIndex).Value = B(e.RowIndex)
	End Sub

	Private Function B(ByVal n As Integer) As Decimal
		Dim Bn As Decimal

		If n = 0 Then
			'To Handel the initial value for B1
			Bn = 0.0
		Else
			Try
				Bn = DG.Item("A", n).Value + DG.Item("B", n - 1).Value
			Catch ex As Exception
				Bn = 0.0
			End Try
		End If

		Return Bn

	End Function

لاحظ ان استجابة البرنامج ستكون اسرع بكثير لانك تعمل على Offline Model ، من غير ان تحتاج للتداخل مع قاعدة البيانات كل مرة.

وبالتوفيق

#4

اشكر كم جزيل الشكر على الاستجابة

وفعلا الوضع Offline Model اسرع

ولكن حصلت لدي بعض الخطأ ولم اصل الى النتيجة ارجو المساعدة وهذه البرنامج مرفق

WindowsApplication9.zip

#5

السلام عليكم

يا اخ عبد الباسط , بالله عليك هل تضن اننا سنفهم النصوص التي عرضتها وهي معرفة بهذا الشكل

Function B(ByVal n As Integer) فهل في احد يبرمج بهذه الطريقة ويسمى الوظيفة بـ B و ممرر لها بـ n

قلي بالله عليك كيف هذا , لقد ضيعت الرجل يا أخي.

ثم لا اعتقد ان الـ DataGrid فيها حدث باسم CellValueChanged وانما هذا في الـ DataGridView أليس كذلك؟

أتمنى ان تضع شرح لنصوصك البرمجية , لانها مبهمه للغاية.

السلام عليكم.

تم تعديل هذه المشاركة بواسطة الغملاسي في 17 يوليو 2006 في 09:27

في المثال يتضح المقال

#6

اشكر مشرفنا الغالي الغملاسي ويا ليت تعلق على الموضوع الموجود على الرابط التالي بارك الله فيك وفي علمك

/index.ph...=101699&hl=

وننتظر الرد من الاخ عبدالباسط فقد راينا بصيص امل في حل المشكلة

تم تعديل هذه المشاركة بواسطة ابوطلال في 18 يوليو 2006 في 00:40

#7

اسف على التاخير لانني لم اتمكن بالامس من الرد.

اسف ايضا لان الكود المكتوب هو بال 2005 لكنها زلت لسان عندما قلت DataGrid والصحيح طبعا DataGridView في ال 2005، ربما لانني حديث التعامل مع ال 2005 لذلك لازال البقر يتشابه علي.

ملاحظات الاخ الغملاسي على العين والراس، واشكر ك على توجيهاتك.

الكود التالي ب 2003

	Private WithEvents T As DataTable

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		T = New DataTable("Sheet")

		T.Columns.Add("A", Type.GetType("System.Decimal"))
		T.Columns.Add("B", Type.GetType("System.Decimal"))

		T.AcceptChanges()

		DG.DataSource = T

	End Sub

	Private Function CalculateB(ByVal n As Integer) As Decimal
		Dim Bn As Decimal

		If n = 0 Then
			'To Handel the initial value for B1
			Bn = 0.0
		Else
			Try
				Bn = DG.Item(n, 0) + DG.Item(n - 1, 1)
			Catch ex As Exception
				Bn = 0.0
			End Try
		End If

		Return Bn

	End Function

	Private Sub T_RowChanged(ByVal sender As Object, ByVal e As System.Data.DataRowChangeEventArgs) Handles T.RowChanged
		DG.Item(DG.CurrentCell.RowNumber - 1, 1) = CalculateB(DG.CurrentCell.RowNumber - 1)
	End Sub

ملاحظات:

1-الحدث CellValueChanged غير موجود في ال 2003 ولم اجد حدث اخر مناسب من احداث ال DataGrid، لكن يمكن الاستفادة من الاحداث الموجودة في ال DataTable وبالتحديد الحدث RowChanged ، ولطالما ان ال DataGrid مربوطة او Binded مع ال DataTable فان عمل Catch للحدث RowChanged في الDataTable يفي بالغرض.

2- لايمكن عمل Catch لاي حدث ل Object معين الا اذا تم تعريفه بالكلمة المفتاحية WithEvents التي تسبق اسم ال Instance من ال Object المعني.

مثلا:

	Private WithEvents T As DataTable
#8

الف الف شكر فقد انحلت مشكلة المثال ولكن لم اصل اللى الشئ المطلوب بالضبط حيث انني اريد استعلام يقوم بالعملية على كامل السجلات

ولدي مشكلة اخرى موجودة على الرابط التالي و تعطيني رايك فيه

/index.ph...=101699&hl=

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…