admin

Forum Replies Created

Viewing 18 posts - 21 through 38 (of 38 total)
  • Author
    Posts
  • adminadmin
    Keymaster

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

    1 ตารางที่เราจะเก็บไฟล์นั้น ให้เก็บแต่ path โดย ประเภทของข้อมูลที่เก็บใช้เป็น text ธรรมดาครับ

    2 สร้างฟอร์มเพิ่มไฟล์ โดย เอาฟิล์ด ที่เราจะเก็บ path ออกมา เป็น textbox แล้วเลือก perperty hyper text เป็น yes ด้วยครับ

    3 ที่ Control source เขียนสูตร =IIf(IsNull([filepath]),"","ดูไฟล์") อธิบายคือ ถ้าช่องที่เราทำเป็นยังไม่มีการเก็บ path เราจะให้เป็นช่องว่างไว้ แต่ถ้ามีการเก็บ path ไว้แล้ว ให้มีลิงค์เปิดดูไฟล์ได้

    4 ที่ event on click ของ textbox ให้ใส่สูตรเพื่อ เช็คว่า มีการใส่ path หรือยัง ถ้าใส่แล้ว ให้เปิดไฟล์ขึ้นมา แต่ถ้ายังไม่ได้ใส่ ให้เลือกไฟล์ เพื่อก๊อปปี้ไฟล์มาไว้ใน folder ที่เรากำหนด แล้วก็เก็บ path ไว้เรียกใช้ภายหลัง

    อันนี้คือเรียกใช้ sub copyToFolder(ชื่อtextbox,ชื่อโฟลเดอร์ที่จะย้ายไฟล์มาเก็บ,ชื่อฟิล์ที่จะเก็บ path ในตาราง)

    Private Sub filepaath_Click()
       Call copyToFolder(Me.filepath, "images", Me.file_pattern)
    End Sub

    ส่วน Sub copyToFolder อันนี้ต้องไล่โค๊ตแล้วเอาไปประยุกต์ใช้เอาเองนะครับ ^^

    Sub copyToFolder(ByRef o As Object, ByVal ftext As String, ByRef field As Object)
        If (o.Value = "") Then
    
            Dim f    As Object
            Set f = Application.FileDialog(3)
            f.AllowMultiSelect = True
            f.Title = "กรุณาเลือกไฟล์รูป หรือ ไฟล์ PDF เพื่อแนบไปกับสินค้านี้"
            f.Show
    
            
            If (f.SelectedItems.Count > 0) Then
                For Each vrtSelectedItem In f.SelectedItems
                    Dim fs As Object
                    Dim oldPath As String, newPath As String
                    oldPath = vrtSelectedItem 
                    Fname = Filename(vrtSelectedItem)
                    fext = EXTname(Fname)
                    Newname = Me.cus_code & "_" & Me.pro_code & "." & fext
                    newPath = CurrentProject.Path & "\" & ftext & "\" & Newname 
                    Set fs = CreateObject("Scripting.FileSystemObject")
                    Call fs.CopyFile(oldPath, newPath, True)
                    Set fs = Nothing
                    field.Value = Newname
                    o.Requery
                Next
            End If
        Else
            
            thisfile = CurrentProject.Path & "\" & ftext & "\" & field.Value
            If (FileExists(thisfile)) Then
                Application.FollowHyperlink thisfile, , True
            Else
                field.Value = ""
                o.Requery
                MsgBox "ไฟล์ที่เคยแนบอาจโดนลบไปแล้วกรุณาเลือกไฟล์เพื่อแนบอีกครั้ง"
            End If
        End If
    End Sub

    5 ถ้าทำถูกต้องนะครับ เราก็จะได้ฟอร์มที่สามารถคลิกที่ textbox เพื่อเลือกไฟล์รูปมาเก็บไว้ที่ folder ที่เรากำหนด ได้ โดยเราเก็บแค่ path ไว้ในตารางเท่านั้น ส่วนจะเอา path ไปทำอะไรต่อก็แล้วแต่นะครับ ^^

    ที่ผมเคยทำมีอยู่วิธีนี้วิธีเดียวครับยอมรับว่าค่อนข้างยากเหมือนกัน เป็นกำลังใจให้นะครับ ^^

    adminadmin
    Keymaster

    ส่งไฟล์มาหน่อยครับ kitisak_arm@hotmail.com เด๋วผมเขียนให้ดูครับ อธิบายยากแหะ ๆ

    adminadmin
    Keymaster

    คือถ้าไม่ใส่ช่วงเวลา ให้มันออกมาทั้งหมดเหรอครับ

    adminadmin
    Keymaster

    ตรงที่ผมเขียน [เงื่อนไข] ตรงนี้ให้ใส่โค๊ตเข้าไปเองครับ สมมติว่าจะดึงค่าจาก control จากฟอร์มใดฟอร์มหนึ่งมา ก็แทนไปว่า [forms]![ชื่อฟอร์ม]![ชื่อ control] ได้เป็น

    Like Nz([forms]![ชื่อฟอร์ม]![ชื่อ control],"*")

    แบบนี้ครับ

    in reply to: การเพิ่มค่า #509
    adminadmin
    Keymaster

    ใช่ครับ ใช้ query ดึงข้อมูลจากสองตาราง ได้เลย โดยให้สองตารางมันโยงความสัมพันธ์กันด้วย pk กับ fk ไว้ครับ

    in reply to: การเพิ่มค่า #505
    adminadmin
    Keymaster

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

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

    เพราะฉะนั้น ข้อมูลช่องสีแดงที่คุณ HooHiiw บอกว่าไม่มา ไม่ต้องแปลกใจครับ เราไม่เก็บไว้ที่ตารางนั้นอยู่แล้ว ^^

    adminadmin
    Keymaster

    ได้สิครับ ใช้ like นั่นแหล่ะครับ สมมติ เราใส่เงื่อนไข

    Like Nz([เงื่อนไข],"*")

    แบบนี้ ถ้า [เงื่อนไข] เป็นค่าว่าง (Null) จะเลือกข้อมูลทั้งหมดครับ แต่ถ้าไม่ใช่ค่าว่าง เช่น มีค่าเท่ากับ 100 แบบนี้ก็จะเลือกแต่ ข้อมูลที่เท่ากับ 100 เท่านั้น งงไหมครับ

    in reply to: การเพิ่มค่า #500
    adminadmin
    Keymaster

    สงสัยต้องให้ส่งไฟล์ให้ผมดูหน่อยละครับ ดูแต่รูป ไม่รู้สาเหตุจริง ๆ ส่งไฟล์มานะครับ kitisak_arm@hotmail.com ครับ

    adminadmin
    Keymaster

    ยินดีมากครับ ติดตรงไหนก็ถามมาได้เลยนะครับ ไม่ต้องเกรงใจครับ admin อยากให้เขียนจบได้โปรแกรมที่ต้องการกันทุกคน อิอิ

    adminadmin
    Keymaster

    ตัวอย่าง

    ลองดูในรูปครับการเขียนเงื่อนไขในการเลือกข้อมูลออกมาโชว์ เราจะเขียนไว้ที่ช่อง Criteria ใน Query

    ถ้าหากต้องการเงื่อนไข จากวันที่หนึ่งถึงวันที่หนึ่ง เราจะใช้ function
    Between [จากวันที่] and [ถึงวันที่]

    การดึงค่าในฟอร์มมาใช้ ใน query นั้นง่าย ๆ ครับ ใช้รูปแบบตามนี้
    [Forms]![ชื่อฟอร์ม]![ชื่อ Control ที่จะดึงค่า]

    ดังนั้น หากเรามีฟอร์มที่ให้ใส่ค่า วันที่เริ่มต้น ถึงวันที่สิ้นสุดเพื่อจะทำ query โดยผมสมมติ ชื่อฟอร์ม ว่า frm_search ส่วน control วันที่เริ่มต้นตั้งชื่อว่า date_start วันที่สิ้นสุดตั้งชื่อว่า date_end เราจะเขียนเงื่อนไขใน query ได้ดังนี้
    Between [Forms]![frm_search]![date_start] and [Forms]![frm_search]![date_end]

    ส่วนที่ถามว่าค้นหาจากชื่อพนักงาน ได้อย่างไร ก็ใช้หลักการเดียวกันครับ วิธีดึงค่าจากฟอร์มก็ทำเหมือนกัน เพียงแต่การค้นหาจากชื่อหรือข้อความนั้นเรานิยมใช้ function Like ครับ ลองไปศึกศาดูครับ

    ส่วนตัวอย่างโค๊ต สมมติว่า ชื่อฟอร์มว่า frm_search ส่วน control ที่ใช้หาชื่อพนักงาน ชื่อว่า emp_name ก็เขียนโค๊ตได้ดังนี้
    Like "*" & [Forms]![frm_search]![emp_name]

    ผมบอกได้แต่แนวการเขียนนะครับ ส่วนรายละเอียดว่า ฟังก์ชั่นอะไรใช้อย่างไร หาใน google ดูครับคนอธิบายไว้เพียบหมดเลย ^^

    adminadmin
    Keymaster

    ถ้าจะเอาให้เป๊ะเลยนะครับ จำเป็นต้องควบคุม lot ในการรับและ lot ในการเบิกด้วยครับ ก็จะรู้ว่าคงเหลือ lot ไหนบ้างในตอนนี้ และอ้างอิงจาก lot จะรู้เลยว่า lot ไหนราคาต่อหน่วยเท่าใหร่ ซึ่งต้องออกแบบใหม่แต่แรกครับ

    ถ้าตามที่ทำมานี้ ก็มีแนวทางทำได้อีกหน่อย แต่ว่าจะไม่เป๊ะนะครับ ต้องคุยกับเจ้านายว่ารับได้ไหม คือ
    1 ถ้าจะเอาราคาสูงสุดที่ซื้อมาไม่สนใจราคาอื่น ก็ใช้ Max แบบที่คุณ peerapach ทำตัวอย่างให้ดูนี่ก็ได้ราคาสูงสุด เอาไปคูณจำนวนคงเหลือได้เลย
    2 ถ้าจะเอาราคาต่ำสุด ที่ซื้อ ก็เปลี่ยนจาก Max เป็น Min ครับ (แต่อันนี้ผมว่าไม่น่าจะได้ เพราะบาง record เป็น null ค่าต่ำสุดจะกลายเป็น null ไป)
    3 ถ้าจะเอาราคาเฉลี่ย ก็เปลี่ยนจาก Max เป็น Avg ครับ

    ผมบอกทางเลือกไปหมดแล้วนะครับ เหลือแค่คุณ peerapach จะเลือกแบบไหน ^^

    adminadmin
    Keymaster

    เข้าใจแล้วครับ ผมคิดว่าถ้าจะเอาราคาสุทธิ (ราคาต่อหน่วย * จำนวนรับ) ภายใน query นี้ จะยังทำไม่จบครับ ต้องเพิ่มอีก query นึง

    query ที่กำลังทำอยู่นี้ ให้เอาแถว total: ออกไปก่อน(หมายถึงแถว group by,sum อะไรพวกนี้ครับ)
    แล้วก็ให้เพิ่มอีก column นึง ไว้คำนวน เป็นราคาสุธิ ขึ้นมาเลย สมมติว่า

    ttl_price: In*IM_Item_Unitprice

    ทีนี้ก็เซพไว้ครับ สมมติเป็นชื่อว่า stock1 แล้วก็สร้างขึ้นใหม่อีก query นึง เอา stock1 ตั้ง เอาแถว(ผลรวม) total: ออกมา

    เอาคอลัมป์ออกมาตามนี้นะครับ
    1. Item_Code [Group By]
    2. Item [Group By]
    3. In [Sum]
    4. Out [Sum]
    5. Balance [Sum]
    6. Target_stock [Group By]
    7. tt_price [Sum]

    แค่นี้ก็น่าจะเอาไปทำรายงานที่ต้องการได้แล้วครับ

    adminadmin
    Keymaster

    ช่อง IM_Item_unitprice อันนี้ เปลี่ยนจาก Max เป็น Sum ดูครับ ได้ไหม

    adminadmin
    Keymaster

    ลองใช้ฟังก์ชั่น dlookup ดูครับ
    เช่น

    Dim chk
    chk=Dlookup("[คอลัมป์ที่หา]","[ชื่อตาราง]","[ชื่อตาราง]![คอลัมป์ที่หา]='" & Me![SearchB] & "'")
    If(IsNull(chk)) then
      msbgox "ไม่เจอข้อมูลที่ค้นหา"
    Else
      'ถ้าหาเจอแล้วจะทำอะไรให้มาใส่ตรงนี้ครับ
    End If
    
    adminadmin
    Keymaster

    จัดให้สองแบบเลยนะครับ
    แบบที่ 1 https://www.youtube.com/watch?v=6p-6WdPEatg

    แบบที่ 2 https://www.youtube.com/watch?v=Vo9a3pqL3UM

    adminadmin
    Keymaster

    มันต้องอธิบายยาว แต่เด๋วผมทำวีดีโอให้ครับจะได้ง่าย ๆ รอแปป

    adminadmin
    Keymaster

    ได้ครับใส่โค๊ตเพิ่มใต้ msgbox

    If(Trim(me.none_blank)="") Then
      msgbox "กรุณาใส่ข้อมูลให้ครบ"
      <strong style="color:red;">Me.non_blank.SetFocus</strong>
    Else
      ' ตรงนี้ใส่โค๊ตสำหรับเซพข้อมูล
    End If
    

    ประมาณนี้ครับ

    adminadmin
    Keymaster

    ต้องใช้ vba เช็คครับ

    1 ให้ตั้งชื่อชองช่องที่เราจะเช็คก่อนนะครับ คลิกขวาที่ช่องที่เราจะเช็ค > property > tab Other > ช่อง name
    สมมติว่า่ชื่อ none_blank ละกัน

    2 ปุ่มบันทึก ไม่ต้องใช้ macro นะครับ ใช้เป็น vba แทน คลิกขวาที่ปุ่ม บันทึก > property > tab Event > ช่อง On Click

    3 คลิกที่ปุ่ม … หลังช่องว่าง เลือก Code Builder

    จากนั้นใส่โค๊ตเช็คครับ

    
    If(Trim(me.none_blank)="") Then
      msgbox "กรุณาใส่ข้อมูลให้ครบ"
    Else
      ' ตรงนี้ใส่โค๊ตสำหรับเซพข้อมูล
    End If
    

    แล้วลองรันดูครับ

Viewing 18 posts - 21 through 38 (of 38 total)