แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - Mercury

หน้า: [1] 2 3
1
เท่าที่ดูคิวรี่นั้นจากคำถามก่อนๆที่มีใส่ไฟล์ฐานข้อมูลเอาไว้ พอไล่ไป สุดท้ายแล้วก็คือผลรวมของพาเลทเข้า-พาเลทออกจากเทเบิล In และ Out ผมเลยเขียนโค้ดโดยหาจากเทเบิลโดยตรงแทนนะครับ

If Nz(Me![A], "") <> "" Then
    If Not (Left(Me![A], 2) Like "A[MNOP]*") Then
        If Nz(DSum("InPallet", "In", "Place = '" & Me![A] & "'"), 0) _
        - Nz(DSum("OutPallet", "Out", "Place = '" & Me![A] & "'"), 0) >= 1 Then
            MsgBox "พื้นที่เต็ม"
            Cancel = True
        End If
    End If
End If
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

2
โค้ดที่ให้ไป ตรวจสอบเฉพาะจำนวนพาเลทที่กำลังป้อนในเรคอร์ดนั้นๆ แต่เท่าที่อ่านใหม่ เหมือนว่าจำนวน 1 พาเลทนั้น ต้องไปค้นเรคอร์ดอื่นๆที่ป้อนไปก่อนหน้าด้วยใช่ไหมว่าได้ป้อนจำนวนพาเลทเท่าไหร่ไปแล้ว

ถ้าใช่
1. ต้องไปค้นจากเทเบิลไหน
2. ใช้เงื่อนไขอะไร ฟิลด์อะไร เพื่อค้นจากเรคอร์ดอื่นๆบ้าง เช่น ต้องเป็นสถานที่เดียวกัน วันเดียวกัน หรือมีอะไรอย่างอื่นอีกบ้าง   หรือสถานที่เดียวกัน ไม่ว่าจะวันไหนก็ได้   หรือสถานที่เดียวกัน ไม่ว่าวันไหนก็ได้ แต่ยกเว้นวันที่กำลังป้อนอยู่นี้
3. ในสถานที่เดียวกัน วันเดียวกัน ป้อนได้เพียงเรคอร์ดเดียวหรือไม่
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

3
ถ้า Aและ P คือชื่อคอนโทรลบนฟอร์มที่ป้อนรหัสพื้นที่และจำนวนพาเลทตามลำดับ  ให้ใส่โค้ดนี้ไว้ที่ BeforeUpdate event procedure ของ P

If Nz(Me![A], "") <> "" Then
    If Not (Left(Me![A], 2) Like "A[MNOP]*") Then
        If Me![P] > 1 Then
            MsgBox "พื้นที่เต็ม"
            Cancel = True
        End If
    End If
End If
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

4
ทุกฟิลด์ที่เป็นตัวเชื่อมระหว่างเทเบิลต้องมีค่า แต่ฟิลด์ Place, Lot จาก 2 รูปสุดท้ายไม่มีค่า จึงไม่สามารถเชื่อมไปหาเทเบิลอื่นเพื่อเอาฟิลด์มาแสดงได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

5
ห้อง MS Access / : การยกเลิกการ split database
« เมื่อ: 31 มี.ค. 63 , 10:57:53 »
คลิกเมาส์ขวาที่ตารางเป้าหมาย แล้วเลือก Convert to Local Table ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

6
ห้อง MS Access / : Queries
« เมื่อ: 03 ม.ค. 63 , 14:22:32 »
ข้อมูล ของคุณนั้นจะต้อง นำ Place มาเชื่อมความสัมพันธ์ด้วย นะครับ
โดย Lot - Boxes (In) เพิ่มฟิลล์ Place ด้วย คือทุกคิวรี่ที่จะเชื่อมกันต้องมี Place ด้วย ข้อมูลจะได้เป็นกลุ่มที่ถูกต้อง

ตัวอย่างผมนำ  Lot - Boxes (In) กับ Lot - Boxes (Out) มาเชื่อมกัน


ลองไปปรับตรงส่วนนี้ดูครับ


โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

7
ห้อง MS Access / : characters found after end of SQL statement
« เมื่อ: 03 ธ.ค. 62 , 13:39:52 »
สามารถทำได้อยู่แล้วครับ แต่ Place จะมีการซ้ำกันตามจำนวนของสินค้าที่แสดง ของแต่ละ รหัสนะครับ

เช่น place A   รหัสสินค้า A = 10 .............ฯลฯ....................
      place A   รหัสสินค้า B = 5  ..............ฯลฯ...................

เป็นต้น
วิธีการ หา max วันที่ให้ได้แล้ว เอา สินค้าทุกตัวของวันที่นั้นมาแสดงทั้งหมด (แต่ place จะซ้ำกันตามจำนวนสินค้านะครับ)
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

