แสดงกระทู้

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

หน้า: 1 ... 3 4 5 [6] 7
91
ผมเคยทำคลิปตอบคำถามแนวๆนี้ ไม่รู้ว่าพอช่วยเป็นแนวทางได้หรือไม่นะครับ ลองดูแล้วกัน

92
ห้อง MS Access / > ซ่อน Page Header
« เมื่อ: 06 มี.ค. 61 , 10:55:22 »
Me.Section ต้องไม่มี s ต่อท้าย ไม่ใช่หรือครับ ส่วนชื่อ PageHeaderSection ต้องเป็นชื่อของพื้นที่ ที่เราจะทำการซ่อน เช่นถ้าเราต้องการซ่อนพื้นที่ในส่วนของ Header ก็คล๊กที่พื้นที่ Header นั้น ในมุมมองออกแบบ แล้วดูที่ Property > Other > Name ว่าใช้ชื่อว่าอะไรก็ใส่ให้ตรงกับชื่อนั้น ส่วนการเทียบ Page = Pages เราจำเป็นต้องสร้าง Control Text Box ขึ้นมา โดย Control Source กำหนดเป็น [Pages] จะแสดงหรือไม่ก็ได้แต่ต้องมี เพื่อให้การนับหน้าทั้งหมดทำงาน เราถึงจะเทียบค่ากับหน้าปัจจุบันได้จริง ประมาณนี้ครับ

93
อื่ม! ห้ามถึงต้องก๊อปปี้เรคคอร์ดที่กำลังโฟกัสอยู่ สำเนาไปเป็นเรคคอร์ดใหม่อีกเรคคอร์ดอย่างนั้นใช่ไม๊ครับ
ลองดูโค้ดแล้ว ใช้ได้นะครับ ใช้การเรียก Command menu แบบที่ใช้ก็ใช้ได้นะครับ ลองใส่แบบนี้ดูครับ

โค๊ด: [Select]
    DoCmd.RunCommand acCmdSelectRecord
    If (MacroError = 0) Then
        DoCmd.RunCommand acCmdCopy
    End If
    If (MacroError = 0) Then
        DoCmd.RunCommand acCmdRecordsGoToNew
    End If
    If (MacroError = 0) Then
        DoCmd.RunCommand acCmdSelectRecord
    End If
    If (MacroError = 0) Then
        DoCmd.RunCommand acCmdPaste
    End If
    If (MacroError <> 0) Then
        Beep
        MsgBox MacroError.Description, vbOKOnly, ""
        DoCmd.GoToRecord , , acLast
    End If
    DoCmd.GoToRecord , , acLast
    DoCmd.GoToControl "CNC"

94
 :sweat: 16
ขั้นตอนมีอยู่เท่านี้จริงๆครับ คือสร้างฟังก์ชั่นขึ้นมา แล้วก็นำฟังก์ชั่นไปใช้ในคิวรี่ครับ
คือถ้าตามโจทย์ คุณลองทำตามขั้นที่ 1 สร้างฟังก์ชั่นใน Module ขึ้นมา
ส่วนขั้นที่ 2 ก็ไปที่คิวรี่ สร้างใหม่ แล้วนำ SQL ที่ให้ไปใส่ลองในมุมมอง SQL แล้วเปลี่ยชื่อ Table1 ให้เป็นชื่อตารางของคุณแทนครับ ประมาณนี้

95
ผมขอช่วยเสริมนิดนะครับ คือผมขอยกตัวอย่างไฟล์ Northwind ของ Microsoft


คือโดยปกติเรากำหนด pk ฟิลด์เดียวในตาราง เราก็จะหมายถึงฟิลด์นั้นในทุกเรคคอร์ดเราจะไม่ให้มีการซ้ำกันของข้อมูล ส่วนการทำ pk หลายฟิลด์มักจะใช้กับกรณีที่เราต้องการให้ข้อมูลในฟิลด์ทุกฟิลด์สามารถซ้ำกันได้ แต่เมื่อฟิลด์ทั้งหลายที่เรากำหนดเป็น pk รวมกันแล้วจะไม่สามารถซ้ำกันได้ ถ้าจะพูดให้สั้นๆว่าเหมือนกับการที่เรานำ Composite key คีย์ร่วมทั้งหมดมาทำให้เป็นคีย์หลัก Primary key เพื่อบ่งบอกว่าถ้าฟิลด์ทั้งหมดที่กำหนดเป็น pk รวมกันจะมีได้แค่เรคคอร์ดเดียวในตาราง
ไม่รู้จะอ่านแล้ว งง หรือไม่นะครับ

