รบกวนช่วยดู code ให้หน่อยครับ
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

 348   11
URL.หัวข้อ / URL
รบกวนช่วยดู code ให้หน่อยครับ

ผมต้องการ Search หาข้อมูลใน Table จาก Field (Field of Study) โดยใช้ Dynamic Search (นำของ อ. BADMan มาประยุกต์ใช้นะครับ)
แต่ผมมี TextBox 2 ตัว คือ FieldOfStudy1 และ FieldOfStudy2 ตาม code ด้านล่าง ผมต้องการใส่บางส่วนของข้อมูล และใช้ * เพื่อแทนตัวอะไรก็ได้
ผมต้องการให้ Search ได้จากทั้ง 2 TextBox แต่ code มันไม่ได้ผลนะครับ ต้องแก้ไขอย่างไรครับ

ขอบคุณ อ.สุภาพ อ.BADMan และผู้รู้ทุกท่านครับ

If Me.FieldOfStudy1 <> "" Then
If Me.FieldOfStudy2 <> "" Then
If where <> "" Then
strAnd = "And"
Else
strAnd = ""
End If
If Left(Me![FieldOfStudy1], 1) = "*" Or Right(Me![FieldOfStudy1], 1) = "*" Then
where = where & strAnd & " [Field of Study] Like'" + Me![FieldOfStudy1] + "'"
If Left(Me![FieldOfStudy1], 1) = "*" Or Right(Me![FieldOfStudy1], 1) = "*" Or Left(Me![FieldOfStudy2], 1) = "*" Or Right(Me![FieldOfStudy2], 1) = "*" Then
where = where & strAnd & " [Field of Study] Like'" + Me![FieldOfStudy1] + "' or [Field of Study] Like'" + Me![FieldOfStudy2] + "'"
Else
where = where & strAnd & " [Field of Study] ='" + Me![FieldOfStudy1] + "' or [Field of Study]='" + Me![FieldOfStudy2] + "'"
End If
End If
End If
End If

11 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R02563
ผมว่าใช้

Like '*" & Me![FieldOfStudy1] & "*'

และ

Like '*" & Me![FieldOfStudy2] & "*'

ไม่ต้องให้ผู้ใช้คีย์ * ลงไปในคำค้นก็ได้ครับ จะได้โค้ดที่สั้นกว่า

และควรจะตรวจทีละเงื่อนไข จะทำให้เข้าใจง่ายกว่าครับ

ส่วนที่บอกว่าไม่ได้ผล แล้วผลออกมาเป็นอย่างไรครับ ไม่มีอะไรแสดงออกมาเลย หรือ มีแต่ไม่ถูกต้องครับ
2 @R02598
ขอโทษครับ ไม่ได้เข้ามา check หลายวัน พอดี net หมดนะครับ
ที่บอกว่าไม่ได้ผล คือ เวลาผม Search ใน FieldOfStudy1 ข้อมูลออกมาถูกต้องครับ
แต่เวลาผม Search ใน FieldOfStudy2 พร้อมกับ FieldOfStudy1 จะเกิด Run-Time Error '3075':
ตัวอย่างเช่น ผมใส่คำว่า *วิศว* ลงใน FieldOfStudy1 ข้อมูลออกมาถูกต้องครับ
และพอผมใส่คำว่า *engineer* ลงใน FieldOfStudy2 ด้วย มันจะแสดง Error ครับ
ไม่ทราบว่าจะแก้ใข code อย่างไรดีครับ ถ้าจะกรุณา ช่วยเขียน code แบบเต็มให้ด้วยครับ
ขอความกรุณาด้วยครับ
ขอบคุณครับ
3 @R02619
เรียน อ.สุภาพ หรือ อ.BADMan หรือผู้รู้ทุกท่าน
รบกวนช่วยด้วยครับ ต้องการความช่วยเหลือจริง ๆ ครับ
ขอบคุณมากครับ
4 @R02620
ผมว่าถ้าแนบไฟล์มาด้วยจะเร็วกว่าครับ

