ขอสอบถามเรื่องการอัพเดทข้อมูลครับ



0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

23 ก.พ. 61 , 11:27:53
อ่าน 1328 ครั้ง

nainumgame

  • สมาชิกไท.Access
  • กระทู้: 13

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

อยากจะสอบถามครับ คือว่าผมต้องการอัพเดทยอดขายโดยบันทึกยอดขายประจำวัน โดยสามารถบันทึกได้ตลอดและอัพเดทข้อมูลเป็นปัจจุบันด้วย

ซึ่งผมเขียนโค้ดตามนี้ครับ
Private Sub Cmd_Report_Up_Click()
On Error Resume Next
If MsgBox("คุณต้องการบันทึกยอดขาย ใช่ หรือ ไม่", vbInformation + vbYesNo, "แจ้งเตือน") = vbYes Then
CurrentDb.Execute "INSERT INTO Report_Sale(R_DATE, R_PRICE, R_SALE, R_CARD,R_CREDIT,R_IN_CREDIT,R_GP)" & _
"values('" & Me.Date_Re & "','" & Me.t01 & "','" & Me.t02 & "','" & Me.t03 & "','" & Me.t04 & "','" & Me.t05 & "','" & Me.t06 & "')"
End If
End Sub
แต่ปัญหามันคือ เมื่อผมขายสินค้าไปเพิ่ม แล้วบันทึกใหม่มันไม่อัพเดทยอดขายให้
ไม่ทราบว่าผมต้องเขียนโค้ดอย่างไงครับ
รบกวนอาจารย์ด้วยครับ

 

23 ก.พ. 61 , 15:45:21
ตอบกลับ #1

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 466
  • พลังขอบคุณ: 418

  • ขึ้น 15 ค่ำเดือน 8 แสดงปฐมเทศนา

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #1 เมื่อ: 23 ก.พ. 61 , 15:45:21 »
1 ที่เห็นแน่ๆหนึ่งจุดคือ CurrentDb.Execute "INSERT INTO Report_Sale(R_DATE, R_PRICE, R_SALE, R_CARD,R_CREDIT,R_IN_CREDIT,R_GP)" & _ ให้เพิ่มอย่างน้อย 1 ช่องว่างที่ด้านหลังวงเล็บครับ

2. ที่ท้ายคำสั่ง CurrentDB.Execute ... Me.t06 & "')" ควรใส่ ,dbFailOnError ต่อท้ายด้วย

3. ที่อาจเกิดปัญหาต่อไปได้ ซึ่งขึ้นกับประเภท (Data Type) ของแต่ละฟิลด์ (R_DATE, R_PRICE, R_SALE, R_CARD,R_CREDIT,R_IN_CREDIT,R_GP) ว่าเป็นประเภทอะไร เพราะคำสั่งคุณมีเครื่องหมาย '  ครอบข้อมูลที่จะเพิ่มทุกฟิลด์ ซึ่งหมายถึงทุกฟิลด์มีประเภทเป็น Text ทั้งหมดเลย แต่ดูแล้วไม่น่าจะเป็นอย่างนั้น ที่ถูกต้องคือ ถ้าเป็นฟิลด์ Number ก็ไม่ต้องมีเครื่องหมาย ' คั่น  ในขณะที่ประเภทของฟิลด์ Date ต้องใช้เครื่องหมาย # คั่น (ประเภทของฟิลด์ต้องดูที่ตัวเทเบิล ไม่ใช่ดูที่เราป้อนอะไรเข้าไปบนหน้าฟอร์ม)

4. ให้เอาบรรทัด On Error Resume Next ออก เพราะคำสั่งนี้จะทำให้ Access ไม่สนใจ error ที่เกิดขึ้น ถ้าเกิด error มันก็จะทำงานคำสั่งถัดไปเลย เราจึงไม่รู้ว่าจริงๆแล้วมี error อะไรเกิดขึ้นบ้าง
« แก้ไขครั้งสุดท้าย: 23 ก.พ. 61 , 15:49:52 โดย สันติสุข »
ช่วยพกถุงผ้า/ถุงพลาสติกใช้แล้วไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 

