dlookup ตัวเลข
กระทู้เก่าบอร์ด อ.Yeadram

 5,132   22
URL.หัวข้อ / URL
dlookup ตัวเลข

รบกวนสอบถาม อ.yeadram และผู้รู้ทุกท่านครับ
ผมใช้ คำสั่ง dlookup ฟิล์ดที่เป็น Number แต่ค่าที่ได้กลับกลายเป็น
string แทน ทำไง ถึงจะได้เป็นค่าตัวเลขเหมือนเดิม หรือ มีฟังค์ชั่นอื่น
อีกหรือไม่ครับ

ขอบคุณมากครับ

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

1 @R05722
ลองครอบด้วย nz(.....,0) ครับ
2 @R05725
DLookUp( ) ให้ค่าคืนมาเป็น Variant data type ซึ่งจะมี sub data type ตรงตามประเภทของฟิลด์ที่เราค้นหา ถ้าฟิลด์เป็น Numer ยังไงมันก็คืนค่าเป็นประเภทที่เกี่ยวเนื่องกับ Number   ถ้าฟิลด์เป็น Text ยังไงมันก็คืนค่าเป็น String ครับ ตัวแปรที่ไปรองรับค่าที่รับคืนควรมีประเภทเป็น Variant ด้วย เนื่องจากถ้าค้นหาตามเงื่อนไขที่เรากำหนดไปไม่เจอ ค่าที่คืนจะเป็น Null ซึ่งมีเฉพาะ Variant data type เท่านั้นที่เก็บค่า Null ได้ ไม่เช่นนั้นมันจะเกิด runtime error ได้

ดังนั้นจึงไม่เข้าใจว่าได้ค่ากลับมาเป็นคนละ data type ได้อย่างไร ลองยกตัวอย่างอย่างละเอียดให้ดูได้ไหมครับ
3 @R05726
ขอบคุณทั้งสองท่านที่ตอบครับ
ขอยกตัวอย่างให้ อ.สันติสุข พรหมสิริ ดูนะครับ
สมมุติ ใน table   tblTest ผมมี 2 ฟิลด์ คือ
id (Autonum) textNum (Number)
1                      100
2                        200
3                        250
4                        400
..                        .....
และผมใช้ Query ในการดึงข้อมูลบางตัวไปนะครับ เช่น
Dlookup("textNum","tblTest","id=3") ผลที่ได้ก็จะเป็น 250
แต่มันชิดขวา ผมเข้าใจว่ามันจะกลายเป็นข้อมูลประเภท text ไป
ถูกต้องหรือไม่ครับ

ขอบคุณมากครับ
4 @R05727
เท่าที่อ่านน่าจะเป็นว่าคุณไปกำหนด Control Source ของเท็กส์บ็อกซ์เป็น =DLookup(...) ใช่ไหมครับ ถ้าใช่ จะบอกว่า Data Type ของเท็กส์บ็อกซ์นั้นมันก็ยังเป็นไปตามประเภทของฟิลด์ TextNum นั่นแหล่ะครับ เพียงแต่มันจัดชิดซ้ายเท่านั้นเอง ดังนั้นการจัดชิดซ้ายหรือขวา ไม่ได้เป็นตัวบ่งบอกว่ามันมี Data Type เป็นประเภทไหน
5 @R05733
ขอบคุณมากครับ
6 @R05740
พอดีเข้ามาอ่านหนะครับ...
ตอนแรกก็เข้าใจเหมือนที่คุณสันติสุขชี้แจงว่าอาจจะเป็นการเขียนสูตรใน Text Box เลยทำให้คืนค่าค่ามาชิดซ้ายขวาตาม property ของ text box ...แต่ว่าผมได้ลองเขียน dlookup ใน query ดู ยังปรากฎว่าคืนค่าเป็น string อยู่
อีกทั้งได้ลอง make table แล้ว ไปเช็คดู property ของ Field มันกลายเป็น text ไปเลยหนะครับ ...ก็เลยเกิดความสงสัยขึ้นมา

