แสดงกระทู้

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 ... 10 11 12 [13] 14 15 16 ... 29
217
Dim TSDYYMM As String
Dim MaxRunNo As Integer

TSDYYMM = "TSD-" & Format([txt_LoanDate], "yymm")
MaxRunNo = Val( Right( Nz(DMax("[Loan_No]", "[Tb_Loan]", "[Loan_No] Like '" & TSDYYMM & "*'"),"0"),3 )  )
txt_LoanNo = TSDYYMM  & Format(MaxRunNo + 1, "000")

218
อ้างถึง
txt_LoanNo = "TSD" & Format([txt_LoanDate], "yymm") & Right("000" & DCount("[Loan_No]", "[Tb_Loan]", "Left([Loan_No],4) = Format([txt_LoanDate],'yymm')") + 1, 3)

ใช่ครับ โค้ดข้างบนนี้จะเริ่มให้ค่า 1 เมื่อเป็นเดือนใหม่ ถ้าต้องการให้ +1 ในปีนั้นไปเรื่อยๆจนกว่าจะเป็นปีใหม่ ก็ต้องเป็น
อ้างถึง
txt_LoanNo = "TSD" & Format([txt_LoanDate], "yymm") & Right("000" & DCount("[Loan_No]", "[Tb_Loan]", "Left([Loan_No],2) = Format([txt_LoanDate],'yy')") + 1, 3)
แต่ผมว่าดูแปลกๆไม่สัมพันธ์กับเลขหลัง TSD หรือเปล่า เพราะพอเดือนใหม่ เลขหลัง TSD ก็เป็น ปีและเดือน ถัดไป แต่เลขรันนิ่งยังเป็นเลขต่อจากเดือนที่แล้ว เช่น ในเดือน 8 มีเลขรันจาก TSD1908001 ถึง TSD1908123 แต่เลขแรกของเดือน 9 เป็นเลข TSD1909124  แต่ไม่ว่ายังไงก็ตาม การใช้ DCount ค่อนข้างไม่ถูกต้อง เพราะมันเป็นการนับจำนวน อย่างเดือน 8 มีเลขที่สมมุติข้างบน  ถ้าเรายังอยู่ในเดือน 8 และมี 1 เรคอร์ดที่ถูกลบไป   พอสร้างเลขต่อไป  Dcount ก็จะนับได้ทั้งหมดเหลือ 122 เลข พอบวก 1 ก็จะได้เลขถัดไปเป็น TSD1908123 ซึ่งซ้ำกับเลขเดิมแน่ๆ

จริงๆ รูปแบบที่ต้องการเป็นอย่างไร และพอขึ้นเดือนต่อไปจะได้เป็นอะไร ยกตัวอย่างให้เห็นเลยครับ

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

220
auto run ของคุณคือฟิลด์ที่มีข้อมูลเป็นประเภท Autonumber หรือว่าคุณเขียนโค้ดเพื่อสร้างเลข Loan No. เอาเองครับ

221
ห้อง MS Access / : Access + mysql แสดงข้อความ #DELETE
« เมื่อ: 21 ส.ค. 62 , 15:14:22 »
ในข้อ 3 ผมไม่แน่ใจว่าเขาหมายถึงกำหนด Primary Key ของลิงค์เทเบิลที่อยู่บน Access เองอีกครั้งหรือเปล่า

222
ผมลองเอาโค้ดสั้นๆของผมทดสอบผ่านการทำงานของหน้าเวปของเขาเอง ก็ทำได้ดีเหมือนกัน แต่ไม่รู้มีข้อจำกัดอะไรแค่ไหน

223
ผมไม่เคยใช้นะ ลองดูแล้วกันครับ  https://www.automateexcel.com/vba/code-formatter/

224
ห้อง MS Access / : อยากได้วิธีสร้าง logfile
« เมื่อ: 19 ส.ค. 62 , 22:39:42 »
ผมผิดแล้ว กรณีการใช้เทเบิล สามารถสร้าง Data Macro เพื่อบันทึกเหตุการณ์ได้ แต่รายละเอียดนี่ไม่ทราบ ยังไม่เคยใช้เลย ท่านใดที่รู้ช่วยตอบแทนด้วย

UPDATE : เท่าที่ทดลองถึงตอนนี้ คิดว่าบันทึก log ได้เมื่อมีการเพิ่ม/แก้ไข/ลบข้อมูลในเทเบิล แต่น่าจะไม่มี event ที่เกิดจากการอ่านข้อมูล ดังนั้นการจะบันทึกว่ามีการอ่านข้อมูลเกิดขึ้น ยังคงต้องหาตำแหน่งที่เหมาะสมในโค้ดของเราเองครับ

226
- คิวรี่นี้ซับซ้อนเสียหน่อย ถ้าเขียนจริงๆคงจะเป็น SELECT ซ้อนกัน 3 ชั้น แต่เพื่อให้ดูง่าย(หรือเปล่าไม่รู้)และคงการใช้ DCount() เอาไว้ ก็จะออกมาเหลือ 2 ชั้น
- ในนี้ผมสมมุติให้ชื่อเทเบิลว่า TB และชื่อฟิลด์ว่า dt,status,type คุณไปเปลี่ยนเองแล้วกัน
- ผมเขียนเพื่อให้ดูสะอาดตาขึ้นโดยขึ้นบรรทัดใหม่ แต่สามารถนำเอามาต่อกันโดยมีช่องว่างคั่นสักตัวนึงก็ได้นะครับ เช่น บรรทัดที่ 1 และ 2 สามารถเขียนเป็น SELECT [Month-Year], Inprogress, Complete, [Inprogress]+[Complete] AS Total, ก็ได้
โค๊ด: [Select]
SELECT
[Month-Year], Inprogress, Complete,
[Inprogress]+[Complete] AS Total,
Format([Complete]/([Inprogress]+[Complete])*100,"0.00") AS [% Complete]
FROM
(SELECT Format([dt],"mmm-yyyy") AS [Month-Year],
First(Month([dt])) AS M,
First(Year([dt])) AS Y,
First(Val(DCount("*","TB","Status = '2' and Type = '1' and (month(dt) = " & Month([dt]) & ") and (year(dt) = " & Year([dt]) & ") "))) AS Inprogress,
First(Val(DCount("*","TB","Status = '1' and Type = '1' and (month(dt) = " & Month([dt]) & ") and (year(dt) = " & Year([dt]) & ") "))) AS Complete
FROM TB
GROUP BY Format([dt],"mmm-yyyy"))  AS Q1

