แสดงกระทู้

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 - สันติสุข

หน้า: 1 ... 23 24 25 [26] 27 28 29
451
ผมจะตั้งกระทู้ ได้อย่างไงครับ พยายามหาวิธีอยู่น่ะครับ

ไปที่ห้องที่ต้องการ แล้วคลิกปุ่ม "เริ่มหัวข้อใหม่"

452
ห้อง MS Access / > > Update field in table
« เมื่อ: 25 เม.ย. 61 , 17:01:25 »
DoCmd.RunSQL "UPDATE Monthly_FG_Imple_Sum SET [Monthly_FG_Imple_Sum].TOTAL_ActualDay = Forms![Monthly_FG_Imple_Sum]!Actualday , dbFailOnError"

เอาออกแล้วError ค่ะ

เงื่อนไขคือวันที่ วันที่ในForm =วันที่ในตามรางค่ะ

ต้องเป็น ...day" , dbFailOnError  ไม่ใช่ ...day , dbFailOnError"

453
ฟิลด์ที่มี Data Type เป็น Number หรือ Currency  เมื่อจะนำข้อมูลเข้าก็ต้องเป็นค่าตัวเลขไม่ก็เป็นคำว่า NULL จะเป็น SPACE หรือ Zero-Length String ไม่ได้ อย่างเช่นที่คุณเขียนว่า Nz(Me![Bill_VAT_Total], "") ถ้า [Bill_VAT_Total] ไม่มีค่า ก็จะกลายเป็น "" ไป คำสั่ง SQL ในส่วนนั้นก็จะออกมาเป็น ... , , ...  ซึ่งการเว้นว่างไม่มีค่าอะไรเลยระหว่างเครื่องหมาย , นั้น ไม่ถูก Syntax ครับ

454
ห้อง MS Access / > Update field in table
« เมื่อ: 25 เม.ย. 61 , 11:10:23 »
DoCmd.RunSQL "UPDATE Monthly_FG_Imple_Sum SET [Monthly_FG_Imple_Sum].TOTAL_ActualDay = Forms![ชื่อฟอร์ม]!Actualday WHERE [Monthly_FG_Imple_Sum].Date = Forms![ชื่อฟอร์ม]!Date", dbFailOnError

455
ห้อง MS Access / > สอบถามการQuery คำนวนค่า
« เมื่อ: 19 เม.ย. 61 , 17:07:21 »
หลักๆก็คือ อย่าเอาวันที่ที่ผ่าน Format$(  ) มาสร้างเป็นเทเบิล  ในคำตอบที่ #13 ที่บอกว่าคิวรี่ที่ 2 ให้ใส่ Format$( ) เราก็ไม่ต้องใส่ เพราะเราจะนำเอาคิวรี่นี้ไปสร้างเทเบิลอีกที  คุณก็เลือกฟิลด์วันที่ตรงๆไปใช้สร้างแทน ถ้าต้องการแสดง วว-ดดด ก็ให้ทำเมื่อจะแสดงผลลัพธ์จากคิวรี่สุดท้ายที่อ่านจากเทเบิลที่สร้างมาใหม่ครับ


456
ห้อง MS Access / > สอบถามการQuery คำนวนค่า
« เมื่อ: 19 เม.ย. 61 , 14:53:29 »
อ่านแล้วไม่เข้าใจเลยครับ

1. หนูเอาQueryที่ได้มา...  คิวรี่ไหน
2. เพราะข้อมูลแสดงช้ามาก ... น่าเป็นเพราะเทเบิลไม่ได้สร้าง index ซึ่งประกอบด้วยฟิลด์ที่อยู่ใน WHERE ครับ
3. อยากทราบว่า สามารถนำโค้ดที่อาจารย์ทำ มาเพิ่มตรงส่วนไหนของsqlนี้คะ  ... ไม่เข้าใจว่าที่ผมตอบไปก่อนหน้า โค้ดอะไรตรงส่วนไหนที่สัมพันธ์กับคิวรี่ที่เขียนมาใหม่นี้
4. ต้องการให้ Order by Date และType2 ค่ะ โดยเรียงวันเดือนตามรูปแบบ 1-Feb> ..... 2-Mar ... ก็สั่ง ORDER BY Monthly_FG.Date,  Monthly_FG.Type2 เท่านั้นครับ แต่ฟิลด์ Date ต้องมี Data Type เป็น DATE ครับ

457
ห้อง MS Access / > สอบถามการQuery คำนวนค่า
« เมื่อ: 18 เม.ย. 61 , 15:47:09 »
คิวรี่ที่1 ไม่ต้องมี Format( )  ให้มาใส่ในคิวรี่ที่ 2 ที่ผมบอกไปครั้งล่าสุด

458
ห้อง MS Access / > สอบถามการQuery คำนวนค่า
« เมื่อ: 18 เม.ย. 61 , 14:34:19 »
ฟิลด์ Date ใน StockMonthly_query อย่าไปกำหนดรูปแบบนะครับ มันต้องการ Data Type เป็น DATE ถ้าไปกำหนดรูปแบบแล้ว มันมีความเป็นไปได้ที่จะมี Data Type เป็น TEXT จะทำให้การเรียงข้อมูลทำตามแบบ TEXT แทน