อ้อลืมบอกไป โดยปกติวิธีการสังเกตุว่าข้อมูลที่แสดงอยู่เป็นตัวเลขหรือตัวอักษรให้ดูว่า ถ้าเป็นตัวเลขจะต้องชิดขวานะครับ ส่วนตัวอักษรจะชิดซ้าย
โดยเซลล์หรือฟิลด์นั้นจะต้องไม่ถูกจัด format ให้ชิดซ้ายหรือขวานะครับ
7 @R05742
ขอโทษนะครับ พิมพ์ผิดไป มันไปชิดซ้ายตะหาก แล้วพอไปกับอ้างอิงกับ ฟิลด์ที่เป็น ตัวเลข มันก็ฟ้องว่าเป็นคนประเภทกันครับ
8 @R05744
งานคอมพิวเตอร์เป็นงานที่ต้องมีเหตุผลพิสูจน์ได้แน่นอนเอามาเป็นเครื่องวัดนะ สำหรับผม ผมเช็คประเภทของข้อมูลด้วยฟังก์ชั่น VarType( ) ซึ่งผมเชื่อถือตรงนี้ครับ ส่วนการชิดซ้าย/ขวา ซึ่งนั่นเป็นการจัดรูปแบบ ไม่ใช่สิ่งที่เป็นเครื่องพิสูจน์ว่ามันมี data type เป็นอะไร สำหรับคุณ weezaa ที่บอกว่า "อ้างอิงกับฟิลด์ที่เป้นตัวเลข" ช่วยแสดงให้เห็นโค้ดหน่วยครับว่ามันอ้างอิงยังไง, แล้วฟิลด์ที่ว่านั้นมันมี data type เป็นอย่างไร, มี error ข้อความทั้งหมดว่าอย่างไร
9 @R05760
เรียน อ.สันติสุข
ผมทดลองทำ dlookup แบบไม่ซับซ้อนอะไร ถึงตัวเลขจะชิดซ้าย มันก็ยังเป็นตัวเลขอยู่ อย่างที่ อ. ว่า แต่สงสัย ผมทำ dlookup ซับซ้อนเกินไปหรือเปล่า จนค่ามันกลายเป็น text โดยผมทำแบบนี้ครับ

myPlace: Nz(DLookUp("[mth_No]","tbSchedule","[tmid] = '" & [tmID] & "' and [mth_Round]=" & [Mth_Round]+1 & " and [mth_A] ='" & [myCode] & "'"),0)

