แยกชื่อ และ นามสกุล จากฟิลด์เดียว
กระทู้เก่าบอร์ด อ.Yeadram

 9,238   8
URL.หัวข้อ / URL
แยกชื่อ และ นามสกุล จากฟิลด์เดียว

ก่อนหน้านี้ ไม่ได้แยกรายชื่อลูกค้า
เป็น ชื่อ และ นามสกุล
ตอนนี้อยากให้รายงานแยกระหว่างชื่อและนามสกุล
สามารถทำได้หรือไม่
เช่น
นาย สมหวัง สกุลชัย
เราจะแยกรายงานเป็น
ชื่อ นายสมหวัง
นามสกุล สกุลชัย
จะต้องทำอย่างไร
ใช้ left หรือ rignt ก็ไม่สามารถแยกจำนวนตัวอักษรได้

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

1 @R06206
ใช้วิธีค้นหาตำแหน่ง space ใน field ครับ เมื่อพบตัวที่ 1 เราก็จะใช้คำสั่ง left เมื่อพบตัวที่ 2 เราก็ใช้คำสั่ง middle ที่แนะนำนี่คือต้องใช้ VB นะครับ
2 @R06211
strFullName="นาย สมหวัง สกุลชัย "

strFullName=Trim(strFullName)
ตัดช่องว่างของชื่อเต็มก่อน เผื่อมีคนเคาะไว้

ใช้ฟังก์ชัน Mid() และ InStrRev() ช่วยแยก นามสกุลออกก่อน
?Mid(strFullName,InStrRev(strFullName," ")+1)
สกุลชัย

InStrRev() มีตั้งแต่ Access 2000 ขึ้นไปนะครับ

หลังจากนั้นก็ใช้ Left() แยกเอาคำนำหน้า และชื่อ

?Left(strFullName,InStrRev(strFullName," ")-1)
นาย สมหวัง

หรือลองดูกระทู้ http://www.thai-access.com/suphap.php?topic_id=1286 ครับ

3 @R06212
พอดีเข้ามาเจอปัญหาแบบเดียวกันเลย แต่ของผมนั้น ผมต้องการตัดคำนำหน้าชื่อออกไปซึ่งคำนำหน้ามันก็มีหลายแบบครับ เช่น นาย/นาง/น.ส./ด.ช./ด.ญ. อยากให้เหลือแต่เพียงชื่อตัว และนามสกุล อย่างเดียว ผมก็เลยทำอัพเดตคิวรี่ โดยเขียน SQL แบบนี้

UPDATE SET;
=Left([ชื่อนามสกุล],Instr([ชื่อตัว]," ") -1)

พอสั่งรันแล้วมันก็ขึ้น Error ตามรูปนี้ครับ



ผมไม่ทราบว่าผิดตรงไหน การตัดเฉพาะคำนำหน้าชื่อดังกล่าวนั้น สามารถทำได้หรือเปล่า เพราะมันอยู่ในฟิลเดียวกัน แถมคำนำหน้ายังมีหลายรูปแบบอีก ขอคำแนะนำด้วยครับ
4 @R06213
คุณเขียน statment ผิดครับ
1) หลังคำว่า Update ต้องระบุชื่อตาราง
2) หลังคำว่า Set ต้องระบุชือฟิลด์
3) เครื่องหมาย เซมิโคลอน ต้องอยู่ท้าย statement เท่านั้น จะอยู่ต้นหรืออยู่กลางไม่ได้
4) คุณบอกว่าคุณกำลังทำงานกับฟิลด์แค่ฟิลด์เดียว แต่ในฟังก์ชั่น left() ของคุณทำไมดูเหมือนคุณกำลังอ้างถึง 2 ฟิลด์ มันยังไงกันแน่

ถ้าจะให้ท่านอื่นช่วยเขียนเป็นตัวอย่าง คุณอดิศักดิ์ ต้องให้ข้อมูลอย่างน้อยๆ
1 จำนวนฟิลด์ที่เกี่ยวข้อง
2 ชนิดข้อมูลที่ฟิลด์นั้นๆ เก็บข้อมูล
3 ตัวอย่างข้อมูลเดิม อย่างน้อยๆ 2-3 เรคคอร์ด (ให้มีความหลากหลายของปัญหาได้ก็ดี)
5 @R06214
ครับผม แต่เดิม ผมมีฟิลที่ต้องการปรับปรุงอยู่ฟิลเดียวคือ [ชื่อนามสกุล]
เก็บข้อมูลเป็น Text เช่น
นายสมบัติ แจ้งดี
น.ส.ปราณี ศรีสมร
ด.ช.อาทร สอนสนุ?
ด.ญ.กระปุก สุขสบาย
แล้วผมก็สร้างฟิลใหม่ขึ้นมาเตรียมเอาไว้อีกอันชื่อ [ชื่อตัว] เพราะตั้งใจว่า หากตัดคำจากฟิล[ชื่อนามสกุล] สำเร็จก็จะส่งเข้าไปไว้ในฟิลใหม่ [ชื่อตัว]ที่เตรียมไว้ครับ และยังคิดไว้แต่ยังไม่ได้ทำคือจะสร้างฟิล[ชื่อสกุล]อีกอันด้วย ถ้ามันสำเร็จครับ

