แสดงกระทู้

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 ... 52
1
วิธิที่ 1.สร้าง Module ใส่โค้ดนี้เข้าไป
โค๊ด: [Select]
Function rownumQry(Rec) As Variant
Static firstRec, row&
If firstRec = "" Then firstRec = Rec
If Rec = firstRec Then row = 0
row = row + 1
rownumQry = row
End Function

ที่คิวรี่ดึงฟิลล์อื่นๆที่ต้องการมาแสดงปกติ
และใส่โค้ดนี้เข้าไปอีก 1 ฟิลล์

RowNumber: rownumqry([ชื่อฟิลล์ที่อยากนำมาสร้างลำดับ])
คิวรี่จะสามารถรันลำดับได้ครับซึ่งไม่จำเป็นต้องมีตัวเลข หรือ ข้อมูลที่ไม่ซ้ำ เหมือนกับการใช้ Count(*) มาสร้างลำดับ
เมื่อได้ลำดับมาแล้วท่านอาจจะสร้าง MakeTable Query เพื่อสร้างตารางไว้เลยก็ได้


วิธีที่ 2 ใช้การ Append ข้อมูลที่ลิ้งมานั้นไปยังตาราง access
โดยมีการกำหนดให้มีField ที่เป็น AutoNumber อยู่ด้วย มันจะสร้างลำดับให้อัตโนมัติ
ในบางครั้งถ้าลบข้อมูลเก่าออกไปแล้วการรันลำดับนั้นไม่เริ่มต้นที่ 1 ใหม่
ให้ทำการ compact & Repair ก็จะสามารถรันลำดับได้ปกติครับ


2
ลอง DIY ดูไม่รู้ใช้การได้ไหมนะครับ

เปลี่ยนฟิลล์ Name เป็น Names

1.สร้างคิวรี่ที่ 1 ตั้งชื่อ Qry1 ใส่โค้ด
โค๊ด: [Select]
SELECT Table1.ID, Table1.Names, DLast("ID","Table2","Names = '" & [SN1] & "'") AS A, DLast("ID","Table2","Names = '" & [SN2] & "'") AS B, DLast("ID","Table2","Names = '" & [SN3] & "'") AS C, IIf(Not IsNull([A] And [B] And [C]),0,1) AS [CHECK]
FROM Table1;
2.สร้างคิวรี่ที่ 2 ใส่โค้ด
โค๊ด: [Select]
SELECT Qry1.ID, Qry1.Names, Qry1.A AS SN1, Qry1.B AS SN2, Qry1.C AS SN3
FROM Qry1
WHERE (((Qry1.CHECK)=0));

ใช้ Dlast เพื่อดึงรหัสสุดท้ายมาแสดงครับ
ที่จริงแล้ว ข้อมูลใน Table 2 นั้นควรเป็นรายการที่จะไว้เลือกข้อมูลของ Sn1 ถึง Sn3 ด้วยซ้ำ อาจใช้ Combobox ก็ได้คับ


3
ใช้ Event เอาครับเช่น DblClick

Dim strBay As String
Dim strBox As String
strBay = Me.Bay.Value
strBox = Me.ActiveControl.Name
msgbox  strBay & " " & strBox

เบื้องต้น code ด้านบนไว้หาตำแหน่งของ Bay และ Box
จากนั้นใช้คำสั่ง Dlookup หรืออื่นๆ เพื่อดึงค่า Code ที่ตรงมาแสดงได้เลยครับ

4
เพิมเงื่อนไข นิดหน่อยก็ได้เลยครับ

Option Compare Database

Function DoBathString(Num As String)
'ต้องขอขอบคุณผู้ที่เขียนโปรแกรมนี้เผยแพร่ในการตอบคำถามใน Pantip.com
Dim numstring(10) As String
Dim million As Integer
Dim hundred_million As Integer
Dim ten_thousand As Integer
Dim thousand As Integer
Dim hundred As Integer
Dim ten As Integer
Dim onebath As Integer
Dim inputstring As String
Dim numLen As Integer
Dim a As String
Dim result As String
Dim bTen As Boolean

