ยกมา-รับ-จ่าย-คงเหลือ
กระทู้เก่าบอร์ด อ.Yeadram

 7,256   16
URL.หัวข้อ / URL
ยกมา-รับ-จ่าย-คงเหลือ



จากรูป
เป็นมุมมองของ Query ที่ดึงมาจากตาราง ตัวหนังสือสีแดง คือสิ่งที่ผมอยากได้
คือฟิลด์คงเหลือ และถ้าทำได้แล้ว ผมก็จะทำรายงานออกมาเลือก ช่วงวันที่อีก
จึงต้องเพิ่ม ฟิลด์ ยกมา แต่ตอนนี้ อยากได้วิธีทำ ฟิลด์ balance ก่อน ผมลองค้น
จากที่อ่านมา ได้มาประมาณนี้

balance: (SELECT Sum(q.munit) FROM Query1 AS q WHERE q.mfcode = Query1.mfcode;)

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

ลบกวนอาจารย์ด้วยครับ

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

1 @R15432
โพสรูปแล้วรูปมันเล็ก คลิกเข้าไปมันไม่ใช่ ทำยังงัยดี

ทดสอบโพสรูป
2 @R15434
คงเหลือ ลองใช้ QueryRunningSum ดูครับ

3 @R15445
โอเค ได้แล้วครับ
อ.polo โค๊สที่โพส ก็น่าจะเรียก QueryRunningSum มั้งครับ
ผมไม่กล้าเรียก กลัวผิด แต่ลองทำอยู่เป็นวันมัน Error
วันนี้ลองทำรายงานตัวอื่นอยู่ มัน Erro เหมือนกัน ทั้งที่ วิธีการคนละเรื่องกัน
เลยสังเกตุ จุดต่าง ได้ความว่า Query เริ่มต้น เป็น Cosstab query
โดยออกแบบใหม่โดยไม่ Cosstab สรุปว่าได้ ตามโค๊สที่โพสไว้เลยครับ
แค่ใส่ Where เข้าไปอีกหน่อย

ขอบพระคุณทุกท่านครับ
4 @R15446
ตัวอย่าง ยกมา-รับ-จ่าย-คงเหลือ
ผมสร้างตารางชื่อ Table1 โดยมีฟิลด์ดังนี้:
ชื่อสินค้า = รายชื่อสินค้าที่มีทั้งหมด
วันที่รับ-จ่าย = วันที่รับสินค้าเข้า และจ่ายสินค้าออก
รับเข้า = จำนวนที่รับเข้าสต๊อก
จ่ายออก = จำนวนที่ตัดออกจากสต๊อก

- โดยตัวอย่างมีสินค้าอยู่ 2 ชนิด คือ Product(A) และ Product(B) ในบางวันก็มีการนำเข้าของสินค้า และในบางวันก็มีการจ่ายออกของสินค้า และในบางวันก็อาจทั้งจ่ายออกและนำเข้าสินค้า โดยมีข้อมูลตารางดังนี้

ชื่อสินค้า วันที่รับ-จ่าย รับเข้า จ่ายออก
Product(A) 7/1/2013      10
Product(A) 8/1/2013               2
Product(B) 8/1/2013       3
Product(B) 8/1/2013               1
Product(A) 10/1/2013              1
Product(B) 11/1/2013      2
Product(A) 14/1/2013              1
Product(A) 14/1/2013      4
Product(B) 14/1/2013      5       6
Product(B) 16/1/2013      3
Product(A) 16/1/2013              4
Product(B) 21/1/2013      2
Product(A) 22/1/2013      6
Product(A) 23/1/2013              5


ไว้เดี๋ยวเขียนต่อครับ พอดีมีงานด่วน
5 @R15447
ขอบคุณครับ อ.TTT แบบของ อ.TTT อาจจะทำให้เร็วขึ้น อยากได้แนวคิดแปลกๆ เพิ่มด้วยครับ
6 @R15450
แบบย่อเลยนะครับ
- จากนั้นก็เขียน SQL ประมาณนี้ครับ

