แสดงกระทู้

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 - Earth

หน้า: [1] 2
1
ห้อง MS Access / : สอบถามError import csv fileค่ะ
« เมื่อ: 17 ม.ค. 62 , 20:34:34 »
ตรง VBA Reference ให้เพิ่ม Microsoft Office 1x.x Object Library เข้าไปด้วยครับ

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

2
ห้อง MS Access / : สร้าง QR Code
« เมื่อ: 21 มิ.ย. 61 , 23:46:02 »
ความคิดส่วนตัวผมว่าไม่น่าจะได้นะครับ เพราะฟิลด์ของ MS Access มันจะสามารถกำหนดฟอนต์ได้เพียงอย่างเดียวเท่านั้น ยกเว้นกำหนดให้เป็น Rich Text ซึ่งมันก็คงไม่รองรับกับ QR แบบนี้อีก เลยคิดว่าไม่น่าจะได้นะครับ ต้องเป็นฟอนต์ญึ่ปุ่นทั้งหมด ส่วนเรื่องอื่นผมตอบใน YouTube แล้วนะครับ คิดว่าคงเป็นคนเดียวกันที่ถาม
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

3
ขอบคุณค้า อันแรกทำได้แล้วค่ะ เหลือแสดงวันที่ค่ะ
ทำคิวรี่แรกก่อนแบบนี้ครับ

โค๊ด: [Select]
SELECT format(StockDate,"DD-MMM"), Takein, TakeOut, Balance
FROM StockBefore
UNION SELECT format(StockDate,"DD-MMM"), Takein, TakeOut,  '' as Balance
FROM StockCard;

อันตอนต่อไป กำหนด วันที่ โดยรันวันที่ลงมา ผมใช้ การสร้างตาราง ขึ่นมามี 365 วัน ตัวอย่างคำสั่ง สร้างตารางที่จะเก็บไว้ชื่อ TempDate365 ตั้งชื่อ Field ว่า Stockdate
บน Module
โค๊ด: [Select]
Option Compare Database
Public Sub MakeDate365(Optional ByVal pYear As Integer, _
        Optional ByVal pTable As String = "TempDate365", _
        Optional ByVal pField As String = "Stockdate")
    Dim db As DAO.Database
    Dim dte As Date
    Dim dteLast As Date
    Dim intYear As Integer
    Dim rs As DAO.Recordset
    Dim strMsg As String

On Error GoTo ErrorHandler

    intYear = IIf(pYear = 0, Year(Date), pYear)
    dte = DateSerial(intYear, 1, 1)
    dteLast = DateSerial(intYear, 12, 31)

    Set db = CurrentDb
    Set rs = db.OpenRecordset(pTable, dbOpenTable, dbAppendOnly)

    Do While dte <= dteLast
        rs.AddNew
        rs.Fields(pField).Value = dte
        rs.Update
        dte = dte + 1
    Loop
    rs.Close

ExitHere:
    On Error GoTo 0
    Set rs = Nothing
    Set db = Nothing
    Exit Sub

ErrorHandler:
    strMsg = "Error " & Err.Number & " (" & Err.Description _
        & ") in MakeDate365"
    MsgBox strMsg
    GoTo ExitHere
End Sub



สร้างคิวรี่ใหม่ ชื่อ  StockQuery2
กำหนดค่าดังนี้
โค๊ด: [Select]
SELECT TempDate365.StockDate, IIf(IsNull([Takein]),0,[Takein]) AS Take_in, IIf(IsNull([Takeout]),0,[Takeout]) AS Take_out, (select  [BeforeQty] from [StockBeforeQuery] ) AS Before_Qty
FROM StockQuery RIGHT JOIN TempDate365 ON StockQuery.StockDate = TempDate365.StockDate
WHERE (((TempDate365.StockDate) Between [forms]![Main]![StockBefore] And [forms]![Main]![EndDate]));

ที่คิวรี่ตัวต่อไป ชื่อ StockQuery3
โค๊ด: [Select]
SELECT T1.[Before_Qty]+(select nz(sum(T2.Take_in),0) from StockQuery2 as T2 where  T2.StockDate <= T1.StockDate)-
(select nz(sum(T2.Take_out),0) from StockQuery2 as T2 where T2.StockDate <= T1.StockDate) AS TotalQty, *
FROM StockQuery2 AS T1
ORDER BY T1.StockDate;