24 ก.พ. 61 , 11:47:26
ตอบกลับ #2

nainumgame

  • สมาชิกไท.Access
  • กระทู้: 13

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #2 เมื่อ: 24 ก.พ. 61 , 11:47:26 »
ขอบคุณครับอาจารย์ผมลองทำตามแล้วมันได้อยู่ครับ แต่มันบันทึกเป็นไฟล์ใหม่ ผมอยากให้มันมันทึกซ้ำวันที่อันเดิมครับ เราต้องใส่เงื่อนไขอย่างไงครับ ให้อัพเดทเป็นวันที่เราต้องการ




ผมเขียนแบบนี้ครับ ไม่รู้ถูกหรือเปล่า

Private Sub Cmd_Report_Up_Click()

If MsgBox("คุณต้องการบันทึกยอดขาย ใช่ หรือ ไม่", vbInformation + vbYesNo, "แจ้งเตือน") = vbYes Then
CurrentDb.Execute "INSERT INTO Report_Sale(R_DATE, R_PRICE, R_SALE, R_CARD,R_CREDIT,R_IN_CREDIT,R_GP) " & _
"values('" & Me.Date_Re & "','" & Me.t01 & "','" & Me.t02 & "','" & Me.t03 & "','" & Me.t04 & "','" & Me.t05 & "','" & Me.t06 & "')", dbFailOnError

End If
End Sub

ถ้าผมต้องการใส่เงื่อนไขวันที่แบบนี้มัน Error ครับ

Private Sub Cmd_Report_Up_Click()

If MsgBox("คุณต้องการบันทึกยอดขาย ใช่ หรือ ไม่", vbInformation + vbYesNo, "แจ้งเตือน") = vbYes Then
CurrentDb.Execute "INSERT INTO Report_Sale(R_DATE, R_PRICE, R_SALE, R_CARD,R_CREDIT,R_IN_CREDIT,R_GP) " & _
"values('" & Me.Date_Re & "','" & Me.t01 & "','" & Me.t02 & "','" & Me.t03 & "','" & Me.t04 & "','" & Me.t05 & "','" & Me.t06 & "')", dbFailOnError
WHERE R_DATE = Me.Date_Re

End If
End Sub

ไม่ทราบว่าต้องเขียนอย่างไงครับ แนะนำด้วยครับ อาจารย์ สันติสุข

 

25 ก.พ. 61 , 15:59:57
ตอบกลับ #3

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 466
  • พลังขอบคุณ: 418

  • ขึ้น 15 ค่ำเดือน 8 แสดงปฐมเทศนา

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #3 เมื่อ: 25 ก.พ. 61 , 15:59:57 »
"... แต่มันบันทึกเป็นไฟล์ใหม่ ผมอยากให้มันมันทึกซ้ำวันที่อันเดิมครับ ..." เข้าใจว่าบันทึกเป็นเรคคอร์ดใหม่ใช่ไหม คงไม่ใช่ไฟล์ใหม่อย่างที่คุณเขียน แล้วต้องการบันทึกทับของเดิมใช่ไหมครับ

คำสั่ง INSERT INTO เป็นคำสั่งเขียนเรคอร์ดใหม่ครับ  ถ้าจะเขียนทับหรือแก้ไขเรคอร์ดที่มีอยู่แล้ว ต้องใช้คำสั่ง UPDATE ซึ่งมี syntax คือ
โค๊ด: [Select]
UPDATE ชื่อเทเบิล SET ชือฟิลด์1 = ค่าใหม่, ชือฟิลด์2 = ค่าใหม่, ... WHERE เงื่อนไขแต่การเขียนทับ/แก้ไขเรคอร์ดโดยยังไม่มีเรคอร์ดนั้นมาก่อนตามเงื่อนไขที่ใส่หลัง WHERE  ผลก็คือจะไม่มีเรคอร์ดอะไรถูกแก้ไขเช่นกัน (ส่วนคำสั่ง INSERT จะไม่มี WHERE clause ครับ)

ดังนั้นที่ควรเป็นก็คือ หาโดยคำสั่ง SELECT ก่อนว่ามีเรคอร์ดนั้นหรือยัง ถ้ายัง ก็ให้ INSERT ไม่เช่นนั้นก็ให้ UPDATE 

