แสดงกระทู้

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

หน้า: 1 2 3 [4] 5 6 7
55
ห้อง MS Access / : ส่ง line notify ไม่ได้ครับ
« เมื่อ: 29 พ.ค. 63 , 17:58:47 »
ขอถามต่อนะครับ เมื่อข้อความถูกส่งแล้วจะมี message ตามรูปแสดงขึ้นมา ถ้าไม่ต้องการให้messageแสดงขึ้นมาต้องเขียน code เพิ่มอย่างไรครับ ขอบคุณครับ


Sub SendMessageToLineNotify()

Dim myurl As String, iMessage As String, postDATA As String, winHttpReq As Object
iMessage = Me.TxtMessage
Set winHttpReq = CreateObject("Microsoft.XMLHTTP")
myurl = "https://notify-api.line.me/api/notify"

postDATA = "message= " & iMessage
winHttpReq.Open "POST", myurl, False
winHttpReq.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
winHttpReq.SetRequestHeader "Authorization", "Bearer " & Me.TxtToken
winHttpReq.Send (postDATA)
MsgBox winHttpReq.responsetext

End Sub

ที่มา
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

56
สอบถามการอัพโหลดไฟล์ Excel ใน MS Access ค่ะ อยากจะ อัพโหลดไฟล์ ได้โดยให้มีการตรวจสอบจากเลขที่บัตรประชาชน โดยเช็คว่า ถ้ามีข้อมูลที่เคยอัพโหลดอยู่แล้ว ให้อัพโหลดเฉพาะข้อมูลที่มีการเปลี่ยนแปลง ข้อมูลไหนไม่มีก็อัพโหลดเข้าตามปรกติ รบกวนแนะนำด้วยนะคะ ขอบคุณค่ะ

ถ้าทำแบบง่ายก็คือ
1.ให้นำเข้าข้อมูลตามบัตรประชาชนทั้งหมดเข้ามาก่อนไปยังตารางสำรอง สมมุติชื่อว่า TempImport นะครับ
2.ใช้การสร้างคิวรี่ โดยกำหนดให้เลือกเอาเฉพาะ รหัสที่ไม่มีในตารางหลัก สมมุติชื่อว่า tblDataMain นะครับ
3.มี Field เก็บเลขบัตรประชาชนชื่อเดียวกันคือ PersonalID


ผมสมมุติมีปุ่มที่ใช้สำหรับนำเข้า 1 ปุ่ม และให้แก้ไขชื่อตารางทั้งสองตามสีแดงที่ผมใส่ไว้ให้ตรงด้วยนะครับ

Private Sub Command0_Click()
'ตัวอย่างโค้ดการนำเข้าข้อมูลโดยมี Dialog ให้เลือกไฟล์เข้ามา
Dim dlg As FileDialog
Dim sql, Deletesql As String
Dim DB As DAO.Database
Set DB = CurrentDb
If MsgBox("คุณต้องการนำเข้าข้อมูลใหม่หรือไม่", vbQuestion + vbYesNo, "ระบบสอบถาม") = vbYes Then

Set dlg = Application.FileDialog(msoFileDialogFilePicker)

With dlg
.Title = "Select the Excel file to import"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel Files", "*.xls*", 1
.Filters.Add "All Files", "*.*", 2

If .Show = -1 Then
StrFileName = .SelectedItems(1)

Deletesql = "DELETE * FROM TempImport;" 'สั่งให้ลบข้อมูลของตารางสำรองให้หมดก่อนเพื่อรอรับข้อมูลนำเข้าใหม่ที่จะเข้ามา
DB.Execute Deletesql

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "TempImport", StrFileName, True 'นำเข้าไปยังตารางชื่อ TempImport
Else
Exit Sub
End If
End With

'หลังจากนำเข้ามาเสร็จให้ทำการ Append ข้อมูลที่ รหัสประจำตัวประชาชนไม่ซ้ำกัน ไปยังตารางหลักของเรา
sql = "INSERT INTO tblDataMain SELECT * FROM TempImport WHERE (((TempImport.PersonalID) Not In (select [PersonalID] from [tblDataMain])));"
DB.Execute sql
If DB.RecordsAffected <= 0 Then
   MsgBox "ไม่มีข้อมูลที่นำเข้า."
Else
MsgBox "นำเข้าจำนวน " & DB.RecordsAffected & " เรคคอร์ด", vbInformation, "Myprogram"
End If
Set DB = Nothing
End If
End Sub


