แสดงกระทู้

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 - สันติสุข

หน้า: 1 ... 11 12 13 [14] 15 16 17 ... 19
235
ห้อง MS Access / : Hide Duplicates
« เมื่อ: 23 ธ.ค. 61 , 15:10:15 »
=F(PID, Visit_No, Visit_Date)
โพสต์นี้ได้รับคำขอบคุณจาก: Un

236
ห้อง MS Access / : Hide Duplicates
« เมื่อ: 23 ธ.ค. 61 , 13:54:43 »
- คอลัมน์ที่จะไม่ให้แสดงค่าซ้ำคือคอลัมน์อะไร
- คอลัมน์นั้นเอามาจากฟิลด์อะไรในเทเบิล
โพสต์นี้ได้รับคำขอบคุณจาก: Un

237
1. ไม่น่าจะเป็นไปได้ที่ Doxorubicin2 จะถูกเขียนทับเป็น 62.4 โดยยังไม่คลิกปุ่ม Save  ดังนั้นถ้าเกิด Doxorubicin2 กลายเป็นค่า 62.4 ก็น่าจะแปลได้ว่าเรคอร์ดถูก Save ด้วยวิธีใดวิธีหนึ่งไปแล้ว ให้ลองทดสอบดูครับ เมื่อเป็น 62.4 ในรอบแรกแล้ว และก่อนที่จะแก้ Doseadjust = 90  ก็เปิดดูจากเทเบิลโดยตรงไปเลยว่าตอนนี้ Doxorubicin2 เป็น 62.4 หรือไม่

2. สงสัยว่า AC-regimen มีแค่เรคอร์ดเดียวหรือยังไง ทำไมเวลาสั่ง DLookup(Doxorubicin2, "AC_regimen") จึงไม่มีพารามิเตอร์ตัวที่ 3 ใน DLookup เพื่อกำหนดว่าจะเลือกจากเรคอร์ดไหน
โพสต์นี้ได้รับคำขอบคุณจาก: Looktarn

238
ผมคิดว่า มันไม่ได้เกี่ยวกับโค้ด แต่น่าจะเกี่ยวกับการตั้งขอบซ้ายขวาของกระดาษมากกว่านะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs, Looktarn

239
ให้แก้เป็น

On Error Resume Next
DoCmd.RunCommand acCmdRecordsGoToNext
If Me.NewRecord Or Err.Number <> 0 Then Me.Requery
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

240
VDO และ PowerPoint อธิบายเรื่อง เข้าถึงหัวใจของปัญญาประดิษฐ์ และความน่าตื่นเต้นของ Deep Learning  https://aiat.or.th/heart-of-ai/?fbclid=IwAR0Emd5APHDq3uVXt53s2ID3FJxzv0uuazEWejViiY3ay6mV2XwUDEswqT8

หมายเหตุ : ไม่แน่ใจว่าเวปของลิงค์ (สมาคมปัญญาประดิษฐ์ประเทศไทย) มีอยู่ในลิงค์ของหัวกระทู้หรือเปล่า แต่ VDO นี้เพิ่งออกมาใหม่ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs, BH

241
Between IIf(Day(Date())>=3,DateSerial(Year(Date()),Month(Date()),2),DateSerial(Year(Date()),Month(Date())-1,2)) And IIf(Day(Date())>=3,DateSerial(Year(Date()),Month(Date())+1,2),DateSerial(Year(Date()),Month(Date()),2))

ความหมายก็คือ
หาข้อมูลระหว่างวันที่ (ถ้าวันที่ >= 3, ให้เป็นวันที่ 2 ของเดือนนี้, ถ้าไม่ใช่ก็เป็นวันที่ 2 ของเดือนที่แล้ว) และวันที่ (ถ้าวันที่ >= 3, ให้เป็นวันที่ 2 ของเดือนหน้า, ถ้าไม่ใช่ก็เป็นวันที่ 2 ของเดือนนี้)

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

