Tuesday, September 29, 2009

Bukan Raya Hairi Tahun Ni

Tahun ni bukan hari raya Hairi... raya ke-6 hairi kene air panas kat peha. water heater rosak. sian hairi.

Dr. x bg balut luka tu... biar cepat kering... tapi hairi takut bila tgk luka yg besar mcm tu.... so dia hanya baring shj. mengharapkan ibu n abah dia temankan/jaga dia.... x bg tinggal. sib abik ada cik nanang tolong jaga hairi sambil tgk TV..

Abah pun kuatkan semangat jer cuci luka hairi tu... tapi hari pertama abah x berani buat... abah hantar ke klinik suruh Dr. tolong buatkan.... lepas tu baru abah berani cuci bila dah x teruk sgt.


hairi takut tgk luka dia...sampai tertidor dia...

Masa ni baru kene... x mengelembung lg...

Life Goes On

Cukup la beraya seminggu... start keje balik... life goes on....

raya tahun ni meriah, cuma ada musibah sikit menimpa abg Hairi. Abg hairi kene air panas dari malfunction water heater kat kampung nenek ibu. sian abg hairi. teruk melecur peha dia. sib baik x kene 'bird' dia... hehehehhe...

Abg mie byk ambik gambar family raya ni... tapi x dpt nak ambik gambar kami sekeluarga sebab pertindihan masa dgn aktiviti lain. so, hanya kami sekeluarga jer yg x da gambar bersama raya ni... yg lain semua ada... sian kami kan....x pe... open house umah kak ani weekend ni kami vogue gila2 ..jgn x ambik gambar udah ler.

Tuesday, September 15, 2009

Hari Raya Aidilfitri 1430h/2009m

Copyright Reserved

Persiapan hari raya anak2 almost complete. tu yg penting. mak pak x kisah sgt. budak2 tu cepat membesar. byk baju2 dah x muat. nasib baik belikan baju melayu diaorg ambik 1 size bigger. bila balik test. ngam2 jer... terasa mcm cepat sgt anak2 tu membesar. mcm baru aritu mandikan diorg dlm bathtub.

Abg Hairi dah pandai nyanyi lagu raya, walaupun dlm versi gubahan dia sendiri. hehehe...

tinggal nak carikan sandal utk diorg.

utk ibu kita last minute shopping yer...

balik kg kali ni besar kemungkinan aku terpaksa pinjam kereta org utk balik kg. kereta aku x solve gak masalah mati2 nya tu. even aku dah hantar ke workshop last week pun masalah x hilang. pomen aku suh tukar distributor. tapi itupun dia x dpt nak janji problem will solve.so aku decide dari bg duit kat pomen ... baik aku simpan utk spent pada hari raya nanti. itu pun aku mcm dah menyesal antar g workshop last week.. duit melayang... masalah x ilang gak.

Nasib baik kak cha ada offer pakai MyVi dia. thanxs kak cha. hopefully muat la barang2 aku nak disumbat dlm boot MyVi tu nanti.

Raya ke-2 baru aku balik kg. tahun ni turn rumah wife kat shah alam. so sesapa yg ada kat shah alam jemput la dtg rumah kami.

Mood raya dah menguasai diri... semua kerja mcm x betul jer buat. even semalam g client site pun .. x leh nak solve kan problem kecik. aku x leh nak pikir lebih2 dah... mood raya sudah menguasai diri... hahahhahahaha

Selamat hari raya aidilfitri dari aku(Hairul, Mbek @ Ayun) + Fardahila bte Omar = Muhammad Luqman Hairi & Muhammad Luqman Danish. Maaf Zahir & batin.

Thursday, September 10, 2009

Playing with PERL Hash

simple PERL script utk menunjukkan bagaimana bermain dgn Hash. cara pass hash ke sub/class/function dan cara retrive back value dari parameter/variable yg di terima. simple tapi cukup rasanya menerangkan pengunaan hash. amat berguna.