โพสต์นี้ได้รับคำขอบคุณจาก: sjs

57
สามารถใช้ Tab Control เพื่อใช้เป็นคอนเทนเนอร์บรรจุคอนโทรลอื่นๆรวมทั้งซับฟอร์มคอนโทรลได้อีกชั้นนึง   Tab Control ตัวนึงสามารถมีได้หลาย Page อย่างในรูป ตย.ข้างล่าง ก็มี Page "รายการขาย" และ "ลงบัญชี"
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

58
จริงๆ แล้วไม่ต้องใช้ VBA ครับ แค่ออกแบบตารางให้เหมาะสมแล้วใช้คิวรีแบบตัวอย่างนี้ครับ

ที่เหลือคุณไปทำต่อเองได้แล้วนะครับ จะใช้ Total Query เพื่อสรุปข้อมูลแต่ละคนก็ได้
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

59
ได้ข้อมูลมาจากเฟสบุ๊กเพจ "โปรแกรมเมอร์ไทย Thai programmer" ครับ

https://goalkicker.com/?fbclid=IwAR1TjcRyaWd6r_xdj510qNJOu_3B2c9EV_AWjkJ0_lyZqxdBS3bYFHCZERo

แนะนำเพิ่มเติมว่า สำหรับคนที่ชอบเขียนโปรแกรม ให้ศึกษาวิชา Data Structure (ส่วนนึงอยู่ในหนังสือ Algorithms) และ Algorithms เพราะจะช่วยให้ขยับโลกทัศน์ในการวิเคราะห์และหาวิธีตอบโจทย์ที่ซับซ้อนยิ่งขึ้นได้
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

60
ลองทำการ compact-repair ดูก่อนว่าหายไหม

หรือลองดู แบบนี้ว่าแก้ได้ไหม



ถ้ายังไม่ได้อีก ให้ Backup File ต้นฉบับไว้ Copy มาซัก 1 อัน
เปิดไฟล์ใหม่ขึ้นมาสร้าง Module แล้วใส่ Codeนี้เข้าไป
โค๊ด: [Select]
Sub FixBadAOIndex(BadDBPath As String)
    ' <BadDBPath> is the path to the corrupt database.
    Dim dbBad As DAO.Database
    Dim tdf As DAO.TableDef
    Dim ix As DAO.Index

    Set dbBad = DBEngine.OpenDatabase(BadDBPath)
    dbBad.Execute "DELETE FROM MSysAccessObjects " & _
        "WHERE ([ID] Is Null) OR ([Data] Is Null)", _
        dbFailOnError
    Set tdf = dbBad.TableDefs("MSysAccessObjects")
    Set ix = tdf.CreateIndex("AOIndex")
    With ix
        .Fields.Append .CreateField("ID")
        .Primary = True
    End With
    tdf.Indexes.Append ix
    Set tdf = Nothing
    dbBad.Close
    Set dbBad = Nothing
End Sub

ต่อไปกด Ctrl+G แล้วใส่ FixBadAOIndex("ตำแหน่งไฟล์ที่เสียหายตั้งอยู่")
เช่น FixBadAOIndex("C:\MyPath\MyFile.mdb")
หรือส่งไฟล์เจ้าปัญหา มาทาง Inbox ผมแก้ไขให้
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

61
ห้อง MS Access / : access 2003 to windows 10 64 bit
« เมื่อ: 04 พ.ย. 62 , 08:47:45 »
Control Panel > Region >Formate ต้องเป็น Thai (Thailand) Currnet language ต้องเป็น Thai (Thailand)

Option Compare Database
      Private Const LOCALE_SSHORTDATE = &H1F
      Private Const WM_SETTINGCHANGE = &H1A
      Private Const HWND_BROADCAST = &HFFFF&
#If VBA7 Then
      Private Declare PtrSafe Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
      Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      Private Declare PtrSafe Function GetSystemDefaultLCID Lib "kernel32" () As Long
#Else
      Private Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
      Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
#End If
     
Function setdate() 'ใช้เปลี่ยนรูปแบบวันที่
    Dim dwLCID As Long
            dwLCID = GetSystemDefaultLCID()
           
        If SetLocaleInfo(dwLCID, LOCALE_SSHORTDATE, "dd/MM/yyyy") = False Then
            MsgBox "รูปแบบวันที่ไม่ใช่ dd/MM/yyyy", vbCritical, "Error"
        End If
            PostMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