SELECT A.[ชื่อสินค้า], A.[วันที่รับ-จ่าย] AS [วันที่รับ-จ่าย], (SELECT NZ(Sum(รับเข้า)) - NZ(Sum(จ่ายออก)) FROM Table1 AS B WHERE A.[วันที่รับ-จ่าย] > B.[วันที่รับ-จ่าย] AND A.ชื่อสินค้า = B.ชื่อสินค้า) AS ยกมา, Sum(A.[รับเข้า]) AS รับ, Sum(A.[จ่ายออก]) AS จ่าย, [ยกมา]+Nz([รับ])-Nz([จ่าย]) AS คงเหลือ
FROM Table1 AS A
WHERE (A.[วันที่รับ-จ่าย])>=(SELECT Min([วันที่รับ-จ่าย]) FROM Table1 AS B)
GROUP BY A.[ชื่อสินค้า], A.[วันที่รับ-จ่าย]
ORDER BY A.[ชื่อสินค้า], A.[วันที่รับ-จ่าย];

- ก็จะได้การ ยกมา-รับ-จ่าย-คงเหลือ

ชื่อสินค้า วันที่รับ-จ่าย ยกมา รับ จ่าย คงเหลือ
Product(A) 7/1/2013    0       10               10
Product(A) 8/1/2013   10               2        8
Product(A) 10/1/2013   8               1        7
Product(A) 14/1/2013   7        4      1        10
Product(A) 16/1/2013 10               4        6
Product(A) 22/1/2013   6        6               12
Product(A) 23/1/2013 12               5        7
Product(B) 8/1/2013    0        3      1        2
Product(B) 11/1/2013   2        2               4
Product(B) 14/1/2013   4        5      6        3
Product(B) 16/1/2013   3        3                 6
Product(B) 21/1/2013   6        2               8

- แนวคิดมาจากกระทู้นี้ครับ
http://www.thai-access.com/yeadram_view.php?topic_id=3052
นำมาปรับใช้ดูแล้วกันนะครับ
7 @R15451
ปล. จริงๆแล้วมันเป็นลักษณะการทำ RunningSum อย่างที่คุณ Polo แนะนำครับ ข้อเสียคือ หากข้อมูลมีจำนวนมากมันจะช้า จึงควรใช้การออกแบบสรุปเป็นรายเดือนน่าจะดีกว่าครับ
8 @R15452
ตอนี้ Query ทำได้แล้วเปิดได้แล้วครบถ้วน ติดตอนนำไปใส่ใน Report
มันขึ้น Erroe อย่างนี้ Multi-level GROUP BY clause is not allowed in a subquery

ผมทำ Group เพื่อที่จะหาผลรวม ของสินค้า มัน Error แต่ถ้าไม่ Group มันก็จะออกได้

ผมกลับไปดูงานเก่าๆ มันก็ Group ได้ แต่ทำไมงานนี้ไม่ได้ T T

อ.ท่านใดพอจะบอกแนวทาง ให้ปรับเปลี่ยนตรงไหนได้มั่งครับ
9 @R15453
ปกติ Report จะไม่ยอมทำ Group ให้ หากมีการใช้งานแบบสอบถามย่อย subquery ปัญหาดูเหมือนยาก แต่เราสามารถแก้ไดัด้วยการใส่
SELECT * FROM (...) AS [TTT];

เช่น จากตัวอย่างก็จะเป็น

SELECT *
FROM(
SELECT A.[ชื่อสินค้า], A.[วันที่รับ-จ่าย] AS [วันที่รับ-จ่าย], (SELECT NZ(Sum(รับเข้า)) - NZ(Sum(จ่ายออก)) FROM Table1 AS B WHERE A.[วันที่รับ-จ่าย] > B.[วันที่รับ-จ่าย] AND A.ชื่อสินค้า = B.ชื่อสินค้า) AS ยกมา, Sum(A.[รับเข้า]) AS รับ, Sum(A.[จ่ายออก]) AS จ่าย, [ยกมา]+Nz([รับ])-Nz([จ่าย]) AS คงเหลือ
FROM Table1 AS A
WHERE (A.[วันที่รับ-จ่าย])>=(SELECT Min([วันที่รับ-จ่าย]) FROM Table1 AS B)
GROUP BY A.[ชื่อสินค้า], A.[วันที่รับ-จ่าย]
ORDER BY A.[ชื่อสินค้า], A.[วันที่รับ-จ่าย]) AS [TTT];

