PDA

View Full Version : مشکل در Update کردن یک بانک با دو تا جدول



misha898
دوشنبه 06 آبان 1387, 02:23 صبح
سلام دوستان
من یه بانک دارم که دو تا جدول داره که به هم لینک شدن.
تو یه فرم اطلاعات اعضا رو از جدول اول و جزئیات اونارو از جدول دوم جدا کرده و شروع به انجام محاسبات کرده و در Datagridview نمایش میده . تا اینجا مشکلی نیست ولی این تغییرات و محاسبات در جدول دوم ذخیره نمیشه و تغییرات جدول اول ذخیره میشه و خطایی که گرفته میشه مروبط به دستور Update هست
Syntax error
از اساتید خواهش می کنم جواب بدن

یه سوال دیگه هم دارم وقتی با یک DATASET به دو تا جدول کانکت میشم در Datagridview نمی تونم اطلاعت جدول دوم رو بخونم.
در قسمت بالا از دو تا Dataset استفاده شده.

baran_mehr
دوشنبه 06 آبان 1387, 10:14 صبح
سلام گلم.
حداقل کد برنامتو بزار تا بتونیم روش نظر بیدیم. اینجوری نمیشه حدس زد مشکل از کجاست.

حامد مصافی
دوشنبه 06 آبان 1387, 11:09 صبح
برای جداولی که Relation دارند یا Primary Key ندارد دستورات UPDATE باید دستی وارد بشه. CommandBuilder قادر به ساخت چنین دستوراتی نیست.

خب طبیعیه! قرار هم نیست دو جدول رو با هم ببینید اما می تونید با استفاده از یک View سفارشی شده اطلاعاتی رو که لازم دارید استخراج کنید.

misha898
دوشنبه 06 آبان 1387, 23:30 عصر
Imports System.Data
Imports System.Data.OleDb

Public Class Membersform
Inherits System.Windows.Forms.Form
Dim rnk(1, 2) As Double
Dim ds As New DataSet(), ds1 As New DataSet(), ds2 As New DataSet()
Dim strsql As String, strcon As String, strsql2 As String, strupd As String
Dim da As New OleDbDataAdapter, da1 As New OleDbDataAdapter
Dim con As OleDbConnection
Dim newrow As DataRow
Dim cb As OleDbCommandBuilder, cb1 As OleDbCommandBuilder
Dim ghest(39, 1) As String, eq As Double, count As Integer

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

strcon = "Provider=Microsoft.Jet.OleDb.4.0;" & "Data Source=|DataDirectory|\maskan.mdb"
con = New OleDbConnection(strcon)
con.Open()
strsql = "select * from Memebers"
da = New OleDbDataAdapter(strsql, con)
da.Fill(ds, "Memebers")
count = Me.BindingContext(ds, "Memebers").Count - 1
TextBox1.DataBindings.Add(New Binding("text", ds, "Memebers.ID"))
TextBox2.DataBindings.Add(New Binding("text", ds, "Memebers.Member"))
TextBox3.DataBindings.Add(New Binding("text", ds, "Memebers.Code"))
con.Close()
Call datagrid()
' Call total()
TextBox6.DataBindings.Add(New Binding("text", ds, "Memebers.Remain"))
TextBox5.DataBindings.Add(New Binding("text", ds, "Memebers.Average"))
TextBox4.DataBindings.Add(New Binding("text", ds, "Memebers.Rank"))
TextBox7.DataBindings.Add(New Binding("text", ds, "Memebers.PENALTY"))
TextBox4.ForeColor = Color.Magenta
End Sub

Private Sub datagrid()
Dim cmd As New OleDbCommand
DataGridView1.RightToLeft = Windows.Forms.RightToLeft.Yes
ds1.Clear()
DataGridView1.DataBindings.Clear()
strsql2 = "select * from Hesab where code='" & TextBox3.Text & "' order by Date;" da1 = New OleDbDataAdapter(strsql2, con)
da1.Fill(ds1, "Hesab")
DataGridView1.DataBindings.Add(New Binding("datasource", ds1, "Hesab"))
DataGridView1.Columns.Item(0).HeaderText = "شماره سند"
DataGridView1.Columns.Item(1).HeaderText = "شماره عضويت"
DataGridView1.Columns.Item(2).HeaderText = "تاريخ"
DataGridView1.Columns.Item(3).HeaderText = "ساعت"
DataGridView1.Columns.Item(4).HeaderText = "مبلغ"
DataGridView1.Columns.Item(5).HeaderText = "کل واريزی"
DataGridView1.Columns.Item(6).HeaderText = "روزهای تاخير"
DataGridView1.Columns.Item(7).HeaderText = "جريمه"
DataGridView1.Columns.Item(8).HeaderText = "روزهای مانده"
DataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Sunken
DataGridView1.ColumnHeadersDefaultCellStyle.Alignm ent = DataGridViewContentAlignment.MiddleCenter
DataGridView1.AutoResizeColumns()
ds.AcceptChanges()
If con.State = ConnectionState.Open Then con.Close()

