สมัครสมาชิก

แสดงกระทู้

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]
1
ไม่ทราบว่าผมตรงคำถามที่ต้องการหรือเปล่า เมื่อย้อนกลับไปดูเหมือนว่าจะผิดไปหน่อยหนึ่ง

2
การ Running เอกสารมีแนะนำในเว็บเก่าๆ ของ อ. สุภาพ ไชยา ครับ

ซึ่งในความเป็นจริง บางครั้งเราไม่สามารถใช้ AutoNumber มาเป็นเลขที่เอกสารได้ เนื่องจากบางความต้องการตัวอักษรมาเพิ่มเข้าไปในเอกสารเพื่อแยกหมวดหมู่หรือแผนก

แต่ตัวอย่างที่ของ อ. สุภาพ ไชยา มีจุดบอด 2 จุดด้วยกัน
- ในจังหวะที่มีการ Add รายการใหม่ของ USer พร้อมกัน ทุกคนจะได้เลขที่เอกสารเลขที่เดียวกัน เพราะตอนที่ Form ของแต่ละ User ร้องขอเลขที่ล่าสุดนั้น ไปมองเลขที่ล่าสุดในขณะนั้น ในจังหวะเดียวกัน จึงได้เลขที่เดียวกัน
- ในกรณีที่มีการลบเลขที่เอกสารเลขที่ล่าสุด และคีร์เพิ่มใหม่เข้าไปอีกครั้ง จะได้เลขที่เดิม ซึ่งบางบริษัทไม่ต้องการเช่นนั้น เพราะอาจจะทำให้เกิดความผิดพลาดเรื่องการยกเลิกเลขที่เอกสารที่ได้มีการยกเลิกไปแล้วได้

สามารถแก้ไขจุดบอดที่ว่านี้ได้โดยสร้าง Table กลางขึ้นมาอันหนึ่งเพื่อเก็บ Running เลขที่เอกสารล่าสุดไว้เวลาที่ User แต่ละคนร้องขอเข้ามา แทนที่จะไปมองที่ Table ที่เก็บข้อมูล โดยเมื่อ User แต่ละคนร้องขอเลขที่เอกสารเข้ามาก็จะมามองที่ Table นี้ก่อน แล้วจึงเอาเลขที่ที่ได้นี้ไปตรวจสอบซ้ำใน Table ที่เก็บข้อมูลกันเหนี่ยว เพือให้ได้เลขที่ล่าสุดจริงๆ ในขณะนั้น เพราะหากมีการ Restore ข้อมูลกลับ จะได้เลขที่เอกสารล่าสุด Run ต่อเนื่องกันไป หรือมีการลบข้อมูลบางส่วนออกไปแล้วเผอิญว่า เป็นเลขที่ล่าสุดที่บันทึกไว้

เมื่อทาง User กดปุ่มบันทึกก็จะเอาเลขที่เอกสารเลขที่ล่าสุดไป Save ไว้ที่ Table กลางด้วยเพื่อใช้ในการอ้างอิงในครั้งต่อๆ ไปในการ Run เลขที่เอกสาร
ภาพประกอบคำอธิยาย กลุ่มตัวอักษรกลุ่ม S ซึ่งจะเห็นว่า มีการแยกปีแยกเดือนเข้ามาด้วยเพราะเลขที่บางอย่างผูกก็เอกสารต้นขั้วที่เกิดขึ้นใน ปีนั้น+เดือนนั้น แล้วอาจจะไม่การย้อนกลับมาแก้เอกสาร
คือ นี้คือตัวอย่างจริงที่ผม Run เลขที่บาร์โค๊ดในระบบคลังสินค้าที่บริษัท คือเวลาที่เราดูบาร์โค๊ดเราก็จะทราบทันทีว่า วัตถุดิบตัวนี้ซื้อมาเมื่อไหร่ หรือs,fอายุหรือยังไม่ต้องวุ่นวายค้นเอกสารต้นขั้ว เพราะของมีของเก่าของใหม่คละเคล้ากันในคลังสินค้า



เพื่อให้เห็นภาพ ซึ่งใครจะไปจำว่าแต่ตัวซื้อมาเมื่อไหร่


3
ปัญหานี้น่าจะเหมือนกับที่ผมเคยใช้ Tab Delimit เป็นตัวแบ่งข้อมูลใน Text file ที่ส่งออกทำให้การนำเข้าข้อมูลข้อไฟล์นี้ผิดพลาดไป
ปัจจุบันนี้ผมเปลี่ยนมาใช้เครื่องหมายคอมม่า (,) แทนยังไม่เจอปัญหาดังกล่าวเลย