แล้วลองทำ Group ในรายงานใหม่ดูครับ ก็จะไม่ฟ้อง Multi-level GROUP BY clause is not allowed in a subquery แล้วครับ
10 @R15454
ยังไม่ได้ครับอาจารย์ คราวนี้ขึ้น

Invalid argument to funtion.
11 @R15455
ตอนแรกที่ไม่ได้ เพราะลองใช้กับ Query ที่ทำเอง
แต่พอไม่ได้จริงๆ เลย ลอง Reviwe ของ อ.TTT อีกครั้ง
โอ้วววว พระเจ้า ได้แล้วคราบบบ 5555

ขอบพระคุณอาจารย์ TTT มากครับ ขอเมลอาจารย์หน่อยครับ
Un_Da@hotmail.com
12 @R15524
อ.TTT ครับ ถ้า ตัดวันที่ออก ให้รายงานออกเป็น
ชื่อสินค้า      ยกมา   รับ   จ่าย   คงเหลือ
Product(A)    0      10    10        0
Product(B)   10       2      8        4
Product(C)    8        1      7        2
Product(D)    7        4      1        10
Product(E)   10       4       6        8
Product(F)    6        6      12       0

จะปรับเปลี่ยน Query ตรงไหนยังงัยครับ
13 @R15526
ทดลองนำ Query ที่ได้จากการทำครั้งแรกที่มีวันที่ มาทำ Query ใหม่
โดยดึง ซื่อสินค้า และคงเหลือมา Group By และ Last ผลที่ออกมาก็ได้
ในแบบที่ต้องการ แต่ไม่น่าจะเป็นวิธีที่ถูก เพราะเท่ากับ โปรแกรมต้อง
คำนวน 2 ต่อ และรายการสินค้า จะไม่ออกมาทั้งหมด จะออกแต่สอนค้าที่
ที่มีในรายการ ตามวันที่เลือกเท่านั้น
14 @R15528
ผมไม่แน่ใจว่ามันเป็นวิธีคิดที่ถูกต้องหรือเปล่านะครับ เพราะการยกยอดมามันน่าจะต้องมีอะไรอ้างให้รู้ว่าอะไรก่อนหลัง แต่หากอยากได้อย่างที่ยกตัวอย่างตารางมาให้ดู ก็แค่ตัดเงื่อนไขที่เกี่ยวกับวันที่ออกให้หมดก็จะได้แบบตัวอย่างตารางที่คุณต้องการแล้วครับ

SELECT A.[ชื่อสินค้า], (SELECT NZ(Sum(รับเข้า)) - NZ(Sum(จ่ายออก)) FROM Table1 AS B WHERE A.ชื่อสินค้า = B.ชื่อสินค้า) AS ยกมา, Sum(A.[รับเข้า]) AS รับ, Sum(A.[จ่ายออก]) AS จ่าย, [ยกมา]+Nz([รับ])-Nz([จ่าย]) AS คงเหลือ
FROM Table1 AS A
GROUP BY A.[ชื่อสินค้า]
ORDER BY A.[ชื่อสินค้า];

ลองดูครับ

ปล. ช่วงนี้ผมอาจไม่ค่อยว่างตอบนะครับ มีปัญหากับชีวิตค่อนข้างเยอะ ยังไงหาก อาจารย์ท่านใดพอมีเวลาแนะนำ ช่วยต่อยอดได้เลยนะครับ
15 @R15543
ใช้ได้ดีเลยครับ ขอบพระคุณอย่างสูงครับ
16 @R18090
สมาชิกใหม่คับ
ขอความรู้จากท่านอาจารย์หน่อยคับ
ถ้ามี lot ด้วยเขียนอย่างไรดีจึงจะรู้ยอดคงเหลือแต่ละ
Lotคับ

ชื่อสินค้า     Lot No        วันที่รับ-จ่าย ยกมา รับ    จ่าย   คงเหลือ
Product(A)       A1            7/1/2013    0     10               10
Product(A)       A2           8/1/2013   10               2        8
Product(A)       A1           10/1/2013   8               1        7
Product(A)       A2           23/1/2013 12               5        7
Product(B)       B1            8/1/2013    0       3      1        2
Product(B)       B1            11/1/2013   2       2               4
Product(B)       B2            14/1/2013   4       5      6        3


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