แสดงกระทู้

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 ... 19
37
ไม่แน่ใจนะครับ  ลองสร้าง Database Instance อีกตัวเพื่อทดลองก่อน ด้วยการ Clone จาก Instance ที่มีอยู่ แล้วแก้ให้ Collation ของ Instance ตัวใหม่ให้รองรับภาษาไทย
https://langisser.wordpress.com/2013/05/28/แก้ปัญหาไม่แสดงลภาษาไท/ แล้วก็ลิงค์มาเป็น 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

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

49
ถ้า T เป็นชื่อเทเบิล และ N เป็นเลขที่บ้าน ก็ต้องสร้างคิวรี่เพื่อเรียงข้อมูลดังนี้

select * from T order by val(replace(N,"/","."))

หลักการคือเปลี่ยน / เป็นจุดทศนิยมแทน แล้วตีความเป็นค่าตัวเลข ดังนั้น 1/1 ก็กลายเป็น 1.1 แล้วการเรียงก็จะเป็นตามที่ต้องการ  แต่ใช้ไม่ได้กับบ้านที่มีตัวอักษรซึ่งผมไม่แน่ใจว่าจะมีประเภท 123ก, 123ข หรือเปล่า แต่ถ้ามี ระบบอาจเลือกตัวไหนขึ้นมาแสดงก่อนก็ได้ เพราะตีค่าเป็น 123 เหมือนๆกัน
โพสต์นี้ได้รับคำขอบคุณจาก: MAKI

50
https://www.thai-access.com/index.php?topic=1213.msg5343#new
โพสต์นี้ได้รับคำขอบคุณจาก: PookPuy, Tatchawin

51
ห้อง MS Access / : หาค่า Min จาก Query Access
« เมื่อ: 19 พ.ค. 63 , 16:12:25 »
สมมุติเทเบิล T มีฟิลด์ ID, F1, F2, F3

select ID, F1, F2, F3 , min(F0) as FMin 
from 
(              select ID, F1, F2, F3, iif(F1 = 0, NULL, F1) as F0 from T
  union all select ID, F1, F2, F3, iif(F2 = 0, NULL, F2) as F0 from T
  union all select ID, F1, F2, F3, iif(F3 = 0, NULL, F3) as F0 from T)
group by ID, F1, F2, F3
order by ID
โพสต์นี้ได้รับคำขอบคุณจาก: OddyWriter, PNR, napat2020

52
คุณไปที่ windows command line  ของเครื่องที่บ้าน แล้วสั่ง PING <เลขIPของเครื่องที่ติดตั้ง shared drive> เพื่อดู Latency Time ว่าเฉลี่ยแล้วมีค่ากี่ millisecond (ms) เเล้วทำอย่างเดียวกับเครื่องที่ออฟฟิสเครื่องอื่นที่เชื่อมไปเครื่องที่ติดตั้ง shared drive  ถ้าต่างกัน 1 เท่า ความเร็ว***เฉพาะ***ในส่วนการรับส่งข้อมูลก็น่าจะลดลงไปเท่าตัวเช่นกันครับ

ถ้าไม่สามารถเพิ่มความเร็วของ VPN ได้อีก อีกวิธีที่เหมาะสมก็คือการใช้โปรแกรมประเภท Remote Control เช่น Team Viewer, Ultra VNC หรือตระกูล VNC ทั้งหลาย เพื่อเชื่อมไปยังเครื่องที่ออฟฟิสที่เราใช้งานประจำ แต่มีข้อเสียคือเครื่องนั้นต้องเปิดตลอดเวลา ไม่ก็ต้องมีคนมาเปิดให้และรันโปรแกรมเพื่อรับการเชื่อมต่อด้วยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: BH

53
เท่าที่ดูคิวรี่นั้นจากคำถามก่อนๆที่มีใส่ไฟล์ฐานข้อมูลเอาไว้ พอไล่ไป สุดท้ายแล้วก็คือผลรวมของพาเลทเข้า-พาเลทออกจากเทเบิล In และ Out ผมเลยเขียนโค้ดโดยหาจากเทเบิลโดยตรงแทนนะครับ

If Nz(Me![A], "") <> "" Then
    If Not (Left(Me![A], 2) Like "A[MNOP]*") Then
        If Nz(DSum("InPallet", "In", "Place = '" & Me![A] & "'"), 0) _
        - Nz(DSum("OutPallet", "Out", "Place = '" & Me![A] & "'"), 0) >= 1 Then
            MsgBox "พื้นที่เต็ม"
            Cancel = True
        End If
    End If
End If
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

54
โค้ดที่ให้ไป ตรวจสอบเฉพาะจำนวนพาเลทที่กำลังป้อนในเรคอร์ดนั้นๆ แต่เท่าที่อ่านใหม่ เหมือนว่าจำนวน 1 พาเลทนั้น ต้องไปค้นเรคอร์ดอื่นๆที่ป้อนไปก่อนหน้าด้วยใช่ไหมว่าได้ป้อนจำนวนพาเลทเท่าไหร่ไปแล้ว

ถ้าใช่
1. ต้องไปค้นจากเทเบิลไหน
2. ใช้เงื่อนไขอะไร ฟิลด์อะไร เพื่อค้นจากเรคอร์ดอื่นๆบ้าง เช่น ต้องเป็นสถานที่เดียวกัน วันเดียวกัน หรือมีอะไรอย่างอื่นอีกบ้าง   หรือสถานที่เดียวกัน ไม่ว่าจะวันไหนก็ได้   หรือสถานที่เดียวกัน ไม่ว่าวันไหนก็ได้ แต่ยกเว้นวันที่กำลังป้อนอยู่นี้
3. ในสถานที่เดียวกัน วันเดียวกัน ป้อนได้เพียงเรคอร์ดเดียวหรือไม่
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

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