PDA

View Full Version : سوال: ساخت فرم جستجوي پيشرفته



arman2000
یک شنبه 14 آذر 1389, 08:00 صبح
سلام

اگه بخوايم در آيتمهاي جستجو، موردي را براي جستجو انتخاب کنيم که خود در جدول، فيلد محسوب مي شود اين کار چطور امکان داره؟

مثلا در نمونه پيوست، فيلدها شامل: "سن"، "نام"، "نام خانوادگي"، "شماره تلفن" و "شهر" هستند، و بخوايم در فرم جستجو، منويي به نام مشخصات، مانند منوي "شهر" بذاريم که شامل دو گزينه "نام" و "نام خانوادگي" باشد.

arman2000
دوشنبه 15 آذر 1389, 10:01 صبح
ممنوم مي شم راهنمايي بفرمائيد.

wolfstander
دوشنبه 15 آذر 1389, 10:38 صبح
سلام
من این لینک رو پیدا کردم
ولی نتونستم منطقش رو بفهمم
کسی هست که یاریمان کند؟>

Public Sub PopulateFieldListControl(DBPath As String, _
ListControl As Object, TableNames() As String, _
Optional Qualify As Boolean = False)

'Purpose: Populate a List Box with the names of fields
'in one or more Access Database Tables

'PURPOSE: Populate a list box, combo box
'or control with similar interface with the
'names of fields in one or more Access
'Database Tables

'Parameters:
'DBPath: FullPath to Database

'List Control: the list or combo box

'TableNames: String Array containing
'names of fields you want to include

'Qualify: (Optional) Set to true if you
'want to qualify the field name with the
'table name (e.g., MyTable.MyField, as
'opposed to MyField)

'Example Usage
'Dim sTables(1) As String
'sTables(0) = "Table1"
'sTables(1) = "Table2"
'PopulateFieldListControl "C:\MyDatabase.mdb", Combo1, sTables

'Combo1 will contain all the fieldnames in Table1 and Table2

'Must have reference to DAO in your project

Dim lCtr As Long, lCnt As Long
Dim oFields As Collection
Dim i As Integer
Dim sItem As String, sTest As String

Dim iTableStart As Integer, iTableEnd As Integer
Dim db As DAO.Database
Dim td As DAO.TableDef

iTableStart = LBound(TableNames)
iTableEnd = UBound(TableNames)

On Error Resume Next
'Validate everyting
ListControl.AddItem "a"
ListControl.Clear
If Err.Number > 0 Then Exit Sub

sTest = Dir(DBPath)
If sTest = "" Then Exit Sub

Set db = Workspaces(0).OpenDatabase(DBPath)
If Err.Number > 0 Then Exit Sub

For i = iTableStart To iTableEnd
Set td = db.TableDefs(TableNames(i))
If Err.Number > 0 Then
db.Close
Exit Sub
End If
Next

For i = iTableStart To iTableEnd
Set td = db.TableDefs(TableNames(i))
Set oFields = FieldNames(td)
lCnt = oFields.Count

For lCtr = 1 To lCnt
sItem = IIf(Qualify, TableNames(i) & "." & _
oFields(lCtr), oFields(lCtr))
ListControl.AddItem sItem
Next
Next

db.Close

End Sub

Private Function FieldNames(td As DAO.TableDef) As Collection

Dim oCol As New Collection
Dim i As Integer

For i = 1 To td.Fields.Count
oCol.Add td.Fields(i - 1).Name
Next

Set FieldNames = oCol

End Function

