แสดงกระทู้

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 2 [3] 4 5 6 ... 21
33
Access 2010 อยู่ที่เมนู File - Save and Publish - Package Solution

ตั้งแต่ Access 2013 เป็นต้นไป ได้ยกเลิกการสร้างไฟล์ setup ให้แก่โปรเจคออกไปแล้ว ต้องไปใช้ซอฟท์แวร์อื่นแทน เช่นที่ได้ยินบ่อยๆคือ Inno Setup ลองไปใช้ดู
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

34
ไม่แน่ใจนะครับ  ลองสร้าง Database Instance อีกตัวเพื่อทดลองก่อน ด้วยการ Clone จาก Instance ที่มีอยู่ แล้วแก้ให้ Collation ของ Instance ตัวใหม่ให้รองรับภาษาไทย
https://langisser.wordpress.com/2013/05/28/แก้ปัญหาไม่แสดงลภาษาไท/ link แล้วก็ลิงค์มาเป็น Linked Table ใน Access  จากนั้นทดลองเขียน SQL โดยมีเงื่อนไขหาข้อมูลภาษาไทย ทำทั้งใน SQL Server และใน Access ดู นอกจากนี้ เมื่อเปลี่ยน Collation แล้ว น่าจะทำให้ไม่ต้องใส่ Prefix N แม้จะเขียน SQL ในตัว SQL Server เองก็ตาม

ถ้าทำแล้วยังไม่ได้ ต้องรอผู้รู้ท่านอื่นมาให้คำแนะนำต่อไป


ข้อมูลใน Table แสดงภาษาไทยปรกตินะคะ ไม่ได้แสดง ???? แต่เวลาค้นหาด้วยภาษาไทย ไม่เจอ ถ้าใส่ N'สม' แบบนี้เจอ

อยากรู้ว่าตอนนี้ Server Collation, Database Collation มีค่าเป็นอะไรครับ

Collation ตามนี้ค่ะ


SQL_Latin1_General_CP1_CI_AS เป็น Collation สำหรับ English (United States)  ผมคิดว่าการตั้งไม่ตรงกับภาษาไทย ซึ่งใช้ Collation Thai_CI_AS น่าจะก่อให้เกิดปัญหานะครับ  อยากให้ลองทำตามที่ผมได้แนะนำไปก่อนหน้านี้ (ย้ำว่าทำการทดสอบบนฐานข้อมูลที่โคลนมาแล้วนะครับ ไม่ใช่ทดสอบบนฐานข้อมูลจริง) และตรวจสอบเพิ่มเติมด้วยว่า Windows System Locale ทั้งบนเครื่องที่ติดตั้ง SQL Server และเครื่องที่ใช้ Microsoft Access ได้ตั้งเป็น Thai (Thailand) แล้วหรือยัง เมื่อแก้ไขแล้ว ให้ลองเขียนคิวรี่ทั้งบน SQL Server และบน Microsoft Access โดยไม่ต้องมี prefix N  ดูว่าจะแก้ปัญหาได้หรือไม่
โพสต์นี้ได้รับคำขอบคุณจาก: PNR, mtaccess

35
ไม่แน่ใจนะครับ  ลองสร้าง Database Instance อีกตัวเพื่อทดลองก่อน ด้วยการ Clone จาก Instance ที่มีอยู่ แล้วแก้ให้ Collation ของ Instance ตัวใหม่ให้รองรับภาษาไทย
https://langisser.wordpress.com/2013/05/28/แก้ปัญหาไม่แสดงลภาษาไท/ link แล้วก็ลิงค์มาเป็น Linked Table ใน Access  จากนั้นทดลองเขียน SQL โดยมีเงื่อนไขหาข้อมูลภาษาไทย ทำทั้งใน SQL Server และใน Access ดู นอกจากนี้ เมื่อเปลี่ยน Collation แล้ว น่าจะทำให้ไม่ต้องใส่ Prefix N แม้จะเขียน SQL ในตัว SQL Server เองก็ตาม

ถ้าทำแล้วยังไม่ได้ ต้องรอผู้รู้ท่านอื่นมาให้คำแนะนำต่อไป


ข้อมูลใน Table แสดงภาษาไทยปรกตินะคะ ไม่ได้แสดง ???? แต่เวลาค้นหาด้วยภาษาไทย ไม่เจอ ถ้าใส่ N'สม' แบบนี้เจอ

อยากรู้ว่าตอนนี้ Server Collation, Database Collation มีค่าเป็นอะไรครับ
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