# init
my %t = (
 1=>'k',
 2=>'l'
);

foreach my $f(keys %t) {
 print $f,'=', $t{$f}, "\n";
}
print "\n";

# process
my $t = &passHash(\%t);

foreach my $f(keys %$t) {
 print $f,'=', $t->{$f}, "\n";
}
print "\n";

# copy
my %k = %$t;
foreach my $f(keys %k) {
 print $f,'=', $k{$f}, "\n";
}
print "\n";


sub passHash {
 my $r = shift;
 $r->{3} = 'new';
 return \%$r;
}

Wednesday, September 9, 2009

Perkerjaan yg pernah aku lakukan

tetiba aku teringatkan pekerjaan2 yg pernah aku lakukan satu ketika dulu hingga la kini... yg pasti semua pekerjaan itu mengharapkan bayaran..

Aku pernah:

  • Jual mee siput(mee sanggul), kacang sira, kerepek sira masa zaman sekolah rendah dulu.
  • Jual peyek/tumpee & mee siput dari rumah ke rumah naik basikal.
  • Jual peyek/tumpee & mee siput dkt court badminton berhampiran rumah waktu malam bila ada org main badminton.
  • Kutip biji getah pastu jual kat tokei cina yg nak buat benih pokok getah. sekilo dia ambik 4osen. kalau 10 kilo dpt la Rm4... masa tu dah kira beso dah.
  • Jual shuttlecock terpakai yg abg aku dpt masa piala thomas kat KL dulu...
  • Jual pelbagai jenis poster.
  • Tolong member aku jual burger.
  • Tolong jaga warung makcik member.
  • Jadi jurulatih Sofbol x bertauliah sekolah lepas SPM.
  • Ambik upah angkat kayu/papan utk org buat rumah...ni yg keje x sampai sehari pastu abah jemput sebab dpt surat dari UiTM. hehehhe..
  • Tolong member buat networking computer. pintal cable UTP sampai naik keras jari2 tangan aku. pasang conduit. tebuk dinding... etc...
  • Jadi driver + tukang angkat barang dari dlm lori.

Dan sekarang ni pekerjaan tetap aku adalah sebagai seorg computer programmer. Dlm bahasa melayu nya pengaturcara komputer. dan ada kerja2 yg pernah aku lakukan dulu aku masih lakukan sebagai hobby atau sekadar menolong mereka2 yg masih memerlukan pertolongan aku.

Aku juga pernah:

  • Menoreh Getah (sampai sekarang ni wife aku x percaya yg aku pernah menoreh getah... siap aku tunjuk kebun nya pun dia ckp aku tipu... hahahahhahaa)
  • Cari Ramban(rumput utk makanan kambing + lembu)
  • Mengembala kambing & lembu(aku pernah kene seret dgn lembu bilamana tali yg mengikat lembu berbelit di tangan aku dan lembu tu lari sebab terkejutkan apa ntah... aku kene seret dlm kebuh kelapa sawit..dengan duri2 sawit menyucuk2 badan aku... tuhan je yg tau rasanya waktu tu.. sib abik x putus jari aku)
  • Gali lubang utk tanam anak keladi. setiap lubang dlm nya lebih 1 kaki. dan setiap hari jumlah lubang yg perlu dikorek dlm 100 lubang... bayangkan....
  • Packing tahi kambing utk dijadikan baja dan dijual. smell good...hehehehe

yg ni mostly aku buat utk membantu keluarga. ketawa sorg2 bila pikir balik yg aku pernah buat semua tu... sekarang ni menyangkul rumpun depan rumah skit pun tangan aku dah start pecah. isk.... lembut betul.. hehehehhee

setiap pekerjaan yg aku pernah lakukan memberi pengajaran yg cukup bermakna kepada aku. dari sudut pandangan masayrakat hingga la pulangan yg diterima. ada yg berbaloi... ada yg x berbaloi... ada yg dibayar... ada yg X DIBAYAR.... tapi pengalaman yg aku dpt... cukup bermakna....