96
ถ้าเป็นการ Import ประเภท Text หรือ CSV จะไม่ Option กำหนด Range ได้นะครับ ต้องนำเข้ามาทั้งหมดก่อนแล้วเขียนโค้ด SQL ตัดช่วงที่ไม่ต้องการออก หรือเอาช่วงที่ต้องการไว้ แล้วแต่ไอเดียที่จะเขียนต่อไปครับ

97
ใช้โค้ดประมาณนี้ในการเซฟไฟล์ครับ แทนค่าตัวสีแดงให้ถูก
On Error GoTo Err_SaveImage
    Dim db As DAO.Database
    Dim rsParent As DAO.Recordset2
    Dim rsChild As DAO.Recordset2
    Set db = CurrentDb
    Set rs = Me.Recordset ' หรือหากฟอร์มไม่ได้ผูกกับฐานข้อมูล Set rsParent = db.OpenRecordset("ชื่อตาราง", dbOpenDynaset)
     rsParent.FindFirst "[ID] = " & Me.txt_ID ' txt_ID คือชื่อ TextBox ที่เป็น ID
'    rsParent.FindFirst "[ProductName] Like '*A*' AND [Quantity] = 15" ' หรือหากต้องการอ้างเรคคอร์ดที่เงื่อนไขอื่นๆ
    Set rsChild = rsParent.Fields("ชื่อฟิลด์ Attachment").Value
    While Not rsChild.EOF
        rsChild.Fields("FileData").SaveToFile "C:\Backup" 'พาธโฟลเดอร์ที่ต้องการเซฟไฟล์
        rsChild.MoveNext
    Wend
Exit_SaveImage:
    Set rsChild = Nothing
    Set rsParent = Nothing
    Exit Sub
Err_SaveImage:
    If Err.Number = 3839 Then
        MsgBox ("File Already Exists in the Directory!")
        Resume Next
    Else
        MsgBox "Some Other Error occured!", Err.Number, Err.Description
        Resume Exit_SaveImage
    End If

ปล. หากอยากเลือกโฟลเดอร์เองด้วยก็ต้องเขียนโค้ดเปิด Dialog Box เลือกโฟลเดอร์เพิ่มเติมอีก ปรับใช้ดูครับ

98
ลองใช้โค้ดประมาณนี้ดูครับ สมมุติไฟล์พาธอยู่ที่ C:\Data\Book1.xlsx นำเข้าเป็นข้อมูลทั้งหมดไม่มีชื่อฟิลด์ ตำแหน่งที่ B5 ถึง M11

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Table1", "C:\Data\Book1.xlsx", False, B5:M11"

ปรับใช้ดูครับ

99
ด้วยตัวคอนโทรลเองไม่น่าจะทำได้ครับ ต้องใช้ฟอร์มทำเป็น Popup แสดงแทน ซึ่งก็ต้องเขียนโค้ต และอาศัยเหตุการณ์หลายๆอย่างช่วย และต้องรัดกุมในการเขียนคำสั่งพอควรครับ ตามความคิดผมนะ ใช้การคลิ๊กเมาส์ เปิดฟอร์ม Popup ที่เราทำไว้เพื่อแสดงภาพต่างหากก็พอครับ ถ้าใช้การเลื่อนเมาส์ก็เท่ากับเราต้องใช้เหตุการณ์ On Mouse Move จะเขียนยากเพราะเหตุการณ์นี้จะทำงานตลอดเมื่อ Pointer Mouse ขยับ

100
เราสามารถใช้ฟังก์ชั่น Dlookup() ตรวจสอบได้ครับว่าฟิลด์ Attachment มีไฟล์อยู่หรือไม่ เช่น สมมุติตารางชื่อ Table1 ฟิลด์ Attachment ชื่อ Attach ก็เขียนตรวจสอบที่ปุ่มบันทึกก็ได้ครับ ก่อนคำสั่งบันทึก