End Function

กระทู้ถามว่าไงเนี๊ย   :shout: :shout: :shout:
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

62
ตามหลักการแล้ว อะไรที่ขึ้นกับคนนั้นและไม่มีทางเปลี่ยน ก็ให้ผูกกับเทเบิลที่มี Primary Key เป็น NationalID เช่น วันเกิด  แต่อะไรที่เปลี่ยนแปลงไปได้ เช่น ชื่อ นามสกุล ที่อยู่ เบอร์โทร ก็ต้องผูกกับเทเบิลที่มี Primary Key เป็น NationalID + NumberOfEdited  แต่เท่าที่ดู มีแค่ฟิลด์วันเกิดเท่านั้นที่ไม่เปลี่ยนแปลง ดังนั้นการจะแยกเป็นอีกเทเบิลที่มีแต่ฟิลด์ NationalID กับ BirthDate อาจจะดูไม่คุ้มกับการทำ ผมคิดว่าให้เทเบิล tbl_Contracter และ tbl_Address มี Primary Key เป็น NationalID + NumberOfEdited ไปเลยจะดีกว่า และคิดว่าเพิ่มฟิลด์ประเภท Boolean อีกฟิลด์ทั้งใน 2 เทเบิล เพื่อบอกว่า Edition ไหน เป็น Edition ปัจจุบันไปด้วย จะทำให้ตอนค้นหาข้อมูลปัจจุบันเพื่อนำมาใช้ในส่วนต่างๆ ไม่ยุ่งยากเมื่อเทียบกับการต้องหาว่า Edition ไหนเป็น Edition ล่าสุดโดยไม่มีฟิลด์ที่ว่า แต่ก็ต้องจัดการให้ดีๆว่า ในขณะใดขณะหนึ่งต้องมีเพียงเรคอร์ดเดียวเท่านั้นที่ฟิลด์ที่ว่ามีค่าเป็น True    ส่วนเทเบิลอื่นๆที่ต้องโยงมายัง 2 เทเบิลนี้ ก็ต้องเก็บทั้ง NationalID และ NumberOfEdited ไปด้วย ดังนั้น transaction ต่างๆก็จะอิงกับข้อมูลที่เป็นปัจจุบัน ณ เวลานั้นครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

63
เว็บบอร์ดวันนี้มีการเพิ่มปุ่ม ตอบกระทู้ ให้กดกันง่ายขึ้นครับ(ข้างๆปุ่ม"อ้างถึง" :sweat:)
ปล.แผ่นป้ายช่วยลงไปกดกันสักหนึ่งทีพอครับ :love:
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

64
ห้อง MS Access / : เรียกข้อมูล Weekly
« เมื่อ: 27 ก.ย. 62 , 12:20:56 »
SELECT * FROM [ชื่อเทเบิล]
WHERE Format$([ชื่อฟิลด์วันนัดชำระ],"yyyymmww",2))=Format$(Date(),"yyyymmww",2)))
ORDER BY [ชื่อฟิลด์วันนัดชำระ]

กลับมาอ่านอีกที ชักเลอะเทอะเกินความจำเป็น  ไม่จำเป็นต้องเป็น yyyymmww แค่ yyyyww ก็พอแล้วครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

65
พอดีมีเวลาและเห็นว่ามีหลายครั้งที่มีการถามถึงการสร้างฟอร์มล็อคอินและเมนู ผมเลยเขียนตัวอย่างขึ้นมาเอาไว้ให้เป็นแนวทางในการศึกษาครับ

ระบบมี 2 เทเบิลคือ tbUser ไว้เก็บ ID,รหัสผ่าน,และเมนูที่จะใช้ ในขณะที่อีกเทเบิล tbMenu จะเก็บว่าแต่ละเมนูมีโครงสร้างอย่างไร

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

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

ปล. อย่าถามนะว่า login ID และรหัสผ่านมีอะไรบ้าง  :sweat:
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

66
Me("Refer") = RS("Refer")

แต่แนะนำให้เปลี่ยนชื่อเท็กซ์บ็อกซ์บนฟอร์มไปเป็นชื่ออื่นที่แตกต่างจากชื่อฟิลด์ดีกว่า อาจเป็น txtRefer ก็ได้ ก็จะเป็น Me("txtRefer") = RS("Refer")
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