Tuesday, September 8, 2009

Servis kereta sebelum balik kampung

esok plan nak servis kereta.

normal servis : minyak engine + oil filter + air filter + fuel filter(x pernah ganti selama aku pakai kete ni)
xtra servis : brake pump + brake shoes

* nak kene check distributor & timing... kete asyik mati2 jer...

Monday, September 7, 2009

Mama's DIY mini fish pond

DIY utk mama. 1st time buat... hehehhe .. plan asal nak pakai varnish biar cantik... tapi request nak pakai cat jer... ikut je la... kurang skit finishingnya pakai cat ni.

Kos x byk sgt. mama dah sediakan papan
12x7.5x3/4 = 2 keping
8x7.5x3/4 = 1 keping
bahan2 lain mmg dah ada dlm store or simpanan aku. so save budget kat situ..

Wednesday, September 2, 2009

Hello World

Koleksi Hello World yg pernah aku buat bedasarkan language yg pernah aku pakai & gunakan.. Kepada mereka2 yg begelar programmer.. pasti mengenali benar perkataan Hello World ini..

Perl:

print "Hello World!\n";

PHP:

< ?php
  echo 'Hello World!';
?>

JavaScript:



<script language="JavaScript" type="text/javascript">
// Hello World in JavaScript
document.write('Hello World');
</script>
</body>
</html>

VBScript:

msgbox "Hello, World!"

XML:




Hello, World

WML:

#define HELLOWORLD
  [message]
    speaker="narrator"
    message=_"Hello World"
  [/message]
#enddef

C++:

#include 

main()
{
    cout << "Hello World!" << endl;
    return 0;
}

HTML:

<HTML>

<HEAD>
<TITLE>Hello World!</TITLE>
</HEAD>
<BODY>
Hello World!
</BODY>
</HTML>

MSDOS:

@ECHO OFF
REM Hello World for DOS batch

ECHO Hello World!

Python 3000:

# Hello World in Python 3000
print("hello World")

Python:

# Hello World in Python
print "Hello World"

Ruby:

# Hello World in Ruby
puts "Hello World!"

Schwantz reunited with 1993 RGV500

http://www.motorcyclenews.com/MCN/News/newsresults/General-news/2009/September/sep1090-Schwantz-reunited-with-1993-RGV500-Roberts-rides-TZ750-flat-tracker/

Khairil Johari Johar - Sepasang Kurung Biru

Relink MS Access table from startup

original code from http://www.mvps.org/access/tables/tbl0009.htm and http://www.mvps.org/access/api/api0001.htm

I made some tweaking and changes to make it suite my application. actually this is combination of 2 different code from mvps.org site and litle function to check link source and check if file exist or not.

here's the code: (copy and name it as anything at module section. and then create a macro to runCode, select function fRefreshLinks and name this macro to autoExec)

Option Compare Database
'***************** Code Start **************
' This code was originally written by Ken Getz.
' It is not to be altered or distributed, 'except as part of an application.
' You are free to use it in any application,
' provided the copyright notice is left unchanged.
'
' Code originally courtesy of:
' Microsoft Access 95 How-To
' Ken Getz and Paul Litwin
' Waite Group Press, 1996
' Revised to support multiple files:
' 28 December 2007

Type tagOPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    strFilter As String
    strCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    strFile As String
    nMaxFile As Long
    strFileTitle As String
    nMaxFileTitle As Long
    strInitialDir As String
    strTitle As String
    Flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    strDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

Declare Function aht_apiGetOpenFileName Lib "comdlg32.dll" _
    Alias "GetOpenFileNameA" (OFN As tagOPENFILENAME) As Boolean

Declare Function aht_apiGetSaveFileName Lib "comdlg32.dll" _
    Alias "GetSaveFileNameA" (OFN As tagOPENFILENAME) As Boolean
Declare Function CommDlgExtendedError Lib "comdlg32.dll" () As Long

