PDA

View Full Version : مشكل كار با Recordset ها



ryonis
دوشنبه 15 آذر 1389, 15:54 عصر
سلام دوستان‏، خلاصه بگويم:
آيا روشي وجود دارد كه بتوان ركوردهاي يك سابفرم را (كه در يك جستجو فيلتر شده‌اند) را تك تك نمايش داد. و آيا نهايتاً مي توان مثلاً يك فيلد خاص از ركورد X ام را تفيير داد؟ بطور مثال فرض بفرماييد يك فرم داريم كه در آن مي توان در ركوردهاي يك table جستجو كرد و تعدادي از آنها را فيلتر نمود و در يك سابفرم نمايش داد. حال، روشي هست كه بجاي نمايش تمام ركوردها، بصورت msgbox فيلد خاصي از ركوردها را نمايش و با كليك كاربر‏، همان فيلد از ركورد بعدي را؟
من حدس مي زنم با استفاده از for each يا array بتوان اين كار را كرد. اما در عمل نتيجه نگرفته ام:متفکر::متفکر:

mazoolagh
دوشنبه 15 آذر 1389, 22:01 عصر
آيا روشي وجود دارد كه بتوان ركوردهاي يك سابفرم را (كه در يك جستجو فيلتر شده‌اند) را تك تك نمايش داد.

کافی هست default view سابفرم رو single form بگذارین



و آيا نهايتاً مي توان مثلاً يك فيلد خاص از ركورد X ام را تفيير داد؟

منظورتون با کد هست؟ چون دلیلی نیست که نتونین اینکار رو در فرم انجام بدین مگر اینکه فرمتون read only باشه

ryonis
سه شنبه 16 آذر 1389, 11:57 صبح
کافی هست default view سابفرم رو single form بگذارین
Mazloogh جان، منظورم از سوال، دسترسي به تك تك ركوردهاي سابفرمه كه بتونم براي دونه دونة اونها يك سرويس ثبت كنم. يعني كاربر بتونه در صورت نياز براي تمام ركوردهاي فيلتر شده يك ركورد جديد در يك جدول ديگر ثبت كنه. خواهش مي كنم نمونه اي كه گذاشتم رو يه نگاه بندازيد. :چشمک:
در نمونه مورد نظر و در فرم نمايش شده، كاربر امكان جستجوي ركوردها را بر حسب فيلدهاي مختلف دارد. يك table جديد ساختم به نام service. اين دو جدول با فيلد شماره مشتري (Customer_ID) به يكديگر متصلند. حال مي خواهم در صورت نياز كاربر‏، وي بتواند براي تمام مشترياني كه مثلاً تلفن شان با 12 شروع مي شود سرويس ثبت كند.:متعجب:
بديهي است در صورتي كه جدول (سرويس ها) داراي فيلدهاي اجباري (required) باشد مي بايست آنها را از كاربر گرفت.
در صورت امكان كمك بفرماييد دكمه "ثبت دسته اي خرابي" در فرم جستجـــــو عمليات فوق را انجام دهد. :متفکر:

:تشویق::تشویق: (((( متشكرم و خيلي متشكرم )))) :تشویق::تشویق:

تا فراموش نكردم بگويم كه مثال زير را از روي يكي از فايل هاي ارسال شده دوستان در همين سايت آماده كردم. (با تشكر از ايشان)

mazoolagh
سه شنبه 16 آذر 1389, 22:20 عصر
سلام

اول اینکه شما کلا نیازی به سابفرم ندارین چون فرم اصلیتون unbound هست. بعبارت دیگه فرم عادی کفایت میکنه.
کافی هست بخش جستجو رو در form header بگذارین. برای راحتی این کار رو براتون انجام دادم.

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


Me.Filter = StrFilt
Me.FilterOn = True
MsgBox (Me.Recordset.RecordCount)

به msgbox دقت کنین که تعداد رکوردهای فیلتر شده رو بهتون میده.