67
โค้ดตัวอย่างนี้ เป็นการแปะค่าของฟิลด์ต่างๆในบรรทัดที่ต้องการ มาลงเป็นบรรทัดใหม่ในฟอร์ม/ซับฟอร์มเดียวกัน วิธีคือให้สร้าง Command Button เอาไว้ที่ไหนก็ได้สักที่บนบรรทัดของข้อมูล (สมมุติชื่อ btnCopy) เมื่อต้องการก็อปปี้ ก็แค่คลิกที่ปุ่มนี้

Private Sub btnCopy_Click()
    Dim RS As DAO.Recordset
   
    If Me.NewRecord Or Me.Dirty Then Exit Sub ' ถ้าคลิกปุ่มบนบรรทัดของรายการใหม่ หรือ บนบรรทัดที่รายการกำลังแก้ไขอยู่ ก็ไม่ต้องทำอะไร
   
    Set RS = Me.RecordsetClone    ' กำหนดตัวแปรสำหรับอ้างอิงข้อมูลของบรรทัดปัจจุบัน (บรรทัดที่เลือก)
    RS.Bookmark = Me.Bookmark  ' ให้ตัวแปรดังกล่าวชี้ไปเรคอร์ดเดียวกันกับบรรทัดปัจจุบัน
    DoCmd.GoToRecord , , acNewRec   ' กระโดดไปบรรทัดรายการใหม่
    Me("ชื่อคอนโทรลบนฟอร์ม") = RS("ชื่อฟิลด์ของคอนโทรลบนฟอร์ม") ' ต้องการก็อปปี้ฟิลด์อะไรบ้าง ก็เพิ่มบรรทัดตามจำนวนฟิลด์ที่ต้องการต่อลงไปได้เรื่อยๆ
   
    Set RS = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

68
การกำหนด Property ให้แก่คอนโทรลในบรรทัดของ Continuous Form จะมีผลกับคอนโทรลนั้นในทุกบรรทัดครับ แต่สำหรับการกำหนดคุณสมบัติในการแสดงบางอย่างเช่น สีพื้น, สีตัวอักษร. อักษรตัวหนา/ขีดเส้นใต้/ตัวเอียง, Enabled/Disabled สามารถใช้ Conditional Formatting ในการกำหนดเฉพาะคอนโทรลในบรรทัดนั้นๆตามเงื่อนไขให้เป็นไปอย่างอัตโนมัติได้ ดังนั้นอย่างแรกที่ต้องทำก็คือต้องหาก่อนว่าเงื่อนไขอะไรที่จะให้ Disabled   จากที่กำหนดมา ถ้าสมมุติว่าเมื่อเงื่อนไข cb_Status = "¨จบงาน" ก็ให้ Disabled ได้ ก็ให้ป้อน Conditional Formatting สำหรับคอนโทรลอื่นที่ต้องการเป็น (เช่น cb_DocEnvelope, txt_OrderID) [cb_Status] = "¨จบงาน" แล้วเลือกลักษณะคอนโทรลเป็น Disabled ครับ 



ส่วนโค้ดที่ให้มา ก็มีแค่นี้เท่านั้น

Private Sub Command27_Click()
    Me.txt_DateClose = Now()
    Me.cb_Status = "¨จบงาน"
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

69
เพิ่มเติมหน่อยนะครับ ที่บอกไปครั้งก่อนว่า "ใน BeforeUpdate event จะไม่ยอมให้เราแก้ไขค่าในเท็กซ์บ็อกซ์ของตัวมันเอง" หมายถึงจะเกิด runtime error ขึ้น แต่ถ้าเราอยากข้าม error นี้ไป ก็ทำแบบเถื่อนๆคือใส่ On Error Resume Next ตามโค้ดที่แก้ไขข้างล่างนี้ก็ได้

Private Sub TxITEM_ฺBeforeUpdate(Cancel As Integer)
  If Me.TxItem.Text = "" Then
  ElseIf DCount("Item", "QrItem") > 0 Then
  Else
      MsgBox "Item ¹ÕéäÁèÁÕã¹ÃкºËÃ×ÍÂѧäÁèä´éà¾ÔèÁà¢éÒä»ã¹Ãкº", vbOKOnly, "Warning!"
      Cancel = True
      On Error Resume Next
      Me.TxItem.Text = ""

  End If