Global Const ahtOFN_READONLY = &H1
Global Const ahtOFN_OVERWRITEPROMPT = &H2
Global Const ahtOFN_HIDEREADONLY = &H4
Global Const ahtOFN_NOCHANGEDIR = &H8
Global Const ahtOFN_SHOWHELP = &H10
' You won't use these.
'Global Const ahtOFN_ENABLEHOOK = &H20
'Global Const ahtOFN_ENABLETEMPLATE = &H40
'Global Const ahtOFN_ENABLETEMPLATEHANDLE = &H80
Global Const ahtOFN_NOVALIDATE = &H100
Global Const ahtOFN_ALLOWMULTISELECT = &H200
Global Const ahtOFN_EXTENSIONDIFFERENT = &H400
Global Const ahtOFN_PATHMUSTEXIST = &H800
Global Const ahtOFN_FILEMUSTEXIST = &H1000
Global Const ahtOFN_CREATEPROMPT = &H2000
Global Const ahtOFN_SHAREAWARE = &H4000
Global Const ahtOFN_NOREADONLYRETURN = &H8000
Global Const ahtOFN_NOTESTFILECREATE = &H10000
Global Const ahtOFN_NONETWORKBUTTON = &H20000
Global Const ahtOFN_NOLONGNAMES = &H40000
' New for Windows 95
Global Const ahtOFN_EXPLORER = &H80000
Global Const ahtOFN_NODEREFERENCELINKS = &H100000
Global Const ahtOFN_LONGNAMES = &H200000

'***************** Code Start ***************
' This code was originally written by Dev Ashish.
' It is not to be altered or distributed,
' except as part of an application.
' You are free to use it in any application,
' provided the copyright notice is left unchanged.
'
' Code Courtesy of
' Dev Ashish
'
Function fRefreshLinks() As Boolean
Dim strMsg As String, collTbls As Collection
Dim i As Integer, strDBPath As String, strTbl As String
Dim dbCurr As Database, dbLink As Database
Dim tdfLocal As TableDef
Dim varRet As Variant
Dim strNewPath As String

Const cERR_USERCANCEL = vbObjectError + 1000
Const cERR_NOREMOTETABLE = vbObjectError + 2000

    On Local Error GoTo fRefreshLinks_Err

    If MsgBox("Are you want to reconnect all Access tables?", _
            vbQuestion + vbYesNo, "Please confirm...") = vbNo Then Err.Raise cERR_USERCANCEL

    'First get all linked tables in a collection
    Set collTbls = fGetLinkedTables

    'now link all of them
    Set dbCurr = CurrentDb

    strMsg = "Do you wish to specify a different path for the Access Tables?"
    
    If MsgBox(strMsg, vbQuestion + vbYesNo, "Alternate data source...") = vbYes Then
        strNewPath = fGetMDBName("Please select a new datasource")
    Else
        strNewPath = vbNullString
    End If

    For i = collTbls.Count To 1 Step -1
        strDBPath = fParsePath(collTbls(i))
        strTbl = fParseTable(collTbls(i))
        varRet = SysCmd(acSysCmdSetStatus, "Now linking '" & strTbl & "'....")
        If Left$(strDBPath, 4) = "ODBC" Then
            'ODBC Tables
            'ODBC Tables handled separately
           ' Set tdfLocal = dbCurr.TableDefs(strTbl)
           ' With tdfLocal
           '     .Connect = pcCONNECT
           '     .RefreshLink
           '     collTbls.Remove (strTbl)
           ' End With
        Else
            If strNewPath <> vbNullString Then
                'Try this first
                strDBPath = strNewPath
            Else
                If Len(Dir(strDBPath)) = 0 Then
                    'File Doesn't Exist, call GetOpenFileName
                    strDBPath = fGetMDBName("'" & strDBPath & "' not found.")
                    If strDBPath = vbNullString Then
                        'user pressed cancel
                        Err.Raise cERR_USERCANCEL
                    End If
                End If
            End If

            'backend database exists
            'putting it here since we could have
            'tables from multiple sources
            Set dbLink = DBEngine(0).OpenDatabase(strDBPath)

            'check to see if the table is present in dbLink
            strTbl = fParseTable(collTbls(i))
            If fIsRemoteTable(dbLink, strTbl) Then
                'everything's ok, reconnect
                Set tdfLocal = dbCurr.TableDefs(strTbl)
                With tdfLocal
                    .Connect = ";Database=" & strDBPath
                    .RefreshLink
                    collTbls.Remove (.Name)
                End With
            Else
                Err.Raise cERR_NOREMOTETABLE
            End If
        End If
    Next
    fRefreshLinks = True
    varRet = SysCmd(acSysCmdClearStatus)
    MsgBox "All Access tables were successfully reconnected.", _
            vbInformation + vbOKOnly, _
            "Success"