หรือถ้าเคยแนบมาแล้ว ก็ให้ช่วยแจ้งกระทู้ที่แนบไว้ด้วยครับ

ถ้ายังไม่ได้ส่งมาไว้ที่นี่ ช่วย compact แล้ว zip ไฟล์ด้วยนะครับ เพราะพื้นที่ของเว็บมีจำกัดครับ

5 @R02623
ลองแบบนี้ดูครับ...
1. ให้สร้าง Temp Table ขึ้นมามีโครงสร้างเดียวกับตารางข้อมูลที่ค้นหา
2. ในฟอร์มที่จะใช้แสดงข้อมูลที่ได้จากการค้นหาให้เอาข้อมูลมาจากตารางข้อ 1
3. เงื่อนไขในการค้นให้ทำอย่างที่ อ.สุภาพบอกด้านบน
4. ก่อนรัน code เพื่อทำการสืบค้น ให้ทำการลบข้อมูลในตารางข้อ 1 ก่อน
5. เมื่อสืบค้น FieldOfStudy1 ก็ให้รัน Append SQL ตามเงื่อนไข ไปที่
ตารางในข้อ 1 แล้วสั่ง requery เพื่อให้แสดงข้อมูล
6. เมื่อสืบค้น FieldOfStudy2 ก็ให้รัน Append SQL ตามเงื่อนไข ไปที่
ตารางในข้อ 1 เพิ่มเข้าไปอีก แล้วสั่ง requery เพื่อให้แสดงข้อมูลออกมา
7. ทำอย่างนี้ก็จะได้ข้อมูลจากผลของการสืบค้น ทั้งที่เป็นภาษาไทย และอังกฤษ
8. ผมว่าลองทำเองจะได้จดจำปัญหา และฝึกวิธีแก้ปัญหา ได้ดีกว่าครับ
...แต่ เอ..ที่บอกมาไม่ทราบเป็นอย่างที่ต้องการเปล่า...
6 @R02628
ผมขอแนบไฟล์ที่ อ.สุภาพ เคยแก้ไขให้ในเรื่องของ Gender และ Marital Status แต่ผมไม่สามารถ Search หา Field of Study พร้อมกัน 2 ช่องได้ครับ
ความต้องการจริง ๆ ของผมคือ สามารถ Search หาข้อมูลจาก Field ใด Field หนึ่งได้ และ Search ได้พร้อมกันทุก Field นะครับ
เช่นต้องการ Search ผู้สมัครที่เป็นผู้ชาย หรือผู้หญิงอย่างเดียว
หรือผู้ชายและเป็นโสด
หรือผู้ชายที่เป็นโสด และเรียนวิศวกรรมศาสตร์ รวมถึง Engineer (ข้อมูลมีทั้งภาษาไทยและภาษาอังกฤษ)
รบกวนด้วยนะครับ
ขอบคุณอาจารย์ทั้งสองมากครับ
7 @R02645
รบกวนช่วยด้วยครับ ต้องการความช่วยเหลือจริง ๆ ครับ
ขอบคุณมากครับ
8 @R02659
ต้องขออภัยครับ ช่วงนี้ผมยุ่งจริงๆ กำลังจะปิดโปรเจ็ค เลยทำให้ต้องวิ่งวุ่นเร่งงานให้เรียบร้อย

มาถึงโค้ดที่ถามมานะครับ

ผมลองทำเป็นตัวอย่างสำหรับส่วนของ FirstName (Thai) อันหนึ่งก่อน
แล้วศึกษาจากภาษาไทยที่ผมอธิบายไว้นะครับ คงต้องทำความเข้าใจโค้ดแต่ละส่วนให้เข้าใจก่อน แล้วค่อยนำไปปรับใช้กับส่วนที่เหลือ

