PDA

View Full Version : ریختن یک متغیر در بانک



bahar2008
جمعه 24 خرداد 1387, 11:54 صبح
سلام دوستان خوبم

من این کد رو در برنامم دارم و می خوام متغیرهایی که تعریف کردم رو در فیلدهای بانکم بریزم ولی نمی دونم با چه دستوری می تونم این کار رو انجام بدم :ناراحت:



For j As Integer = 0 To DataGridView2.RowCount - 1
a = DataGridView1.CurrentRow.Cells(4).Value / DataGridView2.Rows(j).Cells(4).Value
b = DataGridView1.CurrentRow.Cells(5).Value / DataGridView2.Rows(j).Cells(5).Value
c = DataGridView1.CurrentRow.Cells(6).Value / DataGridView2.Rows(j).Cells(6).Value
Next


من به این صورت نوشتم ولی جواب درست نداد :ناراحت:


cmd.CommandText = "insert into shakhes (sal81) VALUES (@a)"
cmd.CommandText = "insert into shakhes (sal82) VALUES (@b)"
cmd.CommandText = "insert into shakhes (sal83) VALUES (@c)"

MH2538
جمعه 24 خرداد 1387, 12:22 عصر
دوست عزیزشما باید متغیرهات رو هم معرفی کنی مثلاً :


cmd.Parameters.Add('@a')

بعد مقدارت رو به اون پاس بدی

kablayi
جمعه 24 خرداد 1387, 12:24 عصر
شما بایستی پارامترهای commandtext تونو add کنید ... یعنی این پارامترهایی رو که در دستور insert نوشتین براش تعریف کنید و مقداردهی نمائید ...
شما فقط مقدار دهی کردید ولی هنوز اونا رو ADD نکردید ...
با دستور زیر میتونید این کارو انجام بدید ... این دستور رو بعد از commandtext و قبل از اجرای اون با ExecuteNonQuery قرار بدین ...


cmd.parameters.addwithvalue("@a",a)
یا مستقیما بنویسید...

cmd.parameters.addwithvalue("@a",DataGridView1.CurrentRow.Cells(4).Value / DataGridView2.Rows(j).Cells(4).Value)

برای بقیه متغیرها هم این کارو انجام بده ...
ضمنا این دستور رو هم به صورت واحد بنویسید ....
cmd.CommandText = "insert into shakhes (sal81,sal82,sal83) VALUES (@a,@b.@c)"

...


موفق باشید ...

bahar2008
جمعه 24 خرداد 1387, 13:27 عصر
ممنونم از راهنمایی و کمکتون دوستان خوبم :قلب::قلب:
مشکل دیگه ای که هست این هست که این کدی که نوشتم جواب تقسیم رو صحیح بر می گردونه چه جوری باید بنویسم که جواب تقسیم رو اعشاری نشون بده در بانک؟ (متغیرها از نوع integer هستند آیا مشکل از تعریف متغیرها هست یا از مدل تقسیم نوشتن؟)

یک سوال دیگه هم دارم که در صفحه بعدی می خوام در یک دیتا گرید فقط یک ردیف از اطلاعاتی که در تیبل بانکم دارم نشون داده بشه ولی وقتی من دیتاگریدم رو به تیبلم بایند می کنم تمام اطلاعات تیبل در دیتا گرید نمایش داده می شه و می خوام که دکمه ای بزارم که وقتی کاربر روی دکمه کلیلک کرد در صورت وجود سطرهای بعدی در تیبل سطر بعدی رو در دیتا گرید به کاربر نمایش بده (یعنی با زدن هر بار دکمه سطر به سطر اطلاعات تیبل در دیتا گرید نمایش داده بشه)
اگر ممکنه راهنماییم کنید که با چه کدی می تونم این کار رو انجام بدم ؟