ส่วนถ้าต้องการแสดงเป็น วัน-เดือน ค่อยมาสร้างฟิลด์ ที่ไปกำหนดรูปแบบใน SQL เพิ่มเติม เป็น Select ...+...-...,  Format$(T1.DATE, " dd-mmm") As FormatD., * From ...

459
ตัดออกให้เหลือ GROUP BY sales_order.Date เท่านั้นครับ

460
ใช้ DMAX แทน DLAST ครับ

461
การนำข้อมูลที่มี Data Type เป็น Date จาก Recordset ไปใส่ลงในเอ็กซ์เซลชีทในเซลที่ถูกกำหนดรูปแบบการแสดงเป็น Custom (รูปแบบที่ผู้ใช้กำหนดเอง เช่นอาจต้องการให้แสดงวันที่ 1 มกราคาม 2561 เป็น "จันทร์ 1 ม.ค. 61") ด้วยคำสั่ง CopyFromRecordset method สำหรับ Range object (เป็น Excel object) จะทำให้เซลนั้นจะถูกเซ็ท format กลับมาเป็นชื่อ Date เสมอ ต้องกำหนดรูปแบบของเซลอีกครั้งด้วย NumberFormat property  แต่ถ้าใส่ค่าลงไปตรงๆด้วย Value property จะไม่เกิดเหตุการณ์แบบนี้

โค้ดตัวอย่างที่ทำให้เกิดเหตุการณ์
โค๊ด: [Select]
    Dim xlApp   As Object
   
    Dim DB      As DAO.Database
    Dim RS      As DAO.Recordset
   
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    xlApp.Workbooks.Open "C:\Temp\Example.xlsx"
   
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("select PMU2_StartDT from PMU2")
    xlApp.ActiveSheet.Range("C3").CopyFromRecordset RS
    RS.Close

ภาพเซลที่มีรูปแบบตามที่ผู้ใช้กำหนดเอง

462
ห้อง MS Access / > สอบถามการQuery คำนวนค่า
« เมื่อ: 11 เม.ย. 61 , 14:01:17 »
คุณไปลองทดสอบดูผลลัพธ์นะครับว่าถูกต้องหรือไม่

ที่ตำแหน่งสีแดง เราเปลี่ยนแหล่งข้อมูลจากเทเบิล T ธรรมดาๆที่เรียกในชื่อ T1  มาเป็น T ที่เพิ่มฟิลด์วันที่น้อยที่สุดของสินค้าตัวเดียวกันโดยเรียกชื่อว่า MinD และเรียกรวมทั้งหมดเป็น T1 เหมือนเดิม

ส่วนการจัดเรียงในตำแหน่งสีฟ้า ก็แทรก MinD เข้าเป็นฟิลด์แรกสุดของ Ordered By ของเดิมครับ

SELECT T1.BFQty
+(select nz(sum(T2.InQty),0) from T as T2 where T2.ItemCD = T1.ItemCD and T2.D <= T1.D)
-(select nz(sum(T2.OutQty),0) from T as T2 where T2.ItemCD = T1.ItemCD and T2.D < T1.D) AS TotalQty, *
FROM (SELECT T2.*, (SELECT MIN(T3.D) FROM T AS T3 WHERE T3.ItemCD = T2.ItemCD) as MinD FROM T AS T2) AS T1
ORDER BY T1.MinD, T1.ItemCD, T1.D;


463
ห้อง MS Access / > > สอบถามการQuery คำนวนค่า
« เมื่อ: 10 เม.ย. 61 , 17:37:30 »
ข้อมูลแยกตามItemID ค่ะ และลำดับวันที่ก่อน ไปหลัง
ตามรูปใหม่ด้านล่างค่ะ



งั้นตามคิวรี่ที่ผมให้ไปก็ควรจะให้ผลลัพธ์ที่ถูกต้องแล้วครับ

464
ห้อง MS Access / > สอบถามการQuery คำนวนค่า
« เมื่อ: 10 เม.ย. 61 , 17:06:02 »
ชักงง ข้อมูลเรียงตามอะไรกันแน่ ดูเหมือนผลรวมจะไม่สนใจว่าเป็นสินค้าตัวไหน (ที่ลงท้ายด้วย 21-P, 31-P, 41-P ใช่หรือไม่) และลำดับวันที่ก่อนหลังเลย !!!

465
ห้อง MS Access / > สอบถามการQuery คำนวนค่า
« เมื่อ: 10 เม.ย. 61 , 16:46:57 »
สมมุติเทเบิล T มีฟิลด์รายการสินค้า ItemCD, วันที่ D, ยอดยกมา BFQty, จำนวนรับเข้าในวันนั้น InQty, จำนวนจ่ายออกในวันนั้น OutQty  และมี Primary Key เป็น ItemCD, D