fRefreshLinks_End:
    Set collTbls = Nothing
    Set tdfLocal = Nothing
    Set dbLink = Nothing
    Set dbCurr = Nothing
    Exit Function
fRefreshLinks_Err:
    fRefreshLinks = False
    Select Case Err
        Case 3059:

        Case cERR_USERCANCEL:
            Dim dbfile As String
            dbfile = fGetLinkPath("staff")
            
            
            If IsFileExist(dbfile) Then
                'MsgBox "connected"
            Else
                MsgBox "No Database was specified, couldn't link tables.", _
                        vbCritical + vbOKOnly, _
                        "Error in refreshing links."
            End If
            Resume fRefreshLinks_End
        Case cERR_NOREMOTETABLE:
            MsgBox "Table '" & strTbl & "' was not found in the database" & _
                    vbCrLf & dbLink.Name & ". Couldn't refresh links", _
                    vbCritical + vbOKOnly, _
                    "Error in refreshing links."
            Resume fRefreshLinks_End
        Case Else:
            strMsg = "Error Information..." & vbCrLf & vbCrLf
            strMsg = strMsg & "Function: fRefreshLinks" & vbCrLf
            strMsg = strMsg & "Description: " & Err.Description & vbCrLf
            strMsg = strMsg & "Error #: " & Format$(Err.Number) & vbCrLf
            MsgBox strMsg, vbOKOnly + vbCritical, "Error"
            Resume fRefreshLinks_End
    End Select
End Function

Function fIsRemoteTable(dbRemote As Database, strTbl As String) As Boolean
Dim tdf As TableDef
    On Error Resume Next
    Set tdf = dbRemote.TableDefs(strTbl)
    fIsRemoteTable = (Err = 0)
    Set tdf = Nothing
End Function

Function fGetMDBName(strIn As String) As String
'Calls GetOpenFileName dialog
Dim strFilter As String

    strFilter = ahtAddFilterItem(strFilter, _
                    "Access Database(*.mdb;*.mda;*.mde;*.mdw) ", _
                    "*.mdb; *.mda; *.mde; *.mdw")
    strFilter = ahtAddFilterItem(strFilter, _
                    "All Files (*.*)", _
                    "*.*")

    fGetMDBName = ahtCommonFileOpenSave(Filter:=strFilter, _
                                OpenFile:=True, _
                                DialogTitle:=strIn, _
                                Flags:=ahtOFN_HIDEREADONLY)
End Function

Function fGetLinkedTables() As Collection
'Returns all linked tables
    Dim collTables As New Collection
    Dim tdf As TableDef, db As Database
    Set db = CurrentDb
    db.TableDefs.Refresh
    For Each tdf In db.TableDefs
        With tdf
            If Len(.Connect) > 0 Then
                If Left$(.Connect, 4) = "ODBC" Then
                '    collTables.Add Item:=.Name & ";" & .Connect, KEY:=.Name
                'ODBC Reconnect handled separately
                Else
                    collTables.Add Item:=.Name & .Connect, Key:=.Name
                End If
            End If
        End With
    Next
    Set fGetLinkedTables = collTables
    Set collTables = Nothing
    Set tdf = Nothing
    Set db = Nothing
