สอบถามเรื่องวิธีการเขียน
กระทู้เก่าบอร์ด อ.Yeadram

 1,229   9
URL.หัวข้อ / URL
สอบถามเรื่องวิธีการเขียน

ถึงอาจารย์ทุกท่านครับ
    ผมมีปัญหามาถามถึงวิธีการเขียนหรือทำ Query
ผมมีข้อมูล ( ชื่อสินค้า,วันที่,ชิ้นผลิต,ชิ้นเสีย,ชิ้นผลิต-ชิ้นเสีย)

สินค้า           วันที่               ชิ้นผลิต     ชิ้นเสีย   ชิ้นผลิต-ชิ้นเสีย     
a0002     01/12/2011     30     1     29
a0002     02/12/2011     0     2     -2
a0002     03/12/2011     21     0     21
a0002     04/12/2011     22     1     21
a0002     05/12/2011     0     2     -2
a0002     06/12/2011     0     0     0
a0002     07/12/2011     21     0     21
a0002     30/12/2011     20     2     18
a0002     31/12/2011     0     1     -1

คือชิ้นที่ผลิตแต่ละวันก็อาจมีชิ้นเสีย เราก็จะเอาไปลบกันเพื่อหายอดผลิตที่ได้จริงของแต่ละวัน
ปัญหาอยู่ที่ว่าเสาร์อาทิตย์ไม่มีการผลิต แต่มีการทำงานสำหรับตรวจของเสียถ้ามีของเสียก็จะลงข้อมูลที่เกิดขึ้นจริงของวันนั้นเลย (วันที่ของเครื่อง)ทำให้ยอดที่ลบกันติดลบ
สิ่งที่ผมอยากให้เป็นคือ
      1 จะทำอย่างไรให้ยอดของเสียไปโชว์วันที่ถัดไปที่มียอดการผลิต
      2 หรือวันที่เปลี่ยนไปเป็นวันที่ที่มีการผลิตถัดไป
      3 แต่ถ้าสิ้นเดือนไม่มียอดการผลิตแต่มีของเสียก็ให้ถอยกลับไปโชว์ที่ผลิตวันสุดท้ายของเดือนนั้น
      4 และ 1,2,3 ต้องเป็นสินค้าเดียวกันด้วย โดยไม่เกี่ยวกับฐานข้อมูลจริงในระบบ
รบกวนท่านอาจารย์ทุกท่านด้วยครับ

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

1 @R11777
ตามความคิดของผม เงื่อนไขที่ 1 และ 2 ผิดครับ
ถ้าพบของเสียควรเป็นของวันก่อนหน้า ไม่ใช่วันถัดไปครับ
และที่ถูกคือ ไม่ใช่ของเมื่อวาน แต่เป็นวันไหนก็ไม่รู้ก่อนหน้านี้

สรุป รายงานนี้ ผิดครับ ก็ไม่แน่ใจว่าผิดที่คนออกแบบ หรือ คนให้ความต้องการ
แนะนำว่าไปตกลงกันใหม่ครับ
2 @R11782
ขอบคุณคุณ PichaiTC ครับ
คืออย่างนี้ครับ ชิ้นที่ผลิตในแต่ละครั้งจะใช้เวลาประมาณ 4 วัน ขั้นตอนก็คือหลังจากแกะแบบสินค้าออกจากโมลด์ต้องเอาเข้าห้องอบประมาณ 3 วัน หลังจากนั้นจะนำสินค้าไปทำการตรวจสอบอีกครั้งว่าจะได้ของดีเท่าไร ซึ่งเวลาตรวจอาจจะตรงกับเสาร์-อาทิตย์ ซึ่งไม่มีการผลิตของวันนั้นครับ

เราไม่สนใจของที่เสียจะเป็นสินค้าที่ผลิตวันนั้นหรือเปล่า เพราะยอดการผลิตกับยอดตรวจคนละวันอยู่แล้ว แต่จะมาตรงกับยอดผลิตของวันต่อมา

