แสดงกระทู้

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 7 ... 29
55
ห้อง 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"

56
ผมใช้วิธีสร้าง 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 เป็นตัวเลข
- ใช้ได้กับฟอร์มที่แสดงเพียงอย่างเดียว ถ้ามีการป้อนเรคอร์ดใหม่ลงในฟอร์มด้วย ต้องแก้ไขโปรแกรมเพิ่มเติม
- สถานะการเลือก ต้องใช้เวลานิดหน่อยในการแสดง ถ้าจำนวนบรรทัดยิ่งมาก อาจจะใช้เวลามากขึ้น
- ต้องเขียนโค้ดเพื่อจัดการ

57
เอาเงื่อนไขสุดท้าย คือ Group on Item ออกครับ

58
เราอ้างถึงฐานข้อมูลตัวปัจจุบันที่โค้ดกำลังทำงานด้วย 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
...
...
...

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

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

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

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

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

62
ห้อง 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

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

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

64
ถ้าการอัพเดตก่อนหน้านี้ถูกทำผ่านโค้ด ดังนั้นคุณก็สามารถอ่านและเก็บค่าต่างๆเอาไว้ได้ทั้งก่อนและหลังการอัพเดต    สมมุติว่า I,M1,M2 คือตัวแปรที่เก็บค่า Fid, Member ก่อนและหลังเปลี่ยนตามลำดับ ก็ใส่โค้ดนี้ต่อท้ายโค้ดที่อัพเดต Ref_Member 

DoCmd.RunSQL "INSERT INTO Tbl_TransOwner(farmid, TransFrom, TransTo, TransDate) VALUES('" & I & "', '" & M1 & "', '" & M2 & "', #" & Format(Date(), "dd/mmm/yyyy") & "#)"

หมายเหตุ : โค้ดนี้สำหรับฟิลด์ TransDate ที่มี Data Type เป็น Date

65
การอัพเดท Ref_member ทำผ่านฟอร์มหรือผ่านโค้ด

66
ตามภาพในคำตอบ#2 ในช่อง Before Update ให้เลือก [Event Procedure] แล้วคลิกปุ่ม ... ที่ท้ายช่อง มันจะเปิดหน้าต่างสำหรับให้เขียนโค้ดภายใต้กรอบ BeforeUpdate Event Procedure

และขอเพิ่มเติมให้เขียนโค้ดใน After Update event procedure ของคอนโทรลที่เลือกพื้นที่ ให้ใส่โค้ด Me![A] = NULL หรือถ้าเกิด error ก็ให้เปลี่ยนจาก NULL เป็น "" (Double Quote 2 ตัวติดกัน) ด้วยครับ

67
เท่าที่ดูคิวรี่นั้นจากคำถามก่อนๆที่มีใส่ไฟล์ฐานข้อมูลเอาไว้ พอไล่ไป สุดท้ายแล้วก็คือผลรวมของพาเลทเข้า-พาเลทออกจากเทเบิล 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

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

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

69
ถ้า Aและ P คือชื่อคอนโทรลบนฟอร์มที่ป้อนรหัสพื้นที่และจำนวนพาเลทตามลำดับ  ให้ใส่โค้ดนี้ไว้ที่ BeforeUpdate event procedure ของ P

If Nz(Me![A], "") <> "" Then
    If Not (Left(Me![A], 2) Like "A[MNOP]*") Then
        If Me![P] > 1 Then
            MsgBox "พื้นที่เต็ม"
            Cancel = True
        End If
    End If
End If

70
เรากำหนด Input Mask ใน Input Box ไม่ได้ครับ วิธีที่ควรทำคือ ก่อนที่จะรันคิวรี่ ให้ไปเปิดฟอร์มที่มีเท็กซ์บ็อกซ์สำหรับป้อนวันที่ที่กำหนด Input Mask แล้วมีปุ่มให้คลิกเพื่อรันคิวรี่อีกที   ส่วน Criteria ของวันที่ก็เปลี่ยนไป Between Forms![ชื่อฟอร์ม]![ชื่อเท็กซ์บ็อกซ์วันที่เริ่มต้น] And Forms![ชื่อฟอร์ม]![ชื่อเท็กซ์บ็อกซ์วันที่สิ้นสุด] แทน

71
ไม่ได้ครับ ต้องรันบน Full Version หรือ Runtime Version เท่านั้นครับ

ถ้าเขียนด้วย MS Access 2013 แต่เครื่อง user เป็น MS Access 2007 ต้องลง runtime version 2007 ไหมคะ เพราะลองลง version2013 แล้วติด configuration รันตลอดเลยค่ะ

ในเมื่อมี Access 2007 บนเครื่อง user อยู่แล้ว ทำไมต้องลง runtime อีกครับ  เราก็เอาไฟล์ .accde ไปรันที่เครื่องนั้นเลยไม่ได้หรือ

72
ไม่ได้ครับ ต้องรันบน Full Version หรือ Runtime Version เท่านั้นครับ

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