End Function

Function fParsePath(strIn As String) As String
    If Left$(strIn, 4) <> "ODBC" Then
        fParsePath = Right(strIn, Len(strIn) _
                        - (InStr(1, strIn, "DATABASE=") + 8))
    Else
        fParsePath = strIn
    End If
End Function

Function fParseTable(strIn As String) As String
    fParseTable = Left$(strIn, InStr(1, strIn, ";") - 1)
End Function
'***************** Code End ***************



Function TestIt()
    Dim strFilter As String
    Dim lngFlags As Long
    strFilter = ahtAddFilterItem(strFilter, "Access Files (*.mda, *.mdb)", _
                    "*.MDA;*.MDB")
    strFilter = ahtAddFilterItem(strFilter, "dBASE Files (*.dbf)", "*.DBF")
    strFilter = ahtAddFilterItem(strFilter, "Text Files (*.txt)", "*.TXT")
    strFilter = ahtAddFilterItem(strFilter, "All Files (*.*)", "*.*")

    ' Uncomment this line to try the example
    ' allowing multiple file names:
    ' lngFlags = ahtOFN_ALLOWMULTISELECT Or ahtOFN_EXPLORER

    Dim result As Variant

    result = ahtCommonFileOpenSave(InitialDir:="C:\", _
        Filter:=strFilter, FilterIndex:=3, Flags:=lngFlags, _
        DialogTitle:="Hello! Open Me!")

    If lngFlags And ahtOFN_ALLOWMULTISELECT Then
        If IsArray(result) Then
            Dim i As Integer
            For i = 0 To UBound(result)
                MsgBox result(i)
            Next i
        Else
            MsgBox result
        End If
    Else
        MsgBox result
    End If

    ' Since you passed in a variable for lngFlags,
    ' the function places the output flags value in the variable.
    Debug.Print Hex(lngFlags)
End Function

Function GetOpenFile(Optional varDirectory As Variant, _
    Optional varTitleForDialog As Variant) As Variant

    ' Here's an example that gets an Access database name.
    Dim strFilter As String
    Dim lngFlags As Long
    Dim varFileName As Variant

    ' Specify that the chosen file must already exist,
    ' don't change directories when you're done
    ' Also, don't bother displaying
    ' the read-only box. It'll only confuse people.
    lngFlags = ahtOFN_FILEMUSTEXIST Or _
                ahtOFN_HIDEREADONLY Or ahtOFN_NOCHANGEDIR
    If IsMissing(varDirectory) Then
        varDirectory = ""
    End If
    If IsMissing(varTitleForDialog) Then
        varTitleForDialog = ""
    End If

    ' Define the filter string and allocate space in the "c"
    ' string Duplicate this line with changes as necessary for
    ' more file templates.
    strFilter = ahtAddFilterItem(strFilter, _
                "Access (*.mdb)", "*.MDB;*.MDA")

    ' Now actually call to get the file name.
    varFileName = ahtCommonFileOpenSave( _
                    OpenFile:=True, _
                    InitialDir:=varDirectory, _
                    Filter:=strFilter, _
                    Flags:=lngFlags, _
                    DialogTitle:=varTitleForDialog)
    If Not IsNull(varFileName) Then
        varFileName = TrimNull(varFileName)
    End If
    GetOpenFile = varFileName
End Function

