แสดงกระทู้

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 ... 32 33 34 [35] 36 37 38 ... 46
613
เรากำลังทำโปรแกรม เข้า ออกงาน
เช่น วันที่ 1 เข้าก็ยิงบาร์โค้ดจากบัตร พนักงาน แต่มันยิงซ้ำได้ ทำให้การบันทึกข้อมูลซ้ำ อยากไห้ภายใน 1 วัน ยิงได้แค่ ครั้งเดียวครับ

เช็คจาก บาร์โค้ด และ วันที่ปัจจุบันบน textbox วันที่ Date()ก็ได้ครับ

ขอดูโค้ดตอนยิงบาร์โคด หน่อย เราต้องสร้าง เงื่อนไขเช็ค รหัสบาร์โค้ดที่ยิงมาก่อนว่าในวันนี้มีแล้วหรือไม่ ถ้าไม่มีถึงจะให้ผ่านได้ ถ้าไม่ผ่านก็จบเงื่อนไข

โดย เช่น If not isnull(dlookup("Barcode","tblMain","Barcode = " & me.txtBarcode & " AND [Current_Date] = #" & Forms!frmMain!txtDate & "#")) then
Msgbox "มีการลงทะเบียนแล้ว"
Me.txtBarcode.setfocus
Me.txtbarcode = null
else
........... ทำเงื่อนไขเดิมที่มี
end if


614
ลองแบบนี้ึครับว่าได้ไหม 

คิวรี่แรกแบบนี้
โค๊ด: [Select]
SELECT Table1.EBELN, Table1.EBELP, Table1.BELNR, Table1.VGABE, Table1.BWART
FROM Table1
WHERE (((Table1.VGABE)<>2 And (Table1.VGABE)<>[EBELP]) AND ((Table1.BWART)="101"));

คิวรี่ 2 แบบนี้
ชื่อคิวรี่แรก Query1

โค๊ด: [Select]
SELECT Query1.EBELN, Query1.EBELP, Query1.BELNR
FROM Query1;

615
ไม่รู้แบบนี้ไหมนะครับ ผมสมมุติ table1 คือชื่อตารางนะ

โค๊ด: [Select]
SELECT Table1.EBELN, Table1.EBELP, Table1.BELNR
FROM Table1
WHERE ((Not (Table1.VGABE)=2 And Not (Table1.VGABE)=[EBELP]) AND ((Table1.BWART)="101"));

616
ได้แล้วครับอาจารย์ ปัญหาเกิดจาก ผมอ้างอิง Rs!Num  ใส่ชื่อฟิลล์จริงผิดไปครับลิมสังเกตุ

แก้เป็น
โค๊ด: [Select]
Public Sub ExplodeTable()
   Dim DB  As DAO.Database
    Dim RS  As DAO.Recordset
    Dim LastID  As Variant
    Dim I   As Integer
   
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("SELECT MakeQryOT.MemID, MakeQryOT.sOT  FROM MakeQryOT ORDER BY MakeQryOT.MemID;")
    Do Until RS.EOF
        If RS!MemID <> LastID Then
            I = 1
            DB.Execute "insert into tblOT_Report (MemID, OT1) values (" & CStr(RS!MemID) & ", " & CStr(RS!sOT) & ")", dbFailOnError
        Else
            I = I + 1
            DB.Execute "update tblOT_Report set OT" & CStr(I) & " = '" & CStr(RS!sOT) & "' where MemID = '" & CStr(RS!MemID) & "'", dbFailOnError
        End If
        LastID = RS!MemID
        RS.MoveNext
    Loop
    RS.Close: Set RS = Nothing
End Sub

ตอนนี้ได้แล้วครับ ขอบคุณครับ

617
ใช้คำสั่ง SQL ล้วนๆคงไม่ได้ ต้องใช้ VBA ด้วย โค้ดนี้ต้องปรับแก้ให้ใส่ ' ' คร่อม ถ้า data type ของ ID, Num, Fieldxx เป็น Text ด้วยนะครับ

Public Sub xxx()
    Dim DB  As DAO.Database
    Dim RS  As DAO.Recordset
    Dim LastID  As Variant
    Dim I   As Integer
   
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("select * from Table1 (order by ..., ถ้ามี)")
    Do Until RS.EOF
        If RS!ID <> LastID Then
            I = 1
            DB.Execute "insert into Table2 (ID, Field1) values (" & CStr(RS!ID) & ", " & CStr(RS!Num) & ")", dbFailOnError
        Else
            I = I + 1
            DB.Execute "update Table2 set Field" & CStr(I) & " = " & CStr(RS!Num) & " where ID = " & CStr(RS!ID), dbFailOnError
        End If
        LastID = RS!ID
           
        RS.MoveNext
    Loop
    RS.Close: Set RS = Nothing