ขออภัยมื่อใหม่ด้วยครับ
6 @R06215
1 แยกนามสกุลออกไปก่อน ใช้ฟังก์ชั่นตามที่ อ.สุภาพแนะนำครับ
Update table1 set [ชื่อสกุล] =Mid(trim([ชื่อนามสกุล]),InStrRev(trim([ชื่อนามสกุล])," ")+1);


2 ระหว่างคำนำหน้า กับชื่อ ในข้อมูลของคุณไม่ได้เคาะแยกเอาไว้
ปัญหามันจึงเกิดตรงที่เราไม่รู้ว่าจะเอาคำนำหน้าออกกี่อักขระกันแน่ เช่น

-ถ้าเรคคอร์ดนั้นนำหน้าด้วย นาย เราก็จะใช้ mid(field,3) คือไม่เอา 3 อักขระแรก แค่นี้ก็จะได้ชื่อตัวแล้ว
-แต่ถ้าเรคคอร์ดนั้นนำหน้าด้วย น.ส. ซึ่งมันมี 4 อักขระ เราก็ต้องใช้ mid(field,4)

แต่ถ้าให้ statement มันรันทีเดียวเลย เราจะรู้ได้ไงว่า เรคคอร์ดใด ต้องตัดออกกี่อักขระ ดังนั้นจึงมีสองแนวทาง

2.1   เปิดตารางขึ้นมากด ctl+H เพื่อแทนที่คำ เช่น
- 2.1.1 หา "นาย" และแทนที่ด้วย "นาย " (เติมเคาะให้มัน เพื่อสร้างจุดให้ตัดง่าย)
- 2.1.2 หาคำต่อไป เช่น "น.ส." แล้วให้แทนที่ด้วย "น.ส. " (เติมเคาะเข้าไปอีกเช่นกัน)
- 2.1.n....... ทำเรื่อยๆ จนกว่าจะแน่ใจว่า ครบทุกคำนำหน้า
- 2.1.z........ แล้วค่อยเขียน statement ให้อัพเดตโดยการแยกตัวที่อยู่หลังเคาะแรก ให้เป็น [ชื่อตัว]

2.2 แนวทางที่ 2 คือการเขียน statement ให้อัพเดตไปด้วยโดยบวกเงื่อนไขเข้าไปในขณะรัน statement เช่น

Update table1 set [ชื่อตัว] = mid([ชื่อนามสกุล],4,instr(1,[ชื่อนามสกุล]," ")-1) Where ([ชื่อนามสกุล] Like 'น.ส.*');

[ ฟังก์ชั่น instr() ค้นหาตำแหน่งที่เคาะ ระหว่างชื่อกับสกุล เพื่อหาจุดสิ้นสุดของ ชื่อ ]
[ ฟังก์ชั่น mid() เพื่อเลือกเอาตรงกลางระหว่างสายอักขระ โดยให้ระบุจุดเริ่มต้นที่จะเอา และระบุจุดสิ้นสุดที่จะเอา ]
[ Where เป็นการใส่เงื่อนไขให้ statement ]

และครั้งนี้คุณก็จะสามารถแยกชื่อออกมาได้ในบางเรคคอร์ดเท่านั้น เพราะมันทำตามเงื่อนไขที่เราสั่ง นั่นคือ ให้แยกเฉพาะ เรคคอร์ดที่นำหน้าด้วย น.ส. เท่านั้น เรคคอร์ดอื่นๆ มันยังไม่ยุ่ง
เมื่อรัน statement นี้แล้วคุณก็จะเรคคอร์ดที่ขึ้นต้นด้วยคำอื่นๆ อีก ที่ยังต้องทำ ก็ให้ทำไปเรื่อยๆ คล้ายกัน เพียงเปลี่ยนคำในเงื่อนไข

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

select [ชื่อนามสกุล], [ชื่อตัว], [ชื่อสกุล] from table1 where isnull([ชื่อตัว]);

ถ้ารู้สึกว่ามันหลายขั้นตอน ก็อย่าท้อ ทำไปครับ ดีกว่าไม่ทำ เพราะนั่นแหละคือหน้าที่ของคน "จัดการข้อมูล" ดีแค่ไหนแล้วที่โลกนี้มันมัน ภาษา SQL ทำให้ช่วยจัดการได้ ไม่งั้นคงต้องนั่งแยกด้วยมือ ที่ละเรคคอร์ดแล้ว


7 @R06216
ผมทำตามที่ท่านแนะนำ ตอนนี้แยกนามสกุลออกมาได้แล้ว
ต่อไปกำลังทยอยจัดการแยกคำนำหน้ากับชื่อออกจากกัน ตามที่ท่านแนะนำ ตอนนี้แยก นาย ออกมาได้แล้ว ส่วนที่เหลือจะค่อยๆทยอยทำไปให้ได้ทั้งหมดครับ

ขอบคุณทุกท่านที่กรุณาให้คำแนะนำ รวมถึงท่านเจ้าของกระทู้ด้วยที่ได้กรุณาเปิดประเด็นนี้ขึ้นมา
บอร์ดนี้มีประโยชน์มากเลยครับโดยเฉพาะมือใหม่อย่างผม
8 @R06217
ขอบคุณครับที่ให้ความรู็้้้แก่มือใหม่ทั้งหลาย
ซึ่งหาไม่ได้จากตำรา
มันมาจากประสบการณ์อันยาวนานของแต่ละคน

@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2638s