ORDER BY Y, M;

227
ห้อง MS Access / : อยากได้วิธีสร้าง logfile
« เมื่อ: 18 ส.ค. 62 , 17:11:16 »
ใช้ฟังก์ชั่น Environ("username") เพื่ออ่านค่า Windows User
ใช้ฟังก์ชั่น Environ("computername") เพื่ออ่านชื่อเครื่อง
การเก็บ log ก็สามารถทำได้ทั้งสร้างเทเบิลไว้เก็บข้อมูลการใช้งาน แล้วก็สั่งเขียนลงเทเบิลเหมือนทั่วๆไปนี่แหล่ะครับ หรือจะเขียนลงเท็กซ์ไฟล์ก็ได้โดยใช้โค้ด

' #1 คือเลขที่ของไฟล์ที่เรากำหนดเอาเอง (อาจเป็น #7 #23 หรือเลขอะไรก็ได้) ใช้เพื่ออ้างอิงสำหรับคำสั่งอื่นๆที่ทำกับไฟล์นี้
open "drive:\path\...\file.txt" for append as #1
write #1, "ข้อความ", ตัวแปร, ...
close #1

ส่วนที่บอกว่าเรียกใช้ไฟล์หรือเทเบิลอะไรนั้น ตัว Access ไม่มี event อะไรที่ดักจับตรงจุดนี้ให้ คุณต้องหา event ที่เหมาะสมที่เป็นจุดของการใช้ไฟล์เหล่านั้นเอง

228
- ถ้าสามารถรีโมทเข้าไปใช้เครื่องของตัวเองที่ บ. ได้ ก็ใช้โปรแกรมเช่น Team Viewer, VNC ก็ได้
- หรือถ้ามี license ของตัว Remote Desktop Service ของ Windows ก็น่าจะได้เหมือนกัน (ผมไม่เคยใช้)

230
สร้างเป็น Relationship ด้วยครับ เพราะจะได้ประโยชน์โดยอัตโนมัติคือ จะป้อนเลขที่ใบยืมลงในใบคืนได้ เลขยืมนั้นต้องมีอยู่จริงแล้ว และจะไม่สามารถลบใบยืมได้ถ้าเลขที่ใบยืมยังปรากฏอยู่ในใบคืนด้วย

231
ให้ครอบชื่อที่มีช่องว่างด้วยเครื่องหมาย [  ] ครับ 

232
ถ้าแค่เอามาเพื่อดู หรือออกรายงาน ก็ให้ทำ Linked-Table จากเทเบิลที่ต้องการของทั้ง 3 ไฟล์  เข้ามาในไฟล์ที่สร้างฟอร์ม  สร้าง UNION Query ที่เป็นการรวมเรคอร์ดจากเทเบิลเหล่านั้นเข้าด้วยกัน แล้วเอาคิวรี่นี้ไปใช้เป็น RecordSource ของฟอร์ม/รายงานก็ได้ครับ  ตย. https://www.thai-access.com/yeadram_view.php?topic_id=475

233
ผมแนะนำว่าควรมีการบันทึกในใบคืนของ ว่าเป็นการคืนมาจากการยืมเลขที่อะไรด้วย (สมมุติชื่อฟิลด์คือ Loan_no) ถ้าเพิ่มได้ คิวรี่นี้ก็เปลี่ยนเงื่อนไขที่ WHERE เป็น (Asset ถูกยืมไปแล้ว) และ (ไม่พบใบคืนที่มีเลขที่ยืมอันเดียวกันนี้ปรากฏอยู่)

WHERE ((Tb_Assets.Asset_Status=False)
     AND NOT EXISTS (SELECT Tb_Return.Loan_No FROM Tb_Return WHERE Tb_Return.Loan_No = Tb_Loan.Loan_No);



หรือไม่ต้องเช็คสถานะของ Asset เลยก็ได้ เป็น

WHERE NOT EXISTS (SELECT Tb_Return.Loan_No FROM Tb_Return WHERE Tb_Return.Loan_No = Tb_Loan.Loan_No);

เพราะตามตรรกะของระบบแล้ว แน่นอนว่าของที่มีใบยืม แต่ไม่มีเลขที่ใบยืมอยู่ในใบคืนใดๆเลย ก็คือของที่ Asset_Status เป็น False นั่นเอง แต่มัน **อาจจะ** ทำให้การค้นหาช้าลงเมื่อมีข้อมูลการยืม/คืนอยู่เป็นจำนวนมาก (ที่บอกว่า อาจจะ เพราะถ้าอยากทราบจริงๆ ต้องขุดลึกลงไปว่าตัวจัดการคิวรี่ (Query Optimizer) มันฉลาดหรือทื่อๆแค่ไหนกับคำสั่งคิวรี่นั้นๆ)

234
ลองดูแนวคิดที่คุณ PichaiTC ตอบใน https://www.thai-access.com/yeadram_view.php?topic_id=2436

หน้า: 1 ... 10 11 12 [13] 14 15 16 ... 29