242
ห้อง MS Access / : Hide Duplicates
« เมื่อ: 01 พ.ย. 61 , 21:08:01 »
แนวทางเท่าที่คิดได้ตอนนี้คือสร้าง ฟังก์ชั่น F ที่รับค่าของทุกฟิลด์ใน Primary Key (หรือ Unique Key) ของบรรทัดนั้นๆ (aPK1 ถึง aPKn) และค่าของฟิลด์ (aF) ที่ต้องการเปรียบเทียบระหว่างบรรทัดนั้นกับบรรทัดก่อนหน้า ส่วนตัวฟังก์ชั่นเองก็คืนค่าของฟิลด์ aF ที่ต้องการแสดงกลับมา ซึ่งก็เป็นไปได้ 2 อย่างคือ ค่าที่ส่งเข้ามา หรือไม่ก็ไม่ต้องแสดงเพราะค่าเท่ากับบรรทัดก่อนหน้า

โค๊ด: [Select]
' โค้ดนี้เป็นแค่แนวทาง ต้องไปปรับปรุงเองนะครับ
Public Function F(aPK1 as Variant , ... , aPKn as Variant , aF as Variant) as Variant
Dim RS As DAO.Recordset

' กรณีเป็นบรรทัดของ New Record ค่าที่ส่งมาจะเป็น NULL
' ก็ไม่ต้องทำอะไร ออกจากฟังก์ชั่นได้เลย
If IsNull(aPK1) Then Exit Function

' กำหนด recordset ของฟอร์มที่โค้ดจะใช้ในการค้นหาเพื่อเปรียบเทียบ
Set RS = Forms("ชื่อฟอร์ม").RecordsetClone

' ทำการรวบรวมทุกเรคอร์ดให้ recordset รู้จัก
RS.MoveLast

' ค้นหาเรคอร์ดที่มีค่าตรงกับ Primary Key ของบรรทัดนั้นๆ
RS.FindFirst " ฟิลด์1 = " & aPK1 & " and ฟิลด์2 = " & aPK2 & ... & " and ฟิลด์n = " & aPKn

' ถ้าเป็นบรรทัดแรก ค่าที่ส่งกลับไปแสดงก็คือค่าที่ส่งเข้ามานั่นเอง
If RS.AbsolutePosition = 0 Then
F = aF
Exit Function
End If

' ย้อนกลับไป 1 เรคอร์ด (บรรทัด)
RS.MovePrevious

' ถ้าค่าของฟิลด์ในบรรทัดก่อนหน้าไม่เท่ากับค่าที่ส่งมา ก็ให้ส่งกลับไปแสดงค่าที่ส่งเข้ามาเช่นกัน
If RS("ชื่อฟิลด์") < > aF Then
F = RS("ชื่อฟิลด์")
End If

' แต่ถ้าเท่ากัน ก็ไม่ต้องส่งอะไรกลับ มันจะเป็น NULL เป็นค่าว่างๆ
End Function

ถ้าเท็กซ์บ็อกซ์ของฟิลด์ T ที่แสดงค่าชื่อว่า txtT  เราก็ใส่ =F([ชื่อฟิลด์ที่1ของ PK],...,[ชื่อฟิลด์ที่ n ของ PK], [T]) ไว้ใน Control Source property ของ txtT นั่นเอง

ตย.การแสดง

เลขเอกสาร(aPK1)   รหัสสินค้า(aPK2)   แผนกผลิต(txtT)   วันที่ผลิต   จำนวนที่ผลิต
A0001      001         CUT      15/11/2018   100
B0003      003                  16/11/2018   300
C0005      005         ASSY      16/11/2018   500
D0007      007                  17/11/2017   700
โพสต์นี้ได้รับคำขอบคุณจาก: Un