ผลลัพท์ที่ได้


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

4
ทำให้เห็นเป็นแนวทางเฉยๆ นะครับ

อาจต้องเขียน VBA หรือใช้คำสั่ง IIF ใน Query เพื่อปรับแต่งการแสดงผล

พอดีจะหายไป 3 วันน่ะครับ เลยอยู่ดูต่อไม่ได้
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

5
ทำคิวรี่แรกก่อนแบบนี้ครับ

โค๊ด: [Select]
SELECT format(StockDate,"DD-MMM"), Takein, TakeOut, Balance
FROM StockBefore
UNION SELECT format(StockDate,"DD-MMM"), Takein, TakeOut,  '' as Balance
FROM StockCard;
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

6
กำหนดตารางขึ้นมาเก็บค่า ตารางชื่อ 4Type โดยอาจจะกำหนด Field ชื่อ Type นะครับ แล้วใส่รายการที่ต้องการนำมากรองไว้ได้เลย

ที่ Criteria ใส่
In (select [Type] from [4Type])

รายการจาก Type ทั้งหมดจะถูกนำมากรองสำหรับคิวรี่นั้นครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

7
เท็กซ์บ็อกซ์ด้านขวา เป็นชื่อ Text... ทั้งนั้นเลย ต้องแก้ให้เป็น Space2,SerialNo,...
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

8
ห้อง MS Access / : สร้าง QR Code
« เมื่อ: 26 พ.ค. 61 , 13:42:56 »
จริงๆแล้วไฟล์ DLL ตัวนี้ ผมใช้กับโปรแกรมอื่นที่รองรับ มันสามารถแสดงเป็นภาษาไทย หรือ ญี่ปุ่นได้หมดนะครับ แต่พอมาใช้กับ MS Access มันกลับใช้ได้แค่ภาษาอังกฤษเท่านั้นครับ ยังไม่ทราบว่าเพราะอะไร สงสัยว่าอาจเป็นที่ตัว VBA ของ MS Access เองครับ
คราวนี้ผมเคยอ่านเจอกระทู้เก่ากระทู้นึงของคุณ kamsuk เป็นโค้ดที่รองรับภาษาญี่ปุ่นได้ ไม่ต้องใช้ไฟล์ไลบารี่หรือฟอนต์ใดๆ เขียนโค้ดอย่างเดียว แต่สามารถใช้กับรายงานเท่านั้น ไม่สามารถแสดงบนฟอร์มได้ ยังไงรองศึกษาดูที่กระทู้นี้ครับ https://www.thai-access.com/yeadram_view.php?topic_id=5576


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

9
น่าจะเป็นแบบนี้ไหมครับ

โค๊ด: [Select]
If  (Type_cmb) = "All" Then
Type_cmb = "*"
 DoCmd.SetWarnings False
 DoCmd.OpenQuery "StockCard"
 DoCmd.OpenForm "ViewStockCard"
 DoCmd.SetWarnings true
else
  DoCmd.SetWarnings False
  DoCmd.OpenQuery "StockCard"
  DoCmd.OpenForm "ViewStockCard"
  DoCmd.SetWarnings true
end if
เราเปลี่ยนแค่ว่าต้องการกำหนดให้ถ้าเป็น ALL ก็ให้แทนค่าใน Combobox เป็น * ครับ ถ้าเป็นรายการอื่นก็ให้รันคิวรี่และเปิดฟอร์มตามปกติ
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

10
ถ้า Type_cmb = "All" มันถึงจะทำ Query StockCard ที่ว่า แต่ถ้า Type_cmb เป็นตัวเลือกอื่นมันก็จะวิ่งมาที่นี่เลย
Else
DoCmd.OpenForm "ViewStockCard"
ก็เลยได้ผลอย่างที่ว่าครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