Function ahtCommonFileOpenSave( _
            Optional ByRef Flags As Variant, _
            Optional ByVal InitialDir As Variant, _
            Optional ByVal Filter As Variant, _
            Optional ByVal FilterIndex As Variant, _
            Optional ByVal DefaultExt As Variant, _
            Optional ByVal FileName As Variant, _
            Optional ByVal DialogTitle As Variant, _
            Optional ByVal hwnd As Variant, _
            Optional ByVal OpenFile As Variant) As Variant

    ' This is the entry point you'll use to call the common
    ' file open/save dialog. The parameters are listed
    ' below, and all are optional.
    '
    ' In:
    ' Flags: one or more of the ahtOFN_* constants, OR'd together.
    ' InitialDir: the directory in which to first look
    ' Filter: a set of file filters, set up by calling
    ' AddFilterItem. See examples.
    ' FilterIndex: 1-based integer indicating which filter
    ' set to use, by default (1 if unspecified)
    ' DefaultExt: Extension to use if the user doesn't enter one.
    ' Only useful on file saves.
    ' FileName: Default value for the file name text box.
    ' DialogTitle: Title for the dialog.
    ' hWnd: parent window handle
    ' OpenFile: Boolean(True=Open File/False=Save As)
    ' Out:
    ' Return Value: Either Null or the selected filename
    Dim OFN As tagOPENFILENAME
    Dim strFileName As String
    Dim strFileTitle As String
    Dim fResult As Boolean

    ' Give the dialog a caption title.
    If IsMissing(InitialDir) Then InitialDir = CurDir
    If IsMissing(Filter) Then Filter = ""
    If IsMissing(FilterIndex) Then FilterIndex = 1
    If IsMissing(Flags) Then Flags = 0&
    If IsMissing(DefaultExt) Then DefaultExt = ""
    If IsMissing(FileName) Then FileName = ""
    If IsMissing(DialogTitle) Then DialogTitle = ""
    If IsMissing(hwnd) Then hwnd = Application.hWndAccessApp
    If IsMissing(OpenFile) Then OpenFile = True
    ' Allocate string space for the returned strings.
    strFileName = Left(FileName & String(256, 0), 256)
    strFileTitle = String(256, 0)
    ' Set up the data structure before you call the function
    With OFN
        .lStructSize = Len(OFN)
        .hwndOwner = hwnd
        .strFilter = Filter
        .nFilterIndex = FilterIndex
        .strFile = strFileName
        .nMaxFile = Len(strFileName)
        .strFileTitle = strFileTitle
        .nMaxFileTitle = Len(strFileTitle)
        .strTitle = DialogTitle
        .Flags = Flags
        .strDefExt = DefaultExt
        .strInitialDir = InitialDir
        ' Didn't think most people would want to deal with
        ' these options.
        .hInstance = 0
        '.strCustomFilter = ""
        '.nMaxCustFilter = 0
        .lpfnHook = 0
        'New for NT 4.0
        .strCustomFilter = String(255, 0)
        .nMaxCustFilter = 255
    End With
    ' This will pass the desired data structure to the
    ' Windows API, which will in turn it uses to display
    ' the Open/Save As Dialog.
    If OpenFile Then
        fResult = aht_apiGetOpenFileName(OFN)
    Else
        fResult = aht_apiGetSaveFileName(OFN)
    End If

    ' The function call filled in the strFileTitle member
    ' of the structure. You'll have to write special code
    ' to retrieve that if you're interested.
    If fResult Then
        ' You might care to check the Flags member of the
        ' structure to get information about the chosen file.
        ' In this example, if you bothered to pass in a
        ' value for Flags, we'll fill it in with the outgoing
        ' Flags value.
        If Not IsMissing(Flags) Then Flags = OFN.Flags
        If Flags And ahtOFN_ALLOWMULTISELECT Then
            ' Return the full array.
            Dim items As Variant
            Dim value As String
            value = OFN.strFile
            ' Get rid of empty items:
            Dim i As Integer
            For i = Len(value) To 1 Step -1
              If Mid$(value, i, 1) <> Chr$(0) Then
                Exit For
              End If
            Next i
            value = Mid(value, 1, i)

            ' Break the list up at null characters:
            items = Split(value, Chr(0))

            ' Loop through the items in the "array",
            ' and build full file names:
            Dim numItems As Integer
            Dim result() As String

            numItems = UBound(items) + 1
            If numItems > 1 Then
                ReDim result(0 To numItems - 2)
                For i = 1 To numItems - 1
                    result(i - 1) = FixPath(items(0)) & items(i)
                Next i
                ahtCommonFileOpenSave = result
            Else
                ' If you only select a single item,
                ' Windows just places it in item 0.
                ahtCommonFileOpenSave = items(0)
            End If
        Else
            ahtCommonFileOpenSave = TrimNull(OFN.strFile)
        End If
    Else
        ahtCommonFileOpenSave = vbNullString
    End If