8
ห้อง MS Access / : characters found after end of SQL statement
« เมื่อ: 03 ธ.ค. 62 , 09:19:49 »
ผมแก้ตรงนี้ให้แล้วครับ 1H060001622 จะแสดง ใน Place Am328 ถูกไหมคับ
1H060001620 จะไม่นำมาแสดง
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

9
ห้อง MS Access / : characters found after end of SQL statement
« เมื่อ: 03 ธ.ค. 62 , 08:01:54 »
ลองสร้างคิวรี่ ใส่ sql นี้เข้าไปแล้วดูผลลัพธ์นะครับ
ผมหา ตาราง Customer , Product , Gcas ไม่เจอเลยไม่ได้เพิ่มส่วนนี้ให้นะครับ
ไม่รู้ผมเข้าใจถูกไหมนะครับ

คือ
1. หา Place โดยการ GroupBy ให้เหลือ Place 1 ตัว ถ้าซ้ำกันก็รวมกันให้ไม่ซ้ำ
2. ส่วนการหา Inhouse (จากวันที่ล่าสุด) นำคิวรี่ warehouse - รหัสสินค้า มาเชื่อม ความสัมพันธ์ กับ warehouse - จำนวนสินค้า ตรง Place
แล้วดึง Inhouse มาแสดง

แต่ กรณีที่ Place เดียวกัน แต่มี INHOUSE ไม่เหมือนกันทำยังไงครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

10
ห้อง MS Access / : characters found after end of SQL statement
« เมื่อ: 02 ธ.ค. 62 , 14:09:29 »
Sql 2 ชุดไม่ได้สอดคล้องกันเลยที่จะทำ Union Query เพราะ Sql query warehouse - จำนวนสินค้า นั้นมี 7 คอลัมน์
แต่ Query warehouse - รหัสสินค้า มีแค่ 3 คอลัมน์เท่านั้น

1.ผมเลยสงสัยว่าคุณอยากทำการรวมไปเพื่ออะไร ลักษณะผลลัพธ์ที่ต้องการเป็นแบบไหน
2. จากโค้ด
โค๊ด: [Select]
SELECT T1.*, (select sum(T3.Inboxes) from [In] as T3 where T3.place = T1.place) AS [Sum]
FROM [In] AS T1

WHERE (((T1.date)=(select max(T2.[date]) from [In] as T2 where T2.place = T1.place)));

นี้ ถ้าตัด T1.* ออกก็จะได้ ฟิลล์ Sum มา 1 คอลัมน์ คุณอยากเอาฟิลล์นี้ไปวางไว้ตรงไหนเพราะอาจจะไม่ใช่การ Union แล้วแต่อาจจะเป็นอย่างอื่น

ลองสร้างตัวอย่างผลลัพธ์ ใน Excel ว่าต้องการผลลัพธ์แบบไหน เดี่ยวผมทำให้
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

11
ห้อง MS Access / : characters found after end of SQL statement
« เมื่อ: 02 ธ.ค. 62 , 09:35:03 »
SELECT [Place - Boxes (In)].Place, Nz([SumOfBoxin])+0 AS [จำนวนรับเข้า (ลัง-ห่อ)], Nz([SumOfBoxout])+0 AS [จำนวนจ่ายออก (ลัง-ห่อ)], [จำนวนรับเข้า (ลัง-ห่อ)]-[จำนวนจ่ายออก (ลัง-ห่อ)] AS [จำนวนคงเหลือ (ลัง-ห่อ)], Nz([SumOfPCSin])+0 AS [จำนวนเศษรับเข้า (ชิ้น)], Nz([SumOfPCSout])+0 AS [จำนวนเศษจ่ายออก (ชิ้น)], [จำนวนเศษรับเข้า (ชิ้น)]-[จำนวนเศษจ่ายออก (ชิ้น)] AS [จำนวนเศษคงเหลือ (ชิ้น)]
FROM (([Place - Boxes (In)] LEFT JOIN [Place - Boxes (out)] ON [Place - Boxes (In)].Place = [Place - Boxes (out)].Place) LEFT JOIN [Place - Pcs (In)] ON [Place - Boxes (In)].Place = [Place - Pcs (In)].Place) LEFT JOIN [Place - Pcs (out)] ON [Place - Boxes (In)].Place = [Place - Pcs (out)].Place;U

UNION SELECT T1.*, (select sum(T3.Inboxes) from [In] as T3 where T3.place = T1.place) AS [Sum]
FROM [In] AS T1