منبع (http://www.freevbcode.com/ShowCode.Asp?ID=184):

wolfstander
دوشنبه 15 آذر 1389, 13:23 عصر
خوب راه حل پیدا کردم
این کد

Dim rst As DAO.Recordset
Dim fld As DAO.Field
Set rst = CurrentDb.OpenRecordset("table1")
For Each fld In rst.Fields
MsgBox fld.Name
Next fld
rst.Close
Set rst = Nothing
Set fld = Nothing

به جای Table1 اسم جدول خودتون رو بنویسید
و به جای msgbox هم دستور خودتون رو که دوست دارید
بعدش شما میتونید یک کمبو باکس ایجاد کنید و نام فیلدها رو بریزید توش
یک تکست باکس جستجو هم بذارید
و یک کلید هم تعریف کنید
توش با استفاده از Select Case بنویسید که بر حسب نام فیلدی که در کمبو باکس انتخاب شده، در رکورد متناظرش جستجو کنه
این راه حل کلی ای بود که من میتونستم بگم
حالا نمیدونم به درد شما میخوره یا نه؟

ryonis
دوشنبه 15 آذر 1389, 15:02 عصر
[RIGHT]سلام



اگه بخوايم در آيتمهاي جستجو، موردي را براي جستجو انتخاب کنيم که خود در جدول، فيلد محسوب مي شود اين کار چطور امکان داره؟ ...

سلام، من قبلاً يه نمونه تو همين سايت پيدا كرده بودم كه خيلي به دردم خورد و هنوزم در موارد مشابه از كدهاي اون استفاده مي كنم. اين جستجو بر اساس فيلدهاي مختلفه و با تشكيل يك متن String، نهايتاً يك دستور SQL شكل مييره و اجرا ميشه.
ببينيد به دردتون ميخوره؟ :متفکر:

arman2000
سه شنبه 16 آذر 1389, 11:18 صبح
از طريق ارتباط چند به چند چي؟

wolfstander
سه شنبه 16 آذر 1389, 14:19 عصر
از طريق ارتباط چند به چند چي؟

اگه منظور شما این باشه که بین چند جدول که با هم ارتباط دارند، این کد بخواد اجرا بشه ، بازم مشکلی نیست
شما یک کوئری ایجاد کن و همه اطلاعات رو توش بیار
بعدش این کد رو به اون کوئری وصل کن
اگه غیر از این منظورتون باشه رو میذاریم به عهده دوستان

arman2000
چهارشنبه 17 آذر 1389, 09:16 صبح
دوست من ممنونم از پيشنهادتون
اين جستجو بر اساس فيلدهاي مختلفه و با تشكيل يك متن String، نهايتاً يك دستور SQL شكل مييره و اجرا ميشه. ولي منظور من وجود يك منوي انتخاب فيلد توي صفحه جستجو هست، مثلا در نمونه شما (TelBook) بعد از تايپ "نام" و "نام خانوادگي" مورد نظر (كه در واقع يكي از ركوردها حساب مي شه)، آيتمي به نام "جستجو براي" كه شامل منوي دو گزينه اي "آدرس" و "محل كار" باشه.
يعني بتونيم انتخاب كنبم كه براي اين "نام"، فقط آدرس ها رو بده يا شماره تلفن ها رو سرچ كن يا محل كار ...


ممنونم از كد پيشنهادي دوستم wolfstander،


Dim rst As DAO.Recordset
Dim fld As DAO.Field
Set rst = CurrentDb.OpenRecordset("table1")
For Each fld In rst.Fields
MsgBox fld.Name
Next fld
rst.Close
Set rst = Nothing
Set fld = Nothing

بزرگوار من از فرم سرچ، داده به كوئري مي دم و كوئري هم يه Report نمايش ميده كه براي پرينت كردن راحته. حالا نمي دونم اين كد رو مي تونم براي اين كار استفاده كنم؟

arman2000
جمعه 19 آذر 1389, 12:09 عصر
ممنوم مي شم راهنمايي بفرمائيد.

arman2000
یک شنبه 21 آذر 1389, 22:34 عصر
سلام
ممنون می شم اگه نمونه ای بذارید.

arman2000
شنبه 04 دی 1389, 10:06 صبح
سلام
منتظر راهنمايي شما هستم

dadsara
شنبه 04 دی 1389, 17:24 عصر
سلام
یک سر به این پست بزنید بد نیست
http://barnamenevis.org/showthread.php?144343-گزارش-ساز-پويا&highlight=