End Function

Function ahtAddFilterItem(strFilter As String, _
    strDescription As String, Optional varItem As Variant) As String

    ' Tack a new chunk onto the file filter.
    ' That is, take the old value, stick onto it the description,
    ' (like "Databases"), a null character, the skeleton
    ' (like "*.mdb;*.mda") and a final null character.

    If IsMissing(varItem) Then varItem = "*.*"
    ahtAddFilterItem = strFilter & _
                strDescription & vbNullChar & _
                varItem & vbNullChar
End Function

Private Function TrimNull(ByVal strItem As String) As String
    Dim intPos As Integer

    intPos = InStr(strItem, vbNullChar)
    If intPos > 0 Then
        TrimNull = Left(strItem, intPos - 1)
    Else
        TrimNull = strItem
    End If
End Function

Private Function FixPath(ByVal path As String) As String
    If Right$(path, 1) <> "\" Then
        FixPath = path & "\"
    Else
        FixPath = path
    End If
End Function

'************** Code End *****************

Function fGetLinkPath(strTable As String) As String
Dim dbs As Database, stPath As String

    Set dbs = CurrentDb()
    On Error Resume Next
    stPath = dbs.TableDefs(strTable).Connect
    If stPath = "" Then
        fGetLinkPath = vbNullString
        'can change this to currentdb.name
    Else
        fGetLinkPath = Right(stPath, Len(stPath) _
                        - (InStr(1, stPath, "DATABASE=") + 8))
    End If
    Set dbs = Nothing
End Function

Sub sListPath()
    Dim loTd As TableDef
    CurrentDb.TableDefs.Refresh
    For Each loTd In CurrentDb.TableDefs
        Debug.Print fGetLinkPath(loTd.Name)
    Next loTd
    Set loTd = Nothing
End Sub
Public Function IsFileExist(strPath) As Boolean
         If Len(Dir$(strPath)) > 0 Then
            IsFileExist = True
         Else
            IsFileExist = False
         End If
End Function

MS Access splitting Client and DB

sejak kebelakangan ini byk bermain dgn MS Access. lama gak la x bermain dgn MS Access ni. dulu sebelum berkenalan dgn MySQL mmg most of application yg perlukan Database akan gunakan MS Access.

dah terbiasa buat applikasi & sistem dgn mengasingkan database dan antaramuka untuk memudahkan proses development and updating patches & bugs. bil.a buat access mula2 tenson gak bila ada changes dgn GUI kene migrate data dari table2 berkaitan.

Terpikir utk splitkan. dgn pertolongan pakcik google, semua berjalan lancar. even discover satu method utk membolehkan access berfungsi style server <-> client. satu cara paling murah dan senang rasanya utk aplikasi2 bermodal rendah.

awal2 development kita buat la cara biasa.. semua dlm 1 aplication. bila dah ok... baru kita splitkan. dari client kita get external data dari db aplication. so dari client akan hanya linked table yg point ke db application. GUI yg kita buat semua x da ganguan. cuma kita kene tweak skit utk membolehkan user switch linked source kepada db application kita masa startup. boleh pilih source dari local pc or melalui network selagi ada privilege.

kelebihan utk update and buat changes kat GUI tanpa kacau live data yg dah ada kat DB. memudahkan ...

nanti saya uploadkan cth method ni... x sempat nak buat sekarang... ada keje skit...