ali_md110
شنبه 25 خرداد 1387, 15:12 عصر
در مورد وارد کردن یک سطر از1 Top بعد از select در دستور اسکیول استفاده کن
جهت نمایش تک تک رکورد باید شما دستور جستجو بنویسید چون این کاری که شما میخواهید بکنید حرکت جلو و عقب توی دیتاست نیست در واقع حستحوی یک رکورد و نمایش در دیتاگراید هست
به نظر من یه فیلد بساز تو بانک برنامت بنام id با فرمت نامبر
یک متغیر integer بنویس و با اولین جستجویی که در برنامه مثلا بر اساس همین فیلد id انجام دادی یا اولین رگوردی که بوسیله دستور Top 1 در سلکت بدست اوردی مقدار بدست امده فیلد id رو در همین متغیر زخیره کن
بار دوم اساس جستجو رو بر جمع مقدار بدست آمده گه د ر متغیر دخیره کرده ای با عدد یک بزار
پس از هر بار کلیک دکمه چون یک عدد به متغیر اضافه میشه و جستجو هم بر اساس همین عدد محاسبه میشه و ریخته میشه توی دیتاگراید ویو
امتحان کن اگر نشد کد برنامتو بزار

bahar2008
شنبه 25 خرداد 1387, 17:48 عصر
ممنونم ا راهنمایی کاملتون دوست عزیز
ولی من نمی خوام جستجو انجام بده من فقط می خوام یک چیزی شبیه اشاره گر باشه که ردیفهایی که در بانک هست رو از بالا تا پایین به ترتیبی که وارد شده در دیتا گرید نشون بده فقط با این تفاوت که هر دفعه کاربر کلید "بعدی " رو می زنه اشاره گر رکورد بعدی رو نشون بده و همین طور به ترتیب وقتی دوباره این کلید رو می زنه رکوردهایه بعدی رو تا جایی که رکورد در بانک وجود داره نشون بده و یک دکمه به نام مثلا "اولین " که مستقیم به اولین رکورد رفته و دوباره این اشاره گر زمانیکه دکمه "بعدی " زده می شه به پایین رفته و رکوردها رو تک تک در دیتا گرید نمایش بده

ali_md110
یک شنبه 26 خرداد 1387, 12:50 عصر
شما میخواهید دیتاگراید رو بویسله تمام رکوردهای جدول پر کرده و بین رکوردها حرکت کنید؟ یا هر لحظه یک رکورد در دیتاگراید نمایش داده بشه؟

bahar2008
یک شنبه 26 خرداد 1387, 22:29 عصر
می خواهم در هر لحظه یک رکورد در دیتاگراید نمایش داده بشه چون نمایش تمام رکوردها رو بلدم ولی اینکه تک تک به ترتیبی که در بانک وارد شده در دیتاگرید نمایش داده بشه رو نمی دونم چه کدی باید بنویسم :ناراحت:

kablayi
دوشنبه 27 خرداد 1387, 00:53 صبح
سلام ...


ممنونم از راهنمایی و کمکتون دوستان خوبم :قلب::قلب:
مشکل دیگه ای که هست این هست که این کدی که نوشتم جواب تقسیم رو صحیح بر می گردونه چه جوری باید بنویسم که جواب تقسیم رو اعشاری نشون بده در بانک؟ (متغیرها از نوع integer هستند آیا مشکل از تعریف متغیرها هست یا از مدل تقسیم نوشتن؟)

شما بایستی متغیرتون رو از نوع double یا decimal تعریف کنید ...



می خواهم در هر لحظه یک رکورد در دیتاگراید نمایش داده بشه چون نمایش تمام رکوردها رو بلدم ولی اینکه تک تک به ترتیبی که در بانک وارد شده در دیتاگرید نمایش داده بشه رو نمی دونم چه کدی باید بنویسم :ناراحت:

برای این کار بایستی شما برای هر بار کلیک روی دکمه next و یا preview یه کوئری بسازی که فقط رکورد بعدی یا قبلی رو برگردونه و دیتاگریدتو با اون پر کنی ...
این کد روی دکمه next کار میکنه ....


' اینا رو پابلیک تعریف کن
dim ds as dataset
dim strcon as string ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=دیتابیس"
dim strsql as string="select * from tableNAME"
dim da as new oledbdataadapter
dim tbl as datatable
dim rw sa datarow