ส่วนการเขียนโค๊ดเพื่อส่งออกข้อมูลยังมีความต้องการให้แนะนำอีกหรือเปล่าครับ
หากต้องการจะทำตัวอย่างเพื่อโพสประกอบคำแนะนำ เพราะมันมีเทคนิคประกอบการเขียนโค๊ดนิดหนึ่ง ซึ่งต้องใช้รูปประกอบด้วยครับ เพื่อความเข้าใจง่าย

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

เอาละ ขอถามกลับ
คุณมีเครื่องอ่านข้อมูลจากบัตรประชาชนแล้วหรือยัง
ถ้ามีคุณอ่านอะไรออกมาได้บ้าง และต้องการเอาอะไรไปเก็บใน Table บ้างครับ

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

เทคนิคที่ผมจะแนะนำวันนี้คือ เราจะมีการสร้าง Temp Table วางคู่แทรกเข้าไปในข้อมูลที่ต้องการสร้าง Label ในตัวอย่างนี้คือ LabelRun



จำนวน Label จะเกิดนั้นมีตามจำนวน record ที่เรา Add เข้าไปใน Table : LabelRun และใน Table ก็จะมีฟิลด์ที่ชื่อ LabelNo



ส่วนที่หน้าจอสำหรับ User นั้นเราก็สร้าง textbox เพื่อให้ผู้ใช้กรอกจำนวนที่ต้องการพิมพ์ได้ตามต้องการ



และใส่ Code เข้าใน CommandButton โดยอาศัยคำสั่ง For..Next
Private Sub Command0_Click()
    Dim rst1 As DAO.Recordset
   
    Dim vNo As Long
   
    Dim dbs As Database
    Set dbs = CurrentDb()
   
    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE * FROM LabelRun"
    DoCmd.SetWarnings True
   
    Set rst1 = dbs.OpenRecordset("SELECT * FROM LabelRun")
   
    For vNo = 1 To Me.Text1 Step 1
        rst1.AddNew
        rst1!LabelNo = vNo
        rst1.Update
    Next
   
    rst1.Close
    Set rst1 = Nothing
   
    DoCmd.OpenReport "Report1", acViewPreview
   
End Sub

และสิ่งที่ต้องทำเพิ่มเติมคือเปิด DAO library ขื้นมาใช้ด้วย เนื่องจากมีการอ้างอิงเพื่อใช้ Recordset โดยเลือกจากเมนู Tools-->Reference



เมื่อลองคลิ๊กดูก็จะได้รายงานออกมาหน้าตามประมาณนี้ครับ
ไม่ต้องแปลกใจนะครับ ถ้าเปิดออกมาแล้วจะเห็นแค่ Label อันเดียว ซึ่งมันเป็น Defualt ของ Access ที่จะให้โชว์หน้าแรก ส่วนหน้าอื่นต้องเลื่อนเอา แต่ถ้าเราสั่งพิมพ์มันก็จะพิมพ์ออกมาทุกหน้า

ส่วนรูปที่ผมแสดงให้เห็นนี้คือผมเลือกให้มีการแสดงหน้า Report หลายหน้าพร้อมกันโดยเลือกจากเมนูข้างบนครับ



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



6
จริงๆ บน Access สามารถทำได้ครับ
โดยมีขั้นตอนคร่าวๆ ดังนี้
- การยืนยันสิทธิ์ อาจจะทำเป็นให้มีช่องกรอก UserName, Password หรือ ตรวจสอบจากการ Login เข้ามาในโปรแกรมว่า User คนนี้ได้รับสิทธิ์นี้หรือไม่ และมี Email อะไร
- บน Access สามารถเขียน Code เพื่อส่งเมล์ผ่านโปรแกรม Outlook ได้ครับ สามารถศึกษาจากตัวอย่างเก่าๆ ของ อ. สุภาพ ไชยาได้ แต่ต้องไปปิดฟังค์ชั่นบางอย่างเกี่ยวกับ Security บน Outlook อีกที ไม่เช่นนั้นมันจะมีเมนู Popup ขึ้นถามทุกครั้งที่สั่งให้ส่งเมล์ แต่ถ้าเราไปปิดฟังค์ชั่นที่ว่า มันจะยิงเมล์ออกไปเลยครับ
อันนี้ตัวอย่างสั้นๆ ครับเป็น idea