End Sub

ขึ้น พารามิเตอร์น้อยเกินไปต้องการ 1 ครับ แถวล่าง Else
DB.Execute "update tblOT_Report set OT" & CStr(I) & " = '" & CStr(RS!OT) & "' where ID = '" & CStr(RS!MemName) & "'", dbFailOnError

Field OT จะมี OT1 , OT2 OT3 ไปเรื่อยๆ

619
 :question: มีข้อมูลจากตารางชื่อ Table1  จะ Add ข้อมูลไปยังตาราง Table 2 โดยให้แยกจากแถวไปใส่ในคอลัมน์แทนจะทำได้ไหม
แบบในรูปเลยครับ  :sweat: :sweat:


620
อ้างถึง
ผมมีตารางชื่อ xFake อยากส่งออกไปไว้ d:\ชื่อตารางเดิมแต่นามสกุลเป็น .xls เอ็กเซลปี 2003 ครับ ทับไฟล์เก่าได้เลยถ้ามีอยู่แล้ว

ถ้าไม่เอาการเรียก ตำแหน่งจะวางก็ใส่แค่นี้พอครับ
โค๊ด: [Select]
private Sub Command0_Click()
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "xfake", "D:\xfake.xls", True
end sub

ถ้าอยากระบุตำแหน่งด้วยก็แบบนี้

โค๊ด: [Select]
Private Sub Command0_Click()
    Const msoFileDialogFilePicker = 3
    Const msoFileDialogViewDetails = 2
 
    Dim fd As Object
    Dim varItems As Variant
    Dim flPath As Variant
    Dim LFilename As String

    Set fd = Application.FileDialog(msoFileDialogViewDetails)
    With fd
        .Title = "Save As"
        .AllowMultiSelect = False
        .InitialView = msoFileDialogViewDetails
        .InitialFileName = "Xfake"
    End With

    If fd.Show = True Then
        For Each varItems In fd.SelectedItems
            flPath = varItems
        Next
    End If
    LFilename = flPath

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "xfake", LFilename, True

End Sub

621
เรามีชุดข้อมูล
100      100
90         90
80         80
70         70
60         60
50         50
40         40
30         30
20        20
10         10

นายA    นายฺB
จะมีขั้นให้เลื่อน ได้ 1 - 3 ขั้น
เริ่มจากรอบแรก ประเมินนาย A ถ้าได้ 1 ขั้น
นายA ก็จะได้ 1
รอบสอง นายA ได้ 3 ขั้น ก็จะ+เพิ่มของเก่าที่มีอยุ่ 10 ไปอีก 3ขั้น จะเป็น 40
ทำแบบนี้ไปเลื่อยๆครับ

การเลื่อนขั้นแต่ละครั้งทำบนฟอร์มไหม

ใช้ Dmax Field เลขของขั้น แยกตาม IDของคน พอได้มาแล้ว ก็นำมา + กับจำนวนขั้นที่ได้เพิ่ม ก็จะได้จำนวนขั้นปัจจุบันแล้วครับ
ผมไม่แน่ใจว่าเวลาคุณเก็บ จำนวนขั้น เก็บแบบ 1 2 3 4 5 6 7 8 9 10 หรือเปล่า จะเก็บแบบ 10 20 30 40 50 60 70 80 90
คุณได้มีการเก็บวันที่จะการได้รับการเลื่อนขั้นด้วยหรือไม่ ?

ถ้าแบบแรกสร้างฟอร์ม
มี textbox       txtNewStep ระบุขั้นปัจจุบัน
   combobox   CmbID        เก็บ ID และ ชื่อของผู้ได้รับการเลื่อนขั้น
   textbox       txttotalStep  เก็บจำนวนขั้นล่าสุด
ถ้าแบบง่ายๆ เลยสาย DIY

Dim A as integer
A = Dmax("Field ขั้น","จากตารางไหน","ID = " & Me.CmbID & "") *10  สมมุติว่ามีอยู่ 2 ขั้น A จะ เท่ากับ 20
ต่อไป A = A + (Me.txtNewStep * 10)   ถ้า txtNewStep ระบุว่า 3 ก็จะเป็น 20 + 30 = 50 เป็นต้น
txttotalStep = A

ผมยังไม่เข้าใจโจทย์เท่าไรครับ ว่าคุณต้องการทำแบบตัวอย่างข้างบนหรือแบบ  Running Total กันแน่

ถ้าแบบ Running Total ข้อมูลจะประมาณนี้
https://theaccessbuddy.wordpress.com/2014/05/04/using-ms-access-to-create-a-running-total-or-a-cumulative-sum-part-1-of-2/