WHERE (((T1.date)=(select max(T2.[date]) from [In] as T2 where T2.place = T1.place)));



ลบตรงสีแดงออกครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

12
ห้อง MS Access / : characters found after end of SQL statement
« เมื่อ: 02 ธ.ค. 62 , 09:12:33 »
ลองเปลี่ยนการตั้งชื่อฟิวด์ที่ไม่มีเครื่องหมาย - หรือ ใช้ Underscore _ แทน หรือใช้ภาษาอังกฤษดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

13
ถึงเจ้าของกระทู้ และสวัสดีอาจารย์ทุกๆท่านครับ

ผมไม่แน่ใจว่าใช่ความต้องการของเจ้าของกระทู้นี้หรือเปล่าครับ...เป็น Code ในคิวรี่ ที่อาจารย์ท่านหนึ่งทำใว้ในบอร์ดนี้ แต่ผมจำชื่อไม่ได้ครับ และผมใช้ในการทำสต็อกมากว่า 1 ปี การตัดสต็อกไม่มีความผิดพลาดเลยครับ ผมแนบไฟล์มาด้วยครับ ถ้าไม่ใช่ความต้องการตามหัวข้อกระทู้ต้องขออภัยด้วยครับ

ขอบคุณครับ
   
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

14
ผมไม่ค่อยแน่ใจถึงสิ่งที่ต้องการ  แต่เอาเป็นว่า ถ้าต้องรวมตาม [place] และ [product] เดียวกัน ก็แก้ส่วน sum โดยเพิ่มเงื่อนไข and เข้าไปในส่วนของ where ตามโค้ดข้างล่างนี้ แต่ถ้าต้องมีเงื่อนไขฟิลด์อื่นเพิ่มเติม ก็ทำในลักษณะเดียวกัน คือเพิ่ม and เข้าไปอีกครับ

select T1.*,(select sum(T3.Inboxes) from [In] as T3 where (T3.place = T1.place) and (T3.product = T1.product)) as SumOfBoxin
from [In] as T1
where T1.[date] = (select max(T2.[date]) from [In] as T2 where T2.place = T1.place)

ยังไงก็ทดสอบผลลัพธ์กับข้อมูลเยอะๆ เพื่อดูว่าถูกต้องหรือไม่ด้วย
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

15
เปลี่ยนโหมดคิวรี่จาก Design View ไปเป็น SQL View แล้วเขียนคำสั่งนี้ลงไปแทนครับ

select T1.*, (select sum(T3.Inboxes) from [In] as T3 where T3.place = T1.place) as SumOfBoxin
from [In] as T1
where T1.[date] = (select max(T2.[date]) from [In] as T2 where T2.place = T1.place)
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

16
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

17
คือ
1. สินค้ามีหลายตัวถูกไหมครับ
2. สินค้าแต่ละตัวมีการป้อนข้อมูลหลายครั้งถูกไหมครับ
3. การบันทึกข้อมูลไม่ได้เรียงกันตามวันที่ถูกไหมครับ แต่ข้อมูลที่บันทึกก็มีวันที่ของข้อมูลถูกไหมครับ

การจะรู้ว่ารายการไหนมาก่อนมาหลัง ก็อยู่ที่วันที่หรือเวลา ไม่ได้อยู่ที่รหัสสินค้าครับ เหมือนโลกนี้มีคนชื่อ "สมชาย" อยู่กี่คนไม่รู้ล่ะ การที่จะรู้ว่าสมชายคนไหนเกิดก่อน เกิดหลังก็ดูจากวันเกิด ไม่ได้ดูจากชื่อสมชาย

ดังนั้นคุณทำอย่างไรล่ะ ก็ต้องใช้ DLast หรือไม่ก็ DMax กับข้อมูลวันเกิดของสมชาย ก็จะรู้ว่าสมชายคนไหนเกิดล่าสุด (คืออายุน้อยที่สุด)

ปล. เว็บนี้มีคนชื่อสมชายไหมอะ??

โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

18
ครั้งหน้าอยากให้ตั้งคำถามให้ชัดเจนหน่อยนะครับ

ถ้าคุณต้องการอย่างกระทู้ล่าสุด คุณต้องสร้างคิวรีเพื่อดึงเฉพาะข้อมูลสถานที่มาก่อน 1 คิวรี (สมมติชื่อ qryA) แล้วกำหนดเป็น Unique Value เพื่อกรองเอาข้อมูลที่ Duplicated ออก
จากนั้นก็สร้างคิวรีอีก 1 อัน โดยนำ qryA มาใส่ Code Dlast ของฟิลด์ Date

อันนี้คือหลักการนะครับ ที่เหลือคุณต้องลองเอง
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

หน้า: [1] 2 3