جعفر88
چهارشنبه 17 آذر 1389, 09:24 صبح
دوست عزيز سلام
مساله رو بيشتر توضيح بدين،شما مي خواين فقط نام يا شماره ID مشترياني رو كه جستجو (فيلتر) كردين در فيلد Customer_ID فرم اطلاعات سرويس نمايش داده بشه و بعد خدمات لازم رو براي اونا ثبت كنين يا داستان چيز ديگريست؟

ryonis
چهارشنبه 17 آذر 1389, 11:14 صبح
دوست عزيز سلام
مساله رو بيشتر توضيح بدين،شما مي خواين فقط نام يا شماره ID مشترياني رو كه جستجو (فيلتر) كردين در فيلد Customer_ID فرم اطلاعات سرويس نمايش داده بشه و بعد خدمات لازم رو براي اونا ثبت كنين يا داستان چيز ديگريست؟
دقيقاً منظورم همينه كه نوشتيد. فقط عبارت "نمايش داده بشه" رو به "اضافه بشه" اصلاح نماييد. منظورم همون خاصيت addnew. در ركوردست هاست كه باهاش به اضاي هر ركورد در مشتريان فيلتر شده يك ركورد در جدول دوم ايجاد بشه. همين!
ضمناً اگر باز هم سوالم گنگه، لطف بفرماييد و بگوييد چگونه مي تونم در يك ركوردست به ركورد خاصي (مثلاً ركورد 5ام) دسترسي داشته باشم. مثل آرايه ها كه مي تونيم بنويسيم array(x) آيا اينجا هم ميشه اين كار رو با روش خاصي كرد؟ اين سوال رو جهت استفاده از حلقه for مي پرسم. تا باهاش بتونم دونه دونه ركوردهاي فرم ام رو به يك ركوردست ديگه كپي كنم. آيا ميشه؟ :متفکر:

Zero Defect
چهارشنبه 17 آذر 1389, 17:34 عصر
سلام Ryonis
عطف به پیغام خصوصیتون
چون عجله داشتم با دقت سئوالتون رو نخوندم امیدوارم بخشهایی از اون رو درست متوجه شده باشم

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

( امیدوارم خطای منطقی توش نباشه تستتش نکردم )


Public Sub AddCustomers()

Dim rstCurrent As DAO.Recordset
Dim rstNewTarget As DAO.Recordset

Set dbs = CurrentDb
Set rstCurrent = dbs.OpenRecordset("tblCustomers")
Set rstNewTarget = dbs.OpenRecordset("tblNewCustomers")
rstCurrent.MoveFirst
Do While Not rstNewTarget.EOF
rstCurrent.Edit
rstCurrent![CustomerCode] = CStr(rstNewTarget![CustomerCode])
rstCurrent.Update
rstCurrent.MoveNext
rstNewTarget.MoveNext
Loop

End Sub

موفق باشید

wolfstander
پنج شنبه 18 آذر 1389, 07:15 صبح
با سلام به همه دوستان
در مورد رکوردست ها، چطور میشود اطلاعات بیشتری به دست آورد؟
کتابی یا آموزشی در این زمینه وجود دارد ؟
با تشکر

RESMAILY
پنج شنبه 18 آذر 1389, 08:07 صبح
به نام خدا
با سلام. به نظر من معمولا در اين زمينه از Help خود آكسس بهتر از هرجايي مي شود كمك گرفت. اجمالا به نظر مي رسد كه در آكسس دو نوع(البته سه نوع كه يكي از آنها درواقع از جنس يك از دونوع است! چي گفتم!؟) ركوردست وجود دارد. كه تفاوت هاي مختصري با هم در متد و مشخصات دارند. ركوردست كتابخانه DAO و ركورد ست كتابخانه ADO. ركورد ست خود آكسس هم هست كه در واقه همان DAO است با تسهيلاتي در دستورات و غيره.
معمولا اگر در كدها متغيري از نوع ركوردست تعريف كنيد در وقت استفاده فهرست متدها و مشخصات آن ظاهر مي شود.
در آبجكت بروسر هم چيزهاي زيادي وجود دارد. دوست مان آقاي پيروزمهر هم يك چند مقاله اي درباره ADO سرقلم رفته بود كه مفيد بود و اما ادامه نيافت(حيف).
من چندسال قبل يك كتاب كوچك و يك كتاب بزرگ در اين زمينه پيداكردم.اولي فقط در مورد DAO بود و دومي DAO,ADO,RDO و اين قبيل اسامي را در خود داشت. اولي چاپ انتشارات ديباگران بود با حدو 100 يا 150 صفحه و دومي حدود 500 صفحه اي مي شد و الان از نام ناشر آن مطمئن نيستم. منظور آنكه منحصر به فرد بودند در آن موقع. الآن بيشتر در مورد ADO كتاب هست و براي من يكي كه زياد موثر نيست. يعني راهنماي خود آكسس خيلي بهتر است. كلا.

