แสดงบทความที่มีป้ายกำกับ MS ACCESS TIP แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ MS ACCESS TIP แสดงบทความทั้งหมด

วันเสาร์ที่ 4 มิถุนายน พ.ศ. 2554

CONNECT ORACLE ด้วย VBA SCRIPT ใน ACCESS

หากทำการ LINK TABLE จาก ODBC มายัง ACCESS   แล้วมีการเรียกใช้ LINK TABLE ดังกล่าว  ครั้งแรก ACCESS จะทำการถาม LOGIN, PASSWORD ที่จะไป CONNECT กับ DATABASE ที่เราทำ LINK ไว้  นอกจากจะถาม LOGIN PASSWORD เราแล้ว ยังให้เปลี่ยน DSN ของ ODBC ที่ตั้งไว้ได้ด้วย    อาการแบบนี้ จะไปสร้าง ความเสี่ยง ให้ USER ไปเลือก DSN ตัวอื่นที่เราไม่ต้องการได้



วิธีที่ดีที่สุด คือการทำหน้าตา LOGIN ของเราขึ้นมา แล้วทำการ ต่อ CONNECTION ไปยัง ODBC รอไว้ก่อน   ให้ใช้ CODE  sysTestLogin  ตามนี้ได้เลยครับ,  ส่วน Sub testLogin ผมทำมาทดสอบ การ LOGIN นำไปปะที่ formLogin ได้เลย

ตย Code ที่แสดง เป็นการ Login ไป Oracle นะครับ  ถ้าเป็นการ Connect ไปยัง SQL SERVER หรือ ODBC อื่นๆ   การทำ ConnStr อาจแตกต่างกันไปครับ


Option Compare Database
Option Explicit
Sub testLogin()
   
    If sysTestLogin("MYDB", "mydblogin", "xg1234") Then
       '--- GOTO LOGIN PASS PROCESS
       '
       '
   
   
       MsgBox "OK, LOGIN PASS"
    Else
       '--- GOTO LOGIN ERROR PROCESS
       '
       '
      
    End If

End Sub
Function sysTestLogin(sysDSNName, sysLogin, sysPassword)
   
    On Error GoTo log_error
    Dim dbx As Database
    Dim wkODBCDirect  As Workspace
    Dim x, ConnStr
   
    ConnStr = "ODBC;DSN=" & sysDSNName & ";DBQ=" & sysDSNName & ";"
    ConnStr = ConnStr & "UID=" & sysLogin & ";"
    ConnStr = ConnStr & "PWD=" & sysPassword & ";"
   
   
    Set wkODBCDirect = CreateWorkspace("", "", "", dbUseODBC)
    Set dbx = wkODBCDirect.OpenDatabase("", dbDriverNoPrompt, True, ConnStr)
    Set dbx = DBEngine(0).OpenDatabase("", dbDriverNoPrompt, False, ConnStr)
   
    x = SysCmd(acSysCmdSetStatus, "LOGIN PASS !")


    Set dbx = Nothing      ' Close database but keep connection.
    sysTestLogin = True
    Exit Function
log_resume:


    sysTestLogin = False
    Exit Function
   
log_error:
    MsgBox "ODBC Error: Initial connection error" & vbCrLf & vbCrLf & DBEngine.Errors(0) & vbCrLf & vbCrLf, vbExclamation
    Resume log_resume
   
End Function


วันเสาร์ที่ 12 กุมภาพันธ์ พ.ศ. 2554

FUNCTION NTZ NVL แบบ ORACLE

หลายๆ ครั้ง เรามักพบปัญหา การนำค่าใน FIELD มาคำนวณ แล้วพบ ว่า ค่าที่ได้เป็น ว่างๆ  ปัญหาหลักส่วนหนึ่วคือ ค่าใน FIELD เป็น ว่างๆ หรือ NULL   ตย  เช่น  เราตั้งค่า AMOUNT + VAT ไว้  ในรายงาน หรือ QUERY ถ้า RECORD ใด ที่ VAT เป็น ช่องว่าง  จะทำให้ AMOUNT+VAT = NULL ไปด้วย

วิธีแก้ พื้นๆ ก็ไปไล่ UPDATE ค่าให้เป็น 0   ,  ผมแนะนำการทำ FUNCTION มาช่วย โดยให้เก็บ FUNCTION นี้ไว้ใน MODULE  ผมเรียกมันว่า ntz

FUNCTION NTZ(vain)
     if  isnull(varin) then
         ntz=0
     else
         ntz =varin
     end if
END FUNCTION

การนำ ไปใช้ ก็เพียงแต่ ใส่ FUNCTION ครอบ ตยเช่น =AMOUNT+VAT ก็ใส่เป็น =ntz(AMOUNT) + ntz(VAT)  เรานำไปใช้ได้ ทั้งใน QUERY REPORT และ FORM



เรานำ FUNCTION ดังกล่าว ไป ดัดแปลง เพื่อให้เทียบเคียงกับ FUNCTION NVL แบบ ORACLE ได้ เช่นกัน โดยการปรับเป็น FUNCTION ดังนี้   

FUNCTION NVL(vain, varnull)
     if  isnull(varin) then
         ntz=varnull
     else
         ntz =varin
     end if
END FUNCTION

แต่ผมนิยมใช้ NTZ เพราะมี PARAMETER เดียวโดดๆ  นำไปครอบสูตรแล้วได้ผลเลย  ส่วน NTZ ต้องพิมพ์เพิ่ม อีก 2 3 ตัวครับ