' اینا رو تو فرم لود بنویس
da= new oledbdataAdapter(strsql,strcon)
ds.clear()
da.Fill(ds, "tableNAME")
tbl = ds.Tables("tableNAME")
.
.
.
.

' تابعی برای بدست آوردن کویریه حاوی رکورد بعدی
sub GetQuery()
If tbl.Rows.Count <> 0 Then
If (Me.BindingContext(ds, "tableNAME").Position = Me.BindingContext(ds, "Edit").Count - 1) Then
Me.BindingContext(ds, "tableNAME").Position = 0
Else
Me.BindingContext(ds, "tableNAME").Position += 1
End If
rw = tbl.Rows(Me.BindingContext(ds, "tableNAME").Position)
dim intID as integer = rw("ID")
strQuery="select * from tableName where ID=" & intID & ""
end if
end sub


Private Sub BTNnext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNnext.Click
GetQuery()
end sub


البته نمیدونم کار میده یا نه چون همینطوری تو هوا نوشتمشون ... :خجالت:
حالا شما میتونید در تابع GetQuery شرطی رو قرار بدین تا position رو برای حرکت رو به عقب هم تنظیم کند تا در هر دو حالت کوئری بدست آمده درست باشد ... :چشمک:

بعد از بدست آمدن کوئری ، دیتا گریدتو با اون پر کن ...

موفق باشید ...

bahar2008
سه شنبه 28 خرداد 1387, 09:21 صبح
ممنونم از كدي كه داديد دوست عزيز ولي من كه اجرا كردمش پيغام خطاي زير رو نشان داد :ناراحت:


http://img.majidonline.com/pic/159506/khata.JPG

kablayi
سه شنبه 28 خرداد 1387, 13:38 عصر
سلام ... بایستی تو تعاریف متغیر ها و یا Instance ها یه جایی اشتباه کرده باشید ...

kablayi
سه شنبه 28 خرداد 1387, 13:39 عصر
اگر امکان داره برنامتونو بزارید اینجا شاید بشه مشکلشو حل کرد ...

موفق باشید ...

bahar2008
چهارشنبه 29 خرداد 1387, 09:06 صبح
مشكلش از دستوز زير بود


strQuery="select * from tableName where ID=" & intID & ""



آخه من در بانكم فيلدي به نام id ندارم و ساختار بانكم اينجوري هست كه فيلدهاي اون از 81 تا 90 هست .
چون مي خواستم در ديتا گريدم سطر اول اون از بانك "خروجي ها" بياد و سطر دوم اون از بانك "ورودي ها " و سطر سوم اون از باك " جواب " (كه بانك سوم حاصل تقسيم بانك اول بر بانك دوم هست ) نمايش داده بشه براي همين هيچ id براي بانك سوم تعريف نكردم
حالا به نظر شما چه جوري مي تونم يك ركورد از بانك اول و يك ركورد از بانك دوم و يك ركورد از بانك سوم رو در ديتا گريدم نمايش بدم؟

kablayi
چهارشنبه 29 خرداد 1387, 14:56 عصر
اگر به جداولتون یه فیلد ID اضافه کنید ... هیچ مشکلی پیش نمی آد ...
این فیلد رو به صورت auto Number تنظیم کنید ...

موفق باشید ...

bahar2008
پنج شنبه 30 خرداد 1387, 12:19 عصر
ممنونم دوست عزیز:قلب: :قلب:
من فیلد id رو به بانکم اضافه کردم ولی در نوع تعریف این فیلد در بانکم نوع auto Number ندیدم و برای همین numeric تعریف کردمش:اشتباه::اشتباه:
البته این دفعه برنامه رو بدون خطا اجرا کرد ولی یک مشکل دیگه ای که گرفت این بود که بعضی از جوابهای تقسیم به صورت
1.#INF در بانکم ذخیره کرده و به همین خاطر پیغام خطایی می ده که این نوع داده ناشناخته هست :ناراحت::ناراحت:
شما می دونید به خاطر چی هست که اعداد رو به این صورت در بانک ذخیره می کنه؟
چه جوری می تونم در تقسیمم بگم که تا چند رقم اعشار تقسیم رو انجام بده که اعداد اینقدر بزرگ در نیان؟ :ناراحت:

