แสดงกระทู้

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 - PNR

หน้า: 1 2 3 4 [5] 6 7 8 ... 46
73
ลองเพิ่มตรงสีแดงเข้าไปว่าได้ไหม
  Set xlapp = CreateObject("excel.application")
  With xlApp
        .Visible = True
        .DisplayFullScreen = True
        .Workbooks.Add
        .Sheets("Sheet1").Select
        .ActiveSheet.Range("A2").CopyFromRecordset rsClone

74
https://www.thai-access.com/tiupld/view.php?id=qxlssh-c273a7
ผมลงรูปไม่เป็น ขอโทษด้วยครับ เลยเอาลิ้งฝากรูปมาแทน
ใช้ Event Form_Load นะครับ มี 2 แบบคือ

1.ถ้าอยากให้เปิดแล้วไป record ท้ายสุดที่เคยลงไว้ก็ใส่
Private Sub Form_Load()
docmd.GoToRecord,,acLast
End Sub

2.ถ้าอยากให้เปิดมาแล้วให้พร้อมกรอกข้อมูลใหม่เลยก็ใส่
Private Sub Form_Load()
DoCmd.GoToRecord , , acNewRec
End Sub

หรือท่านจะสร้างปุ่มไว้ด้วยกรณีกรอกข้อมูลเสร็จแล้วก็กดปุ่มเพื่อไปกรอกหน้าใหม่เลยเช่น

Private Sub btnAdd_Click()
DoCmd.Save
DoCmd.GoToRecord , , acNewRec
End Sub

75
ลองดูกระทู้นี้ครับ

แนะนำให้มี ตาราง User และมีฟิลล์ UserLevel เพื่อใช้ในการกำหนดสิทธิ์การเข้าถึงหรือการมองเห็น
และทำฟอร์มแยกออกมา ตามสิทธิ์ที่สามารถใช้ได้ดีกว่าครับ
โดยจากโค้ดด้านล่างให้ใช้การ selete Case หรือใช้ IF เข้ามาเช็คเงื่อนไขเช่น
IF Flevel = 1 then
docmd.OpenForm "admin"
elseif Flevel = 2 then
Docmd.openform "User"
End if

ส่วนโค้ดไปศึกษาจากลิ้งด้านล่างได้เลย

https://www.thai-access.com/index.php?topic=117.msg318#msg318

77
คำสั่ง มันดัดแปลงได้หลายๆแนวมากแล้วแต่การบันทึกว่าจะทำแบบไหน
ถ้าแบบเบื้องต้น ใช้ Current ในการเช็ค และไปสร้างเงื่อนไขเช็คจาก .Caption เช่น

สร้าง Sub ขึ้นมาใส่
โค๊ด: [Select]
Private Sub CheckRecord()
If NewRecord Then
Me.btnAdd.Caption = "บันทึก"
Else
Me.btnAdd.Caption = "เพิ่ม"
End If
End Sub

ที่ Event Form_Current() ใส่โค้ด
โค๊ด: [Select]
Private Sub Form_Current()
CheckRecord
End Sub

ต่อมาสร้างเงื่อนไขให้กับปุ่มเพิ่ม/บันทึก
โค๊ด: [Select]
Private Sub btnAdd_Click()
If IsNull(Me.ID) Then 'เช็คเงื่อนไขบนฟอร์มว่า ID ไม่เป็นค่าว่างป้องกันกรณีที่ยังไม่ได้เพิ่มข้อมูลแล้วกดบันทึก
MsgBox "กรุณาระบุข้อมูล", vbCritical, "Status!!"
Else
If Me.btnAdd.Caption = "บันทึก" Then
DoCmd.RunCommand acCmdSave
Me.btnAdd.Caption = "เพิ่ม"
ElseIf Me.btnAdd.Caption = "เพิ่ม" Then
DoCmd.GoToRecord , , acNewRec
End If
End If
End Sub

ลองไปดัดแปลงใช้งานดูครับ

79
ผมว่าเงื่อนไขต้องนี้น่าจะมาจากเงื่อนไขตอนแรกมากกว่า
เช่น การกำหนดให้มีการ Dcount มาแสดงใหม่เป็นต้น

ถ้า textbox ใดๆ ที่ผลลัพธ์ มาจากการคำนวน จะใช้ .recalc
ถ้าเป็นคอนโทรลที่มีข้อมูล Bound เช่น  ตารางหรือ Query , ฟอร์มย่อย , วัตถุ OLE เช่น แผนภูมิ , combobox , listbox , ตัวควบคุมที่มีฟังก์ชันการรวม เช่นDSum  ใช้ .Requery ได้



80
ห้อง MS Access / : สอบถามโค้ด SQL ครับ
« เมื่อ: 06 ส.ค. 64 , 14:13:40 »
WHERE (((PI.[Position]) NOT LIKE "ผช.ช่าง" And (PI.[Position]) Not Like "สัญญาจ้าง"));

แล้วถ้าเราอยากนับว่าใน Table นี้ Query นี้มี Record อยู่กี่ Row ใส่ลงใน form ต้องเขียน VBA ยังไงหรอครับ หรือว่าลง Query ได้อย่างเดียวครับ

ทำได้หลายแบบ
ถ้าแบบง่ายก็ใช้ การแสดงผลใน textbox
Dim RecCount as long
RecCount = DCount("*", "[ชื่อตารางหรือคิวรี่]")
Me.txtRecCount = RecCount