โค๊ด: [Select]
Private Sub Cmd_Report_Up_Click()

If MsgBox( ...... ) = vbYes Then
   If CurrentDB.OpenRecordset("SELECT * FROM Report_Sale WHERE R_DATE = '" & Me.Date_Re & "'").EOF Then
      CurrentDB.Execute "INSERT INTO Report_Sale(R_DATE, R_PRICE, R_SALE,R_CARD,R_CREDIT,R_IN_CREDIT,R_GP) " & _
      "VALUES ('" & Me.Date_Re & "', " & Me.t01 & ", " & Me.t02 & ", " & Me.t03 & ", " & Me.t04 & ", " & Me.t05 & ", " & Me.t06 & ")", dbFailOnError
   Else
      CurrentDB.Execute "UPDATE Report_Sale SET R_Price = " & Me.t01 & ",   .....   = " & Me.t06 & " WHERE R_DATE = '" & Me.Date_Re & "'", dbFailOnError
   End If
End If
End Sub

หมายเหตุ
1. ตรงที่เขียน .... คุณไปเติมเองนะครับ
2. ยังคงใช้เครื่องหมาย ' เป็นตัวครอบชนิดข้อมูลวันที่ เพราะถ้าใช้ # ในกรณีวันที่เป็นปี พ.ศ. จะวุ่นวายมาก คำสั่ง SQL จะใช้ปี ค.ศ. เท่านั้น ถ้าจะใช้ # จริง ก็ต้องแปลงข้อมูลจากหน้าฟอร์มที่เป็นปี พ.ศ. ให้เป็นปี ค.ศ. อีก แต่การใช้ ' มันจะแปลงเอง แต่กฏเกณฑ์การแปลงเป็นยังไงนี่ผมไม่รู้ อาจเกิดปัญหาตรงไหนผมบอกไม่ได้   ยังไงก็ตาม ผมไม่แนะนำให้ตั้งปฏิทินของวินโดว์ในระบบปี พ.ศ. หรือป้อนข้อมูลเป็นปี พ.ศ. เพราะจะทำให้เกิดข้อผิดพลาดแอบแฝงเอาไว้ได้ โปรแกรมอาจตีความต่างจากที่เราเข้าใจได้ ควรตังเป็นปี ค.ศ.และรูปแบบเป็น ว/ด/ป เท่านั้น และจะใช้ # ได้อย่างไม่ต้องกังวล(เท่าไหร่)
3. แต่ถ้าปัจจุบันระบบวินโดว์เป็นปี ค.ศ. อยู่แล้ว แปลว่าปีของ 23/2/2561 คือปี ค.ศ. 2561 นะครับ ไม่ใช่พ.ศ. 2561
ช่วยพกถุงผ้า/ถุงพลาสติกใช้แล้วไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 

25 ก.พ. 61 , 21:10:19
ตอบกลับ #4

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 466
  • พลังขอบคุณ: 418

  • ขึ้น 15 ค่ำเดือน 8 แสดงปฐมเทศนา

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #4 เมื่อ: 25 ก.พ. 61 , 21:10:19 »
ลืมไป อีกวิธีที่ดูง่ายดีก็คือ ลบของเก่าก่อนแล้วค่อยเพิ่มรายการใหม่เข้าไป คำสั่งลบ คือ

โค๊ด: [Select]
DELETE * FROM ชื่อเทเบิล WHERE เงื่อนไข
โค๊ด: [Select]
If MsgBox( ...... ) = vbYes Then
   CurrentDB.Execute "DELETE * from Report_Sale WHERE R_DATE = '" & Me.Date_Re & "'", dbFailOnError
   CurrentDB.Execute "INSERT ... ", dbFailOnError
End If
ช่วยพกถุงผ้า/ถุงพลาสติกใช้แล้วไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 

27 ก.พ. 61 , 10:29:51
ตอบกลับ #5