amirzazadeh
پنج شنبه 18 آذر 1389, 09:15 صبح
سلام
اين كد ركوردهاي فيلتر شده شما رو از طريق ركورد ست به جدول سرويس اضافه ميكنه :

Private Sub Command29_Click()
Dim rstCurrent As DAO.Recordset
Dim rstNewTarget As DAO.Recordset

Set dbs = CurrentDb
Set rstNewTarget = dbs.OpenRecordset("service")
Dim StrFilt As String
StrFilt = ""

If Nz(Me.FirstNameTmp) <> "" Then
If Len(StrFilt) > 0 Then
StrFilt = StrFilt & " And "
End If
StrFilt = StrFilt & "[FirstName] like'" & "*" & Me.FirstNameTmp & "*'"
End If

If Nz(Me.LastNameTmp) <> "" Then
If Len(StrFilt) > 0 Then
StrFilt = StrFilt & " And "
End If
StrFilt = StrFilt & "[LastName] like'" & "*" & Me.LastNameTmp & "*'"
End If

If Nz(Me.CompanyTmp) <> "" Then
If Len(StrFilt) > 0 Then
StrFilt = StrFilt & " And "
End If
StrFilt = StrFilt & "[Company] like'" & "*" & Me.CompanyTmp & "*'"
End If

If Nz(Me.TelTmp) <> "" Then
If Len(StrFilt) > 0 Then
StrFilt = StrFilt & " And "
End If
StrFilt = StrFilt & "[Home1] like '" & "*" & Me.TelTmp & "*' Or [Home2] like '" & "*" & Me.TelTmp & "*' Or [Company1] like '" & "*" & Me.TelTmp & "*' Or [Company2] like '" & "*" & Me.TelTmp & "*' Or [Company3] like '" & "*" & Me.TelTmp & "*' Or [Fax] like '" & "*" & Me.TelTmp & "*'"
End If
If StrFilt <> "" Then
Set rstCurrent = dbs.OpenRecordset("select * from Tbl_TelBook where " & StrFilt)
Else
Set rstCurrent = dbs.OpenRecordset("select * from Tbl_TelBook ")
End If
Do Until rstCurrent.EOF
rstNewTarget.AddNew
rstNewTarget.Fields("customer_id") = rstCurrent.Fields("id")
rstNewTarget.Update
rstCurrent.MoveNext
Loop
MsgBox (rstCurrent.RecordCount & "ركورد جديد به جدول سرويس اضافه گرديد")
rstNewTarget.Close
rstCurrent.Close


End Sub

ryonis
پنج شنبه 18 آذر 1389, 12:16 عصر
سلام
اين كد ركوردهاي فيلتر شده شما رو از طريق ركورد ست به جدول سرويس اضافه ميكنه :
...

آقا واقعاً دم شما گرم. عالي بود :بوس::بوس:

با دقت كدنوشته شما رو خوندم. واقعاً مرتب و گويا نوشتيد. البته از قديم گفتن معما چو حل گشت، آسان شود! الان كه نگاه مي كنيم ميگيم كه اَه!! آسون بود ها... :بامزه::چشمک:
يك چيز مهمي هم كه ياد گرفتم و شايد به درد خيلي ها بخوره اين بود كه لازم نيست در استفاده از recordsetها لزوماً with داشته باشيم. من در حل اين مسئله، مرتب سعي مي كردم ركوردست‌ها رو تو هم باز كنم و خلاصه حسابي قاطي مي كردم! :قهقهه:
به هر حال متشكرم - سبز و پيروز باشيد