Sub SenMail() 
Dim ol As Object 
Dim olMail As Object 
Dim strCC As String 
 
Set ol = CreateObject("Outlook.Application") 
Set olMail = ol.CreateItem(0) 
 
With olMail 
 
    .To = "xxx@hotmail.com;yyy@hotmail.com" 
    .Attachments.Add "C:\FolderName\book1.xls" 
    .Subject = "หัวข้อของอีเมลล์ตรงนี้" 
    .Body = "ข้อความที่ต้องการจะส่งไปด้วย" 
    .Display 
    '.Send 
End With 

โดยต้องเขียนโปรแกรมวนลูปเพิ่มเติมเพื่อส่งเมล์หาคนที่เกี่ยวข้องที่กำหนดไว้
แนะว่าใช้คำสั่ง Do While

    Dim rst1, rst2, rst3, rst4, rst5, rst6 As DAO.Recordset
    Dim StrNewFolder, strFileName As String
    Dim vPackID, vCustID, lPO, vRoll, nEmail, lTxt As Long
    Dim vRollID, vLDNo, vEmail, vSubj As String
    Dim ol As Object
    Dim olMail As Object
    Dim strCC, vCustPO, vCust As String
   
    Dim vRlID, vRllNo, vLnt, vWgh, vJbColr As String
   
    Dim dbs As Database
    Set dbs = CurrentDb()

    Set rst6 = dbs.OpenRecordset("SELECT LDEmail.* FROM LDEmail INNER JOIN Customer ON LDEmail.CustID = Customer.CustID WHERE (((Customer.Customer)='" & vCust & "')) ORDER BY LDEmail.Email", dbOpenDynaset, dbSeeChanges)
    Do While Not rst6.EOF
        If nEmail = 1 Then
            vEmail = rst6!Email
        Else
            vEmail = vEmail & ";" & rst6!Email
        End If
   
        nEmail = nEmail + 1
    rst6.MoveNext
    Loop
    rst6.Close
    Set rst6 = Nothing

7
"เรื่องอื่นๆ"เกี่ยวกับ Access / Link MDB File
« เมื่อ: 05 ก.พ. 62 , 10:34:01 »
สำหรับองค์กรหรือหน่วยงานขนาดเล็ก-ขนาดกลาง ที่ต้องการใช้ข้อมูลร่วมกันในหลายส่วนหรือแผนก
หากต้องเชื่อมฐานข้อมูลไปยัง mdb ไฟล์ที่เก็บไว้ Server หรือ Share folder ที่ส่วนกลาง
สามารถทำได้ 2 วิธีครับ

วิธีที่ 1 คือทำการคลิ๊กขวาที่ Tab : table เลือก Link Tables

วิธีที่ 2 คือเชื่อมต่อผ่าน ODBC โดยมีหลักการมีดังนี้ครับ
- ขั้นตอนที่ 1 สร้าง ODBC เพื่อ Connect ไปยัง MDB ไฟล์ที่ต้องการเชื่อมข้อมูล
- ขั้นตอนที่ 2 ทำการ Link Table เข้ามาในไฟล์ Front End ที่กำลังใช้งานอยู่
- ขั้นตอนที่ 3 ในหน้าเขียนโค๊ด VBA ให้ติ๊กเลือก Tools --> Reference --> Microsoft DAO 3.6 Object libray

##################################
เมื่อต้องการจะจัดการกับข้อมูลใน Table สามารถใช้รูปแบบดังนี้

    Dim rst1, rst2, rst3, rst4, rst5, rst6, rst7, rst8 As DAO.Recordset

    Dim dbs As Database
    Set dbs = CurrentDb()
   
    Set rst1 = dbs.OpenRecordset("SELECT * from Table1")
    'Add
    rst1.addnew
    rst1!Filed1 = "Test"
    rst1.update

    'Edit
    rst1.edit
    rst1!Filed1 = "Test"
    rst1.update

    'Del
    rst1.Delete

    rst1.close
    Set rst1 = nothing

