copy ข้อมูลจาก record หนึ่งไปยังrecord ใหม่
กระทู้เก่าบอร์ด อ.Yeadram

 5,895   13
URL.หัวข้อ / URL
copy ข้อมูลจาก record หนึ่งไปยังrecord ใหม่

ต้องการ copy ข้อมูลจาก record หนึ่งไปยังrecord ใหม่ โดยในตารางดังกล่าวมีข้อมูลดังต่อไปนี้

ตาราง TCust ประกอบด้วย (CustID Type = Text)
CustID     DesA       Phone
A1           ดี            9644
A2           พอใช้      9123
A15        ดี            9948
B6           ดีมาก      9953
B8           ปรับปรุง   9456

ต้องการ copy ข้อมูล DesA   Phone จาก record หนึ่ง (ตามที่ระบุ) ไปยังrecord ใหม่ โดยให้กดปุ่ม แล้วมี Msg box บอกว่า โปรดระบุ CustID ที่ต้องการ Copy และใส่ CustID ใหม่ที่ต้องการ ต้องทำอย่างไรค่ะ และต้องการเช็คด้วยว่าเลขที่ใหม่ที่ใส่ไปนั้นซ้ำหรือไม่ เช่นต้องการ Copy ข้อมูลจาก A15 ไปยัง B9 ก็จะได้ข้อมูลใหม่เป็น
CustID     DesA       Phone
A1           ดี            9644
A2           พอใช้      9123
A15        ดี            9948
B6           ดีมาก      9953
B8           ปรับปรุง   9456
B9           ปรับปรุง   9456
แต่หาก CustID ใหม่ที่ระบุมีอยู่แล้วในตาราง (ไม่ว่าข้อมูล DesA   Phone จะเหมือนกันหรือไม่ก็ตาม ให้มี Msg ถามก่อนว่าต้องการcopy ใช่หรือไม่

ขอบคุณค่ะ

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

1 @R01968
ถามคำถามชัดเจนดีครับ

คุณคิดออกมาอย่างมีหลักแล้ว คุณตีโจทก์ได้แตก เข้าใจกับโจทก์ ถ้าคุณแปร "กระบวนการคิด" ให้ออกมาในรูปสัญลักษณ์ แล้วก็จะได้ "กระบวนงาน"

1. ถามว่าจะต้องการลอกข้อมูลหรือไม่
2. ถามว่า ต้องการลอกข้อมูลจากเรคคอร์ดใด
3. ถามว่า ต้องการวางข้อมูลที่ลอกมา ใส่เรคคอร์ดใด
4. ถามว่า แน่ใจหรือไม่ ถ้าจะวางข้อมูลทับกับของเก่า

งานระหว่าง ข้อ2 กับข้อ 3 คือการสั่งให้โค้ดไปเอาข้อมูลที่ต้องการ
งานระหว่าง ข้อ3 กับข้อ 4 คือการตรวจสอบว่ามีเรคคอร์ดเลขที่ "นี้" หรือยัง
งาน หลังข้อ 4 คือการวางข้อมูลลงไปในตาราง

คุณมีนคิดว่าคุณมีนเอง ติดตรงกระบวนงานไหนครับ
2 @R01969
เขียน Code ค่ะ ยอมรับว่าเขียน code เองไม่เป็น แต่จะใช้วิธี ลอกคนอื่นมาแก้ไข แต่จะให้ตั้งต้นเขียนเองทำไม่ได้ เพราะไม่รู้จัก VB อย่างแท้จริง

แต่ตอนนี้พยายามศึกษาอยู่ค่ะ
3 @R01971
แต่ละงาน อาจมีวิธีทำได้มากกว่า 1 ทาง
ที่ผมแนะนำไปก่อนนี้ อาจจะใช้วิธี
- ย้ายเคอร์เซอร์ไปที่เรคคอร์ดต้นทาง
- เก็บค่าจากฟิลด์ที่ต้องการเข้าตัวแปร
- ย้ายเคอร์เซอร์ไปที่เรคคอร์ดเป้าหมาย
- วางค่าจากตัวแปรลงใสในฟิลด์

อีกวิธี อาจใช้คำสั่ง CopyRecord โดยตรงเลยก็ได้

หรือ..... อาจใช้วิธีให้รัน คิวรี่ ก็ได้ แบบนี้

sub copyrec()

dim srcCustID as string
dim desCustID as string
dim sqlStatement as string

if msgbox("ต้องการคัดลอกเรคคอร์ดหรือไม่")=vbyes then
srcCustID = inputbox("ต้องการคัดลอกจากเรคคอร์ดใด")
if srcCustID<>"" or not isnull(srcCustID) then
dscCustID=inputbox("ต้องการวางใส่เรคคอร์ดใด")
if dscCustID<>"" or not isnull(dscCustID) then
if isnull(dlookup("CustID","tCust","[CustID] = '" & dscCustID & "'")) then

sqlStatement = "Update tCust, (Select tCust.DesA, tCust.Phone From tCust Where tCust.CustID ='" & _
srcCustID & "') As q Set tCust.DesA = q.DesA, tCust.Phone = q.Phone Where tCust.CustID ='" & dscCustID & "';"

debug.print sqlStatement

' docmd.setwarnings false
' docmd.runsql sqlStatement

end if
end if
end if
end if
End Sub
4 @R01974
ที่อาจารย์ yeadram บอก 2 วิธีแรก เป็นการทำโดยตรงที่ตารางใช่ไหมค่ะ
ส่วนวิธี รัน คิวรี่ นั้นต้องทำอย่างไรค่ะ
มีนลองเอา code ไปผูกกับ Button แล้ว ผลที่ได้มี Msg ถาม "ต้องการคัดลอกเรคคอร์ดหรือไม่" เพียงแค่อย่างเดียวเองค่ะ (ตามรูป)



ขอโทษค่ะ ไม่เข้าใจจริง ๆ เพิ่งจะเริ่มศึกษา access ค่ะ
5 @R01975
ง่า.... ไม่ครบ อิอิ ไม่ได้ใส่ ตัวเลือกให้ msgbox
อืมม....
เอา OK เลยก็ได้ ไม่ต้อง yesno หรอก

if msgbox("ต้องการคัดลอกเรคคอร์ดหรือไม่")=vbOK then

หมายความว่า ถ้าเขากด OK ก็เข้าเงื่อนไข ให้ทำงานได้เลย
แต่ถ้าเขากดปิด msgbox หรือกด ESC ก็ไม่ต้องทำงาน


อ้อ แล้วก็ โค้ดที่ให้ไป มันจะทำงานถึงบรรทัดที่เน้นสีแดงนะครับ ให้ เปิด debug window ขึ้นมาตรวจดู (ctl+G) ประโยค sql ก่อนครับ ถ้าคิดว่ามันเขียนได้ถูกต้อง ค่อย เบรคบรรทัดนั้น แล้วปล่อย สองบรรทัดล่างนั่นได้เลย
ที่ทำอย่างนี้เพราะว่า โค้ดที่ให้ไป ผมเขียนสดผ่านการโพสต์นี่เลย ไม่ได้ทดสอบใดๆ เลยครับ คุณมีนลองเอาไปทดสอบแล้วปรับแก้ไป พอได้นะครับ

และ จริงๆ แล้ว โค้ดนี้มันไม่สมบูรณ์นะครับ ที่เขียนให้ก็คือ พอให้เห็นลำดับงาน ว่าเราจะทำการตรวจสอบเงื่อนไขอย่างไร ลำดับอย่างไร ร้องขอข้อมูลเพิ่มเติมจาก ผู้ใช้อย่างไร ได้ข้อมูลมาแล้วเอาไปไว้ไหนหรือเอาไปทำอะไรต่อ ประมาณนี้นะครับ ที่เหลือ อีกหลายๆ อย่าง เช่น ถ้าผู้ใช้กรอกไม่ถูกรูปแบบ จะทำอย่างไร อันนี้คุณมีนต้องไปเพิ่มเติมเอาเองนะครับ ถ้าเอาโค้ดนี้ไปใช้เลย แล้วปรากฎว่า ผู้ใช้อยากลองเล่น ด้วยการ ให้ข้อมูลมั่วๆ มาเช่นคีย์ .. ลงไปใน inputbox ก็เรียบร้อยเลยนะครับข้อมูลคุณมีน อาจเสียหายได้ ดังนั้น ต้องไปดักจับ ดักเช็คพวกนั้นด้วยอีกทีนะครับ
6 @R02002
ทดลองแล้ว โดยสั่ง docmd.runsql sqlStatement ด้วย
แต่ผลคือมี Msg box รับค่า แต่ในตาราง tcust ไม่มีข้อมูลดังกล่าวค่ะ

คือต้องการให้ นำข้อมูลที่ copy ไปไว้ในตาราง tCust ด้วยเลยค่ะ ต้องเขียน code อย่างไรเพิ่มอีกหรือไม่

แต่เท่าที่ลองตีความหมาย sqlStatement เป็นการ Update แล้วไม่ใช่หรือค่ะ

ส่วน "ใช้อยากลองเล่น ด้??ยการ ให้ข้อมูลมั่วๆ มาเช่นคีย์ .. ลงไปใน inputbox ก็เรียบร้อยเลยนะครับข้อมูลคุณมีน อาจเสียหายได้ ดังนั้น ต้องไปดักจับ ดักเช็คพวกนั้นด้วยอีกทีนะครับ" คงต้องศึกษาอีกนาน
7 @R02009
ที่ให้ไปน่ะ เอาไปเอามา ก็มั่วเยอะเหมือนกันนะนั่น

เอาใหม่ อันนี้ได้ทดสอบมาบ้างแล้ว คิดว่าน่าจะได้ผลนะครับ ลองดูครับ

Sub copyrec()

Dim srcCustID As String
Dim desCustID As String
Dim sqlStatement As String

If MsgBox("ต้องการคัดลอกเรคคอร์ดหรือไม่") = vbok Then
srcCustID = inputbox("ต้องการคัดลอกจากเรคคอร์ดใด")
If srcCustID <> "" Or Not isnull(srcCustID) Then
dscCustID = inputbox("ต้องการวางใส่เรคคอร์ดใด")
If dscCustID <> "" Or Not isnull(dscCustID) Then
If isnull(dlookup("CustID", "tCust", "[CustID] = '" & dscCustID & "'")) Then
    sqlStatement = "INSERT INTO tCust ( CustID, DesA, phone )" _
            & "       SELECT '" & dscCustID & "' AS CustID, q.DesA, q.phone" _
            & "       FROM (" _
            & "            SELECT tCust.DesA, tCust.phone" _
            & "            FROM tCust" _
            & "            WHERE (tCust.CustID='" & srcCustID & "')" _
            & "       ) As q;"
    
ElseIf MsgBox("รหัสลูกค้านี้มีข้อมูลอยู่แล้ว" & vbCrLf & "คุณแน่ใจว่าต้องการปรับปรุงข้อมูล", vbQuestion + vbYesNo) = vbYes Then

    sqlStatement = "Update tCust, (" _
            & "            Select tCust.DesA, tCust.Phone" _
            & "            From tCust" _
            & "            Where tCust.CustID ='" & srcCustID & "'" _
            & "       ) As q" _
            & "       Set tCust.DesA = q.DesA, tCust.Phone = q.Phone" _
            & "       Where tCust.CustID ='" & dscCustID & "';"
End If

'Debug.Print sqlStatement

DoCmd.SetWarnings False
DoCmd.RunSQL sqlStatement
End If
End If
End If
End Sub
8 @R02010
ได้แล้วค่ะ

แต่สงสัยอีกนิดค่ะ
Dim desCustID As String น่าจะเป็น
Dim dscCustID As String หรือปล่าวค่ะ เพราะด้านใน code ตัวแปรคือ dscCustID ไม่ใช่หรือค่ะ (แต่ทำไมไม่เกิด error ค่ะ)


ขอบคุณมากค่ะ
9 @R02013
อ้อ ใช่ครับ ประกาศผิดครับ
ควรจะเปลี่ยนให้มันเหมือนกันซะ นะครับ จะดีกว่า

ที่มันไม่ error เพราะว่า ด้านบนสุดของโมดูลนี้ คุณไม่ได้ประกาศ Option Explicit

อย่าถามต่อนะ ว่ามันคืออะไร อิอิ ตอบไม่ได้จ้า
10 @R02014
ขอบพระคุณมากค่ะ
11 @R04387
ขอถามหน่อยครับ

ถ้า ค่าของ CustID เป็น number แบบ long ต้องแก้ไข code ตรงไหนหรือไม่ ทดลองนำ code ไปใช้แล้ว แต่ทำไมไม่มีการ copy ข้อมูลเลยครับ

ขอบคุณครับ
12 @R04390
ใน statement มันจะมี เครื่องหมาย single quote ครับ
โดยเฉพาะที่อ้างถึง"ฟิลด์" หรือ "ค่า" ของ ID
ให้เอามันออกครับ
13 @R04391
ขอบคุณครับ

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