แสดงกระทู้

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 - p.choowa

หน้า: [1]
1
ลองดูตัวอย่างอาจารย์ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: p.choowa

2
ห้อง MS Access / : ไฮไลท์ row ที่โฟกัส
« เมื่อ: 19 มิ.ย. 63 , 16:48:52 »

การสร้าง Highlight ให้กับ Current Record ลองดูตัวอย่างนี้ครับ

1.สร้าง textbox unbound ขึ้นมา 1 อันชื่อ txtHighlight แล้วซ่อนไว้ ไม่ต้องแสดง

2.เลือก textbox ตรง Detail ทั้งหมด แล้วเลือกไปที่ี การจัดรูปแบบตามเงื่อนไข ดังภาพด้านล่าง


3.กำหนดเงื่อนไข นิพจน์ โดยสร้างเงื่อนไขเช็คว่า ถ้าเรคคอร์ดปัจจุบัน = txtHighlight ก็จะแสดง สีตามที่เรากำหนด ดังรูป


4.กำหนดโค้ด Event Form_Current()

Private Sub Form_Current()
Me.txtHighlight = Me.[ID]
End Sub

หมายเหตุ

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

3
ลองดูครับ ไม่รู้ต้องการแบบนี้ไหม
ถ้าจะปรับตรงไหนสอบถามได้ครับ

โดยขั้นตอนแรก
ใช้การนำข้อมูลจากตาราง work มา Addnew ไปยังตารางที่ 2 คือ WorkExtrackUNIT
โดยจำนวนครั้งเอามาจากการจำนวนของ Unit ในแต่ละ Fullname

โค๊ด: [Select]
Sub AddRowByUnit()
Dim RS As DAO.Recordset
Dim rst As DAO.Recordset
Dim strFullname As String
Dim I As Long
    Set rst = CurrentDb.OpenRecordset("Work", dbOpenDynaset)
    Set RS = CurrentDb.OpenRecordset("WorkExtrackUNIT", dbOpenDynaset)
 
rst.MoveFirst
Do Until rst.EOF
strFullname = rst!FullName
For I = 1 To rst!unit
If strFullname = rst!FullName Then
            RS.AddNew
            RS![FullName] = rst!FullName
            RS![HN] = rst!HN
            RS!row = "1"
            RS.Update
End If
    Next
  rst.MoveNext
  Loop
    RS.Close
    Set RS = Nothing
End Sub

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

โค๊ด: [Select]
Public Sub ExplodeTable()
    Dim DB  As DAO.Database
    Dim RS  As DAO.Recordset
    Dim I   As Integer
    Dim LastID  As Variant
   
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("SELECT WorkExtrackUNIT.row,WorkExtrackUNIT.Fullname, WorkExtrackUNIT.HN FROM WorkExtrackUNIT ORDER BY WorkExtrackUNIT.ID;")
    RS.MoveFirst
    Do Until RS.EOF
    If RS!row <> LastID Then
                I = 1
            DB.Execute "insert into Workreport (row, box1) values (" & CStr(RS!row) & ", '" & CStr(RS!FullName & vbCrLf & " HN " & RS!HN) & "')", dbFailOnError
            Else
                I = I + 1
            DB.Execute "update Workreport set Box" & CStr(I) & " = '" & CStr(RS!FullName & vbCrLf & " HN " & RS!HN) & "' where row = '" & CStr(RS!row) & "'", dbFailOnError
   End If
   LastID = RS!row
    RS.MoveNext
    Loop
    RS.Close: Set RS = Nothing
    DB.Close: Set DB = Nothing
    DoCmd.OpenReport "rptdemo", acViewPreview
End Sub

แล้วสร้างปุ่มคลิ๊กขึ้นมาซักตัวหนึ่ง ใส่โค้ดให้จัดลำดับการทำงานตั้งแต่เริ่มจนถึงการออกรายงาน
โดยจะสั่งให้ลบข้อมูลในตาราง ชั่วคราวออกก่อนรับข้อมูลใหม่มาแสดงที่รายงานทุกครั้ง
โค๊ด: [Select]
Private Sub Command0_Click()
Dim DB  As DAO.Database
Set DB = CurrentDb
DB.Execute "Delete * from WorkExtrackUNIT;"
DB.Execute "Delete * from Workreport;"
Call AddRowByUnit
Call ExplodeTable
DB.Close: Set DB = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: p.choowa

4
ถูกต้องครับ คือถ้ากำหนด nEmployee datatype เป็น Integer ต้องกำหนดค่าเป็นตัวเลข
ถ้ากำหนด 01 คือการกำหนดเป็น string ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: p.choowa

5
ที่ Combo box : Part Name สั่ง Requery ข้อมูลครับ
โค๊ด: [Select]
Private Sub cb_PartID_GotFocus()
    Me.cb_PartID.Requery
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: p.choowa

6
ลองแก้ sql ของรายงานเป็นแบบนี้นะครับ

โค๊ด: [Select]
SELECT PartRequestList.Request_No, PartRequestList.Request_Date, PartRequestList.Company_ID, tb_CompanyData.CompanyName, PartRequestList.ProcessID, tb_ProcessData.ProcessName, PartRequestList.RecordByID, EmplayeeRecord.EplName, PartRequestList.RequestByID, EmplayeeRequest.EplName, qry_RequestDetail.PartName, qry_RequestDetail.Material, qry_RequestDetail.Qty, qry_RequestDetail.Unit FROM tb_ProcessData INNER JOIN (EmplayeeRecord INNER JOIN (EmplayeeRequest INNER JOIN (tb_CompanyData INNER JOIN (PartRequestList INNER JOIN qry_RequestDetail ON PartRequestList.Request_No = qry_RequestDetail.Request_No) ON tb_CompanyData.Company_ID = PartRequestList.Company_ID) ON EmplayeeRequest.Epl_ID = PartRequestList.RequestByID) ON EmplayeeRecord.Epl_ID = PartRequestList.RecordByID) ON tb_ProcessData.ProcessID = PartRequestList.ProcessID;
โพสต์นี้ได้รับคำขอบคุณจาก: p.choowa

7
งั้นแก้จากแบบเดิมที่มีการอ้างอิง mainform มาใส่แบบนี้ครับ

=DSum("[Qty]","[IncomingMove]","[PartID]='" & [txt_PartID] & "'")

สาเหตุที่ค่าผิดพลาดเพราะเมื่อเราเปิดเฉพาะ Subform
การอ้างอิงผิดพลาดตรงที่เราจะอ้างอิง MainForm ด้วย
ให้แก้ใหม่ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: p.choowa

8
ลองอ้างอิง แบบนี้ดูครับถ้าตัว textbox อยู่ในซัพฟอร์มให้อ้าง Mainform ไปหา Subform และไปยังตัว Control ครับ
และในกรณีที่ PartID เป็นtext ให้ใส่ เครื่องหมาย '  (single quote) ด้วยครับ
โค๊ด: [Select]
=DSum("[Qty]","[IncomingMove]","[PartID]='" & [Forms]![frm_IncomingSheet]![frm_IncomingList].[Form]![txt_PartID] & "'")
โพสต์นี้ได้รับคำขอบคุณจาก: p.choowa

หน้า: [1]