11
ห้อง MS Access / : สร้าง QR Code
« เมื่อ: 16 พ.ค. 61 , 15:51:06 »
คือจะประมาณว่า ถ้าโปรแกรม MS Access เป็นแบบ
32bit ให้ใช้ไฟล์ QRCode_x86.dll
64bit ให้ใช้ไฟล์ QRCode_x64.dll
ไม่เกี่ยวกับ Windows ครับ Windows จะเป็น 32bit หรือ 64bit ก็ได้ แต่ทว่า โฟลเดอร์ระบบมาตรฐานของ Windows 32bit กับ 64bit มันใช้โฟลเดอร์คนละตัวกันคือ
Windows 32bit เราต้องก๊อปปี้ใส่ในโฟลเดอร์ Windows\system32
Windows 64bit เราต้องกีอปปี้ใส่ในโฟลเดอร์ Windows\sysWOW64

สรุปคือ: ถ้าคุณใช้ MS Access 64bit ให้ก๊อปไฟล์ QRCode_x64.dll ไว้ใน Windows\sysWOW64 ได้เลย (เพราะ Access 64bit ต้องใช้ Windows 64bit อยู่แล้ว) แต่หากคุณใช้ MS Access 32bit ต้องดูว่ารันบน Windows 32bit หรือ 64bit ถ้า Windows เป็น 32bit ก็ใช้ไฟล์ QRCode_x86.dll ก๊อปปี้ใส่ในโฟลเดอร์ Windows\system32 แต่หากรันบน Windows 64bit ก็ก๊อปปี้ไฟล์ QRCode_x86.dll ใส่ในโฟลเดอร์ Windows\sysWOW64 แทนครับ

ปล. จริงๆแล้วมันสามารถเขียนโค้ดให้รัน Dll ไฟล์จากในโฟลเดอร์ที่เรากำหนดได้เลยโดยไม่ต้องไปก๊อปใส่เครื่องให้ยุ่งยาก รวมทั้งฟอนต์ด้วย แต่ต้องใช้การเขียนโค้ดอีก ซึ่งมันจะยืดหยุ่นกว่ามาก ไม่ต้องทั้งเพิ่มฟอนต์ QRCode และ ไฟล์ dll ลงในเครื่องเลย สามารถเรียกรันในโฟลเดอร์เดียวกับฐานข้อมูลเราได้เลย แต่มันต้องเขียนโค้ดอีกพอสมควร ในคลิปที่ผมทำเน้นความง่าย เลยไม่ได้ทำในส่วนนี้ให้ดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

12
ตัดบรรทัดเหล่านี้ออกไป

Set rst = CurrentDb.OpenRecordset("select * from Table2")
numOfRecords = rst.RecordCount

เพราะเหมือนไม่ได้เกี่ยวอะไรกับสิ่งที่ต้องการทำเลย ยกเว้นว่าจะมีการเอา numOfRecords ไปใช้ที่อื่น
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

13
ห้อง MS Access / > Error "The database engine could not lock table"
« เมื่อ: 08 พ.ค. 61 , 17:38:58 »
ตอนรัน Queryขึ้นแจ้งเตือนดังรูปด้านล่าง ซึ่งไม่ได้เปิด Tableดังกล่าว หรือTableใด รวมถึงไม่มีการเปิดฟอร์ม Reportใดๆไว้เลยค่ะ
ในแต่ตอนรันครั้งแรก ระบบเอาข้อมูลจากตารางMonthly_FG ไปใช้ต่ออีกหลายQuery
คิดว่าน่าจะมีProcess ค้างอยู่ แต่ไม่รู้ตรงไหน
เวลาจะรันครั้งที่สอง จึงต้องปิดและเปิดโปรแกรมใหม่ถึงจะสามารถรันได้ปกติ

อยากทราบว่ามีวิธีไหนที่จะเขียนโค้ดดักก่อนว่า ให้เคลียร์หรือปิดProcessทั้งหมดก่อน หรือปิดและเปิดโปรแกรมใหม่ไหมคะ
เพื่อจะได้ไม่มีErrorแบบนี้เกิดขึ้น



พอเออเร่อ สั่ง Compact and Repair  หรือ ซ่อมแซมฐานข้อมูล อาการนี้หายไหมครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

14
ไม่ต้อง Join Table ไม่ต้อง อ้างอิงฟอร์ม ให้กำหนด
Criteria ของ Type2 เป็น
Not In (select [Type] from [Not_FG])
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

