แสดงกระทู้

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 ... 17 18 19 [20] 21 22 23 ... 29
343
เราใช้ฟอนท์ Wingding สำหรับเท็กซ์บ็อกซ์เพื่อแสดงรูปสัญญลักษณ์ได้ สมมุติ P คือชื่อฟิลด์ที่เก็บ path ของรูป ก็กำหนด Control Source ของเท็กซ์บ็อกซ์ที่แสดงสัญญลักษณ์เป็น =IIf(nz([P],"")="","","*") มันก็จะแสดงสัญญักษณ์ จดหมาย (เพราะหาไม่เจอสัญญลักษณ์รูป คลิป)  ถ้าอยากได้สัญญลักษณ์อื่นๆ ก็เปิดโปรแกรม Character Map ที่มากับวินโดว์อยู่แล้ว เลือกฟอนท์ Webding, Wingding(1-3) เอาตัวไหนก็ดับเบิลคลิกรูปแล้วคลิกปุ่ม Copy  กลับมาที่ expression ข้างบน กดคีย์ paste ลงแทนที่ * ได้เลยครับ

344
ผมมีโค้ดตัวนึง ลองเอาโค้ดนี้ไปใช้ดู แต่ไม่ยืนยันนะครับว่าจะถูกต้อง 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") มันจะเขียนทับไฟล์เดิมครับ

345
มีฝรั่งแนะนำให้อ่านอันนี้ https://dev.mysql.com/doc/connector-odbc/en/connector-odbc-usagenotes-apptips-microsoft-access.html

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

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

- เทเบิลส่วนลด 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 มาแสดงให้ดูด้วยครับ

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

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

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

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

349
ไม่เคยลองนะครับ เท่าที่ทราบ Access เองไม่สนับสนุนเนื้อเมล์ที่มีฟอร์แมทเป็น HTML  คงต้องเขียนโค้ด VBA ไปเรียกใช้ Outlook ซึ่งสนับสนุนฟอร์แมทนี้ให้มาทำหน้าที่ส่งแทน  ปัญหาอีกนิดคือถ้าเป็นแค่การใส่ลิงค์ไปยังรูปภาพ คนรับเมล์ก็ต้องเข้าถึงที่อยู่ของลิงค์นั้นได้ด้วย แต่ถ้าไม่ได้ ก็ต้องใส่เนื้อรูปภาพโดยแปลงเป็นสตริงที่มีรูปแบบเฉพาะ (เท่าที่ทราบ เขาเรียกว่า Base64 String) แล้วเอาสตริงที่ได้นี้ ใส่เป็นส่วนหนึ่งของข้อความเนื้อเมล์ด้วย ลองค้นหาเพิ่มเติมในเน็ทด้วยคำว่า Outlook VBA inline image ดูครับ

แต่อีกวิธีที่ง่ายขึ้นมาก็คือ ส่ง screen shot เป็น attach file ธรรมดาๆนี่เอง แต่ตัวโปรแกรมที่เปิดอ่านเมล์ ต้องกำหนดให้แสดงรูปภาพใน attach file ได้ด้วยเท่านั้นเอง

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


352
กำหนด Index ของฟิลด์นี้ในเทเบิลให้เป็น Yes (No Duplicate) แต่ต้องแก้ไขไม่ให้มีค่าซ้ำก่อนถึงจะกำหนดได้

353
ห้อง MS Access / : สลับ Row/ Column
« เมื่อ: 26 ก.ย. 61 , 18:40:42 »
สมมุติเทเบิลชื่อว่า T ก็สร้างคิวรี่เพื่อแปลงตามนี้

TRANSFORM First(U.V) AS UV
SELECT U.C as ID
FROM

(
SELECT "CA" AS C, ID, CA AS V FROM T
๊์UNION ALL
SELECT "QA" AS C, ID, QA AS V FROM T
๊์UNION ALL
SELECT "SC" AS C, ID, SC AS V FROM T
) AS U


GROUP BY U.C
PIVOT U.ID;

354
เวลาพูดว่าทับซ้อน ฟังดูเหมือนค่าเป็นช่วงระหว่างวันที่อะไรกับอะไร แล้วไปตรวจว่าทับซ้อนกับค่าอ้างอิงอะไร ค่าอ้างอิงเอามาจากไหน อธิบายรายละเอียดด้วย

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

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

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