End Sub

หมายเหตุ : สังเกตให้ดีว่าเราต้องอ้าง TxtItem.Text นะครับ ไม่ใช่ TxtItem เฉยๆ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

70
ห้าม set focus กลับไปที่ตัวเองครับ การทดสอบว่าเงื่อนไขไหนไม่ผ่านและจะให้ยังคงอยู่ที่เท็กซ์บ็อกซ์เดิม เราต้องทำที่ BeforeUpdate event  และเราจะกำหนดพารามิเตอร์ Cancel เป็น True เพื่อให้ Access หยุดเพียงแค่ event นี้ ดังนั้นจึงไม่ต้องกำหนด .SetFocus เพิ่มเติม แต่เนื่องจากใน BeforeUpdate event จะไม่ยอมให้เราแก้ไขค่าในเท็กซ์บ็อกซ์ของตัวมันเองเช่นกัน จึงไม่สามารถกำหนดค่า Null กลับไปได้ วิธีที่พอทำได้คือ กำหนดให้ตัวอักษรทั้งหมดในเท็กซ์บ็อกซ์ถูกเลือก ดังนั้นผู้ใช้ก็สามารถป้อนค่าใหม่ทับของเดิมไปได้ทันทีครับ

โค้ดคุณก็จะมีแค่นี้ครับ

Private Sub TxITEM_ฺBeforeUpdate(Cancel As Integer)
  If Me.TxItem.Text = "" Then
  ElseIf DCount("Item", "QrItem") > 0 Then
  Else
      MsgBox "Item ¹ÕéäÁèÁÕã¹ÃкºËÃ×ÍÂѧäÁèä´éà¾ÔèÁà¢éÒä»ã¹Ãкº", vbOKOnly, "Warning!"
      Cancel = True
      Me.TxItem.SelStart = 0
      Me.TxItem.SelLength = Len(Me.TxItem.Text)
  End If
End Sub


โพสต์นี้ได้รับคำขอบคุณจาก: sjs

71
สนับสนุนการบ่นอีกเสียงครับ

บางคำถามอ่านแล้วได้แต่ถอนใจ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

72
คำถามจำนวนมาก ถามโดยแทบจะไม่อธิบายอะไรมาเลย ไม่ทราบคนถามจะรู้ไหมว่าคนอ่าน(เอาเป็นว่าอย่างน้อยก็ผมแล้วกัน)รู้สึกเหมือนโดนถามว่า "อยากได้จรวดไปดาวอังคาร ช่วยหน่อยครับ" จริงๆนะ แล้วจะให้ตอบอย่างไร ก็จะกลายเป็นต้องถามกลับไปว่า คุณได้ใช้อุปกรณ์อะไร ออกแบบอะไรยังไงไปแล้วบ้าง เอามาให้ดูหน่อย ซึ่งถ้าเป็นสมัยก่อน ผมก็จะพยายามถามกลับ แต่ยอมรับว่าเดี๋ยวนี้ โอกาสน้อยที่ผมจะถามกลับแล้ว ถ้าอ่านแล้วพบว่าข้อมูลที่ให้มาพร้อมคำถามของผู้โพสนั้นมีน้อยมาก ก็จะข้ามไปเลย หรือถามแล้วอ่านไม่เข้าใจเลย ผมก็ขอข้ามไปเหมือนกัน

ดังนั้น เพื่อเพิ่มความสมบูรณ์ของคำถาม มันก็มีหลายวิธี แต่หลายๆวิธีคงวุ่นวายไป ก็เลยคิดว่าก่อนระบบจะรับโพส อยากให้มี message box แสดงข้อความ "เขียนถามให้ผู้ตอบเข้าใจ..." ตามข้อความเตือนสีแดงๆที่อยู่บนหัวเพจอีกที และอาจมีข้อความอื่นเพิ่มเติมเพื่อเน้นว่าเขาแน่ใจไหมว่าได้อธิบายละเอียดแล้ว ถ้าเขาไม่ยืนยัน ก็ให้เขากลับไปแก้ข้อความ แต่ถ้าเขากดยืนยัน ก็ค่อยโพสจริงๆอีกที

ถามยาว โอกาสได้รับคำตอบเร็วมีสูง -- ถามสั้น โอกาสน้อยลง -- ถามสั้นมากๆ ยากที่จะมีโอกาส
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

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