Hossein Bazyan
پنج شنبه 30 خرداد 1387, 14:17 عصر
سلام
چون فیلد از نوع عددی میباشد و میخوای اعشار هم ذخیره بشه باید از علامت ' ' ( مانند رشته ها برای عدد استفاده کنی ) چون اگر عدد شما 2,55 باشد sql این عدد را دو فیلد فرض میکند ( با توحه به علامت , آن ) پس مانند رشته ها ذخیره ش کن ( داخل علامت ' ' )

bahar2008
پنج شنبه 30 خرداد 1387, 14:40 عصر
ممنونم دوست عزیز
من اینراه رو امتحان کردم ولی هر جایه دستو تقسیمم کوتیشن گذاشتم خطا می گرفت
می شه لطفا بگید کجای ایم کد باید علامت ' ' رو بزارم؟


a = DataGridView1.CurrentRow.Cells(4).Value / DataGridView2.Rows(j).Cells(4).Value

من برای متغیر a گذاشتم ولی خطا گرفت برای سلولهای دیتا گرید هم همین طور :اشتباه:

kablayi
جمعه 31 خرداد 1387, 00:53 صبح
سلام ...
شما دیتاتایپ فیلدی رو که a توی اون ذخیره میشه رو چی گذاشتین ...

bahar2008
جمعه 31 خرداد 1387, 10:32 صبح
در بانکم float گذاشتم و در برنامم double گذاشتم

kablayi
جمعه 31 خرداد 1387, 13:28 عصر
در بانکم float گذاشتم و در برنامم double گذاشتم

سلام ...
دوست عزیز شما درون دیتابیستون تعداد اعشار اون فیلد رو فرضا رو دو رقم بزارید ... ببینید جواب میده یا نه ...

bahar2008
جمعه 31 خرداد 1387, 15:08 عصر
ممنون از راهنماییت دوست عزیز
ولی من نمی دونم کجای دیتا بیس می شه این کارو انجام داد حتی خواستم مقداری که متغیر float می گیره رو از 8 بیشترش کنم ولی انجام نمی داد :ناراحت: :اشتباه:

kablayi
جمعه 31 خرداد 1387, 20:11 عصر
سلام ...
شما از چه دینابیسی استفاده می کنید ...؟
معمولا در قسمت تنظیمات مربوط به فیلدهای دیتا بیس فرضا توی اکسس در قسمت general گزینه ای به نام decimal places وجود داره که تعداد اعشارو از اونجا معین میکنن ...

bahar2008
جمعه 31 خرداد 1387, 21:07 عصر
من از sql استفاده می کنم ولی جایی رو پیدا نکردم که بتونم تعداد اعشار رو براش مشخص کنم :افسرده:

bahar2008
شنبه 01 تیر 1387, 12:01 عصر
چرا وقتي من متغيري رو به صورت زير تعريف مي كنم در vb.net خطا مي گيره؟:ناراحت:


dim math.round (a as double , 2 ) as double

با اين كد مي خوام به برنامه بگم كه فقط تا 2 رقم اعشار تقسيم رو انجام بده و بعد جواب تقسيم رو در بانك قرار بده تا اين مشكل حل بشه ولي برنامه اين كد رو خطا مي دهد
كسي ميدونه در طرز نوشتنش چه مشكلي وجود داره دوستان؟

NewFoxStudent
شنبه 01 تیر 1387, 13:00 عصر
Dim a as Double
a=round(a,2)

NewFoxStudent
شنبه 01 تیر 1387, 13:00 عصر
dim a
dim Round(a,2) as double

bahar2008
شنبه 01 تیر 1387, 17:37 عصر
ممنونم از راهنماییت دوست عزیز
ولی با اینکه متغیرهام رو همینجوری که شما گفتید به صورت زیر تعریف کردم



Dim a, b As Double
a = Math.Round(a, 2)
b = Math.Round(b, 2)

ولی موقع اجرا پیغام خطای زیر رو داد و باز هم اعداد رو تا چند رقم اعشار در بانکم ذخیره می کنه :ناراحت:
http://img.majidonline.com/pic/160000/khata.JPG