357
เราใช้ Dlookup( ) เพื่อค้นหาข้อมูลที่ต้องการจากทีละเทเบิล เราใช้ค่าที่คืนมาเป็นเงื่อนไขว่าจะเลือกทำอะไร  ถ้าไม่เจอ มันจะคืนค่า NULL ครับ และใช้ฟังก์ชั่น Isnull( ) เพื่อทดสอบค่า NULL อีกที

เนื่องจากช่องบาร์โค้ดอยู่ในซับฟอร์ม ดังนั้นการจะอ้างช่องรหัสลูกค้าที่อยู่บนเมนฟอร์มจึงใช้ Parent เพื่ออ้างถึงเมนฟอร์ม แต่ถ้าอยู่ในฟอร์มเดียวกับโค้ดอยู่แล้ว ก็ใช้ Me เพื่ออ้างถึงฟอร์มแทน

เราใส่โค้ดนี้ไว้ใน AfterUpdate event procedure ของช่องบาร์โค้ด แต่เครื่องยิงบาร์โค้ดต้องตั้งเอาไว้ว่าหลังจากยิงแต่ละค่าแล้ว จะต้องส่งโค้ดจำลองการกดคีย์ ENTER หรือ TAB มาด้วยนะครับ ไม่งั้นจะไม่เกิด event นี้
โค๊ด: [Select]
If Not Isnull(Dlookup("C_ID","Customer","C_ID = " & Me.[ชื่อเท็กซ์บ็อกซ์ของบาร์โค้ด] )) Then
   Parent.[ชื่อคอมโบบ็อกซ์รหัสลูกค้า] = Me.[ชื่อเท็กซ์บ็อกซ์ของบาร์โค้ด]
   Parent.Dirty = False  ' เพื่อสั่งบันทึกข้อมูล
Elseif Not Isnull(Dlookup("P_ID","Product","P_ID = '" & Me.[ชื่อเท็กซ์บ็อกซ์ของบาร์โค้ด] & "' " )) Then
   Docmd.GoToRecord ,,acNewRec
   Parent.[ชื่อเท็กซ์บ็อกซ์รหัสสินค้า] = Me.[ชื่อเท็กซ์บ็อกซ์ของบาร์โค้ด]
End If

359
มีคนอื่นมีปัญหาแบบนีเหมือนกัน และเหมือนว่าฟอนท์นี้จะมีปัญหาด้วย fracktured.com/2011/04/28/problem-printing-calibri-font-with-office-2010/ แนะว่าไปใช้ฟอนท์ธรรมดาๆตัวอื่นดีกว่าครับ

360
อันนี้โค้ดที่ผมใช้ ตัวอย่างเวลาเรียกใช้ Call GetFoldersList("C:","MyFileName")

โค๊ด: [Select]
Public Sub GetFoldersList(PathNM As String, FileNM As String)
    Dim S               As String   ' PathNM + FileNM
    Dim SubFdStr        As String   ' เก็บรายชื่อ sub folder คั่นด้วยเครื่องหมาย ?
    Dim SubFdArray()    As String   ' แตกจาก SubFdStr อีกที
    Dim II              As Integer
   
    ' ถ้า folder มีไฟล์ที่ต้องการ
    If Dir(PathNM & "\" & FileNM) <> "" Then
        ' >>>>> เอา PathNM ไปใช้
    End If
   
    ' เก็บชื่อ sub folder ทั้งหมดไว้ก่อน
    S = Dir(PathNM & "\*", vbDirectory)
    Do Until S = ""
        If Right(S, 1) <> "." Then
            S = PathNM & "\" & S
            If GetAttr(S) = vbDirectory Then
                SubFdStr = SubFdStr & IIf(SubFdStr = "", "", "?") & S
            End If
        End If
        S = Dir()
    Loop

    ' แตกชื่อ sub folder ลง array แล้วค้นหาใน sub folder ต่อไป
    If SubFdStr <> "" Then
        SubFdArray = Split(SubFdStr, "?")
        For II = 0 To UBound(SubFdArray)
            Call GetFoldersList(SubFdArray(II), FileNM)
        Next
    End If
End Sub

หน้า: 1 ... 17 18 19 [20] 21 22 23 ... 29