Forum Replies Created
-
AuthorPosts
-
adminKeymaster
ผมเคยทำอยู่ครับ แบบไม่ได้แนบไฟล์เข้าไปใน 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 ไปทำอะไรต่อก็แล้วแต่นะครับ ^^
ที่ผมเคยทำมีอยู่วิธีนี้วิธีเดียวครับยอมรับว่าค่อนข้างยากเหมือนกัน เป็นกำลังใจให้นะครับ ^^
adminKeymasterส่งไฟล์มาหน่อยครับ kitisak_arm@hotmail.com เด๋วผมเขียนให้ดูครับ อธิบายยากแหะ ๆ
adminKeymasterคือถ้าไม่ใส่ช่วงเวลา ให้มันออกมาทั้งหมดเหรอครับ
adminKeymasterตรงที่ผมเขียน [เงื่อนไข] ตรงนี้ให้ใส่โค๊ตเข้าไปเองครับ สมมติว่าจะดึงค่าจาก control จากฟอร์มใดฟอร์มหนึ่งมา ก็แทนไปว่า [forms]![ชื่อฟอร์ม]![ชื่อ control] ได้เป็น
Like Nz([forms]![ชื่อฟอร์ม]![ชื่อ control],"*")
แบบนี้ครับ
adminKeymasterใช่ครับ ใช้ query ดึงข้อมูลจากสองตาราง ได้เลย โดยให้สองตารางมันโยงความสัมพันธ์กันด้วย pk กับ fk ไว้ครับ
adminKeymasterผมดูให้ละครับ ตอนนี้ข้อมูลมันซ้ำซ้อนอยู่ ปรกติข้อมูลลูกค้าเราจะเก็บไว้ที่ตารางลูกค้าที่เดียวครับ ส่วนตารางอื่นที่จะเอาข้อมูลลูกค้าไปใช้ เอาไปแต่ PK ครับ ไม่ได้เอาข้อมูลไปทั้งหมด เพราะงั้น ที่ตารางการจอง ตัดข้อมูลลูกค้าออกให้หมดเลยครับ เหลือแต่ รหัสลูกค้าอย่างเดียวถึงจะถูก
ข้อมูลห้องพักก็เหมือนกันครับ เก็บไว้ที่ตารางห้องพักที่เดียว ตารางอื่นจะเอาข้อมูลห้องพักไปใช้ เอาไปแต่ เลขที่ห้องพักพอครับ
เพราะฉะนั้น ข้อมูลช่องสีแดงที่คุณ HooHiiw บอกว่าไม่มา ไม่ต้องแปลกใจครับ เราไม่เก็บไว้ที่ตารางนั้นอยู่แล้ว ^^
adminKeymasterได้สิครับ ใช้ like นั่นแหล่ะครับ สมมติ เราใส่เงื่อนไข
Like Nz([เงื่อนไข],"*")
แบบนี้ ถ้า [เงื่อนไข] เป็นค่าว่าง (Null) จะเลือกข้อมูลทั้งหมดครับ แต่ถ้าไม่ใช่ค่าว่าง เช่น มีค่าเท่ากับ 100 แบบนี้ก็จะเลือกแต่ ข้อมูลที่เท่ากับ 100 เท่านั้น งงไหมครับ
adminKeymasterสงสัยต้องให้ส่งไฟล์ให้ผมดูหน่อยละครับ ดูแต่รูป ไม่รู้สาเหตุจริง ๆ ส่งไฟล์มานะครับ kitisak_arm@hotmail.com ครับ
adminKeymasterยินดีมากครับ ติดตรงไหนก็ถามมาได้เลยนะครับ ไม่ต้องเกรงใจครับ admin อยากให้เขียนจบได้โปรแกรมที่ต้องการกันทุกคน อิอิ
adminKeymasterลองดูในรูปครับการเขียนเงื่อนไขในการเลือกข้อมูลออกมาโชว์ เราจะเขียนไว้ที่ช่อง 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 ดูครับคนอธิบายไว้เพียบหมดเลย ^^
adminKeymasterถ้าจะเอาให้เป๊ะเลยนะครับ จำเป็นต้องควบคุม lot ในการรับและ lot ในการเบิกด้วยครับ ก็จะรู้ว่าคงเหลือ lot ไหนบ้างในตอนนี้ และอ้างอิงจาก lot จะรู้เลยว่า lot ไหนราคาต่อหน่วยเท่าใหร่ ซึ่งต้องออกแบบใหม่แต่แรกครับ
ถ้าตามที่ทำมานี้ ก็มีแนวทางทำได้อีกหน่อย แต่ว่าจะไม่เป๊ะนะครับ ต้องคุยกับเจ้านายว่ารับได้ไหม คือ
1 ถ้าจะเอาราคาสูงสุดที่ซื้อมาไม่สนใจราคาอื่น ก็ใช้ Max แบบที่คุณ peerapach ทำตัวอย่างให้ดูนี่ก็ได้ราคาสูงสุด เอาไปคูณจำนวนคงเหลือได้เลย
2 ถ้าจะเอาราคาต่ำสุด ที่ซื้อ ก็เปลี่ยนจาก Max เป็น Min ครับ (แต่อันนี้ผมว่าไม่น่าจะได้ เพราะบาง record เป็น null ค่าต่ำสุดจะกลายเป็น null ไป)
3 ถ้าจะเอาราคาเฉลี่ย ก็เปลี่ยนจาก Max เป็น Avg ครับผมบอกทางเลือกไปหมดแล้วนะครับ เหลือแค่คุณ peerapach จะเลือกแบบไหน ^^
adminKeymasterเข้าใจแล้วครับ ผมคิดว่าถ้าจะเอาราคาสุทธิ (ราคาต่อหน่วย * จำนวนรับ) ภายใน 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]แค่นี้ก็น่าจะเอาไปทำรายงานที่ต้องการได้แล้วครับ
adminKeymasterช่อง IM_Item_unitprice อันนี้ เปลี่ยนจาก Max เป็น Sum ดูครับ ได้ไหม
adminKeymasterลองใช้ฟังก์ชั่น dlookup ดูครับ
เช่นDim chk chk=Dlookup("[คอลัมป์ที่หา]","[ชื่อตาราง]","[ชื่อตาราง]![คอลัมป์ที่หา]='" & Me![SearchB] & "'") If(IsNull(chk)) then msbgox "ไม่เจอข้อมูลที่ค้นหา" Else 'ถ้าหาเจอแล้วจะทำอะไรให้มาใส่ตรงนี้ครับ End If
adminKeymasterจัดให้สองแบบเลยนะครับ
แบบที่ 1 https://www.youtube.com/watch?v=6p-6WdPEatgadminKeymasterมันต้องอธิบายยาว แต่เด๋วผมทำวีดีโอให้ครับจะได้ง่าย ๆ รอแปป
06/04/2015 at 11:15 AM in reply to: ข้อความเตือน เมื่อกด บันทึก ว่ามีช่องที่ยังไม่ได้ใส่ข้อมูลครับ #446adminKeymasterได้ครับใส่โค๊ตเพิ่มใต้ msgbox
If(Trim(me.none_blank)="") Then msgbox "กรุณาใส่ข้อมูลให้ครบ" <strong style="color:red;">Me.non_blank.SetFocus</strong> Else ' ตรงนี้ใส่โค๊ตสำหรับเซพข้อมูล End If
ประมาณนี้ครับ
06/04/2015 at 10:52 AM in reply to: ข้อความเตือน เมื่อกด บันทึก ว่ามีช่องที่ยังไม่ได้ใส่ข้อมูลครับ #443adminKeymasterต้องใช้ 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
แล้วลองรันดูครับ
-
AuthorPosts