243
ดีที่สุดคือ เพิ่มฟิลด์ที่เก็บวันเวลาที่บันทึก และถ้าต้องการเรียงลำดับตามเวลาที่อัพเดทด้วย ก็ต้องมีฟิลด์ที่เก็บวันเวลาเมื่ออัพเดตอีกฟิลด์ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Wisa.t

244
เราใช้ฟอนท์ Wingding สำหรับเท็กซ์บ็อกซ์เพื่อแสดงรูปสัญญลักษณ์ได้ สมมุติ P คือชื่อฟิลด์ที่เก็บ path ของรูป ก็กำหนด Control Source ของเท็กซ์บ็อกซ์ที่แสดงสัญญลักษณ์เป็น =IIf(nz([P],"")="","","*") มันก็จะแสดงสัญญักษณ์ จดหมาย (เพราะหาไม่เจอสัญญลักษณ์รูป คลิป)  ถ้าอยากได้สัญญลักษณ์อื่นๆ ก็เปิดโปรแกรม Character Map ที่มากับวินโดว์อยู่แล้ว เลือกฟอนท์ Webding, Wingding(1-3) เอาตัวไหนก็ดับเบิลคลิกรูปแล้วคลิกปุ่ม Copy  กลับมาที่ expression ข้างบน กดคีย์ paste ลงแทนที่ * ได้เลยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: aek

245
ผมมีโค้ดตัวนึง ลองเอาโค้ดนี้ไปใช้ดู แต่ไม่ยืนยันนะครับว่าจะถูกต้อง 100% หรือไม่
โค๊ด: [Select]
Public Sub CutLastCRLF(aFullFileNM As String)
    Dim B As String * 1
    Dim S As String
    Dim L As Long

    Open aFullFileNM For Binary Access Read As #1
    Do Until EOF(1)
        Get #1, , B
        S = S & B
    Loop
    Close #1

    If Right(S, 3) <> vbCr & vbLf & vbNullChar Then
        Exit Sub
    End If

    S = Left(S, Len(S) - 3)

    On Error Resume Next
    Kill aFullFileNM

    On Error GoTo 0
    Open aFullFileNM For Binary Access Write As #1
    Put #1, , S
    Close #1
End Sub
จะเรียกใช้ก็สั่ง Call CutLastCRLF("Drive:\Path\File.txt") มันจะเขียนทับไฟล์เดิมครับ
โพสต์นี้ได้รับคำขอบคุณจาก: aek, อุดมโชค สมหวัง

246
ไม่รู้นะครับว่าเครื่องพิมพ์คุณทำงานยังไง แต่ถ้าลบบรรทัดสุดท้ายไม่ขึ้นบรรทัดใหม่ แก้ไขเองด้วยมือเลย ยังจะมีพิมพ์กระดาษเปล่าออกมาไหม
โพสต์นี้ได้รับคำขอบคุณจาก: aek

247
ถ้ายืนพื้นตามที่คุณได้ออกแบบไว้ ผมสมมุติให้ระบบเราเป็นตามนี้แล้วกันนะครับ (เทเบิลจริงของคุณอาจมีฟิลด์มากกว่านี้ แต่ผมเอาเฉพาะฟิลด์ที่เราสนใจในเรื่องนี้แล้วกัน)

- เทเบิลส่วนลด Disc มีฟิลด์ Member Grade, Catagory Name, Discount
- เทเบิลลูกค้า Cust มีฟิลด์ Customer Code, Member Grade
- เทเบิลสินค้า Prod มีฟิลด์ Product Code, Catagory Name
- [cb Customer Code] เป็นชื่อคอมโบบ็อกซ์เพื่อเลือกลูกค้าที่อยู่บนเมนฟอร์ม เมื่อเลือก จะแสดงชื่อลูกค้าในคอมโบบ็อกซ์ แต่เมื่ออ้างคอมโบบ็อกซ์ก็จะได้รหัสลูกค้าแทน
- [cb Product Code] เป็นชื่อคอมโบบ็อกซ์เพื่อเลือกสินค้าที่อยู่ในซับฟอร์ม เมื่อเลือก จะแสดงชื่อสินค้าในคอมโบบ็อกซ์ แต่เมื่ออ้างคอมโบบ็อกซ์ก็จะได้รหัสสินค้าแทน