' ถ้ามีการพิมพ์ข้อความในช่องชื่อภาษาไทย
If Me.[FirstName (Thai)] <> "" Then
' ถ้ามีการเลือกให้มีการกรองในช่องที่อยู่ก่อนหน้านี้
' คือ Where <> ""
If where <> "" Then
If Left(Me![FirstName (Thai)], 1) = "*" Or Right(Me![FirstName (Thai)], 1) = "*" Then
' จะต้องให้ And เข้ามาช่วย เพื่อรวมเงื่อนไขตรงส่วนนี้กับ Where ที่ที่เก็บได้จากที่ผ่านมา
where = where & " AND [First Name (Thai)] Like '" + Me![FirstName (Thai)] + "'"
Else
where = where & " AND [First Name (Thai)]='" + Me![FirstName (Thai)] + "'"
End If
Else
' ถ้าไม่มีการเลือกเงื่อนไขก่อนหน้ามาก่อน ไม่ต้องใส่ And ลง
If Left(Me![FirstName (Thai)], 1) = "*" Or Right(Me![FirstName (Thai)], 1) = "*" Then
where = "[First Name (Thai)] Like '" + Me![FirstName (Thai)] + "'"
Else
where = "[First Name (Thai)]='" + Me![FirstName (Thai)] + "'"
End If
End If
End If

ลองปรับใช้กับส่วนที่เหลือนะครับ ทำที่เงื่อนไข ถึงแม้จะเป็นชื่อฟีลด์ที่เก็บข้อมูลที่เหมือนกัน เช่น Field Of Study และ Field Of Study1 ให้ถือว่าเป็นคนละรายการ เพื่อความสะดวกในการเขียนโค้ดให้เข้าใจได้ง่าย จะทำให้แก้บักได้ตรงจุดครับ

ข้อแนะนำเพิ่มเติมจากการออกแบบข้อมูล
1. ให้กำหนด CodePage ให้เป็นภาษาไทย โดยไปที่เมนู Tools>Options>General tab>ตรง New Database Sort Order ให้เลือกเป็น Thai ครับ แล้วทำการ Compact แล้วปิดออกไป แล้วให้เข้าไฟล์นี้มาใหม่
การเลือกตรงนี้จะทำให้การ Sort ถูกต้องตามหลักของภาษาไทยครับ

2. การตั้งชื่อฟีลด์ หรือชื่อของ Text Box ไม่ควรให้มีช่องว่าง และชื่อยาว เกินไป จะทำให้เขียนโค้ดมีโอกาสพิมพ์ผิดได้ง่ายครับ

9 @R02667
ขอบคุณ อ.สุภาพมากครับ สำหรับคำแนะนำต่าง ๆ
ผมได้ลองทำตามคำแนะนำ และลองปรับใช้ดูแล้ว
มันสามารถกรองข้อมูลใน Field เดียวกัน (Field of Study) จาก 2 TextBox ได้ (FieldOfStudy1 และ FieldOfStudy2)
แต่พอผมต้องการกรองข้อมูลอื่นร่วมด้วย มันไม่ตรงตามความเป็นจริงนะครับ เช่น
1. ผมกรองข้อมูลคนที่เรียน วิศวกรรมศาสตร์ (FieldOfStudy1 ใส่ *วิศว*,
FieldOfStudy2 ใส่ *engineer*) ข้อมูลกรองได้ถูกต้อง ไม่มีปัญหาครับ
2. ผมกรองข้อมูล ผู้หญิงที่เรียน วิศวกรรมศาสตร์ (cboGender เลือก
Female, FieldOfStudy1 ใส่ *วิศว*, FieldOfStudy2 ใส่
*engineer*) ข้อมูลที่กรองออกมามีทั้งผู้หญิงและผู้ชายนะครับ
ไม่ทราบว่าควรต้องแก้ใขอย่างไรดีครับ