numstring(1) = "ศูนย์"
numstring(2) = "หนึ่ง"
numstring(3) = "สอง"
numstring(4) = "สาม"
numstring(5) = "สี่"
numstring(6) = "ห้า"
numstring(7) = "หก"
numstring(8) = "เจ็ด"
numstring(9) = "แปด"
numstring(10) = "เก้า"
inputstring = Format$(Num, "######0.00")
numLen = Len(inputstring)
If numLen >= 10 Then
a = Left$(inputstring, numLen - 9)
If Len(a) = 1 Then result = numstring(Val(a) + 1) + "ล้าน"
End If
If numLen >= 9 Then
a = Mid$(inputstring, numLen - 8, 1)
If Val(a) > 0 Then result = result + numstring(Val(a) + 1) + "แสน"
End If
If numLen >= 8 Then
a = Mid$(inputstring, numLen - 7, 1)
If Val(a) > 0 Then result = result + numstring(Val(a) + 1) + "หมื่น"
End If
If numLen >= 7 Then
a = Mid$(inputstring, numLen - 6, 1)
If Val(a) > 0 Then result = result + numstring(Val(a) + 1) + "พัน"
End If
If numLen >= 6 Then
a = Mid$(inputstring, numLen - 5, 1)
If Val(a) > 0 Then result = result + numstring(Val(a) + 1) + "ร้อย"
End If
If numLen >= 5 Then
bTen = True
a = Mid$(inputstring, numLen - 4, 1)
If Val(a) = 0 Then bTen = False
If Val(a) = 1 Then result = result + "สิบ"
If Val(a) = 2 Then result = result + "ยี่สิบ"
If Val(a) >= 3 Then result = result + numstring(Val(a) + 1) + "สิบ"
End If
If numLen >= 4 Then
a = Mid$(inputstring, numLen - 3, 1)
If Val(a) = 0 And Len(result) = 0 And Right$(inputstring, 2) = "00" Then result = "ศูนย์"
If Val(a) = 1 Then
If bTen = True Then result = result + "เอ็ด"
If bTen = False Then result = result + "หนึ่ง"
End If
If Val(a) >= 2 Then result = result + numstring(Val(a) + 1)
End If

a = Right$(inputstring, 2)
If a = "00" Then
result = result + "บาทถ้วน"
Else
bTen = True
If Len(result) > 0 Then result = result + "บาท"
If Val(Left$(a, 1)) = 0 Then bTen = False
If Val(Left$(a, 1)) = 1 Then result = result + "สิบ"
If Val(Left$(a, 1)) = 2 Then result = result + "ยี่สิบ"
If Val(Left$(a, 1)) >= 3 Then result = result + numstring(Val(Left$(a, 1)) + 1) + "สิบ"
If Val(Right$(a, 1)) = 1 Then
If bTen = True Then result = result + "เอ็ด"
If bTen = False Then result = result + "หนึ่ง"
End If
If Val(Right$(a, 1)) >= 2 Then result = result + numstring(Val(Right$(a, 1)) + 1)
result = result + "สตางค์"
End If
DoBathString = result
End Function


5
ห้อง MS Access / : จะอ้างอิงค่าจาก record บน
« เมื่อ: 29 มี.ค. 65 , 20:09:06 »


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


6
Private Sub Command11_Click()
if DCount("*", "DATAs", "Code = " & [Forms]![Form1]![txtcodeupdate] & " and employee = '" & [Forms]![Form1]![txtEmployee] & "' and Location = '" & [Forms]![Form1]![txtLocation] & "'") = 0 Then
Me.txtcodeupdate.SetFocus
Me.txtcodeupdate = Null
MsgBox "ใส่ข้อความแจ้งเตือน!!", vbInformation, "แจ้งเตือน"
Else
DoCmd.SetWarnings False
DoCmd.OpenQuery "UpdateQuery"
DoCmd.SetWarnings True
Forms!Form1![Datasubform].Requery
Me.txtcodeupdate.SetFocus
Me.txtcodeupdate = Null
End If
End Sub

7
ใช้การสร้างคิวรี่ Update และสร้างปุ่ม หรือจะใช้ Event อื่นๆ ในการเรียกใช้การอัพเดทก็ได้ครับ

8
ในรีพอร์ต มีบางช่องรายการที่แสดงเลขประจำตัวประชาชน 13หลัก ทีนี้หนูอยากให้แสดง x แทนตัวเลขบางตัวสามารถทำได้ไหมคะ เช่น
1-xxxx-23456-xx-9
ขอบคุณค่ะ
ผมสมมุติเชื่อฟิลล์ที่มีเลขบัตรประชาชนชื่อ
PersonalID

ถ้ารูปแบบของข้อมูล เลขบัตรประชาชนเป็นแบบนี้
1-2345-67899-85-3
ใช้โค้ดแบบนี้ได้เลย
โค๊ด: [Select]
PID: Left([PersonalID],1) & "-xxxx-" & Mid([PersonalID],8,5) & "-xx-" & Mid([PersonalID],17,1)

ถ้าเลขบัตรประชาชนมีเฉพาะตัวเลขเช่น
1234567899853
ใช้โค้ดแบบนี้ได้เลย
โค๊ด: [Select]
PID: Left([PersonalID1],1) & "-xxxx-" & Mid([PersonalID1],6,5) & "-xx-" & Mid([PersonalID1],13,1)

9
ในรีพอร์ต มีบางช่องรายการที่แสดงเลขประจำตัวประชาชน 13หลัก ทีนี้หนูอยากให้แสดง x แทนตัวเลขบางตัวสามารถทำได้ไหมคะ เช่น
1-xxxx-23456-xx-9
ขอบคุณค่ะ
ใช้ ฟังชั่น right() Mid() left() เพื่อดึงหลักของตัวเลขที่ต้องการแสดงมาแสดงส่วนที่ต้องการให้ใส่ X ก็ใส่เครื่องหมาย & "xxxxx" ได้เลย