nainumgame

  • สมาชิกไท.Access
  • กระทู้: 13

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #5 เมื่อ: 27 ก.พ. 61 , 10:29:51 »
ขอคุณอาจารย์ครับ ผมลองทั้งสองวิธีแต่มันติด error ทั้งสองแบบเลยครับ ไม่ทราบว่ามันเป็นเพราะอะไร ผมงงมากเลยครับคิดไม่ออกเลยครับ








รบกวนด้วยครับ

 

27 ก.พ. 61 , 11:36:15
ตอบกลับ #6

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 466
  • พลังขอบคุณ: 418

  • ขึ้น 15 ค่ำเดือน 8 แสดงปฐมเทศนา

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #6 เมื่อ: 27 ก.พ. 61 , 11:36:15 »
ลองเปลี่ยนจาก
= '" & Me.Date_Re & "'"
เป็น
= #" & Me.Date_Re & "#"
ช่วยพกถุงผ้า/ถุงพลาสติกใช้แล้วไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 

01 มี.ค. 61 , 08:18:14
ตอบกลับ #7

nainumgame

  • สมาชิกไท.Access
  • กระทู้: 13

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #7 เมื่อ: 01 มี.ค. 61 , 08:18:14 »
ขอบคุณครับอาจารย์ ผมลองเปลี่ยนแบบที่อาจารย์แนะนำ มันไม่อัพเดทข้อมูลเดิมครับ แต่มันเพิ่มเป็นข้อมูลใหม่มาอีก ไม่ทราบว่าผมต้องแก้ไขยังไงครับ
ผมหาปัญหาไม่ออกเลยครับว่ามันเป็นเพราะอะไร ยังไงผมรบกวนอาจารย์ช่วยดูให้หน่อยน่ะครับว่าผมใส่ตัวไหนผิด ช่วยแนะนำด้วยครับ ขอบคุณครับ




ตัวโปรแกรมครับ https://1drv.ms/u/s!AsCxhafs7TWdgWFhe0BK7zu05BYG link

 

01 มี.ค. 61 , 15:22:56
ตอบกลับ #8

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 466
  • พลังขอบคุณ: 418

  • ขึ้น 15 ค่ำเดือน 8 แสดงปฐมเทศนา

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #8 เมื่อ: 01 มี.ค. 61 , 15:22:56 »
ทดลองแล้วพบว่าปัญหาเกิดจากระบบปี พ.ศ. ครับ คำสั่งในโค้ดต้องเปลี่ยนเป็นปี ค.ศ.

โค๊ด: [Select]
If MsgBox("คุณต้องการบันทึกยอดขาย ใช่ หรือ ไม่", vbInformation + vbYesNo, "แจ้งเตือน") = vbYes Then
  If CurrentDb.OpenRecordset("SELECT * FROM Report_Sale WHERE R_DATE = #" & DateAdd("yyyy", -543, Me.Date_Re) & "#").EOF Then
   CurrentDb.Execute "INSERT INTO Report_Sale(R_DATE, R_PRICE, R_SALE,R_CARD,R_CREDIT,R_IN_CREDIT,R_GP) " & _
    "VALUES (#" & DateAdd("yyyy", -543, Me.Date_Re) & "#, " & Me.t01 & ", " & Me.t02 & ", " & Me.t03 & ", " & Me.t04 & ", " & Me.t05 & ", " & Me.t06 & ")", dbFailOnError
  Else
   CurrentDb.Execute "UPDATE Report_Sale SET R_Price = " & Me.t01 & ",R_SALE = " & Me.t02 & ", R_CARD = " & Me.t03 & ", R_CREDIT= " & Me.t04 & ", R_IN_CREDIT = " & Me.t05 & ", R_GP = " & Me.t06 & " WHERE R_DATE = #" & DateAdd("yyyy", -543, Me.Date_Re) & "#", dbFailOnError
  End If
End If
ช่วยพกถุงผ้า/ถุงพลาสติกใช้แล้วไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 

03 มี.ค. 61 , 16:48:19
ตอบกลับ #9

nainumgame

  • สมาชิกไท.Access
  • กระทู้: 13

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #9 เมื่อ: 03 มี.ค. 61 , 16:48:19 »
ขอบคุณมากครับ ทำได้แล้วครับ ตรงที่ต้องการเลยครับ ผมงมหาตั้งนาน สุดท้ายเป็นเพราะ พ.ศ. นี่เอง
ขอบคุณอาจารย์มาก ๆ น่ะครับ

 