If Dlookup("Attach","Table1","ID=" & Me.ID) = "" then
    "ยังไม่มีการแนบไฟล์" ...
Else
    "มีการแนบไฟล์แล้ว" ...
End IF

ปล. การใช้ Dlookup() จะ Retrun ชื่อไฟล์ทั้งหมดที่อยู่ในฟิลด์ Attachment หากมีการแนบไฟล์เป็น ชือไฟล์.นามสกุล,ชือไฟล์.นามสกุล,...ไปเรื่อยๆ
ปรับใช้ดูครับ

101
@bookungth หลายคนหลายความคิดดีแล้วครับ

ปล. ไม่เคยรู้ว่ามี FC ด้วย เคยแต่เป็น FC คนอื่นเหมือนกัน ขอบคุณครับ

102
อื่ม! อาการเหมือนเครื่องไม่มีโปรแกรม Excel อะครับ
ลองดูใน References ของ VBE ดูว่ามี Microsoft Excel 15.0 Object Library หรือเปล่า


- ถ้ามีก็ให้ทำเครื่องหมายถูกไว้ แล้วทำอย่างที่ อ. pizza_p แนะนำ เราจะสามารถเขียนคำสั่ง Property ต่างๆได้อย่างถูกต้อง และตรวจสอบ Debug ได้
- แต่ถ้าไม่มี แสดงว่าเครื่องคุณลงโปรแกรม Excel ผิดปกติอะครับ แนะนำลองลง Excel ใหม่ดูครับ

103
สมมุติคุณมีตาราง Transaction ประมาณนี้
-------------------------------------------
ProductName    Quantity    Price
        A                 10         5
        A                 15         5
        A                 20         5
        A                 25         5
-------------------------------------------
- ในคิวรี่ก็ให้สร้างฟิลด์เพิ่มดังนี้
subtotal: สำหรับรวมราคาย่อย
Discount: คำนวณส่วนลดตามเงื่อนไข
Total: รวมราคา
- สมมุติตารางชื่อ Table1
------------------------------------------------------
SELECT ProductName, Quantity, Price,
[Quantity]*[Price] AS subTotal,
IIf([Quantity] Between 16 And 20,([Quantity]*[Price])*0.02,IIf([Quantity] Between 21 And 30,([Quantity]*[Price])*0.03,IIf([Quantity]>30,([Quantity]*[Price])*0.04,0))) AS Discount, [subTotal]-[Discount] AS Total
FROM Table1;
-------------------------------------------------------
ประมาณนี้ครับ ปรับใช้ดู

104
สมมุติไฟล์เป้าหมายของคุณอยู่ที่ Path C:\Data\Files\
- ที่ Combobox สมมุติให้ชื่อ Combo1 ให้ใส่โค้ดลงใน Event > On Got Focus
โค๊ด: [Select]
    Dim strFile As String, nFiles As String
    strFile = Dir("C:\Data\Files\", vbNormal)
    Do While strFile <> ""
        nFiles = nFiles & ";" & strFile
        strFile = Dir()
    Loop
    Me.Combo1.RowSource = Mid(nFiles, 2)
ประมาณนี้ครับ ปรับใช้ดู

ลืมบอกไปว่าใน Property ของ Combobox ใน Data > Row Source Type ให้กำหนดเป็น Value List

105
1. เราสามารถเขียน หรือ ประกาศ ในโปรแกรมได้หรือไม่ เพื่อคนอื่นที่มาดูแลโปรแกรมต่อจากเรา จะได้ทราบว่า โปรแกรม Load dll ตัวไหนเข้ามา
- อื่ม! กับคำถามนี้ไม่ค่อยเข้าใจความต้องการนะครับ แต่ถ้าหมายถึงการที่ยากแสดงว่าไฟล์เราใช้ไลบารี่ตัวใดบ้างโดยไม่ต้องมาดูที่ VBE เราสามารถเขียนคำสั่งให้แสดง ชื่อ หรือ พาธไฟล์ ไลบารี่ ที่ใช้งานอยู่ได้ครับ

โค๊ด: [Select]
Sub ListLibraryName()
    Dim chkref As Reference
    For Each chkref In Application.References
        MsgBox "Reference: " & chkref.name & Chr(13) & chkref.FullPath
    Next
End Function

<Return>
Reference: VBA
C:\PROGRA~1\COMMON~1\MICROS~1\VBA\VBA7\VBE7.DLL
 
Reference: Access
C:\Program Files\Microsoft Office\Office14\MSACC.OLB
 
Reference: stdole
C:\Windows\system32\stdole2.tlb

2. ปกติพวก .dll ไม่ได้ถูก compile รวมไปด้วยกับโปรแกรมครับ มันจะไปโหลดที่เครื่องปลายทางตอนเปิดโปรแกรมขึ้นมาครับ .dll บางตัวสามารถใส่ลงไปในที่เดียวกับ .accde ได้ แต่ปกติ Access จะไปหาที่มีอยู่ในระบบก่อน สุดท้ายถึงจะมาหาใน path ที่โปรแกรมอยู่ และไฟล์ .dll บางตัวก็ทำงานไม่ได้ถ้าไม่ได้ register หรือติดตั้งเข้ากับ windows ก่อน
-เราไม่สามารถนำไฟล์ไลบารี่ภายนอกมาก bundle เข้าด้วยกันกับไฟล์ Data ได้ คืออย่าลืมว่าไฟล์ Access เราเป็นแค่ไฟล์ Data นะครับ ไม่ใช่ Execute ไฟล์ (ถึงต่อให้เป็น Execute ก็ไม่ควร bundle เข้าไปเป็นไฟล์เดียว เพราะมันจะพัฒนาต่อได้ยาก และยุ่งยากในการแก้บัค) โปรแกรมส่วนมากจะแยกไฟล์ dll ของตัวเองไว้เป็นอีกไฟล์ภายนอก ส่วนการลงในเครื่องอื่นๆ ก็สามารถใช้โปรแกรมที่สามารถทำเป็นไฟล์ติดตั้งได้ลงในพาธต่างๆตามที่เราต้องการแทน เหมือนการลงโปรแกรมทั้งไปที่จะใช้ไฟล์ตัว Setup.exe อะไรประมาณนี้แทนการแค่ก็อปปี้ใส่ลงในโฟลเดอร์เดียว

106
เคยแนะนำเพื่อนให้ใช้บริการอยู่ที่นึงครับ แต่ไม่ค่อยน่าประทับใจ เลยไม่อยากแนะนำอะครับ รอท่านอื่นๆ ช่วยแนะนำนะครับ

107
ลองใช้คำสั่งการ Ping ไปยังเครื่องเป้าหมายก่อนที่ะใช้คำสั่งดูนะครับ น่าจะช่วยได้ครับ

108
ก็ต้องวางแผนฐานข้อมูลก่อนนะครับ ว่าจะเชื่อมโยงข้อมูลกันหรือไม่ ถ้าแยกร้านกันไม่ต้องเชื่อมโยงข้อมูลกันก็ไม่มีปัญหาใช้ตามความถนัดไปก่อนได้ แต่ถ้าต้องการเชื่อมโยงข้อมูลกันก็ควรใช้เป็นฐานข้อมูล SQL Server หรือ My SQL หรืออื่นๆหลายค่าย (ต้องศึกษาดู ส่วนตัวผมใช้แต่ SQL Server) โดยการใช้งานผ่านทาง Web Browser  น่าจะง่ายที่สุดแล้ว โดยหาคนที่เขียน Web application เป็นก็สามารถทำได้ครับ ส่วนเรื่องข้อมูลเก่าใน MS Access เราสามารถ Export ไปที่ SQL Server (ในกรณีใช้ SQL Server นะครับ ค่ายอื่นๆ ก็ได้ แต่ไม่แน่ใจในวิธีการทำ) ได้ครับ ยกเว้นฟิลด์ที่ไม่ใช้มาตรฐานของฐานข้อมูลจริงๆ อย่าง Attachment ถ้ามีก็ต้องเปลี่ยนรูปแบบการจัดเก็บใหม่
สรุป ลองปรึกษาคนที่รับเขียนเว็บครับ ยิ่งปัจจุบันเค้าสามาถเขียนเป็นแอฟรองรับมือถือได้ด้วยทำให้ใช้งานได้หลาย Device อีกต่างหาก

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