15
ห้อง MS Access / > > Update field in table
« เมื่อ: 02 พ.ค. 61 , 21:36:22 »
ลองคำสั่งทั้งสองแบบ ผลลัพธ์ที่ได้มีค่าเหมือนกันเลยค่ะ
แตกต่างกันยังไงหรอคะ

DoCmd.SetWarnings (0)
...คำสั่งที่ใช้
DoCmd.SetWarnings (1)

และ

DoCmd.SetWarnings (0)
...คำสั่งที่ใช้
DoCmd.SetWarnings (-1)

โดยปกติแล้ว Boolean values = (True; False; Yes; No)
เป็นการแสดงค่าสองค่าโดยปกติครับแต่ Access (VBA) ได้เก็บค่าแบบ numeric variables.

ค่าที่กำหนดใช้แสดงค่า True and False หรือ -1 and 0 หรือ ค่าอื่นๆ ที่ต้้งค่าเพื่อให้ตรงข้ามกับอีกค่าหนึ่ง
ที่จริงแล้วสามารถเก็บค่าได้มากกว่า 2 ค่า นี้ครับ เช่น 0 คือ false แล้ว ค่าตัวเลขอื่นๆที่ไม่ใช่ 0 ที่ใส่ไปก็จะเท่า true หมดครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

16
ห้อง MS Access / > Update field in table
« เมื่อ: 02 พ.ค. 61 , 10:33:36 »
DoCmd.SetWarnings False

DoCmd.RunSQL "UPDATE Monthly_FG_Imple_Sum AS M SET M.TOTAL_ActualDay = M.[SumOfSumOfTotal(m2)] + Forms![ชื่อฟอร์ม]!ShippingArea", dbFailOnError

DoCmd.SetWarnings True
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

17
ห้อง MS Access / > Sumค่า Grand Total ใน Report Footer
« เมื่อ: 26 เม.ย. 61 , 15:55:57 »
สร้าง TextBox ขึ้นมาชื่อ SumTotal กำหนดให้
 Control source =[Total Charge]
 Running Sum = Over All
 Visible = No
แล้วเอาไปวางไว้ใน section เดียวกัน หรือใกล้ๆกันกับ Total Charge

แล้วที่ Grand Total กำหนดให้ Control source =[SumTotal]
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

18
ห้อง MS Access / > Update field in table
« เมื่อ: 25 เม.ย. 61 , 20:20:26 »
จากที่บอกมา คุณต้องไม่อัพเดตด้วยตัว Actualday ตรงๆ  เพราะการอ้างถึง Actualday ซึ่งเป็นเท็กซ์บ็อกซ์(หรือจะเป็นคอนโทรลอื่นๆก็ตาม)ในส่วนของ Detail section (ส่วนที่แสดงออกมาในแต่ละบรรทัด) บนฟอร์มที่เป็นแบบ Continuous Form หรือ Datasheet Form จะได้ค่าจากบรรทัด(เรคอร์ด)ปัจจุบันเท่านั้น ซึ่งก็คือบรรทัดที่มีเครื่องหมายลูกศรชี้อยู่ที่ด้านหน้าของบรรทัดนั้น ไม่ใช่ค่าที่เปลี่ยนไปตามแต่ละบรรทัดให้อัตโนมัติอย่างที่คิด ดังนั้นจากการอัพเดตก่อนหน้านี้ จึงได้อัพเดตออกมาเป็นค่าเดียวกันหมด คือ 852

สิ่งที่ต้องทำคือ ต้องอัพเดต TOTAL_ActualDay ด้วยสูตรที่ใช้สร้าง Actualday อีกที ถ้าเข้าใจไม่ผิด ก็จะเป็น SumOfSumOfTotal(m2) + Forms![ชื่อฟอร์ม]!ShippingArea และ ShippingArea จะเป็นค่าเดียวกันทุกบรรทัด

ดังนั้น UPDATE Query ที่ควรจะเป็นก็คือ

DoCmd.RunSQL "UPDATE Monthly_FG_Imple_Sum AS M SET M.TOTAL_ActualDay = M.[SumOfSumOfTotal(m2)] + Forms![ชื่อฟอร์ม]!ShippingArea", dbFailOnError
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

หน้า: [1] 2