ورود

View Full Version : سوال: اتصال به دیتابیس و مشکل درخواندن اطلاعات



amiralex
سه شنبه 11 مهر 1391, 15:38 عصر
سلام دوستان
خسته نباشيد. من يه تازه كارم تو VB6 و خيلي علاقه مندم كه اين زبان رو ياد بگيرم
يه سري سوال داشتم اگه ممكنه پاسخ بديد.
من از طريق VB Application Wizard يك فرم اضافه كردم و اونو به ديتابيس اكسس متصل كردم و از طريق فرمي كه ايجاد شد ميتونم اطلاعاتم كه يه سري عدد هستند رو در ديتابيس ذخيره كنم و مشاهده كنم. مشكلي تا اينجا نيست
چندين تكست باكس در فرم ايجاد شده كه خود Wizard اونا رو بوجود آورده و همشونم هم نام هستند با نام txtFields و موقع ورودشون هم سعي كردم نامشون رو عوض كنم اما بعدش كه رو اونا انتخاب ميكردم در بخش خصوصياتش همون نام براشون بود.
كد زير بيشتر منظورمه:




Option Explicit


Dim WithEvents adoPrimaryRS As Recordset
Dim mbChangedByCode As Boolean
Dim mvBookMark As Variant
Dim mbEditFlag As Boolean
Dim mbAddNewFlag As Boolean
Dim mbDataChanged As Boolean
-----------------------------------------------------------------------------------
Private Sub Form_Load()
Dim db As Connection
Set db = New Connection
db.CursorLocation = adUseClient
db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Software\Formsaz-Project\F-DataBase.mdb;"


Set adoPrimaryRS = New Recordset
adoPrimaryRS.Open "select Fisargarijari,FneshanJari,Fsakhtikar,FTakhasosijar i,Hsabetjari,jangzade,Jghabelepardakht,Jhoghoghmaz aya,karfarma,karmand,mah,sal,Tedadkarkonan,TTatbig hjari from Sazmanbazneshastegi Order by sal", db, adOpenStatic, adLockOptimistic



Dim oText As Textbox



'Bind the text boxes to the data provider



For Each oText In Me.txtFields



Set oText.DataSource = adoPrimaryRS



Next



mbDataChanged = False




End Sub



http://www.8pic.ir/images/f2enm5z6ovhzhfb8x9u0.jpg



سوالم اينجاست:
1 – چرا اونا نامشون يكي هست؟ و اينكه با تغيير نامشون چرا برنامه ديتاي اونا رو نشون نميده؟
2 – اگه بخوام تعدادي از تكست باكس ها مقدارشون باهم جمع كنم و در يك تكست باكس ديگه نشون بدم و در ديتابيسم ذخيره كنم چي كار بايد بكنم؟
لطفا اگه ميشه يكي راهننمايي كنه.
با تشكر

SlowCode
سه شنبه 11 مهر 1391, 18:44 عصر
1- واسه راحتی کار. اسم اونا یکیه ولی index متفاوتی دارن.
2- اگه اسمشون یکی باشه و ایندکس داشته باشن، از کد زیر استفاده کن:

For i = 0 to 5
x=x+val(txtFields(i))
Next
Msgbox x

این کد مقدار تکست باکس ها از ایندکس 0 تا 5 رو نشون میده.

amiralex
چهارشنبه 12 مهر 1391, 08:15 صبح
ممنونم از پاسختون ولي ميشه منظورتون رو از ايندكس بگين؟
ايندكس همونيه كه تو خصوصيات فايل با نام Index مشخص شده؟

بعد حلقه For رو چطور ميتونم استفاده كنم؟ يعني كاملتر توضيح بديد؟ و اينكه آيا اين جمع در تكست باكس آخري كه تو عكس مشخص كردم نشون ميده و در دريتابيس ذخيره ميشه؟

ممنونم از كمكتون