เช่น ชิ้นเสียวันที่ 1 ของเดือนนี้อาจจะเป็นที่ชิ้นผลิตวันที่ 28 ของเดือนที่แล้ว แต่วันที่ 1 ของเดือนนี้ก็มีการผลิตสินค้าปกติ เราจะสรุปรายงานเป็นเดือนๆครับ
3 @R11784
ในเมื่อ
"เราไม่สนใจของที่เสียจะเป็นสินค้าที่ผลิตวันนั้นหรือเปล่า เพราะยอดการผลิตกับยอดตรวจคนละวันอยู่แล้ว"
จะติดลบก็ไม่ไม่เห็นเป็นไรเลยนี่ครับ
4 @R11787
ถึงคุณ PichaiTC ครับ

คือผมต้องการจะใช้ชิ้นผลิตเป็นตัวคำนวณสำหรับวันนั้นเพื่อหักของเสียออกไปเหลือเท่าไรให้หักเงินจากพนักงานเท่ากับที่เหลือครับ

จะมีคำสั่งที่เขียนได้ตามนี้หรือเปล่าครับ

ขอบคุณอีกครั้งครับ
5 @R11798
ให้สร้างอีกเทเบิลนึง (สมมุติชื่อ B) ให้เหมือนเทเบิลต้นแบบ (สมมุติชื่อ A) แล้ววางโค้ดนี้ใน Module ต่อไปก็จะสั่งให้โค้ดนี้ทำงาน จะจากปุ่มคำสั่งก็ได้ หรือจากเมนูก็ได้ ทำเสร็จ เทเบิล B ก็ควรมีข้อมูลตามที่ต้องการ คุณก็ใช้เทเบิล B ไปแทน A   แต่เมื่อไหร่ต้องการข้อมูลที่อัพเดตใหม่สดเสมอ คุณก็ต้องสั่งให้โค้ดนี้ทำงานทุกครั้งไปครับ


Private Sub ProcessData()
Dim DB As DAO.Database
Dim RSA As DAO.Recordset
Dim RSB As DAO.Recordset
Dim SQL As String
Dim BeginNextMonth As Date
Dim BeginThisMonth As Date

Set DB = CurrentDb

' ลบทุกเรคอร์ดใน B
DB.Execute "delete * from B", dbFailOnError

' เอาเฉพาะเรคอร์ดที่มีการผลิตนำมาใส่ใน B
DB.Execute "insert into B select * from A where A.[ชิ้นผลิต] <> 0", dbFailOnError

