การคำนวณสลับช่องล่างบน
กระทู้เก่าบอร์ด อ.Yeadram

 3,967   19
URL.หัวข้อ / URL
การคำนวณสลับช่องล่างบน

ผมมี table1 มี field ( ชิ้น,ค่าชิ้น,B/เดื่อน)

ชิ้น     ค่าชิ้น     ฿/เดือน     
12      50      …….      50
13      50      …….      100
14      50      …….      150
15      55      …….      205
16      55      …….      260
อยากให้คำนวณคือ ถ้าบรรทัดแรก ชิ้นที่ 12   ค่าชิ้น 50    B/เดือนให้เท่ากับค่าชิ้น 50 เลย
แต่บรรทัดที่ 2 ตั้งแต่ชิ้น 13 เป็นต้นไปให้เอาค่าชิ้นของตัวเองไปบวกกับ B/เดือนที่อยู่ด้านบนสลับกันลงมาจนหมด
เช่นตัวอย่างที่อยู่ริมขวาสุด
                                                      

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

1 @R10475
ในตารางไม่สามารถคำนวณได้ นอกจากใช้คำสั่งใน VB

กรณีนี้สร้างคิวรี่เพื่อคำนวณผลลัพธ์

-วิธีการ
    1. สร้างคิวรี่ใหม่
    2. เปลี่ยนเป็นมุมมอง SQL แล้วคัดลอกคำสั่งข้างล่างนี้ไปวาง

SELECT Table1.fld1, Table1.fld2, IIf([fld1]>=12,([fld2]+(preBMonth([fld1]))),[fld2]) AS fld3
FROM Table1;
    3. บันทึก

    4. สร้างฟังก์ชั่นใน Module

Public Function preBMonth(prvNum As Integer) As Currency
Dim rst As Recordset
If prvNum < 12 Then
    '
    Else
        Set rst = CurrentDb.OpenRecordset("SELECT * From Query1 WHERE [fld1] = " & (prvNum - 1))
        preBMonth = Nz(rst.Fields(2))
        rst.Close
End If
End Function

    5. ในหน้าต่าง VB เลือกเมนู Debug-->Compile...


*** หมายเหตุ
     จากบรรทัดคำสั่งของทั้งในฟังก์ชั่นและคิวรี่นี้ [fld1] หมายถึงฟิลด์ "ชิ้น" [fld2] หมายถึงฟิลด์ "ค่าชิ้น" [fld3] หมายถึง B/เดือน แต่ถ้าชื่อฟิลด์แตกต่างจากนี้ ให้เปลี่ยนเป็นชื่อฟิลด์ของคุณเอง
2 @R10476
ขอบคุณ คุณ U&ME มากครับ เดี่ยวไปลองทำดู ได้ความอย่างไรจะมาบอกครับ

ขอบคุณครับ
3 @R10478
คุณ U&ME ครับ พอคลิกที่query มันขึ้นแบบนี้ครับ ผมทำขั้นตอนตามที่แนะนำทุกอย่างเลยครับ


Fld1     Fld2     fld3
12      50      #Error
13      50      #Error
14      50      #Error
15      55      #Error
16      55      #Error
17      55      #Error

ช่วยดูให้อีกครั้งครับ ถ้าใครมีอะไรใหม่ๆ ช่วยเสนอด้วยครับ

ขอบคุณเพื่อนๆสมาชิกครับ


4 @R10482
ส่งโปรแกรมมาที่บอร์ด ครับ
5 @R10483
ผมจะส่งแบบไหนครับ ช่วยแนะนำให้ด้วยครับ
6 @R10485
ไหนไหนก็ถามแล้วขอถามต่อครับ