36
ออกตัวไว้ก่อนว่าไม่รู้เรื่องอะไรของ .NET เลยนะครับ แต่ไปอ่านหัวข้อ Remarks ของ OleDbDataReader.Read Method ใน https://docs.microsoft.com/en-us/dotnet/api/system.data.oledb.oledbdatareader.read?view=dotnet-plat-ext-3.1#System_Data_OleDb_OleDbDataReader_Read link เขาบอกว่า ตำแหน่งแรกของ OleDbDataReader object จะอยู่ก่อนเรคอร์ดแรก ดังนั้นต้องสั่ง Read method ของ OleDbDataReader object เพื่อดึงเรคอร์ดต่อไป(ซึ่งก็จะทำให้ได้เรคอร์ดแรก)ก่อนอ้างอิงฟิลด์ด้วย   โค้ดของคุณ ถ้าอ่านเรคอร์ดแรกเรคอร์ดเดียว ก็ควรเป็นคำสั่ง dr.Read() แทนที่ 'While dt.Read()  ยังไงก็ตาม ปกติแล้วก็ควรทดสอบว่ามีเรคอร์ดก่อนอ่านจริงด้วยคำสั่ง If dr.HasRows Then อยู่ด้วย
โพสต์นี้ได้รับคำขอบคุณจาก: treethep

37
ไม่แน่ใจนะครับ  ลองสร้าง Database Instance อีกตัวเพื่อทดลองก่อน ด้วยการ Clone จาก Instance ที่มีอยู่ แล้วแก้ให้ Collation ของ Instance ตัวใหม่ให้รองรับภาษาไทย
https://langisser.wordpress.com/2013/05/28/แก้ปัญหาไม่แสดงลภาษาไท/ link แล้วก็ลิงค์มาเป็น Linked Table ใน Access  จากนั้นทดลองเขียน SQL โดยมีเงื่อนไขหาข้อมูลภาษาไทย ทำทั้งใน SQL Server และใน Access ดู นอกจากนี้ เมื่อเปลี่ยน Collation แล้ว น่าจะทำให้ไม่ต้องใส่ Prefix N แม้จะเขียน SQL ในตัว SQL Server เองก็ตาม

ถ้าทำแล้วยังไม่ได้ ต้องรอผู้รู้ท่านอื่นมาให้คำแนะนำต่อไป
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

38
เป็น bug ของ Access 2016 และคาดว่าได้รับการแก้ไขแล้วตั้งแต่เวอร์ชั้น 16.0.6322.1000  ลองอัพเดต Office ดูนะครับ

ข้อมูลจากโพสสุดท้ายใน https://answers.microsoft.com/en-us/office/forum/office_2016-access/access-2016-report-images-still-not-displaying/a0eab74c-a299-4fa2-a38c-26bec448b041 link

ลิงค์ที่โหลด patch
แต่ให้อ่านรายละเอียดดูก่อนนะครับว่าต้องทำอะไรก่อนอัพเดตด้วยไฟล์นี้หรือไม่ แต่ผมแนะนำว่าควรอัพเดตผ่านระบบอัพเดตของ office เอง  https://support.microsoft.com/en-us/help/3114379/december-8-2015-update-for-access-2016-kb3114379 link
โพสต์นี้ได้รับคำขอบคุณจาก: patipat, PNR

39
Criteria ที่อยู่บรรทัดเดียวกันใน Query Design View จะเชื่อมแต่ละเงื่อนไขด้วย AND ซึ่งหมายความว่าทุกเงื่อนไขต้องเป็นจริงพร้อมกันเท่านั้นจึงจะนำเรคอร์ดนั้นออกมาให้ แต่สิ่งที่คุณต้องการคือ เงื่อนไขใดๆก็ได้ที่เป็นจริง ซึ่งหมายถึงเชื่อมแต่ละเงื่อนไขด้วย OR   วิธีการที่จะบอก Query Design View ว่าเป็น OR ก็คือ ใส่แต่ละเงื่อนไขให้อยู่กันคนละบรรทัดของ Criteria เท่านั้นเองครับ
โพสต์นี้ได้รับคำขอบคุณจาก: พิชญะ ชัยชนะ

40
1. ต้องสร้างตัวแปร IsSaveClicked ในระดับของ form module ตัวนึงที่เก็บสถานะว่าได้กดปุ่ม Save ก่อนจะเกิดการบันทึกหรือไม่ แล้วค่อยทำการปรับปรุง txtCreated, txtCreatedBy, txtModified หรือ txtModifiedBy ภายใน Form_BeforeUpdate event procedure เพียงจุดเดียวตามค่าของตัวแปรนี้