' พิจารณาเรคอร์ดที่ไม่มีการผลิตทีละเรคอร์ดจาก A
Set RSA = DB.OpenRecordset("select * from A where [ชิ้นผลิต] = 0 order by [สินค้า], [วันที่]")
With RSA
Do Until .EOF
   ' หาวันที่ถัดไปที่มีการผลิตสำหรับสินค้าเดียวกันและในเดือนเดียวกัน
   BeginNextMonth = DateSerial(Year(![วันที่]), Month(![วันที่]) + 1, 1)
   SQL = "select Min([วันที่]) as NextDT from B " _
      & "where ([สินค้า] = """ & ![สินค้า] & """) " _
      & "and ([วันที่] > #" & Format(![วันที่], "dd-mmm-yyyy") & "#) " _
      & "and ([วันที่] < #" & Format(BeginNextMonth, "dd-mmm-yyyy") & "#) "
   Set RSB = DB.OpenRecordset(SQL)
   If Not IsNull(RSB!NextDT) Then
      ' ถ้าหาเจอก็ให้ปรับปรุงฟิลด์ [ชิ้นเสีย] และ [ชิ้นผลิต-ชิ้นเสีย]
      SQL = "update B set [ชิ้นเสีย] = [ชิ้นเสีย] + " & ![ชิ้นเสีย] & ", [ชิ้นผลิต-ชิ้นเสีย] = [ชิ้นผลิต-ชิ้นเสีย] - " & ![ชิ้นเสีย] & " " _
        & "where ([สินค้า] = """ & ![สินค้า] & """) " _
        & "and ([วันที่] = #" & Format(RSB!NextDT, "dd-mmm-yyyy") & "#) "
      DB.Execute SQL, dbFailOnError
      RSB.Close
      
      ' ถ้าปรับปรุงได้ก็กระโดดไปอ่านเรคอร์ดถัดไปจาก A
      GoTo NextRec
   End If
   RSB.Close

   ' หาวันที่ก่อนหน้าที่มีการผลิตสำหรับสินค้าเดียวกันและในเดือนเดียวกัน
   BeginThisMonth = DateSerial(Year(![วันที่]), Month(![วันที่]), 1)
   SQL = "select Max([วันที่]) as PrevDT from B " _
      & "where ([สินค้า] = """ & ![สินค้า] & """) " _
      & "and ([วันที่] < #" & Format(![วันที่], "dd-mmm-yyyy") & "#) " _
      & "and ([วันที่] >= #" & Format(BeginThisMonth, "dd-mmm-yyyy") & "#) "
   Set RSB = DB.OpenRecordset(SQL)
   If Not IsNull(RSB!PrevDT) Then
      ' ถ้าหาเจอก็ให้ปรับปรุงฟิลด์ [ชิ้นเสีย] และ [ชิ้นผลิต-ชิ้นเสีย]
      SQL = "update B set [ชิ้นเสีย] = [ชิ้นเสีย] + " & ![ชิ้นเสีย] & ", [ชิ้นผลิต-ชิ้นเสีย] = [ชิ้นผลิต-ชิ้นเสีย] - " & ![ชิ้นเสีย] & " " _
        & "where ([สินค้า] = """ & ![สินค้า] & """) " _
        & "and ([วันที่] = #" & Format(RSB!PrevDT, "dd-mmm-yyyy") & "#) "
      DB.Execute SQL, dbFailOnError
      RSB.Close
      
      ' ถ้าปรับปรุงได้ก็กระโดดไปอ่านเรคอร์ดถัดไปจาก A
      GoTo NextRec
   End If
   RSB.Close
   
   ' ถ้าหาวันที่ทั้งหลังและก่อนวันที่ที่ไม่มีการผลิตไม่ได้ ก็ให้แสดงข้อความออกมาเตือน
   MsgBox "ไม่สามารถหาวันที่ผลิต " & ![สินค้า] & " ในเดือนเดียวกันก่อนวันที่ " & Format(![วันที่], "dd-mmm-yyyy")

NextRec:
   .MoveNext
Loop
End With
RSA.Close
End Sub


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

       ผมได้ทดลองใช้แล้วครับ ใช้ได้เลยครับ

ขอบคุณมากๆครับ
8 @R11801
ยังคาใจครับ
"เราจะสรุปรายงานเป็นเดือนๆครับ"

แปลว่าไม่ต้องสรุปตัวเลขเป็นวัน แต่สรุปเป็นเดือนไม่ได้หรือครับ

สินค้า    วันที่        ชิ้นผลิต    ชิ้นเสีย
a0002     01/12/2011     30     1
a0002     02/12/2011      0     2
a0002     03/12/2011     21     0
a0002     04/12/2011     22     1
a0002     05/12/2011      0     2
a0002     06/12/2011      0     0
a0002     07/12/2011     21     0
a0002     30/12/2011     20     2
a0002     31/12/2011      0     1
รวม                      114     9
ชิ้นผลิต-ชิ้นเสีย = 105 (= เงินที่จะจ่าย)
9 @R11802
ถึง คุณ PichaiTC
เราแยกเป็นวันๆ แต่สรุปเป็นแต่ละเดือน สาเหตุที่แยกเป็นวันมาก่อนเพราะเรามีเป้าหมายของแต่ละวันในการผลิตครับ

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