โดยเราจะต้องใส่ Password ไว้ที่ ตรงที่ไฟล์ mdb ที่ Share ไว้ที่ส่วนกลางนั้นไว้ด้วย เพราะเดี๋ยวมีใครซุกซนเข้าไปแก้ไขข้อมูลเดี๋ยวงานจะเข้า
และมีข้อควรระวังอยู่หลายเรื่องคือ
- จะต้องทำการ Compact ข้อมูลทุกวันเพื่อให้ระบบทำการ Clean up record ที่โดนลบระหว่างวันออกไป
- ต้องมีการ Backup ข้อมูลทุกวันเพราะเมื่อไฟล์ชำรุดจะไม่สามารถเปิดไฟล์ได้เลย ไม่ว่าจะรู้ Password ก็ตามต้องใช้ tools พิเศษซ่อม และ Relation ระหว่าง Table จะเสียต้องเข้าไปไล่หาว่า Link ที่เสียหายนั้น หายไปที Table อะไร ต้องทำการสร้าง Relation นั้นใหม่ ซึ่งอาจจะมีปัญหาเพิ่มเติมมาอีกตรงที่มี Record บางอันเกินมาทำให้ไม่สามารถเชื่อมความสัมพันธ์ได้ ต้องลบทิ้งก่อนทำการเชื่อม แล้วค่อยคีร์เข้าไปใหม่
สามารถตรวจสอบได้โดยการสร้าง Query Unmatch เพื่อให้ทราบว่ามี record ใดบ้าง
- เมื่อฐานข้อมูลชำรุด Data unrecognized ต้องให้ User ออกจากระบบทั้งหมดแล้ว Restart เครื่องคอมฯ ที่ Share ไฟล์นั้นเพื่อยกเลิกการเชื่อมต่อมายัง โฟลเดอร์ดังกล่าว ทำการปิด Share สำหรับ User ทุกคน ยกเว้น User ที่ดูแลระบบแล้วจึงทำการปรับซ่อมไฟล์ให้แล้วเสร็จ จากนั้นค่อยทำการเปิด Share กลับมาเหมือนเดิม ปัญหาใหญ่มันจะอยู่ที่ไฟล์ที่ชำรุดนั้นจะเปิดไม่ได้ต้องใช้ Tool ที่เป็นไฟล์ข้างนอกทำการปรับซ่อมสถานเดียว ถ้าไม่มีจึงไม่แนะนำให้ใช้การ Share ข้อมูลวิธีนี้ โดยจะต้องทำทันทีเดี๋ยวนั้นเลย ก่อนที่ข้อมูลจะพังจนสายเกินแก้ หากไม่เก่งพอหรือไม่มี Tool อยู่ในมือ ไม่แนะนำให้ใช้การ Share ข้อมูลแบบนี้เพราะนั้นหมายถึงคุณต้องเอาไฟล์ Backup กลับมาใช้ นรกจะบังเกิดทันที
- เมื่อมีคนใช้งานรวมกันมากขึ้น การเปิด-เขียนข้อมูลจะช้าลงอย่างเห็นได้ชัด เนื่องจากตัว MS-Access จะมีการ Lock Record ที่ User แต่ละคนกำลังใช้งานอยู่ในขณะนั้น
- ความแรงและความเร็วในการอ่านเขียนของเครื่องที่ Share ไฟล์ก็จะมีผลเรื่องความเร็ว ในการอ่าน-เขียนด้วยนะครับ
- การออกแบบระบบ Network และคุณภาพ,ความเร็วของ Network ก็มีผลกับความบ่อยของการชำรุดของไฟล์ที่แชร์ด้วย ถ้าไม่ดีหรือไม่เสถียรก็จะมีปัญหาบ่อย
- ส่วนการตั้งรหัสผ่าน mdb ไฟล์สามารถค้นหาอ่านได้จากข้อมูลเก่าของ อ. สุภาพ ไชยาครับ

จะเห็นว่า มีเงื่อนไขและรายละเอียดการใช้งานค่อนข้างเยอะ จึงไม่แนะนำให้ใช้การ Share วิธีนี้ เลี่ยงได้ก็ควรจะไปใช้ SQL Server จะดีกว่าได้ความเร็วและเสถียรกว่ากันเยอะ แต่ก็ต้องเตรียมเรื่องของ Server และ License

############################
Tool ที่ว่าผมมี หากต้องการให้ Post ขอด้านล่างนะครับเพราะจะให้คนที่ต้องการเท่านั้น ไม่ให้พร่ำเพรื่อ

ขอขอบคุณความรู้เกี่ยวกับ MS-Access จาก อ. สุภาพ ไชยา

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