ให้ใส่ฟังก์ชั่นชื่อว่า fnGetDiscount( ) ไว้ในส่วนของ Module โดยจะรับค่าของรหัสลูกค้าและรหัสสินค้าเข้าไป และคืนค่าส่วนลดออกมาให้ กรณีที่รหัสลูกค้าหรือรหัสสินค้าไม่มีค่า (เป็น NULL) หรือไม่มีกำหนดส่วนลดไว้ ค่าที่คืนก็จะเป็น NULL ด้วย
โค๊ด: [Select]
Public Function fnGetDiscount(aCusCD As Variant, aProdCD As Variant) As Variant
    Dim DB  As DAO.Database
    Dim RS  As DAO.Recordset
    Dim SQL As String
   
    If IsNull(aCusCD) or IsNull(aProdCD) Then Exit Sub

    SQL = "SELECT D.Discount  FROM [Prod] AS P " _
        & "                  INNER JOIN ([Cust] AS C INNER JOIN [Disc] AS D ON C.[Menber Grade] = D.[Menber Grade])" _
        & "                     ON P.[Catagory Name] = D.[Catagory Name] " _
        & " WHERE C.[Customer Code] = '" & cStr(aCusCD) & "' AND P.[Product Code] = '" & cStr(aProdCD) & "' "
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset(SQL)
    If Not RS.EOF Then
        fnGetDiscount = RS![Discount]
    End If
    RS.Close: Set RS = Nothing
End Sub

ปัญหาคือ ผมไม่รู้ว่าคุณจะเอาส่วนลดไปเก็บไว้ที่ไหน เพราะในเทเบิล Order Details ก็ไม่มีฟิลด์ที่เก็บไว้ 
- แต่ถ้าสมมุติว่ามี และเท็กซ์บ็อกซ์บนฟอร์มที่ไว้รับ/แสดงส่วนลดชื่อว่า [tx Discount] ดังนั้นเมื่อผู้ใช้เลือกสินค้า เราก็ใส่โค้ดนี้ไว้ใน AfterUpdate event procedure ของ [cb Product Code] เพื่อดึงเอาส่วนลดออกมาแปะในเท็กซ์บ็อกซ์นี้ได้ครับ
โค๊ด: [Select]
Private Sub  cb_Product_Code_AfterUpdate()
Me.[tx Discount] = fnGetDiscount(Parent.[cb Customer Code], Me.[cb Product Code])
End Sub

- แต่ในกรณีที่***ไม่มี***ที่เก็บ แต่อยากแสดงบนฟอร์มเฉยๆ ก็ให้ใส่ =fnGetDiscount(Parent.[cb Customer Code], Me.[cb Product Code]) เอาไว้ใน Control Source property ของ [tx Discount] ครับ (ต้องมีเครื่องหมาย = ด้วย)

หมายเหตุ : โค้ดนี้ไม่ได้ทดสอบใดๆทั้งสิ้น ถ้ามี Error ก็เอารหัสและข้อความของ Error มาแสดงให้ดูด้วยครับ

ส่วนเรื่องงาน ผมขอตอบใน ข้อความส่วนตัวนะครับ (คุณจะเห็นเมนูอยู่ด้านบนของเพจนี้)
โพสต์นี้ได้รับคำขอบคุณจาก: frank

