กระทู้เก่าบอร์ด อ.Yeadram
7,896 25
URL.หัวข้อ /
URL
สอบถามข้อมูลจากท่านอาจาร์ย yeadram และท่านผู้รู้ทุ
อ้างอิงจาก :: http://www.thai-access.com/yeadram_view.php?topic_id=391
ผมได้ส่งไฟล์ไปทางเมล์ของบอร์ดแล้วน่ะครับ
จากกระทู้ที่อ้างอิง ผมได้ทำการแก้ไขเรียบร้อยตามที่ต้องการแล้วครับ และตอนนี้มี requirement เข้ามาเพิ่มครับ คือ
1. ต้องการให้มีระบบรักษาความปลอดภัย คือ มี user แค่หนึ่งหรือที่กำหนดไว้สามารถแก้ไขข้อมูลทั้งหมดได้ ส่วน user ที่ไม่ได้กำหนดไว้ทำได้แค่ดูอย่างเดียวครับ
===> แนวคิดผมก็คือ สร้างตาราง user ขึ้นมาเพิ่มไว้ และกำหนดเงื่อนไขด้วยการ if..then ตอนที่ form_load ครับ ไม่ทราบถูกหรือไม่
2. ต้องการระบบรายงานโดยใช้เงื่อนไขตามที่ต้องการ (frmreport1) จากในรูปครับ
จะให้ user เลือก ประเภทของการจัดเรียงข้อมูลใน รายงาน โดยมี ฝ่ายงาน รายชื่อ และ วันที่เริ่มงาน (starting_date) และให้ใส่รายละเอียดที่ต้องการใน textbox16 ที่อยู่โดดๆ ระหว่างตัวเลือกทั้งสองครับ ต่อไปให้เลือกประเภทของ license และให้ใส่วันหมดอายุที่ต้องการ และเมื่อกดปุ่มจะโชว์รายงานออกมาตามที่ใส่เงื่อนไขไว้
===> ปัญหาคือ ผมไม่ทราบว่าจะใส่เงื่อนไขอย่างไร เคยลองแกะจากตัวอย่างโปรแกรม แล้วนำมาใช้งาน ปรากฎว่าไม่มีข้อมูลขึ้นตามที่ต้องการเลยครับ
3. มีทางไมครับ ที่จะให้มีคำอธิบายตัวเลือกใน combo-box โดยปกติถ้าไม่มีการเลือกก็จะไม่มีคำอธิบายขึ้นมา แต่พอมีการเลือกหรือ focus ไปจะมีคำอธิบายขึ้นมา พอไม่มีการโฟกัส คำอธิบายก็จะหายไป
4. ถ้าจะ export ข้อมูลไปยัง excel โดยเราสามารถกำหนดเงื่อนไขที่จะทำการ export เฉพาะข้อมูลที่ตรงกับเงื่อนไขที่ระบุ
ผมได้ส่งไฟล์ไปทางเมล์ของบอร์ดแล้วน่ะครับ
จากกระทู้ที่อ้างอิง ผมได้ทำการแก้ไขเรียบร้อยตามที่ต้องการแล้วครับ และตอนนี้มี requirement เข้ามาเพิ่มครับ คือ
1. ต้องการให้มีระบบรักษาความปลอดภัย คือ มี user แค่หนึ่งหรือที่กำหนดไว้สามารถแก้ไขข้อมูลทั้งหมดได้ ส่วน user ที่ไม่ได้กำหนดไว้ทำได้แค่ดูอย่างเดียวครับ
===> แนวคิดผมก็คือ สร้างตาราง user ขึ้นมาเพิ่มไว้ และกำหนดเงื่อนไขด้วยการ if..then ตอนที่ form_load ครับ ไม่ทราบถูกหรือไม่
2. ต้องการระบบรายงานโดยใช้เงื่อนไขตามที่ต้องการ (frmreport1) จากในรูปครับ
จะให้ user เลือก ประเภทของการจัดเรียงข้อมูลใน รายงาน โดยมี ฝ่ายงาน รายชื่อ และ วันที่เริ่มงาน (starting_date) และให้ใส่รายละเอียดที่ต้องการใน textbox16 ที่อยู่โดดๆ ระหว่างตัวเลือกทั้งสองครับ ต่อไปให้เลือกประเภทของ license และให้ใส่วันหมดอายุที่ต้องการ และเมื่อกดปุ่มจะโชว์รายงานออกมาตามที่ใส่เงื่อนไขไว้
===> ปัญหาคือ ผมไม่ทราบว่าจะใส่เงื่อนไขอย่างไร เคยลองแกะจากตัวอย่างโปรแกรม แล้วนำมาใช้งาน ปรากฎว่าไม่มีข้อมูลขึ้นตามที่ต้องการเลยครับ
3. มีทางไมครับ ที่จะให้มีคำอธิบายตัวเลือกใน combo-box โดยปกติถ้าไม่มีการเลือกก็จะไม่มีคำอธิบายขึ้นมา แต่พอมีการเลือกหรือ focus ไปจะมีคำอธิบายขึ้นมา พอไม่มีการโฟกัส คำอธิบายก็จะหายไป
4. ถ้าจะ export ข้อมูลไปยัง excel โดยเราสามารถกำหนดเงื่อนไขที่จะทำการ export เฉพาะข้อมูลที่ตรงกับเงื่อนไขที่ระบุ
25 Reply in this Topic. Dispaly 2 pages and you are on page number 1
2 @R01780
สวัสดีครับ ขอบคุณครับสำหรับคำแนะนำ ผมได้ลองไปทำแล้ว มีข้อขัดข้องดังนี้ครับ
1. ผมได้ลองสร้างตาราง user โดยให้มีฟิลด์ edit ซึ่งเป็นฟิลด์ yes/no โดยถ้าเป็น yes ก็คือสามารถ edit ได้แต่ถ้าเป็น no ก็จะสามารถดูได้อย่างเดียว
=======>>> ปัญหาก็คือ ถ้าผมทำให้ฟอร์ม login ขึ้นมาตอนแรกเลยหรือว่าให้ทำตอนที่ user ได้ทำการกดปุ่มแก้ไขข้อมูลในหน้าฟอร์ม และอีกเรื่องครับ คือ access สามารถจำได้หรือเปล่าครับ ว่าตอนนี้ user คนนี้ login เข้ามาด้วย user ไหน
2. ผมได้ลองไปทำ ดังที่ท่าน yeadram แนะนำแล้ว โดยโค้ดที่ผมเขียนคือ
ปัญหาก็คือ เมื่อผมติ๊กเลือก frame ตรงช่อง starting-date มันฟ้อง error ดังนี้ครับ
และเมื่อผมได้ใส่ค่าลงไปใน textbox ข้างใต้คำว่า ใส่วันหมดอายุที่ต้องการ ผมได้ให้มันเก็บไว้ใน ตัวแปรแบบสตริงชื่อว่า datee ตาม code นี้ datee = "([dateexpire] = cdate(" & txtdate & "))" และได้นำมันมาต่อกับเงื่อนไขเดิม (sq) ดังนี้ sq = sq & " And " & datee และพอกดปุ่มแล้วปรากฎว่ามันขึ้นมาเป็นหน้ารายงานเปล่าครับ
3. ความต้องการในข้อนี้คือ คล้ายๆกับว่ามันมี tooltip ขึ้นมาประมาณนั้นอ่ะครับ แต่ผมไม่ทราบว่าทำอย่างไรครับ
4. DAO คืออะไรครับ ???
และตามตัวอย่างที่ท่าน yeadram แนะนำมา ผมต้องทำการสร้าง table "tmpExcel" ขึ้นมาก่อน โดยให้มีฟิลด์หมดทุกฟิลด์ของ ฐานข้อมูลนี้ หรือเปล่าครับ เนื่องจาก เงื่อนไขในการ export ไม่ได้ fix ไว้ครับ สามารถมีเหตุผลได้อิสระตามที่ user ต้องการครับ
===== ขอบคุณครับ =====
1. ผมได้ลองสร้างตาราง user โดยให้มีฟิลด์ edit ซึ่งเป็นฟิลด์ yes/no โดยถ้าเป็น yes ก็คือสามารถ edit ได้แต่ถ้าเป็น no ก็จะสามารถดูได้อย่างเดียว
=======>>> ปัญหาก็คือ ถ้าผมทำให้ฟอร์ม login ขึ้นมาตอนแรกเลยหรือว่าให้ทำตอนที่ user ได้ทำการกดปุ่มแก้ไขข้อมูลในหน้าฟอร์ม และอีกเรื่องครับ คือ access สามารถจำได้หรือเปล่าครับ ว่าตอนนี้ user คนนี้ login เข้ามาด้วย user ไหน
2. ผมได้ลองไปทำ ดังที่ท่าน yeadram แนะนำแล้ว โดยโค้ดที่ผมเขียนคือ
Private Sub Command18_Click()
Dim sq As String
Dim datee As String
Select Case frmCriteria
Case 1
sq = "([section] like '*" & txtbox & "*')"
Case 2
sq = "([name] like '*" & txtbox & "*')"
Case 3
sq = "([starting-date] = cdate(" & txtbox & "))"
End Select
datee = "([dateexpire] = cdate(" & txtdate & "))"
sq = sq & " And " & datee
If frmlicense = 1 Then
DoCmd.OpenReport "rptequity1", acPreview, , sq
ElseIf frmlicense = 2 Then
DoCmd.OpenReport "rptfuture1", acPreview, , sq
End If
End Sub
ปัญหาก็คือ เมื่อผมติ๊กเลือก frame ตรงช่อง starting-date มันฟ้อง error ดังนี้ครับ
และเมื่อผมได้ใส่ค่าลงไปใน textbox ข้างใต้คำว่า ใส่วันหมดอายุที่ต้องการ ผมได้ให้มันเก็บไว้ใน ตัวแปรแบบสตริงชื่อว่า datee ตาม code นี้ datee = "([dateexpire] = cdate(" & txtdate & "))" และได้นำมันมาต่อกับเงื่อนไขเดิม (sq) ดังนี้ sq = sq & " And " & datee และพอกดปุ่มแล้วปรากฎว่ามันขึ้นมาเป็นหน้ารายงานเปล่าครับ
3. ความต้องการในข้อนี้คือ คล้ายๆกับว่ามันมี tooltip ขึ้นมาประมาณนั้นอ่ะครับ แต่ผมไม่ทราบว่าทำอย่างไรครับ
4. DAO คืออะไรครับ ???
และตามตัวอย่างที่ท่าน yeadram แนะนำมา ผมต้องทำการสร้าง table "tmpExcel" ขึ้นมาก่อน โดยให้มีฟิลด์หมดทุกฟิลด์ของ ฐานข้อมูลนี้ หรือเปล่าครับ เนื่องจาก เงื่อนไขในการ export ไม่ได้ fix ไว้ครับ สามารถมีเหตุผลได้อิสระตามที่ user ต้องการครับ
===== ขอบคุณครับ =====
3 @R01783
ตอบ
1. คุณต้องการรู้ว่าใครออนไลน์อยู่ ขณะนี้ ให้ดูตัวอย่างระบบ แล้วเอาไปปรับปรุงเอาครับ ผมจำไม่ได้ว่าใครเขียนไว้ แต่ผมรวบรวมมาไว้ ลองโหลดลงมาดู เป็นแนวทางนะครับ วิธีเข้าโหลด อ่านตามกระทู้นี้ครับ http://www.thai-access.com/yeadram_view.php?topic_id=24
2. รูปแบบวันที่ของคุณ มันเป็น text หรือ string ที่ VBA มันไม่รู้จัก มีทั้ง ขีด มีทั้ง จุด ฟังก์ชั่น cDate() มันแปลงค่าออกมาไม่ได้ มันก็ส่งต่อให้ SQL ไปแบบผิดๆ
เมื่อ SQL มันรับมาผิดๆ มันก็ทำงานต่อไม่ได้ คุณต้องเพิ่มงานเข้าไป เอาเครื่องหมายเหล่านั้นออก หรือจัดการให้มันอยู่ในรูปแบบวันที่ ที่ VBA รู้จักก่อน (มีหลายรูปแบบมาก แต่ไม่ใช่แบบนี้ เช่น yyyy - MM - dd หรือ dd/mm/yy เป็นต้น)
3. ในมุมมองออกแบบ เลือกพร็อพเพอตี้ ของ คอมโบใส่ Tooltiptext เข้าไปครับ
4. - DAO คืออะไร? ผมใช้เป็นครับ แต่ผมไม่ได้เรียนพื้นฐานมา อธิบายคงผิดๆ ถูกๆ ต้องเปิดเป็นกระทู้ใหม่ แล้วให้ อาจารย์ท่านอื่นมาอธิบายแล้วครับ
- SQL statement รูปแบบนี้ คือ คิวรี่แอคชั่น สร้างตาราง มันจะสร้างตารางของมันเองครับ แม้จะมีตารางชื่อเดียวกันอยู่ก่อนหน้า มันก็จะลบทิ้ง แล้วสร้างของมันมาใหม่ครับ ไม่ต้องไปสร้างให้มัน จำนวนฟิลด์ และชนิดข้อมูลของแต่ละฟิลด์ จะปรับปรุงอัตโนมัติจากแหล่งข้อมูลต้นทางของ statement ครับ
1. คุณต้องการรู้ว่าใครออนไลน์อยู่ ขณะนี้ ให้ดูตัวอย่างระบบ แล้วเอาไปปรับปรุงเอาครับ ผมจำไม่ได้ว่าใครเขียนไว้ แต่ผมรวบรวมมาไว้ ลองโหลดลงมาดู เป็นแนวทางนะครับ วิธีเข้าโหลด อ่านตามกระทู้นี้ครับ http://www.thai-access.com/yeadram_view.php?topic_id=24
2. รูปแบบวันที่ของคุณ มันเป็น text หรือ string ที่ VBA มันไม่รู้จัก มีทั้ง ขีด มีทั้ง จุด ฟังก์ชั่น cDate() มันแปลงค่าออกมาไม่ได้ มันก็ส่งต่อให้ SQL ไปแบบผิดๆ
เมื่อ SQL มันรับมาผิดๆ มันก็ทำงานต่อไม่ได้ คุณต้องเพิ่มงานเข้าไป เอาเครื่องหมายเหล่านั้นออก หรือจัดการให้มันอยู่ในรูปแบบวันที่ ที่ VBA รู้จักก่อน (มีหลายรูปแบบมาก แต่ไม่ใช่แบบนี้ เช่น yyyy - MM - dd หรือ dd/mm/yy เป็นต้น)
3. ในมุมมองออกแบบ เลือกพร็อพเพอตี้ ของ คอมโบใส่ Tooltiptext เข้าไปครับ
4. - DAO คืออะไร? ผมใช้เป็นครับ แต่ผมไม่ได้เรียนพื้นฐานมา อธิบายคงผิดๆ ถูกๆ ต้องเปิดเป็นกระทู้ใหม่ แล้วให้ อาจารย์ท่านอื่นมาอธิบายแล้วครับ
- SQL statement รูปแบบนี้ คือ คิวรี่แอคชั่น สร้างตาราง มันจะสร้างตารางของมันเองครับ แม้จะมีตารางชื่อเดียวกันอยู่ก่อนหน้า มันก็จะลบทิ้ง แล้วสร้างของมันมาใหม่ครับ ไม่ต้องไปสร้างให้มัน จำนวนฟิลด์ และชนิดข้อมูลของแต่ละฟิลด์ จะปรับปรุงอัตโนมัติจากแหล่งข้อมูลต้นทางของ statement ครับ
4 @R01785
DAO มันก็คือไลบรารี่ที่เป็นมาตรฐานอันหนึ่งที่ Microsoft ทำขึ้นเพื่อใช้ติดต่อกับฐานข้อมูลครับ ผมเคยมีอธิบายเรื่อง DAO ไว้คร่าวในนี้ http://www.thai-access.com/yeadram_view.php?topic_id=118
5 @R01798
สวัสดีครับ
ผมมีคำถามย่อยต่างหากครับ คือว่า access มีคำสั่ง Checkpermission อยู่ในโปรแกรมแล้วหรือเปล่าครับ เนื่องจากผมได้ไปทำการศึกษาโปรแกรมตัวอย่างตามที่ท่าน yeadram แนะนำมา โดยในตัวโปรแกรมนั้น เมื่อมีการเรียกใช้งานฟอร์ม จะมีการเรียกใช้ฟังก์ชั่นนี้ขึ้นมา โดยที่ผมพยายามหาคำสั่งนี้แล้วแต่ยังไงก็หาไม่เจอครับ
อีกอย่างครับ ค่าของฟิลด์ที่เป็น yes/no จะให้ค่ากลับมาเป็น integer หรือว่ายังไงครับ แล้วเราจะทำการ check ได้ยังไงว่า มีการตอบว่า yes หรือ no
ขอบคุณครับ
ผมมีคำถามย่อยต่างหากครับ คือว่า access มีคำสั่ง Checkpermission อยู่ในโปรแกรมแล้วหรือเปล่าครับ เนื่องจากผมได้ไปทำการศึกษาโปรแกรมตัวอย่างตามที่ท่าน yeadram แนะนำมา โดยในตัวโปรแกรมนั้น เมื่อมีการเรียกใช้งานฟอร์ม จะมีการเรียกใช้ฟังก์ชั่นนี้ขึ้นมา โดยที่ผมพยายามหาคำสั่งนี้แล้วแต่ยังไงก็หาไม่เจอครับ
อีกอย่างครับ ค่าของฟิลด์ที่เป็น yes/no จะให้ค่ากลับมาเป็น integer หรือว่ายังไงครับ แล้วเราจะทำการ check ได้ยังไงว่า มีการตอบว่า yes หรือ no
ขอบคุณครับ
6 @R01800
ข้อ 2 ที่ท่าน yeadram แนะนำหมายถึงว่าให้ผม trim ออกหรือครับ แล้วเราจะเปลี่ยนลักษณะข้อความที่อินพุตเข้ามาได้อย่างไร และ ต้องเปลี่ยนรูปแบบของ ฟิลด์ ที่จะแสดงข้อมูลในรายงานด้วยหรือเปล่าครับ
7 @R01803
ตอบ R01798
- ผมขอไปเปิดตามดูก่อนนะครับ ผมเคยเปิดผ่านๆ ครั้งหนึ่ง แต่นานมาแล้ว เลยจำไม่ได้ว่า ที่คุณพูดถึงนั่นมันอะไร ตรงไหน
- ค่าของฟิลด์ yes/no คืนค่ามาเป็น interger ครับ ถูกต้อง -1 กับ 0
ตอบ R01800
ต้นทางมันมาจากไหน มันมาจาก textbox ที่ให้ user กรอกหรือเปล่า?
Case 3
sq = "([starting-date] = cdate(" & txtbox & "))"
- ถ้าให้ user กรอกต้องดัก ต้องควบคุมรูปแบบการกรอก
- ถ้า textbox ตัวนี้ได้ค่ามาจากแหล่งอื่น ค่าจากแหล่งอื่นนั้น ต้องปรับเปลี่ยน
- การที่คุณใช้ รูปแบบเดือน ตัวย่อไทย มันแปลงกลับเป็นตัวเลขได้ง่ายหรือเปล่า หรืออาจต้องเขียนฟังชั่นแปลงกลับเอาเอง ถึงจะได้ หรือ
- ถ้าไม่อยากเขียนตัวแปลงกลับ ให้ดูดีๆ ว่า แหล่งข้อมูลของรายงาน (คิวรี่ หรือ ตาราง) เก็บข้อมูลวันที่ อยู่ในรูปแบบใด ถ้าเก็บเหมือนๆ กันนี้ (คือมีทั้งขีด มีทั้งจุด) ให้ลองไปเปลี่ยน operator ในโค้ด จาก เท่ากับ ไปเป็น like ดูครับ และไม่ต้องสนใจแปลงค่าด้วย cDate อีกแล้ว
Case 3
sq = "([starting-date] Like '" & txtbox & "')"
- ผมขอไปเปิดตามดูก่อนนะครับ ผมเคยเปิดผ่านๆ ครั้งหนึ่ง แต่นานมาแล้ว เลยจำไม่ได้ว่า ที่คุณพูดถึงนั่นมันอะไร ตรงไหน
- ค่าของฟิลด์ yes/no คืนค่ามาเป็น interger ครับ ถูกต้อง -1 กับ 0
ตอบ R01800
ต้นทางมันมาจากไหน มันมาจาก textbox ที่ให้ user กรอกหรือเปล่า?
Case 3
sq = "([starting-date] = cdate(" & txtbox & "))"
- ถ้าให้ user กรอกต้องดัก ต้องควบคุมรูปแบบการกรอก
- ถ้า textbox ตัวนี้ได้ค่ามาจากแหล่งอื่น ค่าจากแหล่งอื่นนั้น ต้องปรับเปลี่ยน
- การที่คุณใช้ รูปแบบเดือน ตัวย่อไทย มันแปลงกลับเป็นตัวเลขได้ง่ายหรือเปล่า หรืออาจต้องเขียนฟังชั่นแปลงกลับเอาเอง ถึงจะได้ หรือ
- ถ้าไม่อยากเขียนตัวแปลงกลับ ให้ดูดีๆ ว่า แหล่งข้อมูลของรายงาน (คิวรี่ หรือ ตาราง) เก็บข้อมูลวันที่ อยู่ในรูปแบบใด ถ้าเก็บเหมือนๆ กันนี้ (คือมีทั้งขีด มีทั้งจุด) ให้ลองไปเปลี่ยน operator ในโค้ด จาก เท่ากับ ไปเป็น like ดูครับ และไม่ต้องสนใจแปลงค่าด้วย cDate อีกแล้ว
Case 3
sq = "([starting-date] Like '" & txtbox & "')"
8 @R01819
ขอบคุณครับสำหรับคำแนะนำเรื่องรายงาน ต่อไปผมยังติดอยู่สองเรื่องคือ
1. เรื่อง สิทธิ์การแก้ไขข้อมูล ผมได้ศึกษาตามที่ท่าน yeadram แนะนำแล้ว ผมได้ลองเขียนตาม โดยการประกาศ โมดูล ดังนี้
โดยตาราง จะมีอยู่สองตารางคือ
tbluser (ฟิลด์ UserName เป็น PK)
tblpermission (ฟิลด์ UserID เป็น PK)
โดยมีฟิลด์ UserID เป็น คีย์นอกของทั้งสองตาราง
และในฟอร์ม frmLogin
และในฟอร์ม frmAdd1 ผมได้ใส่คำสั่งตรง form_load ดังนี้ครับ
แต่ปรากฎว่า พอผม login โดยใช้ user ใดก็ตามทั้งที่ไม่ใช่ admin และใช่ admin ปรากฎว่า มันสามารถเพิ่มข้อมูลได้หมดครับ ผมเลยงงตรงที่ว่าค่า return จากฟิลด์ yes/no เป็น Boolean หรือ Integer ซึ่งผมได้ลองทำโดยการเปลี่ยน Adm เป็น Integer ผลที่ได้คือเหมือนกัน ช่วยอธิบายหน่อยน่ะครับ ขอบคุณครับ
2. เรื่องการ export ข้อมูลจากคำแนะนำของท่าน yeadram ผมได้ลองทำเรียบร้อยแล้ว แต่ปรากฎว่าเกิดปัญหาตรงที่เกิดจากการความต้องการที่จะเลือก export ออกไปหมายถึงฟิลด์อ่ะครับ ซึ่งผมได้ลองทำเป็น check boxed โดยที่ประกาศ string ขึ้นมา 1 ตัว เพื่อเก็บค่าที่ต้องการและนำไปใช้ในคำสั่ง select into ดังโค้ดข้างล่างครับ
ผลที่ได้คือ คือ เกิด error ว่า The Select statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation in incorrect ซึ่งผมพอจับได้ว่า มีการสะกดผิดหรือผิดพลาด ซึ่งผมงงครับ แหะๆ ช่วยอธิบายหน่อยครับ ขอบคุณครับ
1. เรื่อง สิทธิ์การแก้ไขข้อมูล ผมได้ศึกษาตามที่ท่าน yeadram แนะนำแล้ว ผมได้ลองเขียนตาม โดยการประกาศ โมดูล ดังนี้
Option Compare Database
Option Explicit
Global LogOnID As Byte 'ใช้เก็บ UserID จาก tblUser ของผู้ที่ Logon
Global LogOnPassword As String 'ใช้เก็บ UserPass จาก tblUser ของผู้ที่ Logon
Global Adm As Boolean 'ใช้เก็บสิทธิ์ของแอดมิน
โดยตาราง จะมีอยู่สองตารางคือ
tbluser (ฟิลด์ UserName เป็น PK)
tblpermission (ฟิลด์ UserID เป็น PK)
โดยมีฟิลด์ UserID เป็น คีย์นอกของทั้งสองตาราง
และในฟอร์ม frmLogin
Private Sub ¤ÓÊÑè§2_Click()
On Error GoTo err_¤ÓÊÑè§2_Click
Dim strPass As String
Dim strSecret As String
Dim strPassWord As String
Dim LogOnName As String
strSecret = "ป๋าคอม"
strPassWord = DLookup("UserPass", "tblUser", "UserName = [Text1]")
strPass = EncryptDecrypt(strPassWord, strSecret)
If text2 = strPass Then
LogOnID = DLookup("UserID", "tbluser", "UserName = '" & [text1] & "'") 'à¡çº¤èÒ UserID
LogOnUserName = DLookup("UserName", "tbluser", "UserID = " & LogOnID)
LogOnPassword = strPass
Adm = DLookup("admin", "tblpermission", "UserID = " & LogOnID)
End If
'**************************************************
DoCmd.OpenForm "frmAdd1", acNormal, , , acFormEdit, acWindowNormal
DoCmd.Close acForm, "frmLogin", acSaveNo
และในฟอร์ม frmAdd1 ผมได้ใส่คำสั่งตรง form_load ดังนี้ครับ
Private Sub Form_Load()
If Adm = False Then
DoCmd.SetWarnings False
DoCmd.GoToRecord , , acNewRec
Else
MsgBox "คุณไม่มีสิทธิ์แก้ไขข้อมูล"
DoCmd.Close acForm, "frmAdd1"
End If
End Sub
แต่ปรากฎว่า พอผม login โดยใช้ user ใดก็ตามทั้งที่ไม่ใช่ admin และใช่ admin ปรากฎว่า มันสามารถเพิ่มข้อมูลได้หมดครับ ผมเลยงงตรงที่ว่าค่า return จากฟิลด์ yes/no เป็น Boolean หรือ Integer ซึ่งผมได้ลองทำโดยการเปลี่ยน Adm เป็น Integer ผลที่ได้คือเหมือนกัน ช่วยอธิบายหน่อยน่ะครับ ขอบคุณครับ
2. เรื่องการ export ข้อมูลจากคำแนะนำของท่าน yeadram ผมได้ลองทำเรียบร้อยแล้ว แต่ปรากฎว่าเกิดปัญหาตรงที่เกิดจากการความต้องการที่จะเลือก export ออกไปหมายถึงฟิลด์อ่ะครับ ซึ่งผมได้ลองทำเป็น check boxed โดยที่ประกาศ string ขึ้นมา 1 ตัว เพื่อเก็บค่าที่ต้องการและนำไปใช้ในคำสั่ง select into ดังโค้ดข้างล่างครับ
Private Sub check_name_Click()
If IsNull(text) Then
text = "id"
Else
text = text & ",id"
End If
End Sub
Private Sub Command10_Click()
Dim sq As String
sq = "Select " & text & " INTO tmp FROM QryAll"
DoCmd.RunSQL sq
'DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "tmp", "Test12345.xls"
text = ""
End Sub
ผลที่ได้คือ คือ เกิด error ว่า The Select statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation in incorrect ซึ่งผมพอจับได้ว่า มีการสะกดผิดหรือผิดพลาด ซึ่งผมงงครับ แหะๆ ช่วยอธิบายหน่อยครับ ขอบคุณครับ
9 @R01820
การออกแบบ
ถ้าให้ UserID ของตาราง tblUser เป็น PK
ก็ไม่จำเป็นต้องมี tblpermision อีก ครับ มันงานซ้ำซ้อนกัน
การประกาศตัวแปร
อ.สันติสุขเคยบอกไว้ว่า ไม่ต้องประกาศเป็น Global นั่นมันเหมาะใน VB มากกว่า VBA สำหรับ VBA ใช้ Public แทนครับ
โค้ด ในการตรวจเช็ค user+password
จากของเดิม ลองปรับแก้เป็น
If text2 = strPass Then
LogOnID = clng(DLookup("UserID", "tbluser", "UserName = '" & [text1] & "'"))
LogOnUserName = text1
LogOnPassword = strPass
if cint(DLookup("admin", "tblUser", "UserID = " & LogOnID)) = -1 then
adm = True
DoCmd.OpenForm "frmAdd1", acNormal, , , acFormEdit, acWindowNormal
DoCmd.GoToRecord acForm, "frmAdd1", acNewRec
DoCmd.Close acForm, "frmLogin", acSaveNo
Else
-ให้ไปเปิดฟอร์มอื่นแทนเลยไม่ต้องยุ่งกับ frmAdd1 อีก
-ไม่ต้องมี msgbox เตือน
- เพราะว่า ไหนๆ คุณก็สั่งปิดฟอร์มอยู่ดี ในกรณีไม่ใช่ admin ดังนั้น ไม่ต้องให้เขาเปิดขึ้นมาเลยดีกว่า
End If
โค้ดในส่วน ดักจับ สิทธิ์ บนฟอร์ม frmAdd1
เปลี่ยนจาก event onLoad (เลิกใช้) มาเป็น event onOpen แทน จะกระชับกว่า
Private Sub Form_Open(Cancel As integer)
cancel = (cint(adm) +1) *-1
End Sub
2. คำว่า text น่าจะประกาศไว้ส่วนบนสุดของ โมดูลบนฟอร์มนี้
แต่คำว่า text น่าจะเป็นคำสงวนของระบบ ไม่ควรนำมาใช้เป็นชื่อ ออบเจ็คใดๆ หรือชื่อของตัวแปร ลองให้แน่ใจ (เพราะผมก็ไม่แน่ใจ) เอาอย่างนี้ ใน sub Command10_Click ให้ดักจับ ค่า ของ sq ออกมา
- ตรวจดู Statement ที่ได้จากตัวแปร sq ว่าเขียนถูกต้องหรือไม่
- ลองนำ Statement ที่ได้ ไปวางใน query เปล่า แล้วลองรันดูว่าผ่านหรือไม่
Private Sub Command10_Click()
Dim sq As String
sq = "Select " & text & " INTO tmp FROM QryAll"
Debug.print sq
'DoCmd.RunSQL sq
ลองดูอีกรอบครับ
ถ้าให้ UserID ของตาราง tblUser เป็น PK
ก็ไม่จำเป็นต้องมี tblpermision อีก ครับ มันงานซ้ำซ้อนกัน
การประกาศตัวแปร
อ.สันติสุขเคยบอกไว้ว่า ไม่ต้องประกาศเป็น Global นั่นมันเหมาะใน VB มากกว่า VBA สำหรับ VBA ใช้ Public แทนครับ
โค้ด ในการตรวจเช็ค user+password
จากของเดิม ลองปรับแก้เป็น
If text2 = strPass Then
LogOnID = clng(DLookup("UserID", "tbluser", "UserName = '" & [text1] & "'"))
LogOnUserName = text1
LogOnPassword = strPass
if cint(DLookup("admin", "tblUser", "UserID = " & LogOnID)) = -1 then
adm = True
DoCmd.OpenForm "frmAdd1", acNormal, , , acFormEdit, acWindowNormal
DoCmd.GoToRecord acForm, "frmAdd1", acNewRec
DoCmd.Close acForm, "frmLogin", acSaveNo
Else
-ให้ไปเปิดฟอร์มอื่นแทนเลยไม่ต้องยุ่งกับ frmAdd1 อีก
-ไม่ต้องมี msgbox เตือน
- เพราะว่า ไหนๆ คุณก็สั่งปิดฟอร์มอยู่ดี ในกรณีไม่ใช่ admin ดังนั้น ไม่ต้องให้เขาเปิดขึ้นมาเลยดีกว่า
End If
โค้ดในส่วน ดักจับ สิทธิ์ บนฟอร์ม frmAdd1
เปลี่ยนจาก event onLoad (เลิกใช้) มาเป็น event onOpen แทน จะกระชับกว่า
Private Sub Form_Open(Cancel As integer)
cancel = (cint(adm) +1) *-1
End Sub
2. คำว่า text น่าจะประกาศไว้ส่วนบนสุดของ โมดูลบนฟอร์มนี้
แต่คำว่า text น่าจะเป็นคำสงวนของระบบ ไม่ควรนำมาใช้เป็นชื่อ ออบเจ็คใดๆ หรือชื่อของตัวแปร ลองให้แน่ใจ (เพราะผมก็ไม่แน่ใจ) เอาอย่างนี้ ใน sub Command10_Click ให้ดักจับ ค่า ของ sq ออกมา
- ตรวจดู Statement ที่ได้จากตัวแปร sq ว่าเขียนถูกต้องหรือไม่
- ลองนำ Statement ที่ได้ ไปวางใน query เปล่า แล้วลองรันดูว่าผ่านหรือไม่
Private Sub Command10_Click()
Dim sq As String
sq = "Select " & text & " INTO tmp FROM QryAll"
Debug.print sq
'DoCmd.RunSQL sq
ลองดูอีกรอบครับ
10 @R01825
ช่วยอธิบายตรงโค้ด ดักจับสิทธิ์หน่อยครับ
cancel = (cint(adm) +1) *-1
คืออะไรอ่ะครับ ขอบคุณครับ
cancel = (cint(adm) +1) *-1
คืออะไรอ่ะครับ ขอบคุณครับ
11 @R01826
ในเหตุการณ์ เมื่อเปิดของทุกๆ ฟอร์มจะมี อาร์กิวเมนต์ คือ cancel as integer
เขามีไว้เพื่อการนี้โดยเฉพาะเลย
คือถ้าเราตรวจสอบเงื่อนไข แล้วไม่อนุญาตให้เปิดฟอร์ม ให้เราสั่ง
cencel = True
มันก็จะยกเลิกการเปิด (ก็คือปิดฟอร์มไปเลยแหละครับ)
แต่ถ้าเราไม่สั่งอะไรเลย หรือสั่ง cancel = false มันก็จะเปิดฟอร์มได้ตามปกติ
-------------------------------------------------------------------------------------
ค่าของ cancel มันเป็น boolean หรืออีกนัยหนึ่ง มันคือ integer
true = -1
false = 0
ในโปรแกรมของคุณ มีตัวแปรชื่อ adm ก็มีค่าเช่นเดียวกัน
และในคอนเซ็ปท์ของคุณเท่าที่เข้าใจ ก็คือ
ถ้า adm เป็น false ก็จะสั่งให้ปิดฟอร์ม
-------------------------------------------------------------------------------------
ดังนั้น ค่าของ cancel จึงเป็นปฎิเสธ ของ adm
ถ้า adm เป็น True cancel ต้องเป็น false
ถ้า adm เป็น false cancel ต้องเป็น true
-------------------------------------------------------------------------------------
โค้ดบรรทัดดังกล่าว ก็คือการสั่งให้ค่า มันปฎิเสธกันครับ
ถ้า adm เป็น True
- cint(adm) ก็จะได้ -1
- เอามา บวกด้วย 1 ก็จะได้ 0
- แล้วเอามาคูณด้วย -1 ก็จะได้ 0
ดังนั้น ค่าของ cancel จึงเป็น False
ถ้าค่าของ adm เป็น false
- cint(adm) ก็จะเป็น 0
- เอามาบวกด้วย 1 ก็จะได้ 1
- เมื่อคูณด้วย -1 ก็จะได้ -1
ดังนั้น ค่าของ cancel จะเป็น True ทำให้สั่งปิดฟอร์ม ครับ
เขามีไว้เพื่อการนี้โดยเฉพาะเลย
คือถ้าเราตรวจสอบเงื่อนไข แล้วไม่อนุญาตให้เปิดฟอร์ม ให้เราสั่ง
cencel = True
มันก็จะยกเลิกการเปิด (ก็คือปิดฟอร์มไปเลยแหละครับ)
แต่ถ้าเราไม่สั่งอะไรเลย หรือสั่ง cancel = false มันก็จะเปิดฟอร์มได้ตามปกติ
-------------------------------------------------------------------------------------
ค่าของ cancel มันเป็น boolean หรืออีกนัยหนึ่ง มันคือ integer
true = -1
false = 0
ในโปรแกรมของคุณ มีตัวแปรชื่อ adm ก็มีค่าเช่นเดียวกัน
และในคอนเซ็ปท์ของคุณเท่าที่เข้าใจ ก็คือ
ถ้า adm เป็น false ก็จะสั่งให้ปิดฟอร์ม
-------------------------------------------------------------------------------------
ดังนั้น ค่าของ cancel จึงเป็นปฎิเสธ ของ adm
ถ้า adm เป็น True cancel ต้องเป็น false
ถ้า adm เป็น false cancel ต้องเป็น true
-------------------------------------------------------------------------------------
โค้ดบรรทัดดังกล่าว ก็คือการสั่งให้ค่า มันปฎิเสธกันครับ
ถ้า adm เป็น True
- cint(adm) ก็จะได้ -1
- เอามา บวกด้วย 1 ก็จะได้ 0
- แล้วเอามาคูณด้วย -1 ก็จะได้ 0
ดังนั้น ค่าของ cancel จึงเป็น False
ถ้าค่าของ adm เป็น false
- cint(adm) ก็จะเป็น 0
- เอามาบวกด้วย 1 ก็จะได้ 1
- เมื่อคูณด้วย -1 ก็จะได้ -1
ดังนั้น ค่าของ cancel จะเป็น True ทำให้สั่งปิดฟอร์ม ครับ
12 @R01835
เกิดปัญหาแล้วครับ
จากข้อ 1 น่ะครับผมลองแก้ไขตามท่าน yeadram แล้วปรากฎว่า ผมกดปุ่ม OK แล้วไม่เกิดเหตุการณ์ใดๆ ขึ้นหรืออาจจะเกิดแต่ไม่มีการแสดงผลออกมาอ่ะครับ แต่เมื่อผมลองลบคำสั่งแล้วลองใช้ msgbox ทดสอบปรากฎว่า มันเกิด msgbox ขึ้นมาครับ งงครับ
จากข้อ 1 น่ะครับผมลองแก้ไขตามท่าน yeadram แล้วปรากฎว่า ผมกดปุ่ม OK แล้วไม่เกิดเหตุการณ์ใดๆ ขึ้นหรืออาจจะเกิดแต่ไม่มีการแสดงผลออกมาอ่ะครับ แต่เมื่อผมลองลบคำสั่งแล้วลองใช้ msgbox ทดสอบปรากฎว่า มันเกิด msgbox ขึ้นมาครับ งงครับ
13 @R01836
??
ไม่เข้าใจครับ
ไม่เข้าใจครับ
14 @R01837
คือมันไม่มีอะไรเกิดขึ้นเลยอ่ะครับ ตอนกดปุ่ม OK กดย้ำๆ ก็ไม่มีการเปิดฟอร์มfrmAdd1 หรือว่าปิดหน้าต่าง frmLogin อ่ะครับ ก็คือเหมือนกับกดปุ่ม OK ไปเฉยๆ อ่ะครับแต่ไม่มีอะไรเกิดขึ้น เริ่มงงครับ
15 @R01838
ก็ต้อง debug ดูทีละขั้นนั่นแหละครับ
debug.print "text2 = " & text2
debug.print "strPass = " & strPass
If text2 = strPass Then
LogOnID = clng(DLookup("UserID", "tbluser", "UserName = '" & [text1] & "'"))
debug.print "LogOnID = " & LogOnID
LogOnUserName = text1
LogOnPassword = strPass
debug.print "cInt dlookup = " & cint(DLookup("admin", "tblUser", "UserID = " & LogOnID))
if cint(DLookup("admin", "tblUser", "UserID = " & LogOnID)) = -1 then
adm = True
debug.print "adm = " & adm & vbtab & " cint adm = " & cint(adm)
...
...
...
อะไรประมาณนี้ครับ คุณต้อง ดักเช็คไปทีละจุด ดูว่า ค่าของอะไรมันผิดพลาด หรือมันไม่ได้ค่าออกมา ดูว่า เงื่อนไขใดมีจุดโหว่ เรามีทางเลือกให้มันแค่สองทาง มันกลับไปออกทางเลือกที่สาม หรือเปล่า ต้องสมมติฐานหาสาเหตุของมัน แล้วก็ทดสอบสมมติฐาน ครับ..
debug.print "text2 = " & text2
debug.print "strPass = " & strPass
If text2 = strPass Then
LogOnID = clng(DLookup("UserID", "tbluser", "UserName = '" & [text1] & "'"))
debug.print "LogOnID = " & LogOnID
LogOnUserName = text1
LogOnPassword = strPass
debug.print "cInt dlookup = " & cint(DLookup("admin", "tblUser", "UserID = " & LogOnID))
if cint(DLookup("admin", "tblUser", "UserID = " & LogOnID)) = -1 then
adm = True
debug.print "adm = " & adm & vbtab & " cint adm = " & cint(adm)
...
...
...
อะไรประมาณนี้ครับ คุณต้อง ดักเช็คไปทีละจุด ดูว่า ค่าของอะไรมันผิดพลาด หรือมันไม่ได้ค่าออกมา ดูว่า เงื่อนไขใดมีจุดโหว่ เรามีทางเลือกให้มันแค่สองทาง มันกลับไปออกทางเลือกที่สาม หรือเปล่า ต้องสมมติฐานหาสาเหตุของมัน แล้วก็ทดสอบสมมติฐาน ครับ..
16 @R01841
รู้แล้วครับ ฟังก์ชั่น EncryptDecrypt ทำงานแต่ค่าที่ได้ออกมาไม่ตรงกับพาสเวิร์ดอ่ะครับ ขอบคุณครับ
17 @R01842
สวัสดีครับ คือว่าถ้าผมต้องการให้เกิดคำแจ้งเตือนด้วยตนเองอ่ะครับ อย่างเช่น
โค้ดของฟอร์ม frmAdd1 อ่ะครับ ที่ท่าน yeadram ให้ใส่ใน Form_Open เป็น Cancel = (CInt(Adm) + 1) * -1 ซึ่งถ้าสมมติผมมีการเปิดฟอร์ม frmAdd1 จาก form อื่นเช่น ฟอร์ม startup ด้วยการกดปุ่ม command มันจะเกิดการแจ้งเตือนขึ้นมาว่า " แอคชั่น OpenForm ได้ถูกยกเลิก" ผมไม่อยากให้เกิดขึ้นอ่ะครับ แต่อยากให้มี msgbox แจ้งว่า "คุณไม่มีสิทธิ์แก้ไขข้อมูล" อ่ะครับ พอจะได้ไมอ่ะครับ
หมายเหตุ ::: ผมลองใส่ docmd.setwarnings false ไว้ในแอคชั่นการกดปุ่ม เปิดฟอร์มในฟอร์ม startup แล้วอ่ะครับ แต่ผลก็คือยังเหมือนเดิมอ่ะครับ
โค้ดของฟอร์ม frmAdd1 อ่ะครับ ที่ท่าน yeadram ให้ใส่ใน Form_Open เป็น Cancel = (CInt(Adm) + 1) * -1 ซึ่งถ้าสมมติผมมีการเปิดฟอร์ม frmAdd1 จาก form อื่นเช่น ฟอร์ม startup ด้วยการกดปุ่ม command มันจะเกิดการแจ้งเตือนขึ้นมาว่า " แอคชั่น OpenForm ได้ถูกยกเลิก" ผมไม่อยากให้เกิดขึ้นอ่ะครับ แต่อยากให้มี msgbox แจ้งว่า "คุณไม่มีสิทธิ์แก้ไขข้อมูล" อ่ะครับ พอจะได้ไมอ่ะครับ
หมายเหตุ ::: ผมลองใส่ docmd.setwarnings false ไว้ในแอคชั่นการกดปุ่ม เปิดฟอร์มในฟอร์ม startup แล้วอ่ะครับ แต่ผลก็คือยังเหมือนเดิมอ่ะครับ
18 @R01846
ท่านอาจาร์ย yeadram ครับ คราวนี้มาตรงเรื่อง export ข้อมูลอ่ะครับ ถ้าสมมติผมทำ query ขึ้นมา 1 query เพื่อที่จะทำการ export จาก query อันนี้แต่ปรากฎว่ามันดันมีชื่อฟิลด์ซ้ำกันแต่มาจากตารางคนละตาราง
ผมได้ใช้การสั่ง sql อ่ะครับ ด้วยการใช้ ชื่อตาราง.ชื่อฟิลด์ แต่ปรากฎว่าเมื่อผมกดปุ่มแล้วมันเกิด dialog ให้ใส่พารามิเตอร์อ่ะครับ แก้ยังไงดีครับ
อีกเรื่องครับ การ export วันที่จาก access ไปยัง excel มันจะไม่ใช่ format เดียวกันอ่ะครับ แก้ยังไงอ่ะครับ ผมพยายามหาวิธีแล้วก็ยังหาไม่เจอ
ขอบคุณครับ
ผมได้ใช้การสั่ง sql อ่ะครับ ด้วยการใช้ ชื่อตาราง.ชื่อฟิลด์ แต่ปรากฎว่าเมื่อผมกดปุ่มแล้วมันเกิด dialog ให้ใส่พารามิเตอร์อ่ะครับ แก้ยังไงดีครับ
อีกเรื่องครับ การ export วันที่จาก access ไปยัง excel มันจะไม่ใช่ format เดียวกันอ่ะครับ แก้ยังไงอ่ะครับ ผมพยายามหาวิธีแล้วก็ยังหาไม่เจอ
ขอบคุณครับ
19 @R01847
การใช้ msgbox มากนักไม่เป็นผลดี
เมื่อมี msgbox ขึ้นมา ผู้ใช้สามารถ กด Ctl+Puase break แล้วก็จะ....
แต่ถ้าต้องการก็ต้องอย่านี้ครับ
Private Sub Form_Open(Cancel As integer)
msgbox "คุณไม่มีสิทธิ์"
docmd.setwarnings false
cancel = (cint(adm) +1) *-1
End Sub
----------------------------------------------------------------------------------------
Export:
ถ้าชื่อฟิลด์ซ้ำ ก็เปลี่ยนมันเป็นชื่ออื่นซิครับ
select table1.field1 As x1, table2.field1 as x2 from....
การเกิด dialog ให้ใส่ค่าพารามิเตอร์ แสดงว่ามีการเขียนชื่อ ของฟิลด์ ผิด ให้ debug มันออกมาตรวจสอบ
format วันที่ ของ excel มันก็มีของมันเอง ต้องไปปรับเอาที่นู่นครับ
มันบังคับไม่ได้นอกจาก คุณต้องส่งมันไปเป็น string
แต่ถ้าคุณไม่ต้องการที่จะไปจัดรูปแบบใน Excel แล้วคุณจะส่งมันไป excel ทำไม เพราะงานด้านข้อมูล Access ทำได้ดีกว่า Excel แทบทุกอย่าง เพราะฉะนั้น ผมแนะนำครับ ไม่ต้องไปไขว่คว้าหามันให้เหนื่อยครับ ว่า ใน Access แสดง dd/mm/yy แล้วพอส่งไป Excel (มันอาจแสดงผลเป็น dd mmm yyyy) ทำอย่างไรให้แสดงผลเหมือนกัน
จุดประสงค์ของการส่งไป excel
- บ้างก็ว่า จัดรูปแบบหน้าเพื่อจะปริ๊นท์ได้ง่ายกว่า (อันนี้คุณค่อยไปจัดรุปแบบวันที่เอาเอง)
- บ้างก็เพื่อพักข้อมูล ก่อนจะนำข้อมูลจาก Excel ไปส่งต่อให้โปรแกรมอื่นต่อ (อันนี้ยิ่งไม่ต้องสนใจเรื่องรูปแบบที่แสดงผลเลยครับ เพราะไปถึง โปรแกรมนู้น ค่อยว่ากันอีกที)
- แล้วจุดประสงค์ของการส่งออกไป Excel ของคุณ JOe คืออะไรครับ
เมื่อมี msgbox ขึ้นมา ผู้ใช้สามารถ กด Ctl+Puase break แล้วก็จะ....
แต่ถ้าต้องการก็ต้องอย่านี้ครับ
Private Sub Form_Open(Cancel As integer)
msgbox "คุณไม่มีสิทธิ์"
docmd.setwarnings false
cancel = (cint(adm) +1) *-1
End Sub
----------------------------------------------------------------------------------------
Export:
ถ้าชื่อฟิลด์ซ้ำ ก็เปลี่ยนมันเป็นชื่ออื่นซิครับ
select table1.field1 As x1, table2.field1 as x2 from....
การเกิด dialog ให้ใส่ค่าพารามิเตอร์ แสดงว่ามีการเขียนชื่อ ของฟิลด์ ผิด ให้ debug มันออกมาตรวจสอบ
format วันที่ ของ excel มันก็มีของมันเอง ต้องไปปรับเอาที่นู่นครับ
มันบังคับไม่ได้นอกจาก คุณต้องส่งมันไปเป็น string
แต่ถ้าคุณไม่ต้องการที่จะไปจัดรูปแบบใน Excel แล้วคุณจะส่งมันไป excel ทำไม เพราะงานด้านข้อมูล Access ทำได้ดีกว่า Excel แทบทุกอย่าง เพราะฉะนั้น ผมแนะนำครับ ไม่ต้องไปไขว่คว้าหามันให้เหนื่อยครับ ว่า ใน Access แสดง dd/mm/yy แล้วพอส่งไป Excel (มันอาจแสดงผลเป็น dd mmm yyyy) ทำอย่างไรให้แสดงผลเหมือนกัน
จุดประสงค์ของการส่งไป excel
- บ้างก็ว่า จัดรูปแบบหน้าเพื่อจะปริ๊นท์ได้ง่ายกว่า (อันนี้คุณค่อยไปจัดรุปแบบวันที่เอาเอง)
- บ้างก็เพื่อพักข้อมูล ก่อนจะนำข้อมูลจาก Excel ไปส่งต่อให้โปรแกรมอื่นต่อ (อันนี้ยิ่งไม่ต้องสนใจเรื่องรูปแบบที่แสดงผลเลยครับ เพราะไปถึง โปรแกรมนู้น ค่อยว่ากันอีกที)
- แล้วจุดประสงค์ของการส่งออกไป Excel ของคุณ JOe คืออะไรครับ
20 @R01849
จุดประสงค์ คือ เจ้านายที่ที่ผมไปฝึกงานอ่ะครับ เขาต้องการเป็นไฟล์ excel เพื่อนำไปเชือมกับฐานข้อมูลของบริษัทอ่ะครับ ซึ่งอันนี้ผมก็เคยคุยกับเขาแล้ว แต่เขาต้องการเป็นรูปแบบ excel อ่ะครับ
ส่วนเรื่องฟิลด์อ่ะครับ ผมได้ใช้ as ใน query แล้วแต่พอมีการเรียกใช้ใน Select..INTO ปรากฎว่า มีการฟ้องว่ามีการใช้ชื่อฟิลด์ซ้ำ แต่จริงๆแล้วผมมีการแก้ไขไม่ให้ซ้ำแล้วครับ เช่นฟิลด์ datestart มันจะมาจากสองตารางคือ equity และ futures ผมก็จะใช้เป็น equity_datestart และ futures_datestart
ขอบคุณครับ
ส่วนเรื่องฟิลด์อ่ะครับ ผมได้ใช้ as ใน query แล้วแต่พอมีการเรียกใช้ใน Select..INTO ปรากฎว่า มีการฟ้องว่ามีการใช้ชื่อฟิลด์ซ้ำ แต่จริงๆแล้วผมมีการแก้ไขไม่ให้ซ้ำแล้วครับ เช่นฟิลด์ datestart มันจะมาจากสองตารางคือ equity และ futures ผมก็จะใช้เป็น equity_datestart และ futures_datestart
ขอบคุณครับ
Time: 0.3286s
แล้วว่างๆ จะเข้าไปอ่านในเมล์ ถ้ามีอะไรเพิ่มเติม ก็จะมาเพิ่มให้ครับ
1 "ต้องการให้มีระบบรักษาความปลอดภัย"
ทำถูกต้องแล้วครับ if .. then .. else ...
ถ้า ไม่ใช่ user ที่ต้องการ ก็สั่ง ฟอร์มห้ามเพิ่ม ห้ามลบ ห้ามแก้ไข
AllowAdditions, AllowEdits, Allowdeletion
2 สมมติว่า เฟรมแรก ชื่อ frameCriteria
ในแหล่งข้อมูลของรายงาน
ฟิลด์ ที่เก็บฝ่ายงาน ชื่อ fPart
ฟิลด์ที่เก็บ ชื่อ-สกุล ชื่อ fName
select case frameCriteria
case 0
sq = "([fPart] like '*" & text16 & "*')"
case 1
sq = "([fName] Like '*" & text16 & "*')"
case 2
sq = "([starting-date] = cdate(" & text16 & "))"
end select
if framLisence = 0 then
sq = sq & " ([ฟิลด์ไลเซ่น] = ค่าตัวเลือกของRadio 0)"
else
sq = sq & " ([ฟิลด์ไลเซ่น] = ค่าตัวเลือกของRadio 1)"
end if
Docmd.open acreport, "ชื่อรายงาน", acPreview, , sq
3 ยังไม่ค่อยเข้าใจคำถามครับ
4 มันมีหลายวิธีที่ทำได้ครับ อย่างน้อยๆ ตอนนี้ คิดมาได้ก็สองวิธี
4.1 สร้างคิวรี่แบบ Select ด้วยโค้ด (Runtime) ด้วย DAO
4.2 สร้างคิวรี่แบบ Action (Make table) ด้วยโค้ด VBA ธรรมดา
จาก 4.1 เราสั่ง Transfer ตัวคิวรี่ ออกไป Excel ได้เลยครับ
จาก 4.2 เราสั่งเหมือนกัน แต่เลือกตัว ตารางที่เราสร้างขึ้นมาครับ
การใส่เงื่อนไข ก็อยู่ในขั้นตอนการสร้างอยู่แล้วครับ เช่น ถ้าทำแบบ ข้อ 4.2
sq = "Select * Into tmpExcel Where [starting-date] > cdate(" & text16 & ")"
docmd.runsql sq
docmd.transferspredsheet .......... ใส่อากิวร์เมนต์ไป...... โดยเลือก source ให้เป็นตารางชื่อ tmpExcel