End Sub



Private Function days(ByVal date1 As String, ByVal date2 As String) As String
Dim year1 As Integer, year2 As Integer, mnt1 As Integer, mnt2 As Integer, day1 As Integer, day2 As Integer
Dim a1 As Integer, a2 As Integer, a3 As Integer
a1 = InStr(1, date2, "/")
a2 = InStr(a1, date2, "/")
a3 = a1 + a2
year1 = Val(Mid(date2, 1, a1 - 1)) : mnt1 = Val(Mid(date2, a1 + 1, a2 - 1)) : day1 = Val(Mid(date2, a3 + 1, (Len(date2) - a3)))
a1 = InStr(1, date1, "/")
a2 = InStr(a1, date1, "/")
a3 = a1 + a2
year2 = Val(Mid(date1, 1, a1 - 1)) : mnt2 = Val(Mid(date1, a1 + 1, a2 - 1)) : day2 = Val(Mid(date1, a3 + 1, (Len(date1) - a3)))
days = (year2 - year1) * 360 + (mnt2 - mnt1) * 30 + (day2 - day1)

End Function
Private Sub total()
Dim i As Integer, date_sh As New Globalization.PersianCalendar
Dim date_str As String, cmd As New OleDbCommand
'id = Val(TextBox1.Text) - 1
Dim f As Integer
For f = 0 To count
DataGridView1.Item(5, 0).Value = DataGridView1.Item(4, 0).Value

'************************************************* ***********************
'************************ Mande Hesab *********************************
'************************************************* ***********************

For i = 1 To DataGridView1.RowCount - 1
DataGridView1.Item(5, i).Value = DataGridView1.Item(4, i).Value + DataGridView1.Item(5, i - 1).Value
Next


'************************************************* ***********************
'************************ Roozhaye Mande (pool dar Hesab) **************
'************************************************* ***********************

For i = 0 To DataGridView1.RowCount - 2
DataGridView1.Item(8, i).Value = days(DataGridView1.Item(2, i + 1).Value.ToString, DataGridView1.Item(2, i).Value.ToString)
Next
date_str = date_sh.GetYear(Date.Now) & "/" & Format(date_sh.GetMonth(Date.Now), "00") & "/" & Format(date_sh.GetDayOfMonth(Date.Now), "00")
DataGridView1.Item(8, i).Value = days(Mid(date_str, 3, 8), DataGridView1.Item(2, i).Value)

'************************************************* ***********************
'************************ Roozhaye Ta'khir & Jarime ********************
'************************************************* ***********************

Call aghsat()
Call penalty()

'*************************
If con.State = ConnectionState.Open Then con.Close()
da1.AcceptChangesDuringUpdate = True

cb = New OleDbCommandBuilder(da1)
da1.UpdateCommand = cb.GetUpdateCommand()
da1.Update(ds1, "Hesab")

'***************************************
TextBox6.Text = DataGridView1.Item(5, i - 1).Value.ToString
TextBox7.Text = Math.Round(eq, 4)
'************************************************* ***********************
'************************ Miyangine banki *****************************
'************************************************* ***********************

TextBox5.Text = average()


'************************************************* ***********************

'***********************************


' Me.BindingContext(ds, "Memebers").Position += 1
Next
Call rank()
If con.State = ConnectionState.Closed Then con.Open()
'ds1.Clear()
cb = New OleDbCommandBuilder(da1)
' da1.Update(ds1, "Hesab")
' da1.Fill(ds1, "Hesab")
If con.State = ConnectionState.Open Then con.Close()
Me.BindingContext(ds, "Memebers").Position = 0
'Update
' Next
End Sub