622
อ้างถึง
ทำคิวรี่เพื่อเปรียบเทียบค่าถ้า 0 หรือ ค่าว่างให้แสดงเป็นค่า 1 ลองใช้ iif แล้วทำคิวรี่อีกอันมารวม

ใช้ Sum ในคิวรี่นี้เลยก็ได้นะครับ  เช่น โดยการ group by
กำหนดตรง groupby เป็น expression
Expr1:Sum(IIf(IsNull([score]),1,0)

ตัวอย่างในคิวรี่ในงานเก่าๆ ที่เคยทำไว้

623
อยากทำฟอร์ม access
 ข้อความใน textbox ก่อนกรอกข้อมูล แล้วพอกดที่ text ให้ข้อความหาย เห็นกับ ช่องค้นหาของเว็บนี้ครับ
ไม่รู้ว่าเรียกแบบนี้ว่าอะไรครับ



สมมุติ มี textbox ชื่อ text0 นะครับ เราจะใช้ 3 event

Private Sub Form_Current()
    Me.Text0.ForeColor = RGB(200, 200, 200)
    Me.Text0.Value = "My Program Custom Search"
End Sub

Private Sub Text0_Exit(Cancel As Integer)
If IsNull(Me.Text0) Then
    Me.Text0.ForeColor = RGB(200, 200, 200)
    Me.Text0.Value = "My Program Custom Search"
 End If
End Sub

Private Sub Text0_GotFocus()
If Me.Text0.Value = "My Program Custom Search" Then
 Me.Text0.Value = Null
 Me.Text0.ForeColor = RGB(0, 0, 0)
 End If
End Sub

ลองดูครับ

624
อ้างถึง
1.ต้องการให้สามารถเรียกดูรายงาน ใบเสร็จรับเงินแบบแยกเฉพาะเลขที่ใบเสร็จได้หน่ะครับ

ตัวรายงานมีเรคคอร์ดที่มี ฟิลล์ Bill_ID อยู่ด้วย
เวลาจะเลือกข้อมูลที่เอาเฉพาะที่มี Bill_ID เหมือนกัน ใช้คำสั่งเปิดรายงานและ กรองค่า Bill_ID ให้ตรงกันกับที่แสดงบนฟอร์มดังนี้

DoCmd.OpenReport "ชื่อรายงาน", acViewPreview, , "[Bill_ID] = & Me.txtBill_ID"


อ้างถึง
2.อยากทำให้ตัวรายงานการขายมีปฏิทินให้สามารถเลือกวันที่ได้ครับ ตอนนี้ต้องกรอกใส่พารามิเตอร์ครับ
สร้าง textbox 2 อัน ตั้งชื่อว่า txtStartDate กับ txtEndDate ไว้บนฟอร์ม ชื่อ findbill
กำหนด รูปแบบ เป็น Short Date ทั้ง 2 textbox หรือดู ในฐานข้อมูลว่าฟิลล์วันที่ กำหนดรูปแบบไว้เป็นแบบไหน ก็มากำหนดใน textbox ให้เหมือนกัน
หรือใช้ คำสั่งกำหนดรูปแบบวันที่ในคิวรี่ เช่น Format(ฟิลล์วันที่,"DD/MM/YYYY")  จะได้รูปแบบวันที่ 00/00/0000 เป็นต้น

เวลากำหนด ในคิวรี่ในฟิลล์ วันที่ ผมสมมุติชื่อ ฟิลล์ Date_Sell
ใส่ criteria ของฟิลล์ date_Sell  ไปว่า Between forms!findbill!txtstartdate and forms!findbill!txtenddate
ข้อมูลที่ออกมาจะกรองข้อมูล ระหว่างวันที่ ของ textbox ทั้งสอง





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

626
ลาออกแค่สองครั้ง ก็ใช้การสร้างฟิลล์หมายเหตุไว้ มีช้อย "ปกติ" , "ลาออก1ครั้ง" ซึ่งปกติ จะมีสถานะไม่เคยบาออก ถ้ามีการลาออก1ครั้ง ก็หมายเหตุลาออก 1ครั้ง หรือ อยากสร้างตารางแยกออกไป ก็ได้ครับ เพื่อความรัดกุมของข้อมูล

627
อ้างถึง
การจะกำหนดเงื่อนใขให้ต้องสอบผ่าน ถึงจะได้เป็นสมาชิก ต้องกำหนดอย่างไร

ตรง สถานะคำขอ ว่าจะให้เป็นสมาชิกได้หรือไม่นั้น เช็ค ตรง Field ผลการสอบ จากตาราง สอบ  ว่า "ผ่าน" หรือ "ไม่ผ่านครั้งแรก" หรือ "ไม่ผ่าน"  โดยอ้างอิงจาก ID โดย ใช้ Dlookup ก็ได้ครับ  ถ้าผ่านแล้ว ก็ให้มีการสร้าง ID ในตาราง สมาชิกได้ และสามารถใส่รายละเอียดอื่นๆ ในตารางด้วย ID นั้นได้

ถ้าข้อมูลระบุว่า "ไม่ผ่าน" (ไม่ผ่านรอบสองด้วย) ให้ใส่วันที่สอบไม่ผ่านไว้ด้วย เพื่อ ใช้ในการตรวจสอบ วันที่ ว่าครบกำหนด 1 ปี หรือยังเพื่อที่จะะสมัครได้ในครั้งต่อไป

เรื่อง การลาออก คุณมีฟิลล์ สถานะอยู่แล้ว ให้เพิ่มฟิลล์ วันที่ลาออก / สาเหตุการลาออก ไว้ด้วย
โดย ฟิลล์สถานะนั้น อาจจะมีช้อย "ยังเป็นสมาชิก" หรือ "ลาออก" เป็นต้น
ที่ฟอร์ม ถ้าสมาชิกลาออกก็ให้สามารถระบุ วันที่ลาออก / สาเหตุการลาออก มาเก็บไว้ในตารางได้

628
คัดลอกข้อมูลสามารถทำได้เช่น การใช้ Append Query ช่วยได้ครับ
ในการนำข้อมูล ที่ต้องการไปใส่ในตารางที่ 2

629
Private Sub Text185_GotFocus()
If Isnull(Me.txt_shop_id) Then
    MsgBox "ป้อนข้อมูล สาขา ก่อนนะ"
    Me.txt_shop_id.SetFocus
    End If
End Sub

630
ผมสมมุติตาราง 2 ตารางคือ ตารางรายละเอียดนักเรียนชื่อ tblstudent มี ข้อมูลตามภาพ


ตารางที่สองเป็นตารางรายละเอียดคุณครู ชื่อ tblAdviser


ต่อมาสร้างคิวรี่ชื่อว่า QryMakeDATA เพื่อรวบรวมรายละเอียดที่จะนำไปสร้างโดยใช้ โค้ด
โค๊ด: [Select]
SELECT tblStudent.Stud_Code, tblStudent.Stud_Name, tblAdviser.Adviser_Name
FROM tblStudent LEFT JOIN tblAdviser ON tblStudent.Stud_Class = tblAdviser.Adviser_Class;

สร้างตารางเพื่อไว้เก็บข้อมูลที่ผ่านการสร้างใหม่ขึ้นมาแล้วผมให้ชื่อว่า tblResult
โดย มี 2 field ดังนี้
Column1 ชนิดข้อมูลเป็น text
Column2 ชนิดข้อมูลเป็น text


ที่ฟอร์มสร้างปุ่มขึ้นมา 1 ปุ่ม Event Click ใส่ข้อมูลดังนี้

โค๊ด: [Select]
Private Sub Makedatatotable_Click()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim rstOut As DAO.Recordset
Dim strStud_Code As String
Dim strAdviser_Name As String
Set db = CurrentDb()
Set rst = db.OpenRecordset("QryMakeDATA", dbOpenDynaset)

If Not rst.BOF And Not rst.EOF Then
  rst.MoveFirst
  strStud_Code = rst!Stud_Code
  strAdviser_Name = rst!Adviser_Name
 
  rst.MoveNext
   
  Do Until rst.EOF
    If strStud_Code = rst!Stud_Code Then
      strAdviser_Name = strAdviser_Name & ", " & rst!Adviser_Name
    Else
    Set db = CurrentDb()
    Set rstOut = db.OpenRecordset("tblResult", dbOpenDynaset)
    rstOut.AddNew
    rstOut!Column1 = strStud_Code
    rstOut!Column2 = strAdviser_Name
    rstOut.Update
       
      strStud_Code = rst!Stud_Code
      strAdviser_Name = rst!Adviser_Name
        rstOut.Close
        db.Close   
    End If
    rst.MoveNext
  Loop
    Set db = CurrentDb()
    Set rstOut = db.OpenRecordset("tblResult", dbOpenDynaset)
    rstOut.AddNew
    rstOut!Column1 = strStud_Code
    rstOut!Column2 = strAdviser_Name
    rstOut.Update       
      strStud_Code = rstOut!Column1
      strAdviser_Name = rstOut!Column2 
    rstOut.Close
    db.Close
   MsgBox "ออกข้อมูลเรียบร้อย", vbInformation, "แจ้งเตือน"
End If
Set rst = Nothing
Set db = Nothing
Set rstOut = Nothing
End Sub

ตัวอย่างข้อมูลที่ได้ครับ


ข้อมูลเหล่านี้สามารถไปสร้างเป็นรายงานได้เลยครับ

หน้า: 1 ... 32 33 34 [35] 36 37 38 ... 46