10
ห้อง MS Access / : สอบคำสั่ง Visible
« เมื่อ: 10 มี.ค. 65 , 08:33:27 »
จากโค้ดนี้
Private Sub TWRD_AfterUpdate()

Me.TWRDC = DLookup("[WARDCODE]", "QY_ward_FW")

   ''Call Cmd84_Click
Me.TCtlrRCB = DCount("[LABNO]", "QAshow_Recivest2")
    Me.Requery
msgbox DCount("[LABNO]", "QAshow_Recivest2") 
If Me.TCtlrRCB > 0 Then
    Me.Command81.Visible = True
   Else
   Me.Command81.Visible = False
End If
Me.TWHN.SetFocus
        Me.Refresh
End Sub

ลองเพิ่ม msgbox DCount("[LABNO]", "QAshow_Recivest2") 
ดูหน่อยว่ามันแสดงค่า 0 จริงหรือเปล่า หรือแสดงค่าว่างอยู่
เพราะถ้าแสดงค่าว่าง มันจะไม่เข้าเงื่อนไขด้านล่าง

11
ลองใช้ DAO ดูนะครับผมไม่แน่ใจว่าได้ไหมแต่รุ่นเก่าๆ ใช้ตัวนี้
เช่น
 Dim rs As DAO.Recordset
 Dim rsOut As DAO.Recordset

ลองดูนะครับ
และเช็คตรง
หน้าเขียนโค้ด > Tool > Reference


12
ขอบคุณมากครับ

แก้ไขโค้ดนิดนึงนะครับ

13
ที่ botton ใส่โค้ดแบบนี้ดูนะครับว่าได้ไหม


โค๊ด: [Select]
Dim strString As String
Dim strArray() As String
Dim intCounter As Integer

strString = Me.Text4
strArray = Split(strString, ",")

For intCounter = 0 To UBound(strArray)
 Me.ข้อมูล = strArray(intCounter)
 DoCmd.GoToRecord , , acNext
Next intCounter


15

เขียนเป็นโค้ดทั้งหมดวันนี้นึกไม่ออกเลยครับ  :cry: แต่!!!
จากเงื่อนไขข้างบน เราจะสังเกตุได้ว่า ในแต่ละวัน และแต่ละ UserR นั้น จะมี SEQ เดียวกัน
ไม่ว่าการเรียงลำดับนั้นจะมาก่อนหรือมาหลัง

ผมลอง  DIY  ดูก็ได้ผลลัพท์แบบที่ต้องการ แต่ต้องสร้างคิวรี่เพื่อให้ได้ผลลัพท์ แบบในภาพด้านบน
ลองเช็คดูเรียงลำดับจาก Q1  >>> Q2  >>> Q_Result 
และท้ายสุดคือที่ปุ่มอัพเดท ข้อมูลจากคิวรี่ไปยังตารางหลัก

Q1 ดึงกลุ่ม DateR และ UserR ที่มีมาแสดง และกำหนดเลือก Autonumber(First)
     เพื่อนำไปใช้ในการสร้าง การรันลำดับในคิวรี่ต่อไป
Q2 นำกลุ่มที่ได้มา เรียงลำดับ ( กำหนด SEQ ให้แต่ละ DateR และ UserR)
     โดยเงื่อนไขการกำหนด SEQ ต้องมี PK ที่เรียงลำดับจากน้อยไปมากของ Autonumber(First)  ที่ถูกต้อง
     เพื่อการเรียงลำดับที่ถูกต้อง (ถ้าติดปัญหาตรงนี้แจ้งได้เผื่อหาวิธีแก้ไข)
Q_Result แสดงผลในแบบคิวรี่

และที่ปุ่มใส่โค้ดแบบนี้
โค๊ด: [Select]
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strDate As String
Dim strUser As String

Set db = CurrentDb()
Set rst = db.OpenRecordset("SELECT * FROM MyTable WHERE ((Not (MyTable.DateR) Is Null));", dbOpenDynaset)

If Not rst.BOF And Not rst.EOF Then
  rst.MoveFirst
End If
  Do Until rst.EOF
        strDate = rst!DateR
        strUser = rst!UserR
    rst.Edit
    rst!SEQrec = DLookup("RunSEQ", "Q2", "cstr(DateR) = '" & strDate & "' and cstr(UserR) = '" & strUser & "'")
    rst.Update
   
     rst.MoveNext
    Loop
    rst.Close: Set rst = Nothing
    db.Close: Set db = Nothing

 




16
กำหนด Events ของฟอร์ม เมื่อโหลด

หน้า: [1] 2 3 4 ... 52