Private Function average() As String
Dim id As Integer
Dim j As Integer, sum As Double, day As Double
id = Val(TextBox1.Text) - 1
sum = 0 : day = 0
For j = 0 To DataGridView1.RowCount - 1
sum = sum + (DataGridView1.Item(8, j).Value * DataGridView1.Item(5, j).Value)
day = day + DataGridView1.Item(8, j).Value
Beep()
Next
average = Str(sum / day)
End Function
Private Sub penalty()
Dim i As Integer, p As Integer, j As Integer
Dim sum As Double, q As Integer
sum = 0
For j = 0 To 10
sum = sum + ghest(j, 0)
Next
eq = 0
For i = 0 To DataGridView1.RowCount - 1

p = days(DataGridView1.Item(2, i).Value, ghest(j, 1))

If p > 0 Then
Dim h As Integer
Do Until days(DataGridView1.Item(2, i).Value, ghest(j, 1)) < 0
h += 1
sum = sum + ghest(j, 0)
j += 1

Loop

If i > 0 Then q = DataGridView1.Item(5, i - 1).Value


If sum > q Then
DataGridView1.Item(6, i).Value = h * 30
DataGridView1.Item(7, i).Value = Math.Round((p * 20 * (sum - q)) / 36000, 4)
End If

Else
DataGridView1.Item(6, i).Value = 0
DataGridView1.Item(7, i).Value = 0
End If
eq = eq + DataGridView1.Item(7, i).Value
Next
DataGridView1.AutoResizeColumns()
'DataGridView1.Update()

End Sub

Private Sub rank()
Dim id As Integer
id = Val(TextBox1.Text) - 1
Dim tmp_id As Double, h As Integer, j As Integer, tmp As Double
ReDim rnk(1, Me.BindingContext(ds, "Memebers").Count - 1)
Me.BindingContext(ds, "Memebers").Position = 0
For h = 0 To Me.BindingContext(ds, "Memebers").Count - 1
rnk(0, h) = Val(TextBox3.Text)
rnk(1, h) = Val(TextBox5.Text)
Me.BindingContext(ds, "Memebers").Position += 1
Next
For h = 0 To Me.BindingContext(ds, "Memebers").Count - 2
For j = h + 1 To Me.BindingContext(ds, "Memebers").Count - 1
If rnk(1, h) < rnk(1, j) Then
tmp = rnk(1, h)
rnk(1, h) = rnk(1, j)
rnk(1, j) = tmp
tmp_id = rnk(0, h)
rnk(0, h) = rnk(0, j)
rnk(0, j) = tmp_id
End If
Next
Next
Me.BindingContext(ds, "Memebers").Position = id
For h = 0 To Me.BindingContext(ds, "Memebers").Count - 1
If Val(TextBox3.Text) = rnk(0, h) Then
TextBox4.Text = Str(h + 1)
TextBox4.ForeColor = Color.Magenta
Exit Sub
End If
Next
End Sub

misha898
جمعه 10 آبان 1387, 00:07 صبح
کسی نیست مشکل منو حل کنه؟

اساتید یه نیم نگاهی هم به ما بندازین

baran_mehr
جمعه 10 آبان 1387, 11:20 صبح
سلام دوست عزیز. متاسفانه من با این شیوه شما هنوز کار نکردم چون به نظرم کار رو دشوار میکنه. من از کد های زیر استفاده میکنم. یه نگاهی بیندازید اگر براتون جالب بود بگید تا نحوه استفاده ازشو بگم:
مثلا برای انجام اعمال ورود یا حذف یا ویرایش:

cmd.CommandType = CommandType.Text
cmd.CommandText = "Insert Or Delete Or Update"
cmd.Connection = cnt
cmd.ExecuteNonQuery()
و برای نمایش:

cmd.CommandText = "SELECT table FROM Industry "
cmd.Connection = cnt
da.SelectCommand = cmd
dt.Clear()
da.Fill(dt)

sepehr.net
جمعه 10 آبان 1387, 21:59 عصر
سلام دوست من والا هرکی این همه کد رو میبینه از پاسخ دادن منصرف میشه
خواهش میکنم کد هاتون را به صورت خالصه شده قرار بدین و فقط اون جایی رو که مشکل دارین
ببینین برای اینجور مواقع شما دوتا راه دارین 1 اینکه تو بانک یک view بسازین و حالا اون رو تو دیتا گرید لود کنید
2 اینکه با استفاده از دستورات sql این کار را بکنید مثلا