248
1. เทเบิลที่เก็บส่วนลด ออกแบบไว้หรือยัง มีฟิลด์อะไรบ้าง
2. ส่วนลดขึ้นกับเกรดลูกค้า และ ประเภทสินค้า หรือว่าขึ้นกับเฉพาะอย่างใดอย่างหนึ่งเท่านั้น และอย่างนั้นคืออะไร
3. เทเบิลของ Order Details มีฟิลด์ต่อไปนี้หรือไม่ ถ้ามี มีอะไรบ้าง และบนฟอร์มมีด้วยหรือไม่ ถ้ามี เปิดให้ผู้ใช้ป้อนได้ด้วยหรือไม่
  - ราคาต่อหน่วย
  - % ส่วนลด
  - มูลค่าส่วนลด (เป็นบาท)
  - ราคาก่อนหักส่วนลด
  - ราคารวมหลังหักส่วนลด
4. เอารูปภาพของหน้าฟอร์มที่เห็นซับฟอร์มมาแสดงให้ดูด้วย

ช่วยตอบทุกคำถามและอย่าข้ามนะครับ

แก้ไข : ในคำตอบก่อนหน้าที่ผมเขียนว่า "ราคาขาย" ขอแก้เป็น "ส่วนลด" ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: frank

249
ไม่รู้ว่าคำถามคืออะไรนะครับ   ถ้าเกรดลูกค้าและประเภทสินค้ามีผลต่อส่วนลด ในเทเบิลส่วนลดก็ต้องกำหนดทั้งเกรดและประเภทสินค้าเป็นส่วนหนึงของ Primary Key  อาจมีกำหนดวันที่เริ่มมีผลบังคับใช้เป็นส่วนหนึ่งของ Primary Key เพิ่มเติมด้วยก็ได้ เพราะในทางปฏิบัติแล้ว ถ้าไม่กำหนดวันที่เริ่มมีผลบังคับ เราจะต้องมานั่งป้อนทุกส่วนลดที่เปลี่ยนแปลงในคืนก่อนวันเปลี่ยนแปลงส่วนลด ซึ่งไม่สะดวกเลย

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

250
กำหนด Index ของฟิลด์นี้ในเทเบิลให้เป็น Yes (No Duplicate) แต่ต้องแก้ไขไม่ให้มีค่าซ้ำก่อนถึงจะกำหนดได้
โพสต์นี้ได้รับคำขอบคุณจาก: Kanxay Vnv

251
เวลาพูดว่าทับซ้อน ฟังดูเหมือนค่าเป็นช่วงระหว่างวันที่อะไรกับอะไร แล้วไปตรวจว่าทับซ้อนกับค่าอ้างอิงอะไร ค่าอ้างอิงเอามาจากไหน อธิบายรายละเอียดด้วย
โพสต์นี้ได้รับคำขอบคุณจาก: Kanxay Vnv

252
คงต้องสร้างเทเบิลชั่วคราวใน Front End เพื่อเก็บข้อมูลทั้งหมดจากคิวรี่อีกที จะสร้างเทเบิลจากโค้ดในขณะที่กำลังทำงานหรือจะสร้างไว้ล่วงหน้าก็ได้ ใช้งานเสร็จก็ค่อยลบเรคอร์ดหรือเทเบิลนั้นทิ้งไปก็แล้วแต่

ส่วนใน ADO ผมไม่แน่ใจว่าทำโดยไม่ต้องสร้างเทเบิลชั่วคราวได้หรือไม่ มันมีความสามารถนึงที่ผมรู้คร่าวๆที่อาจใกล้เคียง เรียกว่า Disconnected Recordset ซึงหลังจากได้เรคอร์ดจากคิวรี่มาแล้ว ก็สั่งตัดการติดต่อกับแหล่งข้อมูล เราสามารถเพิ่ม/แก้ไข/ลบเรคอร์ดที่ว่าโดยไม่มีผลอะไรกับแหล่งข้อมูลเดิมจนกว่าจะสั่งติดต่อใหม่ คือมันจะกระทำในหน่วยความจำของเราเองเท่านั้นครับ
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

หน้า: 1 ... 11 12 13 [14] 15 16 17 ... 19