ขอโทษครับที่ต้องรบกวนหลายครั้ง หวังว่าอาจารย์จะกรุณาอีกครั้งนะครับ
code ของ Field of Study เป็นแบบนี้ครับ

If Me.FieldOfStudy1 <> "" Then
If where <> "" Then
If Left(Me![FieldOfStudy1], 1) = "*" Or Right(Me![FieldOfStudy1], 1) = "*" Then
where = where & " AND [Field of Study] Like'" + Me![FieldOfStudy1] + "'"
Else
where = where & " AND[Field of Study] ='" + Me![FieldOfStudy1] + "'"
End If
Else
If Left(Me![FieldOfStudy1], 1) = "*" Or Right(Me![FieldOfStudy1], 1) = "*" Then
where = "[Field of Study] Like'" + Me![FieldOfStudy1] + "'"
Else
where = " [Field of Study] ='" + Me![FieldOfStudy1] + "'"
End If
End If
End If

If Me.FieldOfStudy2 <> "" Then
If where <> "" Then
If Left(Me![FieldOfStudy1], 1) = "*" Or Right(Me![FieldOfStudy1], 1) = "*" Or Left(Me![FieldOfStudy2], 1) = "*" Or Right(Me![FieldOfStudy2], 1) = "*" Then
where = where & " AND [Field of Study] Like'" + Me![FieldOfStudy1] + "' or [Field of Study] Like'" + Me![FieldOfStudy2] + "'"
Else
where = where & " AND [Field of Study] ='" + Me![FieldOfStudy1] + "' or [Field of Study]='" + Me![FieldOfStudy2] + "'"
End If
Else
If Left(Me![FieldOfStudy1], 1) = "*" Or Right(Me![FieldOfStudy1], 1) = "*" Or Left(Me![FieldOfStudy2], 1) = "*" Or Right(Me![FieldOfStudy2], 1) = "*" Then
where = " [Field of Study] Like'" + Me![FieldOfStudy1] + "' or [Field of Study] Like'" + Me![FieldOfStudy2] + "'"
Else
where = " [Field of Study] ='" + Me![FieldOfStudy1] + "' or [Field of Study]='" + Me![FieldOfStudy2] + "'"
End If
End If
End If
10 @R02670
ผมทำตามแล้ว ได้ผลออกมาถูกต้อง

คือ จะได้ข้อมูลแค่ 1 รายการ ถ้าเลือก Female จะไม่มีข้อมูลเลย

โค้ดเป็นอย่างนี้ครับ

Private Sub cmdShowData_Click()
Dim db As Database
Dim QD As QueryDef
Dim where As String
Dim strAnd As String

Set db = CurrentDb

where = ""

If Me.cboGender <> "" Then
If Me.cboGender = "Male" Then
where = " [Title] = 'Mr.'"
Else
where = " [Title] <> 'Mr.'"
End If
End If
If Me.cboMaritalStatus <> "" Then
If where <> "" Then
strAnd = " And "
Else
strAnd = ""
End If
If Me.cboMaritalStatus = "Single" Then
where = where & strAnd & " [Marital Status] = '1'"
ElseIf Me.cboMaritalStatus = "Married" Then
where = where & strAnd & " [Marital Status] = '2'"
ElseIf Me.cboMaritalStatus = "Divorced" Then
where = where & strAnd & " [Marital Status] = '3'"
ElseIf Me.cboMaritalStatus = "Widow" Then
where = where & strAnd & " [Marital Status] = '4'"
Else
where = where & strAnd & " [Marital Status] = '5'"
End If
End If