2. Me.Dirty = False และ DoCmd.RunCommand acCmdSaveRecord ทำงานเหมือนกันคือสั่งให้บันทึกเรคอร์ดบนฟอร์มลงฐานข้อมูล ดังนั้นเลือกคำสั่งใดคำสั่งหนึ่งก็พอ

3. Form_BeforeUpdate event procedure จะทำงานเสมอเมื่อจะบันทึกข้อมูลบนฟอร์มลงฐานข้อมูล เมื่อโค้ดในปุ่ม Save สั่งบันทึกปั๊ป โค้ดจะกระโดดมา Form_BeforeUpdate event procedure ทันที และตามด้วย Form_AfterUpdate event procedure  แล้วค่อยกลับมาที่โค้ดบรรทัดต่อไปในปุ่ม Save

4. การตรวจสอบว่าเป็นเรคอร์ดเก่าหรือใหม่ สามารถเช็คจาก Me.NewRecord ได้ จึงคิดว่าไม่ต้องแยกปุ่มบันทึกเรคอร์ดใหม่และเก่าแยกกัน

5. Form_AfterUpdate event procedure เป็นตำแหน่งที่เหมาะสมที่จะวางโค้ดแสดงข้อความว่าได้บันทึกแล้วเอาไว้ที่นี่ เราจะใช้สถานะความเป็นเรคอร์ดเก่าหรือใหม่เพื่อแสดงข้อความที่แตกต่างกัน แต่เนื่องจากเมื่อบันทึกเรคอร์ดแล้ว Me.NewRecord property จะให้ค่าเป็น FALSE เสมอ ดังนั้นใน event นี้จึงเช็คจาก property นี้ไม่ได้ จึงต้องเก็บสถานะว่าเป็นเรคอร์ดใหม่เอาไว้ในตัวแปร IsNewRecord เพิ่มเติมตั้งแต่อยู่ใน  Form_BeforeUpdate event procedure

หมายเหตุ ผมไม่ได้เปิดโปรแกรมคุณหรือทดสอบโค้ดนี้ คุณเอาไปลองหรือปรับปรุงเองนะครับ

โค๊ด: [Select]
Option Compare Database
Option Explicit

Dim IsSaveClicked   As Boolean
Dim IsNewRecord     As Boolean

Private Sub cmdSave_Click()
    IsSaveClicked = True
    Me.Dirty = False
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)

On Error GoTo Err_BeforeUpdate

    If Not IsSaveClicked Then
        If MsgBox("Are you sure you want to save change?", vbYesNo + vbQuestion, "Save Record") = vbNo Then
            Me.Undo
            GoTo Exit_BeforeUpdate
        End If
    End If
    If Me.NewRecord Then
        Me.txtNationalID1 = Me.txtNationalID2
        Me.txtCreated = Now()
        Me.txtCreatedBy = GetUserName()
        IsNewRecord = True
    Else
        Me.txtModified = Now()
        Me.txtModifiedBy = GetUserName()
    End If
   
Exit_BeforeUpdate:
   Exit Sub
   
Err_BeforeUpdate:
   MsgBox Err.Number & " " & Err.Description
   Resume Exit_BeforeUpdate
End Sub

Private Sub Form_AfterUpdate()
    If IsNewRecord Then
        MsgBox "Your record has been successfully saved!"
    Else
        MsgBox "Your edited record has been successfully saved!"
    End If
    IsNewRecord = False
    IsSaveClicked = False
End Sub

Private Sub Form_Undo(Cancel As Integer)
    IsSaveClicked = False
    IsNewRecord = False
End Sub

Private Sub Form_Error(DataErr As Integer, Response As Integer)
    IsSaveClicked = False
    IsNewRecord = False
End Sub

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

41
select ... from ... where ฟิลด์ between #1-sep-2019# and #31-mar-2020#
โพสต์นี้ได้รับคำขอบคุณจาก: bgfc

42
ห้อง MS Access / : Export ข้อมูลจาก MS Access
« เมื่อ: 09 มิ.ย. 63 , 21:09:53 »
หลังตำแหน่ง 8  ในช่อง Text Qualifier ให้เลือกเป็น {none}   เสร็จแล้วบันทึกเป็น Specification ตัวใหม่  พอเวลาจะ export  ก็ให้อ้าง Specification ตัวใหม่นี้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