Select Tabale1.Name,Tabel1.Family,Tabel2.Sen,Tabel2.Ghad, Tabel2.Vazn From Tabel1,Tabel2 Where Tabel1.Id=Tabel2.Code
برای اینکه با این دستورات بیشتر آشنا بشین میتونین تو اینترنت جستجو کنین

baran_mehr
شنبه 11 آبان 1387, 14:48 عصر
سلام داداش گلم.اینم مثال اگه مشکل برخوردی بگو.
تو قسمت سراسری فرم این متغییرها رو تعریف کن:

Dim cnt As New OleDb.OleDbConnection
Dim cmd As New OleDb.OleDbCommand
Dim da As New OleDb.OleDbDataAdapter
Dim dt As New DataTable
تو فرم لود:

cnt.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\database.mdb"
cnt.Open()
برای استفاده از دستور Select:

cmd.CommandText = "select * from table1 where(code=" & TextBox4.Text & ")"
cmd.Connection = cnt
da.SelectCommand = cmd
dt.Clear()
da.Fill(dt)
GridView1.DataSource = dt
برای اجرای دستورات Update و Delete و Insert میتونی از دستور زیر استفاده کنی. من برات Insert را مثال میزنم:


cmd.CommandType = CommandType.Text
cmd.CommandText = "insert into Table1 (name) values(' & TextBox6.Text & "' )"
cmd.Connection = cnt
cmd.ExecuteNonQuery()

misha898
دوشنبه 13 آبان 1387, 01:10 صبح
سلام دوست من والا هرکی این همه کد رو میبینه از پاسخ دادن منصرف میشه
خواهش میکنم کد هاتون را به صورت خالصه شده قرار بدین و فقط اون جایی رو که مشکل دارین
ببینین برای اینجور مواقع شما دوتا راه دارین 1 اینکه تو بانک یک view بسازین و حالا اون رو تو دیتا گرید لود کنید
2 اینکه با استفاده از دستورات sql این کار را بکنید مثلا

Select Tabale1.Name,Tabel1.Family,Tabel2.Sen,Tabel2.Ghad, Tabel2.Vazn From Tabel1,Tabel2 Where Tabel1.Id=Tabel2.Codeبرای اینکه با این دستورات بیشتر آشنا بشین میتونین تو اینترنت جستجو کنین

دوست عزیز من اول اون قسمتی که مشکل داشت رو گذاشتم ولی جوابی نگرفتم فکر کردم شاید به دلیل کامل نبودن کد بچه ها جواب ندادن که بعد ویرایشش کردم

داداشی گلم من از این دستورات هم استفاده کردم ولی اجرا میشه ولی تغییراتی در بانک انجام نمیشه.
اگه دقت کرده باشین من جدول رو دارم دستکاری میکنم ولی وقتی می خوام ذخیره کنم دیتاست رو چک میکنم که تغییر کرده یا نه که میبینم میگه نه. جدول رو هم رفرش کردم ولی بازهم میگه تغییرات نداشتم.


بازهم از اینکه به سوالام جواب دادین ممنونم

baran_mehr
دوشنبه 13 آبان 1387, 12:08 عصر
سلام داداشی حتما یک جای کار رو درست انجام نمیدی.این پروژه رو نگاه کن البته با اسکیوال هست که جدولشم گذاشتم

sepehr.net
دوشنبه 13 آبان 1387, 18:00 عصر
اگه دستورات اجرا میشه یعنی اطلاعات تو بانک اعمال شده . در ضمن ببین که از try استفاده نکرده باشی
شید مشکلت از این باشه که دو تا بانک اطلاعاتی داری ؟
ممکنه که شما یک بار در کد بانکی رو به برنامه متصل کردی و در پوشه ی bin برنامت کپی کرده باشی که برنامه از اون فایل ها رو میخونه و نشون میده و یک بار هم با ویزارد این کار رو کرده باشی(مثلا برای گزارش گیری) که بانک رو در سورس برنامت کپی میکنه . و از این به بعد هر موقع که چیزی رو در بانکت اعمال کنی برنامه اطلاعات بانک دوم رو میخونه و در بانک اصلی برنامت میریزه( یعنی دوباره مثل قبل میشه).
حالا ببین شاید از این باشه

baran_mehr
دوشنبه 13 آبان 1387, 23:12 عصر
سلام داداشی نازم.
ببین من برات برنامه رو به اکسس تغییر دادم بازش کن و بانک رو تو درایو C کپی کن و اجرا کن. امیدوارم مشکلت حل بشه.