SlowCode
چهارشنبه 12 مهر 1391, 09:27 صبح
بله، منظورم همونه، شما ببین که txtFields ایندکس داره یا نه؟ اگه میگین که اسم همشون همینه پس حتما ایندکس دارن.
شما برای جمع کردن مقادیر تکست باکس ها یا باید یکی یکی مقدارشون رو جمع کنی(که اصلا اصولی نیست) یا باید از یه حلقه استفاده کنی. توی حلقه 0 ایندکس تکست باکس اوله و به جای 5، ایندکس آخرین تکست باکسی رو بنویس که باید مقدارش جمع بشه. طبق عکس شما میخوای مقدار 7 تا تکست باکس رو جمع کنی پس به جای 5 بنویس 6، منهای یک میشه چون ایندکس از صفر شروع میشه. پس باید اینطوری بنویسی:
For i = 0 to 6
x = x + val(txtFields(i))
txtSum = x
Next
همونطور که گفتم اعداد به ترتیب از 0 تا 6 توی متغیر i ذخیره میشه، توی خط دوم مقدار عددی تکست باکس ها به x اضافه میشه، در خط سوم مقدار x رو توی تکست باکس txtSum میریزیم.
واسه پایگاه داده از چی استفاده میکنی؟واسه ado می تونی اینطوری اضافه کنی:
Adodc1.Recordset.Fields(fldSum) = x

amiralex
چهارشنبه 12 مهر 1391, 09:32 صبح
ممنونم از پاسختون دوست عزيز بزاريد طبق گق گفته شما عمل كنم.
اگه سوالي داشتم ازتون ميپرسم.
باز هم متشكرم

amiralex
چهارشنبه 12 مهر 1391, 09:46 صبح
دوست عزيز من كدي كه شما نوشتين رو امتحان كردم البته با اين تغيير كار ميكرد ولي مقدار جمع رو در اون تكست باكس نشون نميده كد رو به اين صورت نوشتم و البته با دستور پرينت در فرم جمع و نشون ميده

Dim db As Database
Dim rst As Recordset
Dim I As Double
Dim X As Long
For I = 4 To 10
X = X + Val(txt1(I))
Next I
Print X

كدي كه شما گفتين و به اين صورت نوشتم اما ارور ميده

Dim db As Database
Dim rst As Recordset
Dim I As Double
Dim X As Long
For I = 4 To 10
X = X + Val(txt1(I))
Next I
Adodc1.Recordset.Fields(fldSum) = X


چي كار بايد بكنم؟


البته ديتابيسمم اكسس هست و اونو از طريق خود ويزارد برنامه متصل كردم و موقع اتصال هم از ADO رو انتخاب كردم.

SlowCode
چهارشنبه 12 مهر 1391, 10:14 صبح
توی خط Adodc1.Recordset.Fields(fldSum) = X به جای fldSum ایندکس فیلدی رو که میخوای مقدار توش ذخیره بشه بنویس(دقت کن، از شماره فیلد باید یکی کم بشه). این خط چیزی رو نشون نمیده فقط ذخیره میکنه. اگه اینطوری نمیخوای مقدار تکست باکسی رو که میخوای مقادیر جمع توش نوشته بشه رو برابر x کن. خیلی راحته.

amiralex
چهارشنبه 12 مهر 1391, 10:26 صبح
آق محسن من كاري كه شما گفتين رو كردم اما ارور ميده و خطاش هم اينه

كلمه Adodc1 رو انتخاب ميكنه و ميگه :
Variable Not Defined

چي كار بايد بكنم؟
منظورتون رو از حالت دوم اينطور متوجه شدم كه يعني غير اون راه اين كار رو بكنم:
كدي كه شما گفتين و به اين صورت نوشتم اما ارور ميده ( نام تكست باكسي كه ميخوام جمع توش نوشته بشه txtjam هستش). اما اونم ارور


Dim db As Database
Dim rst As Recordset
Dim I As Double
Dim X As Long
For I = 4 To 10
X = X + Val(txt1(I))
Next I
txtjam=x


