กระทู้เก่าบอร์ด อ.Yeadram
9,238 8
URL.หัวข้อ /
URL
แยกชื่อ และ นามสกุล จากฟิลด์เดียว
ก่อนหน้านี้ ไม่ได้แยกรายชื่อลูกค้า
เป็น ชื่อ และ นามสกุล
ตอนนี้อยากให้รายงานแยกระหว่างชื่อและนามสกุล
สามารถทำได้หรือไม่
เช่น
นาย สมหวัง สกุลชัย
เราจะแยกรายงานเป็น
ชื่อ นายสมหวัง
นามสกุล สกุลชัย
จะต้องทำอย่างไร
ใช้ left หรือ rignt ก็ไม่สามารถแยกจำนวนตัวอักษรได้
เป็น ชื่อ และ นามสกุล
ตอนนี้อยากให้รายงานแยกระหว่างชื่อและนามสกุล
สามารถทำได้หรือไม่
เช่น
นาย สมหวัง สกุลชัย
เราจะแยกรายงานเป็น
ชื่อ นายสมหวัง
นามสกุล สกุลชัย
จะต้องทำอย่างไร
ใช้ 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 ครับ
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 ตามรูปนี้ครับ
ผมไม่ทราบว่าผิดตรงไหน การตัดเฉพาะคำนำหน้าชื่อดังกล่าวนั้น สามารถทำได้หรือเปล่า เพราะมันอยู่ในฟิลเดียวกัน แถมคำนำหน้ายังมีหลายรูปแบบอีก ขอคำแนะนำด้วยครับ
UPDATE SET;
=Left([ชื่อนามสกุล],Instr([ชื่อตัว]," ") -1)
พอสั่งรันแล้วมันก็ขึ้น Error ตามรูปนี้ครับ
ผมไม่ทราบว่าผิดตรงไหน การตัดเฉพาะคำนำหน้าชื่อดังกล่าวนั้น สามารถทำได้หรือเปล่า เพราะมันอยู่ในฟิลเดียวกัน แถมคำนำหน้ายังมีหลายรูปแบบอีก ขอคำแนะนำด้วยครับ
4 @R06213
คุณเขียน statment ผิดครับ
1) หลังคำว่า Update ต้องระบุชื่อตาราง
2) หลังคำว่า Set ต้องระบุชือฟิลด์
3) เครื่องหมาย เซมิโคลอน ต้องอยู่ท้าย statement เท่านั้น จะอยู่ต้นหรืออยู่กลางไม่ได้
4) คุณบอกว่าคุณกำลังทำงานกับฟิลด์แค่ฟิลด์เดียว แต่ในฟังก์ชั่น left() ของคุณทำไมดูเหมือนคุณกำลังอ้างถึง 2 ฟิลด์ มันยังไงกันแน่
ถ้าจะให้ท่านอื่นช่วยเขียนเป็นตัวอย่าง คุณอดิศักดิ์ ต้องให้ข้อมูลอย่างน้อยๆ
1 จำนวนฟิลด์ที่เกี่ยวข้อง
2 ชนิดข้อมูลที่ฟิลด์นั้นๆ เก็บข้อมูล
3 ตัวอย่างข้อมูลเดิม อย่างน้อยๆ 2-3 เรคคอร์ด (ให้มีความหลากหลายของปัญหาได้ก็ดี)
1) หลังคำว่า Update ต้องระบุชื่อตาราง
2) หลังคำว่า Set ต้องระบุชือฟิลด์
3) เครื่องหมาย เซมิโคลอน ต้องอยู่ท้าย statement เท่านั้น จะอยู่ต้นหรืออยู่กลางไม่ได้
4) คุณบอกว่าคุณกำลังทำงานกับฟิลด์แค่ฟิลด์เดียว แต่ในฟังก์ชั่น left() ของคุณทำไมดูเหมือนคุณกำลังอ้างถึง 2 ฟิลด์ มันยังไงกันแน่
ถ้าจะให้ท่านอื่นช่วยเขียนเป็นตัวอย่าง คุณอดิศักดิ์ ต้องให้ข้อมูลอย่างน้อยๆ
1 จำนวนฟิลด์ที่เกี่ยวข้อง
2 ชนิดข้อมูลที่ฟิลด์นั้นๆ เก็บข้อมูล
3 ตัวอย่างข้อมูลเดิม อย่างน้อยๆ 2-3 เรคคอร์ด (ให้มีความหลากหลายของปัญหาได้ก็ดี)
5 @R06214
ครับผม แต่เดิม ผมมีฟิลที่ต้องการปรับปรุงอยู่ฟิลเดียวคือ [ชื่อนามสกุล]
เก็บข้อมูลเป็น Text เช่น
นายสมบัติ แจ้งดี
น.ส.ปราณี ศรีสมร
ด.ช.อาทร สอนสนุ?
ด.ญ.กระปุก สุขสบาย
แล้วผมก็สร้างฟิลใหม่ขึ้นมาเตรียมเอาไว้อีกอันชื่อ [ชื่อตัว] เพราะตั้งใจว่า หากตัดคำจากฟิล[ชื่อนามสกุล] สำเร็จก็จะส่งเข้าไปไว้ในฟิลใหม่ [ชื่อตัว]ที่เตรียมไว้ครับ และยังคิดไว้แต่ยังไม่ได้ทำคือจะสร้างฟิล[ชื่อสกุล]อีกอันด้วย ถ้ามันสำเร็จครับ
ขออภัยมื่อใหม่ด้วยครับ
เก็บข้อมูลเป็น 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 ทำให้ช่วยจัดการได้ ไม่งั้นคงต้องนั่งแยกด้วยมือ ที่ละเรคคอร์ดแล้ว
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
ขอบคุณครับที่ให้ความรู็้้้แก่มือใหม่ทั้งหลาย
ซึ่งหาไม่ได้จากตำรา
มันมาจากประสบการณ์อันยาวนานของแต่ละคน
ซึ่งหาไม่ได้จากตำรา
มันมาจากประสบการณ์อันยาวนานของแต่ละคน
Time: 0.2638s