ขอบคุณมากครับ
10 @R05764
ก็ต้องถามกลับว่า รู้ได้อย่างไรว่ามันกลายเป็น text ?
11 @R05778
ขอเพิ่มนิดนะครับ
อย่างที่ผมบอกไปตอนต้น ผมไปสร้าง field ใหม่ใน query โดยใช้สูตร GetID:dlookup("FieldNumber","teble1","ID = 1") แล้วสั่ง maketable
พอไปเช็ค Field GetID ดูปรากฎว่ามันกลายเป็น Text Size 255
ไม่แน่ใจว่ามันเกี่ยวกับอะไรเหมือนกันทำไมถึงแปลงจาก numeric เป็น text
12 @R05779
function ก็มี cDbl(),cLong(),Val() และอื่นอีกที่แปลงได้ครับ
ลองดู
13 @R05784
แม้ว่าผลของการสร้างเทเบิลด้วยการใช้ Make-Table query น่าจะ สะท้อน data type ของแต่ละคอลัมน์ในคิวรี่นั้น แต่ในกรณีที่เป็นผลของฟังก์ชั่น เช่น DLookUp( ) เราไม่มีทางรู้ว่า Access มันไปทำอะไรบ้างในการพิจารณาว่าจะกำหนด data type ของฟิลด์ในเทเบิลที่กำลังจะสร้างใหม่เป็นประเภทอะไร อย่าว่าแต่ฟิลด์ที่เป็น numeric แล้วกลับถูกพิจารณาว่าให้มี data type สำหรับฟิลด์ในเทเบิลที่สร้างใหม่เป็นประเภท text เลย ผมลองแม้แต่ใช้ฟิลด์ประเภท date/time มันก็ยังถูกพิจารณาว่าเป็น text เช่นกัน หรือลองเอา expression นี้ Expr1: IIf(True,1,#1-Jan-2010#) ใส่ลงคิวรี่แล้วลองสร้างเทเบิลใหม่ดู คุณอาจจะแปลกใจว่า Access ยังไงก็จะสร้าง data type สำหรับฟิลด์ในเทเบิลที่สร้างใหม่เป็น date/time อยู่ดี ทั้งๆที่ผลลัพธ์ของคิวรี่ไม่มีทางที่จะให้ค่าเป็นวันที่ 1-Jan-2010 เลย

สรุปคือ เราจะใช้วิธีมอง data type ในเทเบิลที่สร้างจาก Make-Table query แล้วมาฟันธงว่า data type ของฟังก์ชั่นในคิวรี่นั้นเป็นประเภทเดียวกันนั้น ย่อมไม่ได้ ครับ
14 @R05785
โอเค ผมได้ข้อพิสูจน์แล้วว่า ผลของฟังก์ชั่น DLookup( ) ที่ใช้ในคิวรี่ จะให้ค่ากลับมาเป็น text แล้ว (ไม่แน่ใจว่าทุกกรณีหรือไม่ แต่เท่าที่ลองจะเป็นเช่นนั้น) โดยสั่งให้มีการกำหนด sort order สำหรับฟิลด์ DLookup( ) ไปด้วย ถ้าผลเป็น numeric ค่าจะต้องเรียงแบบตัวเลข แต่ผมได้ผลลัพธ์ว่า มันเรียงจาก 1000000, 123, ... (ตามข้อมูลทดสอบของผม) ดังนั้นจึงสรุปได้ตอนนี้ว่า มันให้ค่้าเป็น text

แต่ผมก็ยังยืนยันครับว่าโดยฟังก์ชั่นของ DLookup( ) เองแล้ว มันจะให้ data type เป็นอะไร ขึ้นกับ data type ของฟิลด์ที่เราไป lookup แต่สำหรับกรณีผลของคิวรี่นั้น ไม่เป็นอย่างนั้นครับ
15 @R05788
ขอบคุณทุกท่าน ที่มีช่วยวิเคราะห์ให้ครับ
16 @R13858
รบกวนสอบ ปกติใช้ excel เขียน vlookup เป็น rang เช่น
score       result
1               5
10             20
20             60

ถ้าใส่ค่า 3 จะได้ result เท่ากับ 5 หรือ ถ้าไส่ 17 ก็จะได้ 20

ถ้าเป็น MS Access ใน dlookup จะใช้อย่าไรครับ
17 @R13866
DLookup("result", "ชื่อเทเบิล","score = " & cstr(DMax("score","ชื่อเทเบิล","score <= " & cstr(ชื่อเท็กบ็อกซ์ที่ป้อนค่า 3))))
18 @R13869
ขอบคุณมากครับ คุณ สันติสุข แต่ผมส่งสัยว่าถ้าทำบน query จะใส่ค่าเป็นอย่างไรครับ
เช่น มี table (คือ table1) จะมีแค่ 1 field คือ score มีค่า 3 และ 15 จะต้องทำการ query 1 field โดยใส่ ค่าตามที่แนะนำมาจะต้องอย่างไร

DLookup("result", "ชื่อเทเบิล","score = " & cstr(DMax("score","ชื่อเทเบิล","score <= " & cstr(ชื่อเท็กบ็อกซ์ที่ป้อนค่า 3))))

ผมรบกวนด้วยครับ
19 @R13870
...จะมีแค่ 1 field คือ score มีค่า 3 และ 15 จะต้องทำการ query 1 field...

ไม่เข้าใจครับ
20 @R13876
ขอโทษทีครับ ที่คำถามไม่ clear เช่น มี 2 table ดังนี้

table1                                             table2
Level     Score     Result                 name        range     score
TMR           0        U                        mr. a          TMR        37
TMR          20       A                        MR.B          STMR     90
TMR          35       S                        MR.C          TMR       16
TMR          45       E                        MR.D          STMR     75
STMR        0        U
STMR        40       A
STMR        80       S
STMR      120       E

โดยใช้การสร้าง query ที่ table2 ว่าถ้าจะทำ dlookup เพื่อหา Result ที่ table1 โดยมี 2 เงื่อนไข 2 อย่างคือเทียบ Rang กับ Level ใน table1 และหา Result ที่ table1 ว่าเป็นอย่างไร ถ้าตามข้อ 1 คือ mr. a ที่เป็น TMR จะได้ Result เท่ากับ S ไม่ทราบจะเขียน query อย่างไรครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2678s