ผมขอแทรก 1 field ที่ table1 (Model,fld1,fld2,fld3)
ตอนนี้ผมกำลังปวดหัวมากกับโปรเจคที่ได้รับ   เป็นโปรเจค Insentive
คือว่า table1 จะเป็น Master สำหรับค่าชิ้น : Model (ตัวสินค้า), fld1(จำนวนชิ้น), fld2(ค่าชิ้น), fld3(ค่าชิ้นสะสม ซึ่งต้องคำนวณจาก Query1

table3 คือยอดจากผลิตได้จริง ( Name[ชื่อของพนักงาน] ,Model, fld1[ยอดชิ้นที่ผลิตได้จริง] , fld3 (คือต้องเอายอดจาก query1 fld3 มาใส่)


table1                     
MODEL     Fld1     Fld2     Fld3      
AA2398     12      50           บรรทัดแรกของ Model ให้ fld3 = fld2
AA2398     13      50           บรรทัดต่อมา ให้ fld3 =fld2+fld3 ที่อยู่ด้านบน
AA2398     14      50            
AA2398     15      55            
AA2398     16      55            
AA2398     17      55            
AA2455     12      50           บรรทัดแรกของ Model ให้ fld3 = fld2
AA2455     13      50           บรรทัดต่อมา ให้ fld3 =fld2+fld3 ที่อยู่ด้านบน
AA2455     14      50            
AA2455     15      55            
AA2455     16      55            
AA2455     17      55            
AA2459     12      50           บรรทัดแรกของ Model ให้ fld3 = fld2
AA2459     13      50           บรรทัดต่อมา ให้ fld3 =fld2+fld3 ที่อยู่ด้านบน
AA2459     14      50            
AA2459     15      55            
AA2459     16      55            
AA2459     17      55            
7 @R10486
table3                    
NAME     MODEL     Fld1     Fld3     
       A     AA2398     12     xxx     query1
       A     AA2398     14     xxx     query1
       A     AA2398     15     xxx     query1
       A     AA2398     16     xxx     query1
       A     AA2398     17     xxx     query1
       B     AA2398     15     xxx     query1
       B     AA2398     16     xxx     query1
       B     AA2398     17     xxx     query1
       C     AA2455     16     xxx     query1
       C     AA2455     18     xxx     query1
       C     AA2455     19     xxx     query1
       D     AA2455     16     xxx     query1
       D     AA2455     17     xxx     query1
       E     AA2459     15     xxx     query1
       E     AA2459     18     xxx     query1
       F     AA2459     12     xxx     query1
       F     AA2459     15     xxx     query1
       F     AA2459     16     xxx     query1

จะมีวิธีการเขียนแบบไหนให้ table3 เอาข้อมูลจาก query1 มาใส่โดยมีเงื่อนไข table3.Model = query1.Model , table3.fld1=query1fld1 , table3.fld3=query1.fld3
และใน 1 Model อาจจะมีพนักงานมากกว่า 1 คนทำชิ้นเท่ากัน

ต้องรบกวนท่าน U&ME และท่านสมาชิกทุกท่านด้วยครับ
ขอบคุณครับ
8 @R10493
มีท่านใด พอช่วยได้บ้างครับ
9 @R10495
ขออนุญาตคุณ U&ME นะครับ ขอแทรกนิดนึง

ผมไม่ได้อ่านรายละเอียดของคำถามนี้นะครับ ไม่ค่อยมีเวลาเท่าไหร่ แค่อ่านผ่านๆตา มันดูใกล้เคียงกับคำถาม http://www.thai-access.com/yeadram_view.php?topic_id=2188 นี้หรือไม่ ลองเอาไปศึกษาดูครับ
10 @R10497
ผมได้ลองเอาไปใช้ดูแล้วครับ work ครับ ก็ไม่ตรงสักเท่าไร แต่ดัดแปลงใช้ได้เลยครับ โดยไม่ต้องเอา table1 ไปคำนวณอีก แต่ใช้ table3 คำนวณจาก table1 ได้เลย
ขอบคุณคุณสันติสุขมากครับ

11 @R10862
ผมกลับมาถามอีกแล้วครับ
ผมมีข้อมูลที่เป็นวันที่ เวลา เรียงตามบรรทัดลงมา sort จากน้อยลงมาหามากจะทำอย่างไรให้หาค่าแตกต่างของเวลาได้ครับ โดยใช้เวลาที่มากกว่าลบตัวที่น้อยกว่าตัวอย่าง เช่น
ในที่นี้เราจะใช้เวลาเป็นหลักโดยอยู่ในขอบเขตของวัน order by ttime

model     ttime     Diff time
AA2398     13:40:47     00:00:00
AA2398     13:40:59     00:00:12
AA2398     13:41:02     00:00:03
AA2398     14:25:28     00:44:26
AA2398     14:25:30     00:00:02
AA2455     14:25:34     00:00:04
AA2455     14:38:11     00:12:37
AA2455     14:38:34     00:00:23

ขอบคุณครับ
12 @R10868
มีแต่เวลา แล้วไม่มีวันที่ด้วยหรือ ? และถ้าไม่มีวันที่ เวลาของวันนี้กับวันอื่นๆจะเรียงออกมาเป็นอย่างไร ?
13 @R10871
ขอบคุณอาจารย์สุภาพครับ ที่แนะนำครับ ความจริงแล้วผมใช่ด้วยครับ
ตามนี้ครับ

MODEL     ttime          Diff time
AA2398     30/08/2011 13:40          0
AA2398     30/08/2011 13:40          ?
AA2398     30/08/2011 13:41          ?
AA2398     30/08/2011 14:25          ?
AA2398     30/08/2011 14:25          ?
AA2455     30/08/2011 14:25          ?
AA2455     30/08/2011 14:38          ?
AA2455     30/08/2011 14:38          ?

ขอบคุณครับ
14 @R10872
เพิ่มใหม่ครับ ครั้งก่อนไม่มี วินาที

model           ttime                         diff time
AA2398     30/08/2011 13:40:47     0
AA2398     30/08/2011 13:40:59     ?
AA2398     30/08/2011 13:41:02     ?
AA2398     30/08/2011 14:25:28     ?
AA2398     30/08/2011 14:25:30     ?
AA2455     30/08/2011 14:25:34     ?
AA2455     30/08/2011 14:38:11     ?
AA2455     30/08/2011 14:38:34     ?     

ขอบคุณครับ
15 @R10876
ขอตัวไปธุระก่อนนะครับ บ่ายๆจะกลับมาตอบ
16 @R10878
จะเห็นได้ว่า MODEL ไม่มีส่วนเกี่ยวข้องกับการหาผลลัพธ์ จะใช้แต่ ttime เป็นหลักเท่านั้น ส่วน diff time นั้นต้องเขียนฟังก์ชันเอาครับ เพราะไม่มี built-in function อะไรที่ให้ผลตรงตามที่ต้องการนี้

ดังนั้นสิ่งแรกคือไปสร้างฟังก์ชั่นใน Module เสียก่อนด้วยโค้ดนี้

Public Function TimeDiff(StartDT As Variant, EndDT As Variant) As String
    Dim SecDiff As Long
    Dim HH      As Integer
    Dim NN      As Integer
    Dim SS      As Integer
    
    If IsNull(StartDT) Then StartDT = EndDT
    
    SecDiff = DateDiff("s", StartDT, EndDT)
    HH = Int(SecDiff / 3600#)
    NN = Int((SecDiff Mod 3600#) / 60#)
    SS = (SecDiff Mod 3600#) Mod 60#
    TimeDiff = Format(HH, "00") & ":" & Format(NN, "00") & ":" & Format(SS, "00")
End Function

ส่วนคำสั่ง SQL Statement ก็เขียนดังนี้

select a.model, a.ttime, TimeDiff((select max(b.ttime) as prevtime from ชื่อเทเบิล as b where b.ttime < a.ttime) ,a.ttime) as difftime
from ชื่อเทเบิล as a
order by a.ttime


เท่านี้เองครับ ลองเอาโค้ดไปไล่ดูนะครับ ไม่เข้าใจตรงไหนก็มาถามแล้วกัน
17 @R10879
เอาฟังก์ชั่นนี้ไปดีกว่า ไม่ลุ่มล่ามเหมือนอันที่เพิ่งเขียนให้ไปครับ แต่ได้ผลลัพธ์เหมือนกัน

Public Function TimeDiff(StartDT As Variant, EndDT As Variant) As String
    Dim HH      As Integer
    Dim NN      As Integer
    Dim SS      As Integer
    
    If IsNull(StartDT) Then StartDT = EndDT
    
    HH = DateDiff("h", StartDT, EndDT)
    NN = DateDiff("n", StartDT, EndDT) Mod 60
    SS = DateDiff("s", StartDT, EndDT) Mod 60
    TimeDiff = Format(HH, "00") & ":" & Format(NN, "00") & ":" & Format(SS, "00")
End Function
18 @R10884
      ขอบคุณ อ.สันติสุข ที่ช่วยปิดกระทู้ให้ (อีกตามเคย)
จริงๆ ผมก็พยามจะตอบเหมือนกันแต่คำถามมัน ^4S$@A=] ยากแก่การเข้าใจ บางคนก็ยกตัวอย่างข้อมูล ตัวอย่างผลลัพธ์ที่ต้องการ (อันนี้ดูง่ายหน่อยไม่ต้องแปลโจทย์) แต่บางคนโจทย์สั้นกระทัดรัด(คิดแต่ว่าตัวเองเข้าใจ) ไอ้คนจะตอบก็ตอบไปสั้น ๆ เหมือนกัน [ก็ไม่ว่ากันครับ "คนไม่รู้" ก็ไม่รู้จะเริ่มถามจากตรงไหน] ยังดีที่ อ.สันติสุข สามารถเข้าใจทุกอณู คนถามก็เลยได้คำตอบ
19 @R10885
      ผมได้ไปลองใช้แล้วครับ ใช้ได้เลยครับ
ขอบคุณอาจารย์สันติสุขมากครับ มีปัญหาอะไรที่เราคิดว่ายากส่งกระทู้มาทีไรก็ได้คำตอบทุกครั้งเลยครับ
และขอบคุณคุณ U&ME ด้วยครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3472s