' ถ้ามีการพิมพ์ข้อความในช่องชื่อภาษาไทย
If Me.[FirstName (Thai)] <> "" Then
' ถ้ามีการเลือกให้มีการกรองในช่องที่อยู่ก่อนหน้านี้
' คือ Where <> ""
If where <> "" Then
If Left(Me![FirstName (Thai)], 1) = "*" Or Right(Me![FirstName (Thai)], 1) = "*" Then
' จะต้องให้ And เข้ามาช่วย เพื่อรวมเงื่อนไขตรงส่วนนี้กับ Where ที่ที่เก็บได้จากที่ผ่านมา
where = where & " AND [First Name (Thai)] Like '" + Me![FirstName (Thai)] + "'"
Else
where = where & " AND [First Name (Thai)]='" + Me![FirstName (Thai)] + "'"
End If
Else
' ถ้าไม่มีการเลือกเงื่อนไขก่อนหน้ามาก่อน ไม่ต้องใส่ And ลง
If Left(Me![FirstName (Thai)], 1) = "*" Or Right(Me![FirstName (Thai)], 1) = "*" Then
where = "[First Name (Thai)] Like '" + Me![FirstName (Thai)] + "'"
Else
where = "[First Name (Thai)]='" + Me![FirstName (Thai)] + "'"
End If
End If
End If

Debug.Print where

If Me.FieldOfStudy1 <> "" Then
If where <> "" Then
If Left(Me![FieldOfStudy1], 1) = "*" Or Right(Me![FieldOfStudy1], 1) = "*" Then
where = where & " AND [Field of Study] Like'" + Me![FieldOfStudy1] + "'"
Else
where = where & " AND[Field of Study] ='" + Me![FieldOfStudy1] + "'"
End If
Else
If Left(Me![FieldOfStudy1], 1) = "*" Or Right(Me![FieldOfStudy1], 1) = "*" Then
where = "[Field of Study] Like'" + Me![FieldOfStudy1] + "'"
Else
where = " [Field of Study] ='" + Me![FieldOfStudy1] + "'"
End If
End If
End If

If Me.FieldOfStudy2 <> "" Then
If where <> "" Then
If Left(Me![FieldOfStudy1], 1) = "*" Or Right(Me![FieldOfStudy1], 1) = "*" Or Left(Me![FieldOfStudy2], 1) = "*" Or Right(Me![FieldOfStudy2], 1) = "*" Then
where = where & " AND [Field of Study] Like'" + Me![FieldOfStudy1] + "' or [Field of Study] Like'" + Me![FieldOfStudy2] + "'"
Else
where = where & " AND [Field of Study] ='" + Me![FieldOfStudy1] + "' or [Field of Study]='" + Me![FieldOfStudy2] + "'"
End If
Else
If Left(Me![FieldOfStudy1], 1) = "*" Or Right(Me![FieldOfStudy1], 1) = "*" Or Left(Me![FieldOfStudy2], 1) = "*" Or Right(Me![FieldOfStudy2], 1) = "*" Then
where = " [Field of Study] Like'" + Me![FieldOfStudy1] + "' or [Field of Study] Like'" + Me![FieldOfStudy2] + "'"
Else
where = " [Field of Study] ='" + Me![FieldOfStudy1] + "' or [Field of Study]='" + Me![FieldOfStudy2] + "'"
End If
End If
End If

If where <> "" Then
where = " Where " & where
End If

Set QD = db.QueryDefs("Query1")
QD.SQL = "Select * from qryEducationDetails" & where

'DoCmd.OpenQuery "Query1"
Me.sfrmSearch2.Form.RecordSource = "Query1"

End Sub

ลองเปรียบเทียบกับที่มีอยู่นะครับ

*** Edited by Supap Chaiya *** 2/5/2546 12:10:42
11 @R02672
ขอบคุณ อ.สุภาพมาก ๆ ครับ
ผมอยากขอ email address ของอาจารย์หน่อยนะครับ คือ
ผมอยากส่ง File ตัวจริงไปให้อาจารย์ดูนะครับ ซึ่งมีข้อมูลที่ไม่สามารถเปิดเผยต่อสาธารณะได้ครับ
ผมยังติดปัญหาเหมือนเดิมนะครับ
ขอความกรุณาด้วยครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.0683s