06 มี.ค. 61 , 16:25:49
ตอบกลับ #10

Ekarat Joolawan

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #10 เมื่อ: 06 มี.ค. 61 , 16:25:49 »
ไม่เห็นมีข้อมูลอะไรให้ดูเลย

 

06 มี.ค. 61 , 16:38:13
ตอบกลับ #11

ปิ่นณรงค์

> > ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #11 เมื่อ: 06 มี.ค. 61 , 16:38:13 »
ไม่เห็นมีข้อมูลอะไรให้ดูเลย


ด้านบนมีให้ใส่ วันที่ๆ จะแสดงข้อมูลครับ ข้อมูลที่เขาใส่มามีแค่เดือน 1 ถึงเดือน 2 ท่านมากดดูวันที่ปัจจุบันคือเดือน 3 มันเลยไม่โชว์ครับ
:love: :grin:
 

08 มี.ค. 61 , 23:11:33
ตอบกลับ #12

nainumgame

  • สมาชิกไท.Access
  • กระทู้: 13

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #12 เมื่อ: 08 มี.ค. 61 , 23:11:33 »
อ้อครับ ผมก็อปแค่ข้อมูลบางส่วนในฐานข้อมูลผมครับ ไม่สง่วนครับเอาไปลองปรับใช้กับฐานข้อมูลอื่น ๆ ดูครับ

 

09 มี.ค. 61 , 01:31:19
ตอบกลับ #13

nainumgame

  • สมาชิกไท.Access
  • กระทู้: 13

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #13 เมื่อ: 09 มี.ค. 61 , 01:31:19 »
ขอสอบถามอาจารย์สันติสุข อีกหน่อยครับ โค้ดที่อาจารย์ให้ ทำไมบางเดือนมันกลับเดือนกลับวันกันครับ
เช่น 1/2/2561 มันจะกลับเป็น 2/1/2561 และอีกหลาย ๆ วันครับไม่ทราบว่าเป็นเพราะอะไรยิ่ง เดือนมีนาคม เป็นทุกตัวเลยครับ





รบกวนหน่อยน่ะครับ ไม่ทราบว่ามันเป็นกับอะไรครับ

 

09 มี.ค. 61 , 05:32:12
ตอบกลับ #14

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 466
  • พลังขอบคุณ: 418

  • ขึ้น 15 ค่ำเดือน 8 แสดงปฐมเทศนา

    • ดูรายละเอียด

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #14 เมื่อ: 09 มี.ค. 61 , 05:32:12 »
คุณไป Control Panel ของวินโดว์ เลือก Region and Language แล้วแคป แทป Formats หน่อย ผมอยากดูว่าเครื่องกำหนดรูปแบบ Short Date และ Long Date เป็นอะไร
« แก้ไขครั้งสุดท้าย: 09 มี.ค. 61 , 05:33:57 โดย สันติสุข »
ช่วยพกถุงผ้า/ถุงพลาสติกใช้แล้วไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 

09 มี.ค. 61 , 11:23:47
ตอบกลับ #15

pizza_p

> ขอสอบถามเรื่องการอัพเดทข้อมูลครับ
« ตอบกลับ #15 เมื่อ: 09 มี.ค. 61 , 11:23:47 »
การใช้เงื่อนไขที่เป็น Date ผมจะไม่ใช้รูปแบบนี้ #dd/mm/yy# ใน Query เลยครับ มันมีปัญหากับการตั้งค่าของวินโดวส์แต่ละเครื่อง
ผมตัดปัญหาโดยการใช้ตัวเลขของ Date แทนครับโดยใช้ CDbl(date_data) เช่น

"[MyFieldDate] = " & CDbl(Me.DateControl)
"[MyFieldDate] < " & CDbl(Me.DateControl)
"[MyFieldDate] Between " & CDbl(Me.DateControl1) & " AND " & CDbl(Me.DateControl2)

 


บอร์ดเรียนรู้ Access สำหรับคนไทย