ارورش اينه:

Argument Not Optional





واقعا از كمكهاتون ممنونم

SlowCode
چهارشنبه 12 مهر 1391, 10:42 صبح
بله، شما از adodb استفاده میکنی نه Adodc1 پس باید هم خطا بگیره.
من الان امتحان کردم درست کار کرد. فقط یه چیزی به ذهنم میرسه، به جای txtjam از txtjam.text استفاده کن، شاید درست بشه.

amiralex
چهارشنبه 12 مهر 1391, 11:03 صبح
مشكلم حل نشد نميدونم چي كار كنم

اون كاري گفتيد هم كردم نشد.

چي كار بايد بكنم

لطفا يه راهنمايي ديگه بكنيد.

SlowCode
چهارشنبه 12 مهر 1391, 11:21 صبح
اگه ممکنه اون قسمت از پروژت رو بزار تا ببینم.

amiralex
چهارشنبه 12 مهر 1391, 11:37 صبح
آقا محسن من فايلمو گذاشتم ممنون ميشم برام اصلاحش كنيد

يه مورده ديگه هم سوال دارم اينه كه چطور ميتونم ديتابيس برنامه مسيرش هميشه در محل پروژه باشه :

مسير فعليش پوشه رو به درايو D انتقال بديد درسته

amiralex
چهارشنبه 12 مهر 1391, 12:25 عصر
يكي لطفا جواب بده ديگه !!

saeedharati
چهارشنبه 12 مهر 1391, 12:48 عصر
من واسه مشكل مسيرش اصلاح كردم تو قسمت Form_Load خط 4 رو با اين كد را جايگزين كنيد

db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\f-Database.mdb"

در مورد ديگر مشكلاتش ميشه دوباره توضيح بديد شايد كمك كنم

amiralex
چهارشنبه 12 مهر 1391, 12:58 عصر
ممنونم ازتون. در پست يك يه عكس گذاشتم
ميخوام اونا فيلدها جمع بشن و در اون فيلد txtjam نشون بده و ذخيره بشه.

يه كارهايي انجام دادم ولي جمع ميشه با زدن دكمه ذخيره اما خب ارور ميده و نشون نميده.
ممنون ميشم پاسخ بديد.

SlowCode
چهارشنبه 12 مهر 1391, 13:22 عصر
مشکل شما اینه که به Txtjam هم ایندکس دادین، عدد 11 رو پاک کن، بعد توی فرم هم این قسمت رو حذف کن:
Dim I2 As TextBox
'Bind the text boxes to the data provider
For Each I2 In Me.txtjam
Set I2.DataSource = adoPrimaryRS
Next
و به طور دستی تنظیمش کن تا حجم کدت کم بشه(برای تکست باکس های دیگه هم همینطور، البته اجباری نیست:چشمک:). بعد کدی رو که گفتم رو بنویس.

amiralex
چهارشنبه 12 مهر 1391, 13:36 عصر
آقا محسن من اون كاري رو كه گفتيد انجام دادم و درست شد ولي خب با حذف اون قسمت ديگه تو ديتابيسم ذخيره نميشه.
منظورتون از اينكه به طور دستی تنظیمش کن رو نميدونم.
ميشه كدشو بگيد؟

ممنونم از كمكتون.

amiralex
چهارشنبه 12 مهر 1391, 13:42 عصر
منظورتون اينه كه در رويداد Form Load اين كد رو بعد از Select .... بنويسم؟

Set Me.txtjam.DataSource = adoPrimaryRS

اين كار رو كردم درست شد

ممنونم از شما.
سوالي بود باز هم از دوستاي خوبم ميپرسم

SlowCode
چهارشنبه 12 مهر 1391, 13:44 عصر
ببخشید، عوض کدی که پاک کردی اینو بنویس:
set txtJam.DataSource = adoPrimaryRS

ممنونم از كمكتون.
لطفا از دکمه تشکر استفاده کنید.:چشمک: