20101121

บันทึกข้อมูลใน access ได้บ้าง ไม่ได้บ้าง

0 comments
ทำโปรแกรม POS ด้วย vb6 และฐานข้อมูล access ค่ะ ระหว่างพัฒนา test ผ่านไม่มีปัญหาเลย แต่พอส่งให้ผู้ใช้ ในเครื่องที่ต่างสเปคกัน ปรากฎว่ามีบางวัน ในเอกสารบางใบที่บันทึกรายการให้ไม่ครบ เช่น ขายสินค้า 3 ตัว บันทึกมาได้ 2 ตัว อีกตัวหายจ้อย หรืออาจไม่บันทึกเอกสารนั้นเลย ทั่งๆที่ระหว่างบันทึก ก็ผ่านไม่มีปัญหาอะไรเลย เดือนอาจจะมีสักวัน
เครื่องของผู้ใช้เป็น mainboard ของ win98 แต่ลง win xp ดูเหมือนจะปกติ แต่ผลลัพธ์มันแปลก ตอนนี้กำลังสงสัย hardware  และต่อ ลิ้นชัก เครื่องพิมพ์ เครื่องอ่านบาร์โค้ด
ขอความเห็นหน่อยนะคะว่าจะเป็นไปได้หรือเปล่า
รบกวนผู้รู้ทั้งหลายช่วยแนะนำด้วย ของคุณค่ะ
 
Private Sub CMDPRN_Click()
If saveok = False Then
    cmdprn.Enabled = False
    Call TCKprn
    cmdsave_Click
End If
Private Sub cmdsave_Click()
Dim sqlupdate As String
Dim srvdate As String
Dim I As Integer, rs As Recordset
Dim amtnet As Variant
Dim amtvat As Variant
On Error GoTo 0
If saveok = False Then
saveok = True
Set WRK = DBEngine.Workspaces(0)
cmdsave.Enabled = False
If MSF1.Rows = 2 Then
    MsgBox "äÁèÁÕ¢éÍÁÙÅ", vbOKOnly + vbCritical, "¤Óàµ×͹"
    Exit Sub
End If
amt7 = 0: amt0 = 0
gact = "ºÑ¹·Ö¡¢éÍÁÙÅ¢ÒÂ" & txtinv.Text
If chkmem.Value = 0 Then mber = " "
WRK.BeginTrans
srvdate = Format(tdate, "dd/mm/yyyy")
amtnet = lblcash.Caption / ((100 + systax) / 100)
amtvat = lblcash.Caption * (systax / (100 + systax))
 
tmpcard = IIf(txtpay.Text > 0, "CS", "CR")
If tmpcard = "CS" Then
    TMPCASH = Format(lblcash.Caption, "#####0.00")
    xcard = 0
Else
    xcard = Format(lblcash.Caption, "#####0.00")
    TMPCASH = 0
End If
I = 1
With MSF1
For I = 1 To MSF1.Rows - 2
       
        amtnet = CSng(.TextMatrix(I, 8)) / ((100 + systax) / 100)
       
        If MSF1.TextMatrix(I, 10) = "V" Then
                amt7 = amt7 + CCur(MSF1.TextMatrix(I, 8))
        Else
                amt0 = amt0 + CCur(MSF1.TextMatrix(I, 8))
        End If
     sqlupdate = "INSERT INTO detail(refdate,reftype,refno,pcode,refqty,refamt,refprc,REFNET,REFLOT,COUPON,PRC_CHG,refvat7) "
     sqlupdate = sqlupdate & "VALUEs('" & srvdate & "','21','"
     sqlupdate = sqlupdate & txtinv.Text & "','" & .TextMatrix(I, 1) & "',"
     sqlupdate = sqlupdate & CSng(.TextMatrix(I, 7)) & "," & CSng(.TextMatrix(I, 8)) & ","
     sqlupdate = sqlupdate & CSng(.TextMatrix(I, 4)) & "," & amtnet & ",'" & .TextMatrix(I, 9) & "',"
     sqlupdate = sqlupdate & .TextMatrix(I, 5) & ",'" & PRCCHG & "'," & systax & ")"
     DB.Execute (sqlupdate)
Next
End With
     amtnet = amt7 / ((100 + systax) / 100)
     amtvat = amt7 - amtnet
     sqlupdate = "INSERT INTO daily(refdate,reftype,refno,refcash,refcard,refdisc1,refamt,refamt7,refamt0,refmem,refsman,cashier,refno2,"
     sqlupdate = sqlupdate & "refdisc2,refdisc3,reftime,refnet,refvat,reftot,refflag,refclr)"
     sqlupdate = sqlupdate & " VALUEs('" & srvdate & "','21','"
     sqlupdate = sqlupdate & txtinv.Text & "'," & TMPCASH & ",'" & tmpcard & "'," & Format(lbldsc.Caption, "#0") & ","
     sqlupdate = sqlupdate & Format(TT, "#####0.00") & "," & Format(amt7, "#####0.00") & "," & Format(amt0, "#####0.00") & ",'" & mber & "','" & chkid & "','" & gpass & "',' ',0,0,'" & Time() & "',"
     sqlupdate = sqlupdate & Format(amtnet, "#####0.00") & "," & Format(amtvat, "#####0.00") & "," & Format(lblcash.Caption, "#####0.00") & ",0,0)"
    DB.Execute (sqlupdate)
    sqlupdate = "UPDATE CASH SET CIOCARD=IIF(ISNULL(CIOCARD),0,CIOCARD)+" & xcard & ",CIOSALE=IIF(ISNULL(CIOSALE),0,CIOSALE)+" & TMPCASH
    sqlupdate = sqlupdate + " WHERE CIODA=#" & ADATE & "# AND CIOCLR=0"
    DB.Execute (sqlupdate)
'End With

    sqlupdate = "SELECT * FROM PFRDATA"
    Set rs = DB.OpenRecordset(sqlupdate, dbOpenDynaset)
    If rs.RecordCount > 0 Then
            rs.Edit
                    rs!NO_sale = rno
                    rno = IIf(rno > 9999999, 1, rno + 1)
            rs.Update
    End If

sqlupdate = "UPDATE PRCACT SET STAT=1 WHERE REFNO='" & txtinv.Text & "'"
DB.Execute (sqlupdate)
WRK.CommitTrans
    MsgBox "ºÑ¹·Ö¡àÍ¡ÊÒà #  " + txtinv.Text + "  àÃÕºÃéÍÂáÅéÇ", vbOKOnly + vbInformation, "¼Å¡Ò÷ӧҹ"
   
Call clrdata
End If
End Sub
Private Sub TCKprn()
Dim rh As Integer
Dim YPS As Integer
Dim I As Integer, X As Integer
Dim K As Integer, amt As Currency
Dim F1 As Integer, F2 As Integer, L1 As Integer
If saveok = False Then
cmdprn.Enabled = False
gact = "¾ÔÁ¾ì¢éÍÁÙÅ¢Ò " & txtinv.Text
tmpcard = IIf(txtpay.Text > 0, "CS", "CR")
CPdsc = False
If MSF1.Rows = 2 Then
  '  MsgBox "äÁèÁÕ¢éÍÁÙÅ", vbOKOnly + vbCritical, "¤Óàµ×͹"
    Exit Sub
End If
For X = 1 To systck
If SYSPRN = "DOT" Then
    SetDefaultPrinter ("Epson TM-U950 Partial cut")
    If X = 2 Then
        Printer.FontName = "control"
        Printer.Print "1"   '1=JOURNAL
    Else
        Printer.FontName = "control"
        Printer.Print "2"   '2=RECEIVE
        If comdraw = True Then
       
        DoEvents
        Open "LPT1" For Output Access Write As #1     'à´é§ÅÔ鹪ѡ
        Print #1, Chr$(27); Chr$(112); Chr$(0)
        Close #1
            DoEvents
        '    Printer.FontName = "control"
         '   Printer.Print "A"
           
   
        End If
    End If
   
amt = 0
       
'    End If
    F1 = 11
    F2 = 14
    L1 = 3400
Else
    SetDefaultPrinter ("BTPTML")
    F1 = 11
    F2 = 8
    L1 = 3500
End If
    YPS = 50
   
    With Printer
      '.PaperBin = Default
      '  .FontName = "cordiaUPC"
        If SYSPRN = "DOT" Then
           ' .FontName = "dilleniaDSE"
           .FontName = "ms sans serif"
        Else
            .FontName = "ms sans serif"
        End If
        .FontSize = 11
        .FontBold = True
        rh = .TextHeight("·´Êͺ") + 2
        .CurrentX = 60
        .CurrentY = YPS
        Printer.Print tid
       
        .FontBold = False
        .FontSize = F2
        rh = .TextHeight("·´Êͺ") + 2
        .CurrentX = 50
       
        If SYSPRN = "DOT" Then
            .FontName = "TAHOMA"
            .FontSize = 9
            .CurrentY = 400
            Printer.Print "POS#" + SYSPOS + " TAX#" + TAXID
            .FontName = "dilleniaDSE"
            .FontSize = F1
        Else
            .CurrentY = 300
            Printer.Print "POS# " + SYSPOS + "                   TAX# " + TAXID
        End If
        .CurrentX = 50
        .CurrentY = YPS + (rh * 2)
        If SYSPRN = "DOT" Then
            .FontName = "TAHOMA"
            .FontSize = 9
            Printer.Print "DATE : " + tdate + "  RCPT # " + txtinv.Text
            '.FontName = "dilleniaDSE"
            .FontName = "MS Sans Serif"
         '   .FontSize = 9
           
        Else
            Printer.Print "DATE : " + tdate + "                               RCPT # " + txtinv.Text
        End If
       
        .CurrentX = 50
        .CurrentY = YPS + (rh * 3)
        If SYSPRN = "DOT" Then
            Printer.Print "        RECEIPT/TAX INVOICE (ABB.)"
            .CurrentX = 0
            .CurrentY = YPS + (rh * 4)
            Printer.Print String(40, "_")
       
        Else
            Printer.Print "                      RECEIPT/TAX INVOICE (ABB.)"
           .CurrentX = 0
           .CurrentY = YPS + (rh * 4)
           Printer.Print String(44, "_")
       
        End If
       
       
        K = 5
        I = 1
  '      With MSF1
            For I = 1 To MSF1.Rows - 2
                .CurrentX = 0
                .CurrentY = YPS + (rh * K + 1)
                'Printer.Print IIf(Left(MSF1.TextMatrix(I, 2), 1) = "[", Mid(MSF1.TextMatrix(I, 2), 4, 12), Mid(MSF1.TextMatrix(I, 2), 1, 12))
                Printer.Print Left(MSF1.TextMatrix(I, 2), 12)
               
                If MSF1.TextMatrix(I, 7) > 1 Or MSF1.TextMatrix(I, 5) > 0 Then
                    .CurrentX = 1800 - .TextWidth(Format(MSF1.TextMatrix(I, 4), "##,##0.00"))
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print "@" & Format(MSF1.TextMatrix(I, 4), "##,##0.00")
                    If MSF1.TextMatrix(I, 5) > 0 Then CPdsc = True
                End If
                .CurrentX = 2300 - .TextWidth(Format(MSF1.TextMatrix(I, 7), "#,###"))
                .CurrentY = YPS + (rh * K + 1)
                Printer.Print Format(MSF1.TextMatrix(I, 7), "#,###")
                '+ " " + MSF1.TextMatrix(I, 9)
               
                .CurrentX = L1 - .TextWidth(Format(MSF1.TextMatrix(I, 8), "###,##0.00"))
                .CurrentY = YPS + (rh * K + 1)
                'Printer.Print Format(MSF1.TextMatrix(I, 7) * MSF1.TextMatrix(I, 4), "###,##0.00")
                'amt = amt + (MSF1.TextMatrix(I, 7) * MSF1.TextMatrix(I, 4))
                Printer.Print Format(MSF1.TextMatrix(I, 8), "###,##0.00")
                amt = amt + (MSF1.TextMatrix(I, 8))
                K = K + 1
            Next
           
       '  End With
       .FontBold = True
                .CurrentX = 500
                .CurrentY = YPS + (rh * K + 1)
                Printer.Print "TOTAL"
               
                .CurrentX = L1 - .TextWidth(Format(amt, "###,##0.00"))
                .CurrentY = YPS + (rh * K + 1)
                Printer.Print Format(amt, "###,##0.00")
                K = K + 1
                If MMDSC > 0 Then
                    .CurrentX = 500
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print "DISC " & MMDSC & "%"
                   
                    .CurrentX = L1 - .TextWidth(Format(xdsc, "###,##0.00"))
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print Format(xdsc, "###,##0.00")
                    K = K + 1
               
                    .CurrentX = 700
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print "NET CASH"
               
                    .CurrentX = L1 - .TextWidth(Format(amt, "###,##0.00"))
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print Format(lblcash.Caption, "###,##0.00")
                    K = K + 1
                End If
               
                If tmpcard = "CS" Then
                    .CurrentX = IIf(MMDSC > 0, 700, 500)
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print "CASH"
               
                    .CurrentX = L1 - .TextWidth(Format(txtpay.Text, "###,##0.00"))
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print Format(txtpay.Text, "###,##0.00")
                Else
                    .CurrentX = IIf(MMDSC > 0, 700, 500)
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print "CR " + cmbcard.Text
               
                    .CurrentX = L1 - .TextWidth(Format(lblcash.Caption, "###,##0.00"))
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print Format(lblcash.Caption, "###,##0.00")
                   
                End If
                K = K + 1
               
                'If optcash.Value = True Then
                If tmpcard = "CS" Then
                    .CurrentX = 500
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print "  CHANGE"
                   
                    '.FontBold = True
                    .CurrentX = L1 - .TextWidth(Format(lblton.Caption, "###,##0.00"))
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print Format(lblton.Caption, "###,##0.00")
                    .FontBold = False
                    K = K + 1
                End If
               
               
               
                If chkmem.Value = 1 Then
                    .CurrentX = 500
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print "MEM. " + txtno.Text
                    K = K + 1
                End If
               
        .CurrentX = 0
        .CurrentY = YPS + (rh * K + 1)
        Printer.Print String(40, "=")
       
                K = K + 1
               
                .CurrentX = 50
                .CurrentY = YPS + (rh * K + 1)
                Printer.Print sysmess
               
               
                K = K + 1
                .CurrentX = 50
                .CurrentY = YPS + (rh * K + 1)
                Printer.Print IIf(SYSPRN = "DOT", Time() & "               *VAT INCLUDED*", Time() & "            *VAT INCLUDED*")
               
                K = K + 1
                '.CurrentX = IIf(SYSPRN = "DOT", 2200, 3000)
                .CurrentX = 50
                .CurrentY = YPS + (rh * K + 1)
                Printer.Print "RCVD BY : " + sayname
       
        .EndDoc
       
   End With
  
   Next
  
   If CPdsc = True Then CP_PRN
  
   End If
  
End Sub
Private Sub CP_PRN()
Dim rh As Integer
Dim YPS As Integer
Dim I As Integer, X As Integer
Dim K As Integer, amt As Currency
Dim F1 As Integer, F2 As Integer, L1 As Integer
tmpcard = IIf(txtpay.Text > 0, "CS", "CR")
For X = 1 To 2
If SYSPRN = "DOT" Then
    SetDefaultPrinter ("Epson TM-U950 Partial cut")
    If X = 2 Then
        Printer.FontName = "control"
        Printer.Print "1"
    Else
        Printer.FontName = "control"
        Printer.Print "2"
        If comdraw = True Then
        'DoEvents
        'Open "LPT1" For Output Access Write As #1     'à´é§ÅÔ鹪ѡ
        'Print #1, Chr$(27); Chr$(112); Chr$(0)
        'Close #1
         '   DoEvents
        End If
    End If
   
amt = 0
       
    F1 = 11
    F2 = 14
    L1 = 3400
Else
    SetDefaultPrinter ("BTPTML")
    F1 = 11
    F2 = 8
    L1 = 3500
End If
    YPS = 50
   
    With Printer
        If SYSPRN = "DOT" Then
           ' .FontName = "dilleniaDSE"
           .FontName = "ms sans serif"
        Else
            .FontName = "ms sans serif"
        End If
        .FontSize = 14
        rh = .TextHeight("·´Êͺ") + 2
        .CurrentX = 60
        .CurrentY = YPS
        Printer.Print tid
       
        .FontBold = False
        .FontSize = F2
        rh = .TextHeight("·´Êͺ") + 2
        .CurrentX = 50
        .CurrentY = 400
        If SYSPRN = "DOT" Then
            .FontName = "TAHOMA"
            .FontSize = 9
            Printer.Print "DATE : " & Format(tdate, "dd/mm/yyyy")
            .FontName = "MS Sans Serif"
           
        Else
            Printer.Print "DATE : " + tdate
        End If
       
        .CurrentX = 50
        .CurrentY = YPS + (rh * 2)
           Printer.Print "INVOICE : " + txtinv.Text + "    ¨Ó¹Ç¹à§Ô¹ " & lblcash.Caption
       
        .CurrentX = 50
       
        .FontSize = 14
        rh = .TextHeight("·´Êͺ") + 2
        .CurrentY = YPS + (rh * 3)
        If SYSPRN = "DOT" Then
            Printer.Print "   ÃÒ¡ÒÃãËéÊèǹŴ¤Ù»Í§"
        Else
            Printer.Print "             ÃÒ¡ÒÃãËéÊèǹŴ¤Ù»Í§"
        End If
       
       
        .FontSize = 9
       
       
       
        .CurrentX = 0
        .CurrentY = YPS + (rh * 4)
        Printer.Print String(40, "_")
       
        K = 5
        I = 1
        For I = 1 To MSF1.Rows - 2
               If MSF1.TextMatrix(I, 5) > 0 Then
                    .CurrentX = 0
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print Left(MSF1.TextMatrix(I, 2), 20)
                    .CurrentX = 3000 - .TextWidth(Format(MSF1.TextMatrix(I, 5), "##,##0.00"))
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print Format(MSF1.TextMatrix(I, 5), "##,##0.00") & "  ºÒ·"
                   
                    amt = amt + (MSF1.TextMatrix(I, 5))
                     K = K + 1
                 End If
            Next
           
                .CurrentX = 500
                .CurrentY = YPS + (rh * K)
                Printer.Print "TOTAL"
               
                .CurrentX = 3000 - .TextWidth(Format(amt, "###,##0.00"))
                .CurrentY = YPS + (rh * K)
                Printer.Print Format(amt, "###,##0.00")
               
                K = K + 1
               
                If chkmem.Value = 1 Then
                    .CurrentX = 500
                    .CurrentY = YPS + (rh * K + 1)
                    Printer.Print "MEM. " + txtno.Text
                    K = K + 1
                End If
               
        .CurrentX = 0
        .CurrentY = YPS + (rh * K + 1)
        Printer.Print String(40, "=")
       
               
                K = K + 1
                .CurrentX = 50
                .CurrentY = YPS + (rh * K + 1)
                Printer.Print Time() & "     RCVD BY : " & sayname
               
       
        .EndDoc
       
   End With
  
   Next
End Sub
======================
 
ปัญหาคล้ายๆแบบนี้ที่ผ่านก็พบว่าเครื่องที่เราใช้พัฒนาเป็น ACCESS เวอร์ชั่นที่สูงกว่าเครื่องผู้ใช้งานน่ะครับ  หรือไม่ก็เอาโค้ดมาโพสให้สมาชิกช่วยกันหาวิธีแก้ไขก็ได้นะครับ
 
คิดว่าเจอปัญหาแล้วหละ คงเพราะวิธีการเปิด connection แบบ DAO กับ ADO ลองเปลี่ยนใช้ ADO ดู คาดว่าคงผ่าน ได้ผลแบบไหนแล้วจะ post บอกนะคะ  
 
อธิบายปัญหาเพิ่มเติม เริ่มจาก บันทึกข้อมูล แล้วมีข้อความ
 run-time error -2147467259(80004005)
Could not update;currently locked.
 
ดูไปดูมาได้ความว่าเป็น bug ของ ms
ให้แก้ด้วยวิธีเปลื่ยนการ connect  จาก ms ole provider for jet 4.0 เป็น
ms oledb provider for odbc drivers(MSDASQL) WITH the ms access dirver
 
แบบ MSDASQL
คือ cn.open "provider=MSDASQL.1;dbq=;driver={microsoft
access driver (*.mdb)}"
 
แบบ jet 4.0
คือ cn.open "provider=microsoft.jet.oledb.4.0;data source="

แปลก ผมเจอกับ access link to sql server 2005 ไปเซ็ท permission และเช็คทุก table index หายต้องเซ็ทใหม่




Read more ►

20100831

ใส่รูปในฐานข้อมูล

0 comments
ผมต้องการใส่รูปภาพในฐานข้อมูลครับ
ใครทราบวิธีบ้างครับ ประมาณว่าถ้าเปิดตาราง
ในมุมมองแผ่นข้อมูล มีชื่อนามสกุลและ โชว์รูปด้วยครับ
ขอบคุณสำหรับผู้ตอบด้วยครับ
----------------------------------------------------------------

ในฐานข้อมูลอะไรครับ
- MySQL , MS SQL, Access
เว็บนี้ เน้น Access เป็นหลัก ดังนั้นถามจี้ลงไปถึง Access ต่อเลยก็แล้วกัน
- ตัวที่จะเก็บรูปภาพนี้ เป็น ฐานข้อมูลปัจจุบัน หรือฐานข้อมูลตัวอื่นซึ่งแยกไว้     ที่ถามอย่างนี้เพราะว่า
โดยปกติการเก็บไฟล์รูปภาพไว้ในฐานข้อมูลไม่น่าจะเป็นวิธีที่ดี เพราะทำให้ฐานข้อมูลมีขนาดใหญ่อย่างรวดเร็ว (บวม) แม้โดยหลักแล้วจะสามารถเก็บได้ก็ตาม เพียงแค่กำหนดชนิดข้อมูลของฟิลด์ที่จะเก็บให้เป็น OLE OBJECT    และคอนโทรลที่จะนำข้อมุลนี้ไปแสดงบนฟอร์ม ก็ให้เป็นคอนโทรลชนิด BoundOLEobject

วิธีที่เหมาะ ที่คนอื่นๆ ส่วนใหญ่เค้าทำกันคือ
- เก็บรูปภาพไว้ในโฟลเดอร์ที่กำหนด
- ในตารางเก็บข้อมูล มีฟิลด์ที่เห็น text ไว้เก็บ path ของรูปภาพนั้น
- เมื่อจะแสดงข้อมูลบนฟอร์ม หรือรายงาน ให้ใช้คอนโทรล image
- ให้ source ของ image นั้น = ค่าในฟิลด์ (path ของไฟล์รูปภาพ) เช่น


นอกดาต้าเบส ผมมีโฟล์เดอร์เก็บรูปภาพวางไว้ข้าง mdb ตัวนี้เสมอ ไปไหนมาไหนด้วยกัน ชื่อโฟล์เดอร์ว่า GloveProcessImages ผมจะเก็บรูปภาพของสินค้าไว้ใน นั้น
ผมมีฟิลด์ที่เก็บ pathของไฟล์ในตาราง ชื่อว่า picture ชนิดข้อมูลเป็น text
ที่ฟอร์ม ผมจะมีคอนโทรลที่เกี่ยวข้องสองตัว
- textbox ผูกไว้กับฟิลด์ picture ชื่อ textbox ตัวนี้ คือ PicturePath
- Image ไม่ผูกกับฟิลด์ใดๆ ผมตั้งชื่อคอนโทรลตัวนี้ชื่อ Image1
ผมก็จะเขียนโค้ดประมาณนี้ ครับ

Private Sub Form_Current()
' ----- คำสั่งอื่นๆ ถ้ามี
' ----- คำสั่งอื่นๆ ถ้ามี
' ----- คำสั่งอื่นๆ ถ้ามี
ShowPic
' ----- คำสั่งอื่นๆ ถ้ามี
' ----- คำสั่งอื่นๆ ถ้ามี
End Sub

Private Sub ShowPic()
        If Me.PicturePath <> "" Then
            Me.Image1.Picture = CurrentProject.path & "\GloveProcessImages\" & Me.PicturePath
        Else
            Me.Image1.Picture = ""
        End If
End Sub


------------------------------------------------------------------

ขอบคุณ คุณ yeadram มากครับที่กรุณาผมบ่อยมากครับ
ฐานเป็น Access ครับ
ผมทราบว่าวิธีนี้ไม่ดีครับเลยไม่เคยทำ
แต่งานนี้ทำฐานเพื่อนในห้องแค่ 28 คนใส่รูปที่มีขนาดเล็กมาก
และไม่อยากให้มีไฟล์หลายไฟล์ เผื่อคนไม่เข้าใจเรื่องการ Link
จะทำให้มันยุ่งยากครับ ผมเริ่มจากสร้างฟิลด์ ที่เป็น OLEOPJECT แล้วครับ
และก็เลือกไปยังรูปที่ต้องการแล้วครับ แต่พอสร้าง Report โดยเลือกจากตาราง
ที่เก็บข้อมูลนี้ พอแสงในมุมมองรายงาน มันขึ้น เป็นตัวอักษรชื่อไฟล์นะครับ
แต่พอมาอ่านที่คุณ yeadram ชี้แนะก็เข้าใจว่าผมน่าจะผิดขั้นตอนตรงที่ไม่ได้ใช้คอนโทรลชนิด BoundOLEobject   ผมไปใช้จากโปรแกรมกำหนดให้
แต่เดี๋ยวผมลองดูถ้าใช้ได้จะกลับมาขอบคุณอีกที่ครับ ^J^

==============================================

ผมมีตัวอย่างไม่ทราบว่าใช้ได้หรือไม่ ไป download ที่นี่ครับ
http://www.up2box.com/download.php?file=070912c4e054d5a7ef11ec6af32a5c32135bff

=================================================

ขอบคุณ Arsitkpnplus ไม่ใช่แบบนี้ครับ แบบนี้ทำได้
อยากให้อยู่ในฐานเลยอะครับ นำไฟล์ .mdb ไปไฟล์เดียวเปิดได้เลย
=============================================

การตั้งค่าชนิดข้อมูล



การใส่รูปภาพเข้าตาราง
- คลิ๊กขวาที่ฟิลด์นั้น เลือกคำสั่ง แทรกวัตถุ



เมื่อมี dialog ขั้นมา คลิ๊กตามลำดับ
- เลือกจากไฟล์
- เรียกดู
- ทำการเลือกไฟล์ (ที่ผมเลือกเป็นตัวอย่างคือ 4.jpg)



- เมื่อทำการเลือกเสร็จแล้วกลับมาดูผลที่หน้าตาราง จะเห็นว่า
มันไม่ได้มีตัวหนังสือที่บอกว่าเป็น 4.jpg เลยแต่ไม่ต้องตกใจ นี่คือวิธีที่ถูกแล้ว



เวลาออกแบบรายงาน ดูตามจุดที่วงนะครับ
- ใช้คอนโทรล เฟรมวัตถุที่ผูก (BoundOLEobject)
- ขนาดของคอนโทรล กว้างใหญ่ตามใจชอบ
- โหมดขนาดเลือกได้ตามใจชอบ สำหรับผม ไม่ stretch ก็ zoom ครับ
- ชื่อคอนโทรล ตั้งใหม่หรือไม่ ตามใจชอบ
- แหล่งข้อมูล ขอให้เป็นชื่อฟิลด์ที่เป็นชนิด OLE OBJECT ก็แล้วกัน (ในที่นี้ ฟิลด์นี้ชื่อ gt)



* * อย่าลืมทำการ compact database * *
ผมทำอย่างนี้แหละครับ ได้ตามที่ต้องการเลย
ไม่ทราบว่าคุณ Un_Kop ทำอย่างนี้หรือเปล่า หรือว่าไม่ตรงกันตรงไหนบ้างครับ


===========================================================

ไม่ทราบลองทำ BLOB ใน Menu แรกหรือยังครับ มัน include รูปไว้ใน Database เลย

====================================================

คุณ yeadram ครับผมทำเหมือนทุกขั้นตอนเลยครับ
ต่างตรงที่วงกลมที่ 7 ตรงตารางครับผมไม่มีเมนู Microsoft foto E..... ให้เลือกครับ
ผมใช้ Access 2003 ครับเลยไม่มีหรือว่าอะไรไม่ทราบ
นอกนั้นเหมือนหมด และขั้นตอนสุดท้ายคือผม เปิดรายงานในมุมมองรายงาน
มันขึ้น 4.jpg (สมมุติตามตัวอย่าง) ผมจะโพสรูปให้ดู พอดีทำไม่เป็นขอโทษทีครับ

+++++++++++++++++++++++++++++++++++++++++++++++++++

1 Microsoft photo editor เป็น โปรแกรมเสริม ที่ทางไมโครซอฟท์แถมฟรี มาพร้อมกับ ชุด office แทบทุกเวอร์ชั่น ตอนติดตั้ง ต้องเลือกโหมดการติดตั้งด้วยการเลือกออปชั่นด้วยตัวเอง
มันจะอยู่ในกลุ่มประมาณ office tools ลองหาดูครับ ณ ตอนนี้ ถ้าคุณ Un_Kop มีแผ่น ออฟฟิศ แล้วอยากจะเพิ่มตรงนี้ ก็เข้าไปเพิ่มได้ครับ (น่าจะเป็นแล้วล่ะ)

2 OLE OBJECT เป็นเรื่องที่ผมไม่กระจ่างเอาซะเลย แต่ผมก็ลองผิดลองถูกมาจนได้ ถ้าให้ทำก็ลุยๆ ไปครับ แต่ถ้าให้อธิบายจริงๆ ว่ามันเป็นมายังไง ทำงานยังไง สัมพันธ์อะไร มีข้อจำกัดอะไรบ้าง คงไม่ไหวครับ   ถ้าให้เดาปัญหาของคุณ Un_Kop ก็คือ สิ่งที่คุณเก็บใน ตาราง ขณะนี้ access ไม่ถือว่าเป็น OLE หรืออาจเป็น แต่ไม่สามารถหาไลบรารี่ มาถอดรหัส OLE ตัวนี้ได้

3 จำเป็นหรือไม่ ต้องเป็น object ที่อ่านด้วย Microsoft Photo editor ใช้ object อย่างอื่น เช่น pdf หรือ bitmap ที่สามารถอ่านออกด้วย Microsoft photo and fax viewer หรือ ms paint ทดแทนได้หรือเปล่า อันนี้ผมก็ไม่ค่อยกระจ่าง น่าจะทดสอบข้อสมมติฐานนี้โดยการไม่ แทรก jpg แต่ลอง แทรก pdf แล้วดูที่รายงาน ว่า มันสามารถแสดง pdf ได้หรือไม่

4 การอัพไฟล์เข้าเว็บบอร์ดแห่งนี้ คงต้องรอสักระยะ พอดียังไม่ได้เขียนสคริปต์เพิ่มเติมครับ ที่ผมอัพได้เพราะผมใช้ผ่าน โปรแกรมอัพเว็บของผม แล้วลิงค์เอาครับ ตอนนี้คงต้องใช้วิธีอื่นๆ ไปก่อนเช่น อัพไว้ที่อื่น แล้วใช้ลิงค์มาครับ เวลาเขียนในบอร์ดก็แทรก แท็ก img เอาครับ ตามเมนูมีครับ

สุดท้ายคือ ผมไปต่อไม่ได้แล้วครับ อิอิ คงต้องให้ผู้รู้ท่านอื่นๆ ช่วยต่อแล้วครับ

=============================================+++++
Read more ►

20100621

ตอน 4.2 :: form เปิดตาราง #2

0 comments
> ข้อควรทราบ <
ฟอร์มถ้าไม่มีปุ่มควบ คุมก็ทำงานไม่สะดวก ในตอนนี้จะแนะนำ การสร้างปุ่มโดยใช้ wizard เพื่อให้การทำงานกับฟอร์มสะดวกขึ้น
ขั้นตอนที่ 1 :
เมื่อ copy form01 เป็น form02 แล้ว ให้ design form02 ขึ้นมา แล้วเลือก toolbox ด้านข้าง ให้ option ของ wizard เปิดดังวงกลมสีแดง แล้วเลือก command button ดังวงกลมสีเหลือง จะเปิดตารางให้เลือกปุ่ม ตามตัวอย่างผมเลือกปุ่ม goto first record จะให้ผลดังภาพถัดไป
ตัวอย่างนี้แสดงการเลือกปุ่ม ใน mode ที่ wizard ถูกเปิด

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

ขั้นตอนที่ 3 :
ให้ double click บนปุ่มที่ถูกวงสีแดงไว้ จะขึ้นคุณสมบัติมาให้เลือก ผมเลือก ตัวเลือกระเบียนเป็นไม่ และปุ่มนำทางเป็นไม่ จะทำให้ได้ผลลัพธ์ดังด้านล่าง
ตัวอย่างนี้แสดงคุณสมบัติของฟอร์ม

ขั้นตอนที่ 4 :
แสดงการสร้างปุ่ม first,previous,next,last,new และ close ขึ้นใช้งาน และให้กำหนดคุณสมบัติ แถบเลื่อนเป็น ไม่ทั้งสองด้าน
ตัวอย่างนี้แสดงการสร้างปุ่มทั้ง 6 ใช้งาน
Read more ►

ตอน 4.1 :: form เปิดตาราง #1

0 comments
> ข้อควรทราบ <
ตอนนี้ง่ายมาก เพราะสร้างฟอร์มขึ้นมา โดยกำหนดตาราง ชื่อ catalog มาใช้ในฟอร์ม แล้วก็เลือก รายชื่อเขตข้อมูล จะแสดงรายชื่อเขตข้อมูลทั้งหมด ของตารางนั้น แล้ว click พร้อมกดปุ่ม Ctrl ทุก field จากนั้นใช้ mouse ลาก field มาไว้ใน ฟอร์ม เป็นอันเรียบร้อย
ฟอร์มนี้จะมีหน้าที่แสดงข้อมูลจากตาราง สามารถเพิ่มข้อมูล ลบ หรือแก้ไขข้อมูลได้ทันที
ขั้นตอนที่ 1 :
เมื่ออยู่ใน database windows แล้วเลือก form จากนั้นเลือก สร้างใหม่ จะสามารถขึ้นหน้าต่างหน้านี้ขึ้นมา ให้เลือกว่าจะสร้าง form วิธีไหน ปกติผมชอบใช้ design view เพราะสามารถคุมได้ทุกอย่าง เพียงแต่ต้องศึกษาการควบคุมให้เข้าใจเท่านั้น
ตัวอย่างนี้ตอนสร้างใหม่พร้อมเลือกตาราง catelog

ขั้นตอนที่ 2 :
เมื่อเลือกปุ่มที่มีสีแดงวงไว้ จะเกิดตารางที่ชื่อว่า field list ให้นำ field ทั้งหมด มาใส่ใน form จะได้ผลดังภาพ
ตัวอย่างนี้แสดงการนำ field มาใส่ใน form

ขั้นตอนที่ 3 :
ถ้าต้องการทำงานเลยให้เลือกกดปุ่ม ที่วงสีน้ำเงินดับภาพด้านบน จะได้ผมดังภาพด้านล่าง ซึ่งทำงานกับตาราง catelog ได้ทันที แต่ถ้าต้องการกลับไปแก้ไขฟอร์ม ให้กดปุ่มที่มีวงกลมสีเหลืองล้อมรอบ
ตัวอย่างนี้แสดงฟอร์มที่ทำงานกับตาราง catalog
Read more ►

SQL + Northwind

0 comments
ตัวอย่าง SQL ใน Northwind.mdb
    
    
    
  1. แสดงเลขที่ใบสั่งซื้อ เรียงตามรหัสพนักงาน
  2. select orderid, employeeid from orders order by employeeid;
  3. แสดงเลขที่ใบสั่งซื้อ จับกลุ่มตามรหัสพนักงาน
  4. select orders.employeeid, count(orders.orderid) as c from orders group by orders.employeeid order by count(orders.orderid) desc;
  5. เลือกตามรหัสลูกค้า
  6. SELECT * FROM customers WHERE customerid = 'ANTON';
  7. ใครซื้อใบไหนบ้าง
  8. select orders.orderid, employees.lastname from orders, employees where orders.employeeid = employees.employeeid order by employees.lastname;
  9. เชื่อมตารางด้วย where : ลูกค้าแต่ละคนซื้อกี่ใบ
  10. select employees.employeeid, count(orders.orderid) as xx, first(employees.lastname) as x from orders, employees where orders.employeeid = emplyoees.employeeid group by employees.employeeid;
  11. เชื่อมตารางด้วย join : ลูกค้าแต่ละคนซื้อกี่ใบ
  12. select orders.employeeid, first(orders.orderid) as x, count(orders.orderid) as c from (orders inner join employees on orders.employeeid = employees.employeeid) group by orders.employeeid;
  13. ใบสั่งซื้อแต่ละใบ มียอดเท่าใด
  14. select [order details].orderid, sum((unitprice * quantity) - (unitprice * quantity * discount)) from [order details] group by [order details].orderid;
SQL Function in Microsoft Access
sum, avg, min, max, count, stdev, first, last
+ ถ้าทุกค่าต่างกัน ส่วนเบี่ยงเบน (stdev) จะเป็น 100%
+ ถ้าทุกค่าเหมือนกัน ส่วนเบี่ยงเบน (stdev) จะเป็น 0%
แนะนำเว็บ (Web Guides)
+ http://www.thaiall.com/mysql
+ C:\Program Files\Microsoft Office97\Office\Samples\ northwind.mdb (532 KB)
+ http://www.thaiall.com/project/projectdbnwind.htm
Read more ►

ตอน 1.2 :: 2 Query อย่างง่าย

0 comments
> ข้อควรทราบ <
Query คือความสามารถที่ยอดเยี่ยมในการเรียกข้อมูล ในภาษาอื่น ๆ ต้องใช้ SQL เขียนเพื่อเรียกข้อมูล แต่ใน ACCESS สามารถสร้าง Query แล้วนำไปใช้ได้ทันที และ Query ยังมีความสามารถในการปรับปรุงข้อมูลเช่น เพิ่ม ลบ แก้ไขข้อมูลได้อย่างง่าย ไม่ต้องเขียน Code ยาว ๆ เพื่อปรับปรุงข้อมูล สำหรับรายละเอียดเรื่องปรับปรุงข้อมูลจะกล่าว โดยละเอียดในตอนต่อไป


ขั้นตอนที่ 1 : เลือกสร้างใหม่ และเลือก Design view

ขั้นตอนที่ 2 : เลือกตารางมา 2 ตาราง ถ้า field ชื่อเดียวกัน และเป็น primary key จะทำการ link กัน อัตโนมัติ แต่สามารถยกเลิก หรือลากไปสัมพันธ์กัน หรือจะ Double click ที่เส้น เพื่อกำหนดความสัมพันธุ์ก็ได้ แล้ว Double ใน Field ของตาราง เพื่อกำหนด Field ที่ต้องการนำมาแสดงผล

ขั้นตอนที่ 3 : ตัวอย่างผลลัพธ์จากการ Click ที่บนซ้ายสุด

ขั้นตอนที่ 4 : ดูว่า SQL เขียนอย่างไร เลือกจากมุมบนซ้ายสุด ที่เขียนว่า SQL (อยู่ที่ปุ่มเดียวกับ ปุ่ม view หรือ design นั่นเอง)
Read more ►

ตอน 1.3 :: สร้างเพิ่มอีก 6 ตาราง

0 comments
> ข้อควรทราบ <
ในตอนที่ 1.1 เรารู้วิธีสร้างตาราง ในตอนนี้ผมจะให้สร้างอีก 6 ตารางตามโครงสร้างด้านล่าง ซึ่งความตั้งใจจริง คือการฝึกให้ท่านชินกับการสร้างตาราง
ความชำนาญเกิดจากการปฏิบัติบ่อย ๆ เท่านั้นครับ สร้างตาราง ถ้าจะให้ชินก็ต้องสร้างกันบ่อย ๆ ซึ่ง 6 ตารางนี้จะนำไปใช้ในตอนต่อ ๆ ไป ในโอกาสต่อไปครับ เพราะทั้ง 6 ตารางด้านล่างจะมีความสัมพันธุ์กัน แต่ tmp จะเป็นตารางต่างหากที่ใช้ทดสอบ เพราะ tmp ย่อมาจาก temp ซึ่งแปลว่าชั่วคราวไงครับ


ขั้นตอนที่ 1 : สร้างตาราง catalog

ขั้นตอนที่ 2 : สร้างตาราง customer

ขั้นตอนที่ 3 : สร้างตาราง debt

ขั้นตอนที่ 4 : สร้างตาราง product

ขั้นตอนที่ 5 : สร้างตาราง sale

ขั้นตอนที่ 6 : สร้างตาราง saled

ขั้นตอนที่ 7 : สร้างตาราง tmp
ข้อมูลนี้นำไปใช้ใน ตอน 3.1 ถึง 3.4 เรื่องการ เขียน Module แล้วสั่งให้ SQL ทำงานกับตาราง tmp เช่น เพิ่ม ลบ หรือแก้ไขเป็นต้น
Read more ►

ตอน 1.1 :: 2 table อย่างง่าย

0 comments
บทนี้เป็นบทแรกในการเรียน Microsoft access ซึ่งผู้เรียนควรมีพื้นฐานของระบบฐานข้อมูลมาก่อน (แต่ถ้าไม่มีก็ไม่ เป็นไร สั่งสมกันได้) โดยบทเรียนนี้จะแสดงวิธีการสร้างตารางขึ้นมา 2 ตารางไว้เก็บข้อมูล เมื่อสร้างเสร็จแล้วก็สามารถเพิ่มข้อมูลในตารางได้ ซึ่งการเพิ่มข้อมูลก็คล้ายกับ excel แต่จะมี function ต่าง ๆ น้อยกว่า excel เล็กน้อย
บทนี้มี 7 ขั้นตอน เมื่อทำทั้ง 7 ขั้นตอนแล้ว จะได้ตารางขึ้นมา 2 ตาราง ที่มีความสัมพันธ์กัน เพื่อนำไปใช้ในบทอื่นต่อไป ผู้เรียน จึงควรใส่ข้อมูลในตารางทั้ง 2 อย่างสมเหตุสมผล ให้เรียบร้อย


ขั้นตอนที่ 1 : การสร้างตาราง

ขั้นตอนที่ 2 : การสร้างตาราง

ขั้นตอนที่ 3 : การสร้างตาราง

ขั้นตอนที่ 4 : การสร้างตาราง

ขั้นตอนที่ 5 : การสร้างตาราง

ขั้นตอนที่ 6 : การสร้างตาราง

ขั้นตอนที่ 7 : การสร้างตาราง
Read more ►

ความรู้เบื้องต้น ไมโครซอฟท์แอคเซส (Microsoft Access)

0 comments
ความรู้ เบื้องต้น
ไม่มีใคร .. ศึกษาอะไร ได้ทุกเรื่อง แล้วสามารถจดจำ .. ตลอดไป
ผมยังจำไม่ได้เลยว่า มื้อเที่ยงเมื่อวาน เคี้ยวข้าวไปกี่คำ .. แม้ทำด้วยตนเองมาแล้ว
แค่นี้ผมยังจำไม่ได้เลย ..
ไมโครซอฟท์แอคเซส (Microsoft Access) คือ โปรแกรมเพื่อพัฒนาระบบฐานข้อมูล มีตารางเก็บข้อมูลและสร้างแบบสอบถามได้ง่าย มีวัตถุคอนโทลให้เรียกใช้ในรายงานและฟอร์ม สร้างมาโครและโมดูลด้วยภาษาเบสิก เพื่อประมวลผลตามหลักภาษาโครงสร้าง สามารถใช้โปรแกรมนี้เป็นเพียงระบบฐานข้อมูลให้โปรแกรมจากภายนอกเรียกใช้ก็ ได้
ไมโครซอฟท์แอคเซส (Microsoft Access) ต่างกับ วิชวลเบสิก (Visual Basic) หรือ
วิชวลเบสิกดอทเน็ต (Visual Basic .Net)
เพราะ วิชวลเบสิกไม่มีส่วนเก็บข้อมูลในตนเอง แต่สามารถพัฒนาโปรแกรมได้หลากหลาย เช่น พัฒนาโปรแกรมควบคุมอุปกรณ์ โปรแกรมประยุกต์ทางวิทยาศาสตร์ เกมส์ หรือเชื่อมต่อกับระบบฐานข้อมูลภายนอก เป็นภาษาที่เหมาะกับการพัฒนาโปรแกรมประยุกต์ (Application) ส่วนไมโครซอฟท์แอคเซสเหมาะสำหรับนักพัฒนาระบบฐานข้อมูลที่ไม่ต้องการโปรแกรม ที่ซับซ้อน ความสามารถของโปรแกรมที่สำคัญคือสร้างตาราง แบบสอบถาม ฟอร์ม หรือรายงานในแฟ้มเดียวกันได้ ด้วยคุณสมบัติพื้นฐานและวิซซาร์ดจึงอำนวยให้พัฒนาโปรแกรมให้แล้วเสร็จได้ใน เวลาอันสั้น มีเครื่องมือที่อำนวยความสะดวกในการพัฒนาระบบฐานข้อมูลอย่างครบถ้วน
แนะนำเว็บ (Web Guides)
+ Webboard เกี่ยวกับ Microsoft Access โดยกลุ่มสมาชิกลูกศิษย์ อ.สุภาพ ไชยา
+ Microsoft Access on MSDN
+ Mvps.org (Sample Code)
แผนการสอน : แบบแบ่งเป็นตอน
ตอนที่ 1 : หัดสร้างตาราง และใช้งาน
ตอน 1.1 : 2 table อย่างง่าย : เพราะจุดเริ่มต้นของ Access คือการเก็บข้อมูล
ตอน 1.2 : 2 query อย่างง่าย : เรื่องนี้จะช่วยให้การเรียกข้อมูลง่ายดังใจนึก
ตอน 1.3 : สร้าง เพิ่มอีก 6 table : เพื่อฝึกฝน และย้ำความเป็นระบบฐานข้อมูลให้ชัดเจนขึ้น
ตอนที่ 2 : เริ่มโปรแกรมเบื้องต้น
ตอน 2.1 : เขียน Module #1 : ใช้ประสบการณ์เดิมศึกษาการคำนวณตามทฤษฎีของการโปรแกรมโครงสร้าง
ตอน 2.2 : เขียน Module #2 : ศึกษาการใช้ ฟังก์ชันพิเศษอื่น ร่วมในการเขียนโปรแกรม
ตอน 2.3 : เขียน Module #3 : ศึกษาการทำซ้ำซ้อนกัน .. อาจยากที่สุด แต่บริษัทต่าง ๆ ชอบใช้วัดคนเข้าทำงาน
ตอน 2.4 : เขียน Module #4 : ศึกษาวิธีการเลือกข้อมูลมาใช้ด้วย if หรือ select
ตอน 2.5 : เขียน Module #9 : หาอายุ และเปลี่ยนปีไทย เป็นฝรั่ง (ศึกษาจากกรณีของชุติกร)
ตอนที่ 3 : เรียนรู้ sql เพื่อจะได้ประยุกต์ใช้ต่อไป
:: หัวข้อนี้อาจลึกไปสำหรับหลาย ๆ คน ข้ามไปก็ได้นะครับ .. เพราะอาจไม่ต้องใช้ก็ได้
ตอน 3.1 : เขียน Module #5 : ศึกษาการอ่านข้อมูลจากตารางด้วย select
ตอน 3.2 : เขียน Module #6 : ศึกษาการเพิ่มข้อมูลด้วย insert
ตอน 3.3 : เขียน Module #7 : ศึกษาการลบข้อมูลด้วย delete
ตอน 3.4 : เขียน Module #8 : ศึกษาการแก้ไขข้อมูลด้วย update
ตอนที่ 4 : เรียนรู้ Form บันทึกข้อมูล และปุ่ม (อย่างง่ายตารางเดียว)
ตอน 4.1 : form เปิดตาราง #1 : นำตาราง table:catalog มาเปิดในฟอร์ม
ตอน 4.2 : form เปิดตาราง #2 : สร้างปุ่มประกอบฟอร์มข้างต้น เช่น first,previous,next,last,new เป็นต้น
ตอน 4.3 : form เปิดตาราง #3 : สร้างปุ่มเต็มจอ พร้อมตัวอย่างการปรับแต่งอย่างง่าย ด้วยสี่เหลี่ยมมีเงา
ตอนที่ 5 : ใช้ form ปรับปรุงข้อมูล (หัวข้อนี้ ท่านอาจประยุกต์ได้หลากหลาย)
ตอน 5.1 : เพิ่มข้อมูล ผ่าน form : ใช้วิธีเก็บข้อมูลใน text box แล้วถามยืนยัน ว่าแน่นอนหรือไม่
ตอน 5.2 : เพิ่มโดยใช้ temp file : เพิ่มข้อมูล เข้า catalogtmp เมื่อยืนยัน จึงจะส่งไปใน catalog
    ตอนที่ 6 : กรณีศึกษาระบบฐานข้อมูล พร้อม MDB file
  1. แฟ้มสำหรับนำไปทดสอบ tchmdb97.zip 72 KB
  2. แฟ้มสำหรับนำไปฝึก จัดตารางสอบ timetabling.zip 11 KB
    ประกอบด้วย ข้อมูลการลงทะเบียน ข้อมูลวิชา และข้อจำกัด
  3. กรณีศึกษา ระบบรับ-ส่ง สินค้า
    : พัฒนาขึ้นอย่างง่าย ๆ ตามโจทย์ที่คุณสุวิทย์ ได้มาจากการเรียนปริญญาโทที่พะเยา
  4. กรณีศึกษา ระบบบันทึกเวลาเข้า ออกงาน
    : ไม่ใช้ปุ่ม แต่ใช้ร่วมกับเครื่องอ่านบัตร เลือกบันทึกการเข้า ออกงาน อัตโนมัติ อย่างง่ายมาก ๆ เพราะมี form เดียวเท่านั้น (ต่อมาเพิ่มรายงานเข้าไป 2 รายงานที่ดึงข้อมูลจาก query เพื่อทำรายงาน คนมา และคนที่ไม่มา)
  5. กรณีศึกษา บันทึกเวลา ร่วมกิจกรรม
    : ฟอร์มเดียว ตารางเดียว จะได้ให้นักศึกษาใช้บัตร Barcode เดินเข้ามารูด เพื่อบันทึกการร่วมกิจกรรม เจ้าหน้าที่ก็จะ copy แฟ้มไปใช้ในโปรแกรมอื่น ๆ ต่อไป
  6. กรณีศึกษา คำนวณอายุ และปีไทย
    : แสดงการทำงานร่วมกับ form และ query โดยใช้ text box เป็นตัวเลือก criteria และเรียกฟังก์ชันโดยตรงจาก module ที่สร้างขึ้นในส่วนกลาง
  7. กรณีศึกษา yn351003.zip 68 KB
    : ระบบ e-Portfolio เพื่อบันทึกข้อมูลการทำงานของบุคลากรแต่ละคน แต่ยังพัฒนาไม่เสร็จ เพราะรอความแน่นอนของผู้บริหาร และคณะกรรมการวิชาการ
  8. กรณีศึกษา regists.zip
    : ระบบบันทึกข้อมูลนักเรียนอย่างง่าย มีการใช้ form ที่ปิดการแสดงผล หรือ logo ของ MS Access ในระดับหนึ่ง แสดงการเรียนรายงาน เลือกข้อมูล Sub form และการใช้ Query ให้ดูเป็นระบบที่สวยงาม ผมทำไว้เตรียมสอนให้นักศึกษาทำ project ลักษณะนี้ได้อย่างง่าย ๆ เหมาะกับจอกว้าง 8 นิ้ว สูงประมาณ 6.3 นิ้ว
  9. กรณีศึกษา db4order.zip 13 KB
    : เก็บตารางเกี่ยวกับการสั่งซื้ออย่างง่าย สอดคล้องกับใน /mysql และ /learn/sader.htm
    orderm : คำว่า m ย่อมาจาก main หมายถึง ข้อมูลการสั่งซื้อของแต่ละใบ ถ้ามี 3 ใบ ก็จะมี 3 ระเบียนในตารางนี้
    orderd : คำว่า d ย่อมาจาก detail หมายถึง ข้อมูลรายละเอียดการสั่งซื้อ เช่นใบสั่ง 3 ใบ อาจสั่งสินค้า 6 รายการ แฟ้มนี้อาจมี 6 ระเบียน
    pro : คำว่า pro ย่อมาจาก product หมายถึง ข้อมูลจำนวนสินค้า อาจมีสินค้าเป็น 1000 รายการ แฟ้มนี้ก็จะเก็บ 1000 ระเบียน
    cust : คำว่า cust ย่อมาจาก customer หมายถึง ข้อมูลจำนวนลูกค้า อาจมีลูกค้าเป็น 1000 รายการ แฟ้มนี้ก็จะเก็บ 1000 ระเบียน
  10. 2548-05-13 กรณีศึกษา teachgov1.mdb 136 KB (ประกอบการอบรมข้าราชการ)
    : พฤษภาคม 48 นำบทเรียนนี้มาปัดฝุ่น เพิ่มเรื่องระบบฐานข้อมูลเกี่ยวกับ การทำ denormalization สำหรับนำไปใช้ทำรายงานได้ทันที และใช้เวลาในการอบรมมากขึ้น (18 ชั่วโมง 3 วันติดกัน) จึงเตรียมเนื้อหาแยกเป็น 8 หน่วย ให้ชัดเจนขึ้น
    : ตุลาคม 47 ใช้เวลา 10 ชั่วโมง วันละ 2 ชั่วโมง เน้นให้สามารถออกแบบตาราง ให้กับหน่วยงานของตนได้ แม้จะทราบว่าการเขียน Access ได้จะต้องเข้าใจเรื่อง ระบบฐานข้อมูล การเขียนโปรแกรมเบื้องต้น MIS และ MS Access แต่ข้อจำกัดเรื่องเวลา จึงเตรียมไว้เท่านี้ก่อน
    gov : govid, govname และ salary : yr, govid, salary
    ตัวอย่างใช้งานทั้ง table, query, form, report, macro และ module
    โดยเน้นการสั่งงานหลักจาก form ชื่อ main
    [ แผน การสอน ] สำหรับข้าราชการที่มีพื้นฐาน และสนใจ
    Function ใน module สำหรับ เปลี่ยนตัวเลข เป็นอักษร
  11. กรณีศึกษา พิมพ์ผลประเมินการสอน + พิมพ์ผลจิตพิสัยกลาง ( eval200401m.zip )
    ระบบประเมินมีอยู่แล้ว โปรแกรมนี้เพีบงแต่นำข้อมูลมาพิมพ์รายงานให้กับผู้สอนแต่ละคน
    ระบบการเก็บคะแนน กิจกรรมหลัก และ กิจกกรรมรอง มีแล้ว โปรแกรมนี้เพียงทำรายงาน

  12. สร้างแฟ้ม .mde ใช้แทน .mdb (เสมือน .exe ที่รู้จักกัน)
    นักพัฒนาหลายคนอยากได้ .exe แต่ microsoft Access ไม่มีให้ ทางออกที่มีคือ หลังสร้าง .mdb ก็สร้าง .mde ขึ้นมา แล้วส่งให้กับผู้ใช้นำไปใช้ ส่วน programmer ก็เก็บ .mdb กั๊กไว้พัฒนาโปรแกรมต่อไป
    ลูกค้าที่ได้แฟ้ม .mde ไป จะไม่สามารถแก้ไข form, report และ module ทำได้เพียงการเปิดมาทำงานเท่านั้น การ import เข้าใน .mdb ตัวอื่นก็ไม่ได้ เพราะ .mde จะป้องกันการคัดลอกไว้เรียบร้อย
  13. 2549-04-18 โปรแกรมแสดงผลการเลือกตั้งใน LAN election.zip 40 KB
  14. 2549-09-03 กรณีศึกษาระบบโรงเรียน IP System schoolipv1.zip 147 KB (MDB in 97)
  15. 2550-04-12 โปรแกรมสำหรับ ดูรหัสผ่านที่เข้าใช้งานโปรแกรม .mdb (ดูด้วย Password Retrieval)
  16. 2550-10-24 โปรแกรมแสดง การทำงานของลิฟ (Lift System) ให้นักศึกษานำไปปรับปรุง หรือเป็นต้นคิดสำหรับภาษาอื่น เพราะโปรแกรมมีฟอร์มเดียว ไม่มีฐานข้อมูลใดเลย 90 KB
เตรียมสอน Microsoft Access 2003
1. 2552-07-21 a20031.mdb คือ กรณีศึกษาการจัดการตารางเดียว ใน Access 2003
- empl (eid number, ename text, edep text, esex y/n, ebirth date, esalary number)
- q1 รายชื่อบุคลากรเรียงตามชื่อจากน้อยไปมาก
- q2 SELECT empl.* FROM empl WHERE (((empl.esex)=Yes));
- q3 รวมเงินเดือนบุคลากรแต่ละแผนก
- q4 INSERT INTO empl ( eid ) SELECT DMax("eid","empl")+1 AS E1;
- q5 DELETE Len([ename]) AS Expr1 FROM empl WHERE (((Len([ename])) Is Null));
- q6 เพิ่มเงินเดือนให้พนักงาน 101 เพิ่มขึ้นอีก 1 บาท
- q7 ตารางไขว้ว่า แต่ละแผนก มีแต่ละเพศกี่คน ให้แผนเป็น row และเพศเป็น column
- Form1 วาดเส้น 2 เส้นตัดขวางกันอยู่
- Form2 ใช้ Wizard เรียก q1 มาแสดงผล แบบ Columnar
- Report1 ใช้ Wizard เรียก q7 มาแสดงผล แบบ Columnar
- Report2 ใช้ empl วางใน field ใน detail และเปลี่ยนสีพื้นให้กับ header และ footer
- Report3 ใช้ empl แสดงรายชื่อพนักงาน แยกรายชื่อพนักงานแผนกละหน้า
- Report4 ใช้ Report3 แต่เพิ่ม textbox ใน footer ของ group ใช้ =Sum([esalary]) +ใช้ Running Sum
- Macro ชื่อ autoexec จะเปิดทันทีเมื่อเปิดแฟ้มนี้ แต่ถ้ากดปุ่ม shift ค้างไว้ก็จะไม่เข้า Macro
- ถ้าใช้ pdfcreator ก็จะส่งรายงานไปเป็น PDF File ได้
- Menu bar, Tools, Options, Edit, Confirm (ยกเลิก Confirm : Rec. Chg, Doc Del, Action Queries)
- Security Warning จะไม่ให้เตือนอีก เข้า Menu Bar, Tools, Macro, Security = Low, Yes
2. 2552-07-22 a20032.mdb คือ กรณีศึกษาประมวลผลด้วย SQL ใน Access 2003
- empl (eid number, ename text, edep text, esex y/n, ebirth date, esalary number)
- dep (edep text, eid number, tel text)
- sex (esex y/n, sexdesc text)
- pro (proid number, proname text, prodetail memo, edep text, budget number, finish y/n)
- proteam (proid number, eid number, position text)

- q1 เบอร์ติดต่อภายในของพนักงานแต่ละคน คืออะไร SELECT empl.eid, dep.tel FROM empl INNER JOIN dep ON empl.edep = dep.edep; - q2 แต่ละโครงการมีบุคลากรท่านใด ร่วมทีมบ้าง SELECT pro.proid, pro.proname, empl.eid, empl.ename FROM (pro INNER JOIN proteam ON pro.proid = proteam.proid) INNER JOIN empl ON proteam.eid = empl.eid ORDER BY pro.proname, empl.eid; - q3 แต่ละโครงการมีชายกี่คน หญิงกี่คน รวมทั้ง 2 เพศกี่คน SELECT pro.proid, pro.proname, Count(IIf([esex]=True,[esex])) AS m, Count(IIf([esex]=False,[esex])) AS f, Count(empl.eid) AS CountOfeid FROM (pro INNER JOIN proteam ON pro.proid = proteam.proid) INNER JOIN empl ON proteam.eid = empl.eid GROUP BY pro.proid, pro.proname; - form1 สร้างมีปุ่มเพิ่มข้อมูลด้วย sql หลายแบบ
dim s as string
s1 = "INSERT INTO empl ( eid ) SELECT DMax('eid','empl')+1 AS E1;"
s2 = "INSERT INTO empl ( eid ) SELECT " & Text0 & " AS E1;"
s3 = "INSERT INTO empl ( eid,ename ) values ( " & Text0 & ",'" & Text2 & "')"
If (Text0 > 100 And Len(Text0) > 2) Then ... end if
docmd.runsql s - form2 เพิ่มเสน่ห์ให้กับฟอร์มด้วยฟังก์ชัน
Text0 = DMax("eid", "empl") + 1
s1 = "DELETE eid FROM empl WHERE eid = " & Text0
s2 = "UPDATE empl SET ename ='" & Text2 & "' WHERE eid =" & Text0 - report1 คือรายงานที่รับค่าจากฟอร์ม โดยเลือกจาก record source
DoCmd.OpenReport "report1", acViewPreview
SELECT empl.* FROM empl WHERE (((empl.eid)=forms!form2!text0)); - ปุ่มอ่านข้อมูลมาแสดงใน msgbox Option Compare Database Option Explicit Dim db As Database Dim rs As Recordset Dim s, m As String Set db = CurrentDb() s = "SELECT * FROM empl" Set rs = db.OpenRecordset(s) rs.MoveFirst While Not rs.EOF m = m & rs!eid & rs!ename & Chr(10) rs.MoveNext Wend MsgBox m rs.Close db.Close
3. 2552-08-01 a20033.mdb คือ macro menu, subform, listbox, combobox
- คำสั่งในฟอร์ม 1 เกี่ยวกับ listbox และ combobox ที่กำหนดแบบเป็น Value List
Private Sub Command1_Click()
  Child5.Form!Text1 = Text3 ' forms!form1!text3 = 5
End Sub
Private Sub Command11_Click()
  For i = 0 To List9.ListCount
    If (List9.Selected(i) = True) Then
      List12.AddItem (List9.ItemData(i)) ' เพิ่มเข้า listbox ใหม่
      Combo20.AddItem (List9.ItemData(i)) ' เพิ่มเข้า combobox ใหม่
    End If
  Next
End Sub
Private Sub Command14_Click()
  For i = 0 To List9.ListCount
    If (List9.Selected(i) = True) Then List9.RemoveItem (i)
  Next
End Sub
Private Sub Command19_Click()
  MsgBox (List9.ItemData(Text16)) ' แสดง item ที่ต้องการ
End Sub
Private Sub Command8_Click()
  List9.AddItem (Now) ' เพิ่ม item เข้า listbox
End Sub
Private Sub Form_Load()
  Child5.SourceObject = "form3" ' กำหนดชื่อฟอร์มให้กับ subform
End Sub
การแปลงฐานข้อมูล

- เพื่อนส่งแฟ้มที่สร้างจาก 2000 แต่ที่บ้านมี 97 ที่ทำงานมี 2003
- ผมจึงต้องไปเปิดที่ทำงานด้วย 2003 แล้วแปลงเป็น 97 เพื่อนำมาพัฒนาต่อที่บ้าน
Tables ::
จัดเก็บข้อมูล แต่ต้องมีความรู้พื้นฐานเรื่องของฐานข้อมูล เพื่อให้สามารถออกแบบระบบ และการเก็บข้อมูลให้เ็ป็นตามความต้องการของผู้ใช้ ซึ่งเป็นสิ่งแรกที่ต้องทำใน Access
Querys ::
ช่วยให้การใช้งานตารางมีความยืดหยุ่นอย่างมาก เป็นการใช้ QBE = Query By Examble หรืออาจใช้ SQL เรียกข้อมูลมาใช้ก็ทำได้ ชื่อของ query จะซ้ำกับ table ไม่ได้ เพราะทั้ง 2 อย่างนี้มีสถานะเหมือนกัน คือเป็นแหล่งให้ข้อมูลแก่ส่วนอื่น แต่ตารางจะเป็นข้อมูลจริง ส่วน query จะเรียกตารางมาสร้างความสัมพันธ์ขึ้นใหม่
Forms ::
ช่วยรับข้อมูล หรือจะแสดงผลก็ได้ เป็นส่วนที่ช่วยให้ผู้ใช้ได้มี Interface กับเครื่องคอมพิวเตอร์ การพัฒนาโปรแกรมส่วนใหญ่จะให้ความสำคัญกับส่วนนี้เป็นหลัก เพราะเป็นการนำส่วนอื่น ๆ มาใช้ร่วมกันได้อย่างลงตัว
ตัวอย่างคำสั่ง
DoCmd.GoToRecord , , acNewRec
Reports ::
พิมพ์ข้อมูลเป็นรายงานออกทางเครื่องพิมพ์ และง่ายในการนำข้อมูลจากตาราง หรือคิวรี่มาจัดรูปแบบให้เรียบร้อย แล้วจึง Preview หรือ Print ทันที
ตัวอย่างคำสั่ง
=Int(Left(Format(Date()-[Datebirth],"yyyy")-1900,2))
Macros ::
ช่วยสั่งประมวลผลด้วยวิธีที่ง่าย แบบทีละบรรทัด เช่น macro ชื่อ autoexec หรือใช้ macro ทำ Menu Bar ใช้เอง
ตัวอย่างโปรแกรม
autoexec และกดปุ่ม shift เพื่อข้ามไป
Modules ::
โปรแกรมเมอร์สามารถสร้างคำสั่งทั้งหมด เก็บไว้ที่นี่แล้วเรียกใช้ หรือจะเขียนคำสั่งไว้ในแต่ละฟอร์มก็ทำได้ ถ้าคิดว่าโปรแกรมที่เขียนขึ้นไม่ถูกเรียกใช้ในฟอร์มอื่น
ตัวอย่างโปรแกรม
Dim i, j As Integer
j = 0
For i = 1 To getint
j = j + i
Next
MsgBox j
Dim c, d, e
call cutfield("boy|bb|ccc|dddd",1)
Function cutfield(s As String, fld As Integer)
c = InStr(s, "|")
Debug.Print Mid$(s, 1, c - 1)
s = Mid$(s, c + 1)
c = InStr(s, "|")
Debug.Print Mid$(s, 1, c - 1)
s = Mid$(s, c + 1)
c = InStr(s, "|")
Debug.Print Mid$(s, 1, c - 1)
End Function
โปรแกรม สำหรับโรงเรียนจาก สำนัก งานคณะกรรมการการศึกษาขั้นพื้นฐาน กระทรวงศึกษาธิการ
1. โปรแกรม : บริหารสถานศึกษา BEIS (Basic Education Information System)
+ http://210.1.20.11/doc/web_doc/information_eis.htm [obec_doc@hotmail.com]
! http://smis.bopp.go.th/smis/proupdate.htm
! http://smis.click-computer.com
+ เป็นลิขสิทธิ์ของ สพฐ. ที่มุ่งเน้นเพื่อลดภาระงานภายในโรงเรียน และพัฒนาระบบงานภายในโรงเรียนให้ มีการบริหารจัดการแบบ E-Office และสามารถแจกจ่าย ให้โรงเรียนใช้ฟรี โดยไม่มีเงื่อนไข ใด ๆ ทั้งสิ้น ประกอบด้วย 8 ระบบงานดังนี้ 1)งานทะเบียน – วัดผล 2)งานกิจการนักเรียน 3)งานบุคลากร 4.งานดูแลช่วยเหลือ นร. 5)งานพัสดุครุภัณฑ์ 6)งานห้องสมุด 7)งานงบประมาณการเงิน 8)งานพิมพ์บัตร

2. โปรแกรม : Students'44 Version 2.1Final
ผู้สร้างสรรค์ : ครูอัมพร ชมเด็จ [email] 70 MB
เผยแพร่โดย : กระทรวง ศึกษาธิการ
+ โปรแกรมระบบงานทะเบียน-วัดผล และสารสนเทศนักเรียน (Students'44) เป็นโปรแกรมสำหรับในการจัดเก็บ ข้อมูลพื้นฐานและผลการเรียนของ นักเรียน และจัดพิมพ์เอกสารทางการศึกษาต่างๆ
StudentSetup.exe
Site 1 : http://gpa1.moe.go.th
Site 2 : http://gpa2.moe.go.th
Site 3 : http://gpa3.moe.go.th
+ Shift of .mdb + Password Recover
แบบของข้อมูลในไมโครซอฟท์แอคเซส (Microsoft Access Data Types) (?)
แบบข้อมูลรายละเอียดขนาด
Text ชุดตัวอักษร หรือตัวอักษรรวมกับตัวเลข เช่น ที่อยู่ ชื่อ เป็นข้อมูลที่ไม่นิยมใช้สำหรับการคำนวณ <= 255 Bytes
Memo บันทึก หรือชุดตัวอักษรที่เก็บรายละเอียดได้มาก มักมีขนาดไม่แน่นอน <= 64000 Bytes
Number ตัวเลขสำหรับการคำนวณ ซึ่งมีหลายรูปแบบ เช่น Byte , Integer , Long Integer (Default) , Decimal , Single , Double และ Replication ID 1 - 16 Bytes
Date/Time วันที่ / เวลา 8 Bytes
Currency หน่วยทางการเงิน เก็บตัวเลข 15 หลักทางซ้ายของจุด และทศนิยม 4 ตำแหน่ง 8 Bytes
AutoNumber ตัวเลขที่ไม่ซ้ำและเพิ่มทีละ 1 เมื่อเพิ่มระเบียนใหม่อัตโนมัติ 4 Bytes และ
16 Bytes สำหรับ Replication ID (GUID)
Yes/No เก็บเพียง 2 สถานะ คื อ Yes/No, True/False, On/Off 1 bit
OLE Object วัตถุภายนอก เช่น Word , Excel , Pictures, Sounds หรือ ไบนารี่ดาต้า 0 - 1 GB (จำกัดตามขนาดฮาร์ดดิสก์)
Hyperlink ตำแหน่ง หรือที่อยู่ของเว็บไซต์ 0 - 64000 ตัวอักษร
Lookup Wizard เขตข้อมูลสำหรับเลือกค่าจากตาราง หรือลิสท์ หรือคอมโบ้บ็อก เท่ากับแหล่งที่เชื่อมโยงมา

คุณสมบัติของขนาดตัวเลข (Numeric Field Size Properties) (?)
แบบข้อมูล รายละเอียด ทศนิยม ขนาด
Byte เลขระหว่าง 0 - 255 ไม่มี 1 Byte
Integer เลขระหว่าง -32,768 ถึง 32,767 ไม่มี 2 Bytes
Long Integer เลขระหว่าง -2,147,483,648 ถึง 2,147,483,647 ไม่มี 4 Bytes
Decimal เลขระหว่าง -10^28 -1 ถึง 10^28 -1 (.mdb) 28 12 Bytes
Single เลขระหว่าง -3.4028E38 ถึง -1.4012E-45 สำหรับค่าลบ
เลขระหว่าง 1.4012E-45 ถึง 3.4028E38 สำหรับค่าบวก
7 4 Bytes
Double เลขระหว่าง -1.7976E308 ถึง -4.9406E-324 สำหรับค่าลบ
เลขระหว่าง 1.7976E308 ถึง 4.9406E-324 สำหรับค่าบวก
15 8 Bytes
Replication ID ค่า GUID (Globally unique identifier) N/A 16 Bytes
วันที่ รุ่น เลขรุ่น ระบบปฏิบัติการที่สนับสนุน รุ่นของชุดออฟฟิศ
1992 Access 1.1 1 Windows 3.1x
1993 Access 2.0 2.0 Windows 3.1x Office 4.3 Pro
1995 Access 95 7.0 Windows 95 Office 95 Professional
1997 Access 97 8.0 Windows 9x, NT 3.5/4.0 Office 97 Professional and Developer
1999 Access 2000 9.0 Windows 9x, NT 4.0, 2000 Office 2000 Professional
Office 2000 Premium and Developer
2001 Access 2002 10 Windows 98, Me, 2000, XP Office XP Professional and Developer
2003 Access 2003 11 Windows 2000, XP Office 2003 Professional
Office 2003 Enterprise
2007 Access 2007 12 Windows XP SP2, Vista Office 2007 Professional
Office 2007 Professional Plus
Office 2007 Ultimate and Enterprise
ไม่มี Access ระหว่างรุ่น 2.0 ถึง 7.0 เพราะ วินโดว์95 ประกาศใช้ Word7 ดังนั้นใน Office95 จึงมีโปรแกรมที่เริ่มต้นด้วยเลข 7 ทั้งหมด เพื่อให้สัมพันธ์กับ Word7

หลักสูตรอบรม Microsoft Access 2003 ระยะเวลา 12 ชั่วโมง (แบบทดสอบ)
วันแรก (กำหนดการอย่างเป็นทางการ)
9.00 น. - 9.30 น. ความรู้เบื้องต้นเกี่ยวกับไมโครซอฟท์แอคเซส 
- วัตถุประสงค์การการใช้ไมโครซอฟท์แอคเซส (Objective)
- วัตถุของไมโครซอฟท์แอคเซส (Object of Microsoft Access)
- ความแตกต่างของแฟ้ม .MDB และ MDE
- ความแตกต่างของไมโครซอฟท์แอคเซสแต่ละรุ่น 9.30.00 น. - 10.30 น. การจัดการตาราง (Table Management)
- การสร้างตารางด้วย Design View, using wizard และ entering data
- การ Get External Data แบบ Import จากระบบฐานข้อมูลอื่น
- การ Get External Data แบบ Link Table จากระบบฐานข้อมูลอื่น
- การ Export Table 10.30.00 น. - 12.00 น. การสร้างแบบสอบถาม (Query Creating)
- แบบสอบถามแบบจัดเรียง และเลือกข้อมูล (Sort and Criteria)
- แบบสอบถามแบบจัดกลุ่ม และใช้ฟังก์ชัน (Grouping and function)
- แบบสอบถามแบบประมวลผล (Executable Query)
- แบบสอบถามแบบแท็บไขว้ (Crosstab Query) 12.00น. - 13.00น. พักรับประทานอาหารกลางวัน 13.00 น. - 14.30 น. ฟอร์มเบื้องต้น (Form)
- ฟอร์มแบบด้วย Design View และ using wizard
- ฟอร์มแบบไม่ใช้ตารางข้อมูล
- ฟอร์มแบบใช้ตารางข้อมูล หรือแบบสอบถาม
- ปุ่มด้วย wizard 14.30 น. - 16.00 น. รายงานเบื้องต้น (Report)
- รายงานแบบด้วย Design View และ using wizard
- รายงานแบบไม่ใช้ตารางข้อมูล
- รายงานแบบใช้ตารางข้อมูล หรือแบบสอบถาม
- รายงานแบบ report & page header, group
- การใช้ function in textbox วันที่สอง 9.00 น. - 10.30 น. การเชื่อมตารางในแบบสอบถาม
- การเชื่อมตารางผ่าน Primary key
- การเขียน SQL หรือนำ SQL ไปใช้ในรายงาน หรือฟอร์ม 10.30.00 น. - 12.00 น. ปุ่มคำสั่งในฟอร์ม
- เขียนคำสั่งในปุ่มคำสั่ง
- การเชื่อมโยงระหว่างฟอร์ม แบบสอบถาม และรายงาน
- การส่งค่าระหว่างฟอร์ม แบบสอบถาม และรายงาน 12.00 น. - 13.00 น. พักรับประทานอาหารกลางวัน 13.00 น. - 14.30 น. การสั่งประมวลผลตารางข้อมูลจากฟอร์ม
- การสั่งประมวลผลในฟอร์มต่อตารางข้อมูลผ่านปุ่มคำสั่ง
- การเขียนฟังก์ชันในโมดูล และการเรียกใช้โมดูลในฟอร์ม 14.30 น. - 16.00 น. ทบทวน
- การสร้างเว็บเพจที่เชื่อมโยงข้อมูลจากตาราง
- การแยกข้อมูลออกจากโปรแกรมเป็น .mdb 2 แฟ้มที่เชื่อมโยงกัน
- เชื่อมโยงตาราง แบบสอบถาม ฟอร์ม รายงาน และโมดูลเข้าด้วยกัน

คำถามที่ถูกถามบ่อย
  1. เก็บปี ค.ศ. ใน Table แบบ Date/Time แต่ลบ ค.ศ.ไปอีก 543
    - ถ้าเก็บข้อมูลใน xdate พลาดไปแล้ว เช่น 1464 เป็นต้น
    - ถ้าแก้ตอนทำรายงานก็อาจใช้ฟังก์ชันปรับการแสดงผล
    เช่น chkdate: CDate(Format(Month([xdate]) & "/" & Day([xdate]) & "/" & Year([xdate])+543,"mm/dd/yyyy"))
  2. แสดงวันที่ในช่วง 30 วัน จากวันนี้ของปีที่แล้วใน Criteria ของ Query
    เช่น Now()-390
  3. พบคำว่า can't build key เมื่อเปิดแฟ้ม .mdb ที่สร้างจาก Access 2.0 ไปใน Access 97
    วิธีที่ 1 กระชับฐานข้อมูล (Compact) ใน Access 2.0 ก่อนนำไปเปิดใน Access 97 หรือสูงกว่า
    วิธีที่ 2 โปรแกรม แปลง 2.0 เป็น 2003 จาก Microsoft
    - The Access 2.0 Converter is used by Microsoft Office Access 2003 to enable you to convert files from the Microsoft Access 2.0 file format.
  4. ภาษาไทยเป็น ??? เมื่อนำไปใช้กับ ASP ใน server ของ godaddy.com
    พบว่าถ้าเป็น Access 2003 จะมีปัญหาภาษาไทยใน godaddy แต่ผม Convert .mdb มาเป็นรูปแบบแฟ้มของ Access 97 แล้ว upload กลับไปยัง server ก็ไม่พบปัญหา ?? อีกเลย ใช้งานได้ปกติ
  5. พบคำว่า ? Can't Find Project or Library
    จากการ convert แฟ้ม .mdb ที่สร้างด้วย Access2003 ไปเป็น Access97 พบว่าใช้ฟังก์ชันบางตัวไม่ได้เช่น chr ทั้ง ๆ ที่น่าจะใช้ได้ วิธีแก้ไขคือ ถ้ายกเลิกการอ้างอิง 3 รายการที่เป็นสีแดงออก ก็จะใช้งานได้ตามปกติ แต่ 2 ตัวบนยกเลิกไม่ได้
  6. การติดตั้ง Office97 และ Office2003 ในเครื่องเดียวกัน
    วิธีแรก ให้ติดตั้ง Office97 ก่อน แล้วตามด้วย Office 2003
    ถ้าติดตั้ง 2003 ก่อน 97 จะทำให้ Microsoft Access 97 ใช้งานไม่ได้ แม้จะถอนแล้วลงใหม่ก็ใช้ไม่ได้เหมือนเดิม
    วิธีที่สอง ให้ติดตั้งระบบปฏิบัติการเพิ่มอีก 1 ตัว แล้วติดตั้ง Office ไว้แยกกัน
  7. การใช้ Microsoft Access 97 ใน WinXP ที่ใช้ database เป็น Data Type
    เช่น Dim db As Database
    จะต้อง Add Reference : Microsoft DAO 3.5 Object Library (แต่ใน Win98 ยังไม่ OK)
    โดย DOS>regsvr32 "c:\program files\common files\microsoft shared\dao\dao350.dll"
    อ่านจาก http://allenbrowne.com/ser-38.html
Read more ►

ตอน 2.1 :: การเขียน Module เบื้องต้น

0 comments
> ข้อควรทราบ <
บทนี้เป็นบทแรกในการเขียน โปรแกรม แบบ structure programming จะเห็นว่า หลักการในบทนี้ไม่ยากเลย เพราะเขียน function ง่าย ๆ และทดสอบในส่วนของ Debug window หรือ หน้าต่างตรวจแก้จุดบกพร่องนั่นเอง .. ให้ทดลองเขียนดูนะครับ ทำให้ได้ เพราะ บทอื่นยากกว่านี้
บทนี้มี 4 โปรแกรม แบ่งเป็น function และ sub ทั้ง 2 ส่วนในโปรแกรมนี้เป็น public ทั้งคู่ เพราะสามารถถูกเรียกใช้ด้วย form หรือ report ตามความเหมาะสมได้ตลอดเวลา สำหรับการเรียกใช้ function หรือ sub ใน form หรือ report จะไม่ขอกล่าวถึงในบทนี้ เพราะต้องการให้เรียนรู้เป็นขึ้นตอน ขณะนี้ขอให้ทดสอบโปรแกรมเฉพาะใน debug window ก่อน
สำหรับหน้าที่ของ function นั้น ก็คือการคืนค่ากลับไป เช่นการหาผลคูณ 2 เท่าของค่าที่ต้องการ เป็นต้น สำหรับการทดสอบ function ใน debug windows ให้พิมพ์ว่า ? x(5) เป็นต้น
ส่วนหน้าที่ของ sub ก็คือการกระทำการอย่างใดอย่างหนึ่งเช่น สั่งลบข้อมูลอะไรทำนองนี้เป็นต้น สำหรับการทดสอบ sub ใน debug windows ให้พิมพ์ว่า call x(5) เป็นต้น
ขั้นตอนที่ 1 :
เมื่อเริ่มต้นให้กดปุ่ม สร้างใหม่ จะเห็นหน้าต่างที่ชื่อว่า โมดูล1 แล้วไปกดปุ่มที่ใช้เรียก หน้าต่างตรวจ แก้จุดบกพร่อง เพื่อใช้เรียก sub หรือ function (ความหมายและวิธีการเรียก sub หรือ function อธิบายไว้ด้านบน) ท้ายสุดให้ save จะแล้วกำหนดชื่อ ของผมกำหนดเป็น sample01
ตัวอย่างนี้แสดงจุดที่ใช้เรียก Debug windows

ขั้นตอนที่ 2 :
ลองเขียนโปรแกรม ลงไปแล้วให้เรียกโปรแกรมมาทำงานด้วยการพิมพ์เข้าไปใน หน้าต่างตรวจแก้จุด บกพร่อง ถ้าพิมพ์ว่า ? sam0102(3) หมายถึงเรียกฟังก์ชันให้ประมวลผล และแสดงค่าออกมา แต่ถ้าพิมพ์ call sam0104(5) หมายถึงเรียกโปรแกรมย่อยให้ทำงาน
ตัวอย่างนี้แสดงให้เห็นวิธีการเรียกใช้งาน และผลลัพธ์บางส่วน


> Module source code ใน sample01 <
Option Compare Database
Dim x As Integer
Option Explicit
Function sam0101(getint As Integer) x = 2 sam0101 = getint * x End Function
Function sam0102(getint As Integer) Dim i As Integer sam0102 = 0 For i = 1 To getint sam0102 = sam0102 + i Next End Function
Sub sam0103(getint As Integer) Dim i As Integer i = getint * 2 MsgBox i End Sub
Sub sam0104(getint As Integer) Dim i, j As Integer j = 0 For i = 1 To getint j = j + i Next MsgBox j End Sub
Read more ►

ตัวดำเนินการ Like

0 comments

ตัวดำเนินการ Like

นำไปใช้กับ: Microsoft Office Access 2003, Office 2003, Microsoft Access

เปรียบเทียบนิพจน์ สายอักขระกับรูปแบบในนิพจน์ SQL
ไวยากรณ์
expression Likepattern
ไวยากรณ์ของตัวดำเนิน การ Like มีส่วนต่างๆ เหล่านี้
ส่วน คำอธิบาย
expression นิพจน์ SQL ที่ใช้ในส่วนคำสั่ง WHERE
pattern สายอักขระหรือสายอักขระของตัวอักษร ซึ่ง expression ถูกนำมาเปรียบเทียบด้วย

หมายเหตุ
คุณสามารถใช้ตัวดำเนินการ Like เพื่อหาค่าในเขตข้อมูลหนึ่ง ซึ่งตรงกันกับรูปแบบที่คุณระบุ สำหรับ pattern คุณสามารถระบุค่าที่สมบูรณ์ (เช่น Like “Smith”) หรือคุณสามารถใช้ สัญลักษณ์ ตัวแทน เพื่อหาช่วงของค่าก็ได้ (เช่น Like “Sm*”)
ใน นิพจน์ คุณสามารถใช้ตัวดำเนินการ Like เพื่อเปรียบเทียบค่าของเขตข้อมูลกับนิพจน์สายอักขระได้ ตัวอย่างเช่น ถ้าคุณใส่ Like “C*” ในแบบสอบถาม SQL แบบสอบถามจะส่งกลับค่าของเขตข้อมูลทั้งหมดที่ขึ้นต้นด้วยตัวอักษร C ใน แบบ สอบถามแบบพารามิเตอร์ คุณสามารถพร้อมท์ผู้ใช้เพื่อให้ใส่รูปแบบที่จะใช้ในการค้นหาได้
ตัวอย่าง ต่อไปนี้จะส่งกลับข้อมูลที่ขึ้นต้นด้วยตัวอักษร P ตามด้วยตัวอักษรใดก็ได้ระหว่าง A ถึง F และตัวเลขสามตัว
Like “P[A-F]###”
ตารางต่อไปนี้แสดงวิธีที่คุณสามารถใช้ Like เพื่อทดสอบนิพจน์สำหรับรูปแบบต่างๆ

ลักษณะการเปรียบเทียบ

รูปแบบ
ตรงกัน
(ส่งกลับค่า True)
ไม่ตรงกัน
(ส่งกลับค่า False)
อักขระหลายอักขระ a*a aa, aBa, aBBBa aBC
*ab* abc, AABB, Xab aZb, bac
อักขระพิเศษ a[*]a a*a aaa
อักขระหลายอักขระ ab* abcdefg, abc cab, aab
อักขระตัวเดียว a?a aaa, a3a, aBa aBBBa
ตัวเลขตัวเดียว a#a a0a, a1a, a2a aaa, a10a
ช่วงของอักขระ [a-z] f, p, j 2, &
อักขระภายนอกช่วง [!a-z] 9, &, % b, a
ไม่ใช่ตัวเลข [!0-9] A, a, &, ~ 0, 1, 9
หลายแบบร่วมกัน a[!b-m]# An9, az0, a99 abc, aj0

การใช้สัญลักษณ์ตัวแทนใน การเปรียบเทียบสายอักขระ

นำไปใช้กับ: Microsoft Office Access 2003, Office 2003, Microsoft Access

การจับคู่กับรูปแบบที่มีอยู่แล้วภายในเป็นเครื่องมือเอนกประสงค์สำหรับ การเปรียบเทียบสายอักขระ ตารางต่อไปนี้จะแสดงสัญลักษณ์ตัวแทนที่คุณสามารถใช้ได้กับตัวดำเนินการ Like และจำนวนของตัวเลขหรือสายอักขระที่ตรงกัน
อักขระในรูปแบบ สิ่งที่ตรงกันในนิพจน์
? หรือ _ (ขีดเส้นใต้) อักขระใดๆ หนึ่งอักขระ
* หรือ % กี่อักขระก็ได้
# ตัวเลขหลักเดียวใดๆ (0— 9)
[charlist] อักขระใดๆ หนึ่งอักขระในcharlist
[!charlist] อักขระใดๆ หนึ่งอักขระที่ไม่อยู่ใน charlist

คุณสามารถใช้กลุ่มของอักขระอย่างน้อยหนึ่งอักขระ (charlist) ที่อยู่ภายในเครื่องหมายวงเล็บเหลี่ยม ([ ]) เพื่อให้ตรงกับอักขระใดๆ หนึ่งอักขระในนิพจน์ได้ และ charlist สามารถมีอักขระได้เกือบทุกอักขระที่อยู่ในชุดอักขระแบบ ANSI รวมทั้งตัวเลขด้วย คุณสามารถใช้อักขระพิเศษวงเล็บเหลี่ยมเปิด ([ ) เครื่องหมายคำถาม (?) สัญลักษณ์ตัวเลข (#) และเครื่อง หมายดอกจัน (*) เพื่อจับคู่กันโดยตรงก็ต่อเมื่ออยู่ในเครื่องหมายวงเล็บเหลี่ยม คุณไม่สามารถใช้เครื่องหมายวงเล็บเหลี่ยมปิด ( ]) ภายในกลุ่มเพื่อจับคู่กัน แต่คุณสามารถใช้เป็นอักขระแต่ละอักขระจากภายนอกกลุ่มได้
นอก จากรายการอักขระธรรมดาที่อยู่ภายในเครื่องหมายวงเล็บเหลี่ยมแล้ว charlist ยังสามารถระบุช่วงของอักขระได้โดยใช้เครื่องหมายขีดกลาง (-) เพื่อแยกขอบเขตบนและล่างของช่วง ตัวอย่างเช่น การใช้ [A-Z] ใน รูปแบบ จะให้ผลลัพธ์ที่ตรงกัน ถ้าตำแหน่งของอักขระที่เกี่ยวข้องในนิพจน์มี อักษรตัวพิมพ์ใหญ่ใดๆ ในช่วง A ถึง Z คุณสามารถรวมหลายช่วงไว้ภายในวงเล็บเหลี่ยมได้โดยไม่ต้องมีเครื่องหมายคั่น ช่วง ตัวอย่างเช่น [a-zA-Z0-9] จะจับคู่อักขระที่เป็นตัวเลขหรือตัวอักษรใดๆ
ให้ สังเกตว่าสัญลักษณ์ตัวแทน SQL ในรูปแบบ ANSI อันได้แก่ (%) และ (_) นั้น จะใช้ได้กับ Microsoft® Jet รุ่น 4.X และ Microsoft OLE DB Provider for Jet เท่านั้น โดยจะถือเสมือนเป็นตัวอักษรถ้าใช้งานผ่าน Microsoft Access หรือ DAO
กฎที่สำคัญอื่นๆ สำหรับการจับคู่รูปแบบมีดังต่อไปนี้
  • เครื่องหมายอัศเจรีย์ (!) ที่ขึ้นต้น charlist หมายความว่ามีการจับคู่ที่ตรงกันถ้าพบอักขระใดๆ ใน นิพจน์ ยกเว้นอักขระใน charlist เมื่อใช้เครื่องหมายอัศเจรีย์นอกวงเล็บเหลี่ยม เครื่องหมายอัศเจรีย์จะจับคู่กันเอง
  • คุณสามารถใช้เครื่องหมายขีดกลาง (-) ที่ส่วนต้น (หลังเครื่องหมายอัศเจรีย์ ถ้าใช้) หรือที่ส่วนท้ายของ charlist เพื่อให้จับคู่กันเอง ในตำแหน่งอื่นๆ เครื่องหมายขีดกลางจะระบุช่วงของอักขระ ANSI
  • เมื่อคุณระบุช่วงของอักขระ อักขระต่างๆ จะต้องปรากฏในลำดับการจัดเรียงจากน้อยไปหามาก (A-Z หรือ 0-100) โดย [A-Z] จะเป็นรูปแบบที่ถูกต้อง แต่ [Z-A] ไม่ถูกต้อง
  • ลำดับของอักขระ [ ] จะถูกละเว้น โดยจะพิจารณาเป็นสาย อักขระที่มีความยาวเป็นศูนย์ (“”)


Read more ►
 

Copyright © Access เบื้องต้น Design by Gu