ถ้าอยากแสดงบน Label ใช้
Me.LabelRecCount.Caption = RecCount

81
ห้อง MS Access / : สอบถามโค้ด SQL ครับ
« เมื่อ: 06 ส.ค. 64 , 14:01:25 »
WHERE (((PI.[Position]) NOT LIKE "ผช.ช่าง" And (PI.[Position]) Not Like "สัญญาจ้าง"));

ปกติใช้
WHERE (((PI.[Position]) NOT "ผช.ช่าง" And (PI.[Position]) Not  "สัญญาจ้าง"));

Not Like จะใช้ในกรณ๊ที่ต้องการประโยคบางส่วนของข้อมูลก็เข้าเงื่อนไขโดยใช้ *  เช่น
มีข้อมูล กขค
          กขจ
          ครง
          จกข
WHERE (((PI.[Position]) NOT "*ก"));

ข้อมูล กขค กับ กขจ จะไม่แสดง เป็นต้น

82
เปลี่ยนจาก Count เป็น Sum ธรรมดาได้เลยเช่น
ถ้าคุณมีข้อมูลใน Field แยกประเภท ข้อมูล จะมี สัญญาจ้าง และ พนักงานประจำ

เช่น
[แยกประเภท]
สัญญาจ้าง
สัญญาจ้าง
พนักงานประจำ
สัญญาจ้าง
พนักงานประจำ
สัญญาจ้าง

SQL คือ

SELECT Sum(IIf([แยกประเภท]="สัญญาจ้าง",1,0)) AS สัญญาจ้าง, Sum(IIf([แยกประเภท]="พนักงานประจำ",1,0)) AS พนักงานประจำ
FROM [ชื่อตารางหรือคิวรี่];


ข้อมูลจะได้
สัญญาจ้าง lพนักงานประจำ
      4     l       2


กรณีที่ Field แยกประเภท จะระบุเฉพาะคนที่มีสัญญาจ้างเท่านั้น พนักงานประจำไม่ได้ระบุหรือเว้นว่างๆ ไว้แต่อยากให้คำนวนด้วย
เราก็แก้เงื่อนไข True False ให้ False = 1 ก็ได้แล้วครับเช่น

SELECT Sum(IIf([แยกประเภท]="สัญญาจ้าง",1,0)) AS สัญญาจ้าง, Sum(IIf([แยกประเภท]="สัญญาจ้าง",0,1)) AS พนักงานประจำ
FROM [ชื่อตารางหรือคิวรี่];

83
เสริมเพิ่มเติม
บางครั้งแปลงไฟล์ เป็น ACCDE หรือ MDE
เพื่อป้องกันการแก้ไขหรือลบโค้ด Module  สามารถใช้งานรันได้ แต่ไม่สามารถเปลี่ยนแปลงได้
เพื่อที่ป้องกันผู้ใช้จากการเข้าถึงฐานข้อมูลแบบเต็มครับ

แต่เมื่อแปลงเป็น เป็น ACCDE หรือ MDE แล้ว ถ้า Admin ผู้พัฒนาจะแก้ไขโค้ดต่างๆ ต้องทำจากตัว ACCDB หรือ MDB เท่านั้นแล้วแปลงใหม่
จะไม่สามารถแก้ไขโค้ดจาก ACCDE ได้เช่นกัน

84
สามารถดึงตารางที่มี Field เพศ หรือ Field กรุ๊ปเลือด มานับจำนวนโดยสร้างคิวรี่ใหม่ขึ้นมาแล้ว ใส่ sql แบบนี้

SELECT [เพศ], Count([เพศ]) AS จำนวน FROM [ชื่อตารางหรือคิวรี่]  GROUP BY [เพศ];

และถ้าจะนับจำนวน กรุ๊ปเลือด ทำแบบเดียวกัน

SELECT [กรุ๊ปเลือด], Count([กรุ๊ปเลือด]) AS จำนวน FROM [ชื่อตารางหรือคิวรี่]  GROUP BY [กรุ๊ปเลือด];

85
ที่คิวรี่ ให้ดึงฟิลล์ไอดี เข้ามาด้วย แต่ให้กดติ๊กถูกออกไปเพื่อไม่ให้แสดงบนฟอร์ม
และให้เรียงลำดับจากน้อยไปหามาก ที่ฟิลล์ ID นี้

86
ตอบ ข้อความผมด้วยครับ ผมส่ง ID LINE ไปให้แล้ว


87
ส่ง รหัส anydesk มาทางข้อความหน่อยครับ
ผมรีโมทไปแก้ให้

88
ลองเช็ค ไปทาง Floder testProject แล้วใช่ไหมครับ ว่าไม่มีไฟล์ excel ที่ export มา

89
Dim strOutFile As String
On Error Resume Next
Me.Dirty = False
   CurrentDb.QueryDefs("qryPTT").sql = Me.RecordSource    'นำ RecordSource ของฟอร์มนิแหละครับมาใช้
strOutFile = "E:\Test.xlsx" 'ตำแหน่งที่ให้นำไฟล์ Export ไปวาง
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qryPTT", strOutFile, False



โดย ผมได้นำ ข้อมูลจากตาราง PTT ทั้งหมด มาสร้าง Query ชื่อ QryPTT แล้วใช้ QueryDefs

90
โค้ดผิดครับ
แก้เป็น

Set rsc = Forms!......................Form.RecordsetClone

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