8
"เรื่องอื่นๆ"เกี่ยวกับ Access / Link SQL Server
« เมื่อ: 28 ม.ค. 62 , 15:51:06 »
หากต้องเชื่อมฐานข้อมูลจาก SQL Server โดยตัว Front End เป็น MS-Access

หลักการมีดังนี้ครับ
- ขั้นตอนที่ 1 สร้าง ODBC เพื่อ Connect ไปยัง MySQL Server
- ขั้นตอนที่ 2 ทำการ Link Table เข้ามาในไฟล์ Front End ที่กำลังใช้งานอยู่
- ขั้นตอนที่ 3 ในหน้าเขียนโค๊ด VBA ให้ติ๊กเลือก Tools --> Reference --> Microsoft DAO 3.6 Object libray

เมื่อต้องการจะจัดการกับข้อมูลใน Table สามารถใช้รูปแบบดังนี้

    Dim rst1, rst2, rst3, rst4, rst5, rst6, rst7, rst8 As DAO.Recordset

    Dim dbs As Database
    Set dbs = CurrentDb()
   
    Set rst1 = dbs.OpenRecordset("SELECT * from Table1", dbOpenDynaset, dbSeeChanges)
    'Add
    rst1.addnew
    rst1!Filed1 = "Test"
    rst1.update

    'Edit
    rst1.edit
    rst1!Filed1 = "Test"
    rst1.update

    'Del
    rst1.Delete

    rst1.close
    Set rst1 = nothing

จะเห็นว่า มีรูปแบบคำสั่ง    ", dbOpenDynaset, dbSeeChanges)   ต่อท้ายเพิ่มขึ้นมานิดหน่อย

ขอขอบคุณความรู้เกี่ยวกับ MS-Access จาก อ. สุภาพ ไชยา

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

9
"เรื่องอื่นๆ"เกี่ยวกับ Access / : Link MySQL
« เมื่อ: 28 ม.ค. 62 , 14:27:21 »
ก็ฝากไว้เผื่อจะสามารถช่วยให้มิตรรักแฟนเพลงท่านหนึ่งท่านใด ก้าวพ้นปัญหาที่กำลังแก้อยู่ได้เร็วขึ้น

10
"เรื่องอื่นๆ"เกี่ยวกับ Access / Link MySQL
« เมื่อ: 28 ม.ค. 62 , 14:21:19 »
พอดีไปเจอโจทย์ใหม่ คือต้องเชื่อมฐานข้อมูลจาก MySQL มาที่งานเก่าที่เป็น SQL Server โดยตัว Front End เป็น MS-Access
งมอยู่พักใหญ่ ในที่สุดก็สามารถทำได้

หลักการมีดังนี้ครับ
- ขั้นตอนที่ 1 ต้องลง Driver ของ MySQL ที่เครื่องก่อน ณ. วันที่โพสนี้มี 2 เวอร์ชั่น คือ v.3.1.5 , 8.0 แนะนำเป็นเวอร์ชั่น 3.1.5
- ขั้นตอนที่ 2 สร้าง User ที่สามารถเข้าถึงฐานข้อมูลให้เรียบเรียบก่อนพร้อมทดสอบ และอย่าเปลี่ยนสิทธิ์ของ User ที่ว่านี้ให้เป็น Full ด้วยเครื่องหมาย %
- ขั้นตอนที่ 3 สร้าง ODBC เพื่อ Connect ไปยัง MySQL Server
- ขั้นตอนที่ 4 ทำการ Link Table เข้ามาในไฟล์ Front End ที่กำลังใช้งานอยู่
- ขั้นตอนที่ 5 ในหน้าเขียนโค๊ด VBA ให้ติ๊กเลือก Tools --> Reference --> Microsoft DAO 3.6 Object libray

เมื่อต้องการจะจัดการกับข้อมูลใน Table สามารถใช้รูปแบบดังนี้

    Dim rst1, rst2, rst3, rst4, rst5, rst6, rst7, rst8 As DAO.Recordset

    Dim dbs As Database
    Set dbs = CurrentDb()
   
    Set rst1 = dbs.OpenRecordset("SELECT * from Table1")

    'Add
    rst1.addnew
    rst1!Filed1 = "Test"
    rst1.update

    'Edit
    rst1.edit
    rst1!Filed1 = "Test"
    rst1.update

    'Del
    rst1.Delete

    rst1.close
    Set rst1 = nothing

ขอขอบคุณความรู้เกี่ยวกับ MS-Access จาก อ. สุภาพ ไชยา

หน้า: [1]