43
ห้อง MS Access / : Export ข้อมูลจาก MS Access
« เมื่อ: 08 มิ.ย. 63 , 15:33:28 »
ถามผมกลับอย่างนี้นี่ผมงงเลย ตกลงคุณไม่ได้เป็นคนสร้าง spec เองเหรอ แล้วคุณไปเอาชื่อ spec จากไหนมาใส่ในคำสั่ง DoCmd.TransferText  ?

เอาอย่างงี้ เปิดคิวรี่แล้วกดตามลำดับ 1 - 6 ที่แสดงครับ สำหรับตำแหน่งที่ 8 ถ้าเลือกเป็น Fixed Width ก่อนกดตำแหน่งที่4 หลังจากเลือก Specification แล้ว ตารางของฟิลด์ (ตำแหน่งที่ 7) จะแสดงตำแหน่งเริ่มต้นและความยาวของฟิลด์ออกมาด้วย ที่นี้ก็ขึ้นกับคุณออกแบบว่าจะให้ export เป็นแบบไหน ออกแบบแบบไหน ในคำสั่ง DoCmd.TransferText ก็ให้ใช้ตัวเลือกเพื่อ export แบบนั้นด้วยนะครับ

ตำแหน่งที่ 4 หมายถึงคลิกที่ปุ่ม Spec... นะครับ

หรือไม่ก็ ลอง export โดยไม่ใช้ spec ด้วยคำสั่ง
DoCmd.TransferText acExportDelim, , qry, myPath, True
ดูว่าได้ผลตามต้องการหรือไม่


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

44
ห้อง MS Access / : Export ข้อมูลจาก MS Access
« เมื่อ: 08 มิ.ย. 63 , 11:07:15 »
Short Text กับ nvarchar(255) ไม่น่าจะเป็นปัญหาครับ เพราะ nvarchar(255) จะเก็บตัวอักษรได้**อาจจะ**น้อยกว่า 255  แต่ให้ไปดูว่าใน Specification นั้น เอาฟิลด์นี้ออกมากี่ตัวอักษรมากกว่า
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

45
ห้อง MS Access / : Export ข้อมูลจาก MS Access
« เมื่อ: 05 มิ.ย. 63 , 22:39:30 »
- ตรวจการกำหนดประเภทข้อมูลและความยาวของฟิลด์ข้อมูลที่เราตั้งเอาไว้ใน "QueryExportToSQLSERVER Export Specification" เพราะเมื่อเปลี่ยนฐานข้อมูลจาก Access ไปเป็นตัวอื่น สิ่งต่างๆข้างต้นอาจแตกต่างไป

- เปลี่ยนจาก
Const myPath As String = "C:\Exportfile\Test.csv"
ไปเป็น
Dim myPath As String
myPath = "C:\Exportfile\Test" & txtDivision & txtLoacation & ".csv"
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

46
ผมใช้วิธีสร้าง Public Array Variable X ในโมดูล M เพื่อเก็บสถานะการเลือกเมื่อเปิดฟอร์ม F โดย X จะถูกกำหนดให้มีจำนวน element ทั้งหมดเท่ากับค่าสูงสุดของ ID  แล้วเชื่อม check box (chkX) ที่ใช้แสดงสถานะการเลือกเข้ากับฟังก์ชั่น XStatus( ) ที่อ่านค่าจาก X อีกทีนึง

แต่เนื่องจาก check box นี้ผูกกับฟังก์ชั่น จึงทำได้แค่แสดง ไม่สามารถคลิกเปลี่ยนแปลงได้ จึงสร้าง combo box command button (btnX) เพื่อรองรับการคลิกเลือกเปลี่ยนสถานะแทน โดยกำหนดให้แสดงเป็นประเภทโปร่งใส (Transparent property = True) และวางขี่อยู่บน chkX เพื่อให้ผู้ใช้รู้สึกเหมือนใช้งาน chkX เท่านั้น  เมื่อคลิกก็จะไปสลับค่าในตัวแปร X ตาม element ที่อ้างอิงด้วยค่า ID และอัพเดตการแสดงของ chkX อีกที  และเมื่อจะนำการเลือกไปใช้ เช่นนำไปออกรายงาน ก็ให้กำหนดเงื่อนไขของคิวรี่หรือ Filter ของรายงานให้มีเงื่อนไข Xstatus(ID) = TRUE

ข้อดีคือ
- ไม่ต้องสร้างฟิลด์หรือเทเบิลชั่วคราวเพื่อเก็บสถานะการเลือก