คิวรี่คือ
SELECT T1.BFQty+(select nz(sum(T2.InQty),0) from T as T2 where T2.ItemCD = T1.ItemCD and T2.D <= T1.D)-(select nz(sum(T2.OutQty),0) from T as T2 where T2.ItemCD = T1.ItemCD and T2.D < T1.D) AS TotalQty, *
FROM T AS T1
ORDER BY T1.ItemCD, T1.D;

ความหมายคือ

T1.BFQty
ยอดยกมา

+ (select nz(sum(T2.InQty),0) from T as T2 where T2.ItemCD = T1.ItemCD and T2.D <= T1.D)
+ ผมรวมของจำนวนรับเข้าสำหรับสินค้าเดียวกันตั้งแต่วันแรกจนถึงวันนั้น (วันของเรคอร์ดนั้น)

(select nz(sum(T2.OutQty),0) from T as T2 where T2.ItemCD = T1.ItemCD and T2.D < T1.D)
-  ผมรวมของจำนวนจ่ายออกสำหรับสินค้าเดียวกันตั้งแต่วันแรกจนถึงก่อนวันนั้น (วันของเรคอร์ดนั้น)

ที่ต้องใส่ฟังก์ชั่น nz( ) เพราะถ้าผลรวมนั้นไม่มีมาก่อน เช่นจำนวนจ่ายออกของวันที่น้อยกว่าวันแรก ซึ่งไม่มีค่า จะไม่ใช่ศูนย์ แต่เป็น NULL ซึ่งพอเอามาคำนวนกับค่าอื่นแล้ว จะให้ผลลัพธ์ซึ่งก็คือช่อง TotalQty ของเรคอร์ดนั้นเป็น NULL ไปด้วย ดังนั้นถ้าต้องการให้เป็นศูนย์ เราจึงต้องใส่ฟังก์ชั่น nz(... , 0) เพื่อแปลงค่า NULL เป็นศูนย์แทน

466
ถ้าไม่มีเชื่อมเทเบิลอื่นต่อไปอีกแล้ว ก็ไม่ต้องมีคำว่า UNION ALL ปิดท้ายครับ

467
เวลาเราดีบักโปรแกรม โค้ดจะหยุดรันเมื่อถึงบรรทัดที่ตั้ง break point ไว้ ปกติเมื่อกดคีย์ F8 โค้ดก็จะทำงานต่อไปหนึ่งบรรทัดและหยุดรอเราว่าจะให้ทำอะไรต่อไป แต่บางกรณีที่โค้ดนั้นเขียนเพื่อโปรแกรมการทำงานของ Excel เช่น

1410              xlSheet.Cells(wR, wxlOut_ColIDLine) = wRS!PMU2_ID
1420              xlSheet.Cells(wR, wxlOut_ColStartDT) = wRS!PMU2_StartDT
1430              xlSheet.Cells(wR, wxlOut_ColMatCD) = wRS!PMU2_MATCD

สมมุติว่าตั้ง break point ไว้ที่บรรทัด 1410  พอโค้ดหยุดแล้ว และเรากดคีย์ F8  แทนที่โค้ดจะหยุดที่บรรทัด 1420  ปรากฏว่าโค้ดจะไม่หยุด และทำงานต่อไปตามปกติ ถ้าอยากให้หยุดที่บรรทัด 1420 ก็ต้องตั้ง break point ไว้ที่นั่นอีกบรรทัด แต่จะไม่เกิดปัญหานี้ในโค้ดที่ควบคุมการทำงานของ Access เอง สาเหตุเป็นปัญหาทางเทคนิคของตัว VBA เอง วิธีแก้ก็คือให้แก้ไข Registry ในระบบวินโดว์ตามลิงค์นี้ครับ http://www.contextures.com/excelvbatips.html#f8 (ดูในส่วน F8 Key Stops Working)

หมายเหตุ : ปัญหานี้สามารถเกิดได้เมื่อเขียน VBA ภายในตัวโปรแกรม Excel เองโดยตรงด้วย

468
ให้ตาราง A ชื่อ TA มีฟิลด์ชื่อ DateA
ให้ตาราง B ชื่อ TB มีฟิลด์ชื่อ DateB และ Output
ให้ตาราง C ชื่อ TC มีฟิลด์ชื่อ DateC และ Output
...

ให้สร้างคิวรี่ชื่อ JoinOutput ซึ่งมี SQL เป็น
SELECT TA.DateA, TB.Output, "OutputB" AS HeadName FROM TA LEFT JOIN TB ON TA.DateA = TB.dateB
UNION ALL
SELECT TA.DateA, TC.Output, "OutputC" AS HeadName FROM TA LEFT JOIN TC ON TA.DateA = TC.dateC
UNION ALL
...

ให้สร้างคิวรี่ชื่อ FinalOutput ซึ่งมี SQL เป็น
TRANSFORM Sum(JoinOutput.Output) AS SumOfOutput
SELECT JoinOutput.DateA
FROM JoinOutput
GROUP BY JoinOutput.DateA
PIVOT JoinOutput.HeadName;

รัน FinalOutput ก็จะได้ผลลัพธ์ที่ต้องการครับ

หน้า: 1 ... 23 24 25 [26] 27 28 29