ข้อด้อยคือ
- ใช้ได้กับฟอร์มที่มี ID เป็นตัวเลข
- ใช้ได้กับฟอร์มที่แสดงเพียงอย่างเดียว ถ้ามีการป้อนเรคอร์ดใหม่ลงในฟอร์มด้วย ต้องแก้ไขโปรแกรมเพิ่มเติม
- สถานะการเลือก ต้องใช้เวลานิดหน่อยในการแสดง ถ้าจำนวนบรรทัดยิ่งมาก อาจจะใช้เวลามากขึ้น
- ต้องเขียนโค้ดเพื่อจัดการ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs, thanapol.w

47
เราอ้างถึงฐานข้อมูลตัวปัจจุบันที่โค้ดกำลังทำงานด้วย DBEngine.Workspaces(0).Databases(0) (ปัจจุบันอ้างด้วย CurrentDB แทน) ซึ่งเทเบิลที่อยู่ในนี้เป็น Linked Table ดังนั้นเมื่อสั่งเปิดด้วย OpenRecordset ระบบจะเปิดเป็น dbOpenDynaset   จะไม่สามารถเปิดเป็นเทเบิลโดยตรงแม้จะบังคับด้วยค่าคงที่ DB_OPEN_TABLE ก็ตาม (เป็นค่าคงที่รุ่นเก่าแล้ว ปัจจุบันเปลี่ยนไปใช้ dbOpenTable แทน) แต่เมื่อเอาโค้ดไปทำงานใน Back-End Database ซึ่งเทเบิลเป็นเทเบิลจริง ไม่ใช่ Linked Table โค้ดจึงทำงานได้  และเพราะ .Seek method ใช้ไม่ได้กับ Dynaset Recordset  คิดว่านี่คือจุดที่ทำให้เกิด error นี้  ต้องใช้ .FindFirst method แทน

ยังไงก็ตามเนื่องจาก Recordset ก็เปิดมาเพื่ออัพเดตเท่านั้น เราสามารถสั่งอัพเดตแล้วเช็คจำนวนเรคอร์ดที่อัพเดตได้ ถ้าเป็นศูนย์ก็แปลว่ารหัสตำแหน่งนั้นไม่มี  ไม่ต้องทำ .Seek หรือ .FindFirst ก่อน  โค้ดก็จะเป็น

Private Sub cmdsave_Click()
On Error GoTo Err_Command139_Click
If IsNull(Me!POSIT_DT) Then
   MsgBox "**** กรุณาบันทึกข้อมูลวันที่ ****"
   Exit Sub
End If
DoCmd.SetWarnings False

Dim db As DAO.Database
Dim ttran As DAO.Recordset

Set db = CurrentDB
Set ttran = db.OpenRecordset("tranpolice")

db.execute "update person set id_posit = NULL where ชื่อฟิลด์primarykey = " & cstr(mid)
' แต่ถ้าฟิลด์primarykeyมี data type เป็น text ก็ต้องเปลี่ยนเป็น
' db.execute "update person set id_posit = NULL where ชื่อฟิลด์primarykey = '" & mid & "' "
if db.RecordsAffected = 0 then
   MsgBox "ไม่มีข้อมูลรหัสตำแหน่ง " & mid_posit & " ในตาราง Person"
   Exit Sub
End If
' หมายเหตุ  โค้ดข้างบนนี่ถูกหรือเปล่า เพราะค้นหา primarykey ด้วยตัวแปร mid แต่ถ้าไม่เจอกลับแจ้งข้อความด้วยตัวแปร mid_posit ?

db.execute "update postid set id = 0 where ชื่อฟิลด์primarykey = " & cstr(mid_posit)
' หรือถ้าเหมือนกรณีอธิบายข้างบน ก็ต้องเปลี่ยนเป็น
' db.execute "update postid set id = 0 where ชื่อฟิลด์primarykey = '" & mid_posit & "' "
if db.RecordsAffected = 0 then
   MsgBox "ไม่มีข้อมูลรหัสตำแหน่ง " & mid_posit & " ในตารางเลขตำแหน่ง"
   Exit Sub
End If


' ข้างล่างนี้จนจบ โค้ดไม่ต้องมีเปลี่ยนอะไรครับ
ttran.AddNew
ttran("id") = mid
ttran("id_posit") = mid_posit
...
...
...
โพสต์นี้ได้รับคำขอบคุณจาก: Niky@cm5

48
ลืมบอกไป กรณีใส่ตัวอักษรต่อท้ายบ้านเลขที่เดียวกัน ให้เพิ่มค่า N ต่อท้ายการเรียงลำดับอีกที

select * from T order by val(replace(N,"/",".")), N
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

หน้า: 1 2 [3] 4 5 6 ... 21