Minggu, 26 Januari 2014

Re: [belajar-access] Cek file Open kemudian tutup file tersebut

 

Hm... Ms Acces antar berbagai versi memang berbeda.

Seharusnya, sebelum saya mengeksekusi syscmd(609), dilihat dulu versi Ms Access-nya. Karena syscmd(609) hanya berjalan di versi 2003 ke bawah.

Katakanlah versi Ms Acces yang dipakai diputuskan diatas 2003, maka PID bisa diperoleh dengan memakai fungsi ini:

Public Declare Function GetWindowThreadProcessId Lib "user32.dll" _
(ByVal hwnd As Long, lpdwProcessId As Long) As Long
Function Get_pid()
Dim pid As Long

Get_pid = GetWindowThreadProcessId(Application.hWndAccessApp, pid) - 4
End Function



Dengan begitu fungsi matikan (syscmd), harus diubah menjadi matikan (Get_pid). Apabila aplikasi yang dijalankan juga ikut tertutup, coba hilangkan angka -4.

Semoga bisa membantu dan memberi semangat.


Hariyanto (Surabaya)


On Sunday, 26 January 2014, 15:01, him mah <himmah.mlg@gmail.com> wrote:
 
saya coba koq error pak ya di baris perintah matikan (SysCmd(609))

Private Sub Command11_Click()
Dim xx As Variant

Dim fd As New FileDialog
fd.ShowOpen
If fd.FileName <> "" Then
matikan (SysCmd(609))
xx = Replace(fd.FileName, ".mdb", ".ldb")
If FileExists(xx) Then
Pause (0.03)
Kill xx
End If
End If
End Sub

Pada tanggal 24/01/14, hari yanto <har_i20002000@yahoo.com> menulis:
> him mah...,
>
> Optional pada script yang Sampeyan sampaikan, merupakan pilihan variabel
> buat user. Bisa di-isi bisa pula tidak. Namanya juga option (pilihan).
>
> Terlepas dari itu, bila script tersebut di-eksekusi, kita tidak bisa menutup
>
> file Ms Access yang sudah dibuka oleh siapapun. Walaupun, hanya dibuka
> kita sendiri (melalui form file Ms Access lainnya).
>
> Karena tidak memungkinkan, jalan satu-satunya adalah memaksa tutup. Ini
> mirip
> dengan kita menekan key board Alt+ctrl+del ==> jendela Task Manager.
> Lalu, kita pilih applikasi Ms Access yang sedang running. Sayangnya
> satu, kita tidak tahu file Ms Access mana yang kita paksa tutup itu.
> Karena tidak informasi nama file Ms Access yang running.
>
> Dalam VBA, grab atas Task Manager bisa kita lakukan dengan cara mengkoleksi
>
> properti dari WMI (Windows Management Instrumentation) -- saya baru
> mempelajari sekitar 1 minggu lalu. Disini sejatinya banyak hal yang bisa di
> eksplorasi (lihat class WMI di windows).
>
> Dalam kaitan tutup paksa Ms Access, hasil grab WMI selain mampu mengeluarkan
>
> nama aplikasi yang sedang. Bisa juga, kita temukan Proses ID (PID) dari
> sebuah aplikasi. Bila ada 2 Ms Access running, maka akan muncul nama Ms
> Access 2 dengan PID berbeda. Contohnya:
>
>
> Yang sampai saat ini saya belum menemukan adalah PID file MS Access dengan
> cara kita browser. Misal, klik browser ==> kita arahkan pada file Ms
> Access tertentu yang sedang running ==> dapat kembalian PID. Metode DOA,
> belum menyediakan properti PID. Yang
> tersedia hanya seperti dibawah ini:
>
>
>
> Namun
> untuk PID Ms Acces yang sedang dibuka dijalankan (tempat eksekusi
> menutup file Ms Acces lain) bisa diketahui. Kita bisa memanggil dengan
> memanfaatkan SysCmd(). Kalau kita beri niali SysCmd(609), maka akan
> menghasilkan PID. (property SysCmd, belum banyak didokumentasikan)
>
> Dari
> proses ini, bisa diputuskan menutup file Ms Acces lain yang sedang
> dibuka. Caranya kita menterminate, PID selain yang sedang dijalankan.
>
> Private Sub Command11_Click()
> Dim xx As Variant
>
>     Dim fd As New FileDialog
>     fd.ShowOpen
>     If fd.FileName <> "" Then
>         matikan
> (SysCmd(609))
>         xx = Replace(fd.FileName, ".mdb", ".ldb")
>         If FileExists(xx) Then
>             Pause (0.03)
>             Kill xx
>         End If
>     End If
> End Sub
>
> Fungsi matikan sendiri adalah:
>
> Function matikan(ProcessId As String)
> Dim objWMIService As Object
> Dim colProcesses As Object
> Dim objProcess As Object
> Dim strComputer As String
>
>     strComputer = "."
>
>     Set objWMIService =
> GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
>     & strComputer & "\root\cimv2")
>
>     Set colProcesses =
> objWMIService.ExecQuery _
>     ("SELECT * FROM Win32_Process WHERE Name='MSACCESS.EXE'" _
>     & " and ProcessId<>" & ProcessId)
>     For Each objProcess In colProcesses
>         objProcess.Terminate
>     Next objProcess
>
>     Set objProcess = Nothing
>     Set colProcesses = Nothing
>     Set objWMIService = Nothing
>
>
> End Function
>
> Sedangkan file exis:
>
> Function FileExists(ByVal FileToTest As String) As Boolean
>    FileExists = (Dir(FileToTest) <> "")
> End Function
>
> Terlampir contoh Ms Acces 2003 yang merangkaum uraian diatas.
>
>
> Semoga bisa membantu dan memberi semangat.
>
> Hariyanto (Surabaya)
>
>
>
>
>
> On Saturday, 25 January 2014, 11:26, hari yanto <har_i20002000@yahoo.com>
> wrote:
>
> him mah...,
>
> Optional pada script yang Sampeyan sampaikan, merupakan pilihan variabel
> buat user. Bisa di-isi bisa pula tidak. Namanya juga option (pilihan).
>
> Terlepas dari itu, bila script tersebut di-eksekusi, kita tidak bisa menutup
> file Ms Access yang sudah dibuka oleh siapapun. Walaupun, hanya dibuka kita
> sendiri (melalui form file Ms Access lainnya).
>
> Karena tidak memungkinkan, jalan satu-satunya adalah memaksa tutup. Ini
> mirip dengan kita menekan key board Alt+ctrl+del ==> jendela Task Manager.
> Lalu, kita pilih applikasi Ms Access yang sedang running. Sayangnya satu,
> kita tidak tahu file Ms Access mana yang kita paksa tutup itu. Karena tidak
> informasi nama file Ms Access yang running.
>
> Dalam VBA, grab atas Task Manager bisa kita lakukan dengan cara mengkoleksi
> properti dari WMI (Windows Management Instrumentation) -- saya baru
> mempelajari sekitar 1 minggu lalu. Disini sejatinya banyak hal yang bisa di
> eksplorasi (lihat class WMI di windows).
>
> Dalam kaitan tutup paksa Ms Access, hasil grab WMI selain mampu mengeluarkan
> nama aplikasi yang sedang. Bisa juga, kita temukan Proses ID (PID) dari
> sebuah aplikasi. Bila ada 2 Ms Access running, maka akan muncul nama Ms
> Access 2 dengan PID berbeda. Contohnya:
>
>
> Yang sampai saat ini saya belum menemukan adalah PID file MS Access dengan
> cara kita browser. Misal, klik browser ==> kita arahkan pada file Ms Access
> tertentu yang sedang running ==> dapat kembalian PID. Metode DOA, belum
> menyediakan properti PID. Yang tersedia hanya seperti dibawah ini:
>
>
>
> Namun untuk PID Ms Acces yang sedang dibuka dijalankan (tempat eksekusi
> menutup file Ms Acces lain) bisa diketahui. Kita bisa memanggil dengan
> memanfaatkan SysCmd(). Kalau kita beri niali SysCmd(609), maka akan
> menghasilkan PID. (property SysCmd, belum banyak didokumentasikan)
>
> Dari proses ini, bisa diputuskan menutup file Ms Acces lain yang sedang
> dibuka. Caranya kita menterminate, PID selain yang sedang dijalankan.
>
> Private Sub Command11_Click()
> Dim xx As Variant
>
>     Dim fd As New FileDialog
>     fd.ShowOpen
>     If fd.FileName <> "" Then
>         matikan
> (SysCmd(609))
>         xx = Replace(fd.FileName, ".mdb", ".ldb")
>         If FileExists(xx) Then
>             Pause (0.03)
>             Kill xx
>         End If
>     End If
> End Sub
>
> Fungsi matikan sendiri adalah:
>
> Function matikan(ProcessId As String)
> Dim objWMIService As Object
> Dim colProcesses As Object
> Dim objProcess As Object
> Dim strComputer As String
>
>     strComputer = "."
>
>     Set objWMIService =
> GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
>     & strComputer & "\root\cimv2")
>
>     Set colProcesses =
> objWMIService.ExecQuery _
>     ("SELECT * FROM Win32_Process WHERE Name='MSACCESS.EXE'" _
>     & " and ProcessId<>" & ProcessId)
>     For Each objProcess In colProcesses
>         objProcess.Terminate
>     Next objProcess
>
>     Set objProcess = Nothing
>     Set colProcesses = Nothing
>     Set objWMIService = Nothing
>
>
> End Function
>
> Sedangkan file exis:
>
> Function FileExists(ByVal FileToTest As String) As Boolean
>    FileExists = (Dir(FileToTest) <> "")
> End Function
>
> Terlampir contoh Ms Acces 2003 yang merangkaum uraian diatas.
>
>
> Semoga bisa membantu dan memberi semangat.
>
> Hariyanto (Surabaya)
>
>
>
>
> On Friday, 24 January 2014, 8:56, him mah <himmah.mlg@gmail.com> wrote:
>
>
> sudah ketemu pak, saya dapat disini
>
> http://www.cpearson.com/excel/ISFILEOPEN.ASPX
>
>
> cuma saya agak bingung dengan yang ini Optional ResultOnBadFile As Variant
> Option Explicit
> Option Compare Text
> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ' modIsFileOpen
> ' By Chip Pearson, www.cpearson.com , chip@cpearson.com '
> www.cpearson.com/Excel/IsFileOpen.aspx ' This module contains the IsFileOpen
> procedure whict tests whether
> ' a file is open.
> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> Public Function IsFileOpen(FileName As String, _ Optional ResultOnBadFile As
> Variant) As Variant
> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> ' IsFileOpen
> ' This function determines whether a the file named by FileName is
> ' open by another process. The fuction returns True if the file is open
> ' or False if the file is not open. If the file named by FileName does
> ' not exist or if FileName is not a valid file name, the result returned
> ' if equal to the value of ResultOnBadFile if that parameter is provided.xd
> ' If ResultOnBadFile is not passed in, and FileName does not exist or
> ' is an invalid file name, the result is False.
> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
> Dim FileNum As Integer
> Dim ErrNum As Integer
> Dim V As Variant On Error Resume Next
> ''''''''''''''''''''''''''''''''''''''''''''
> ' If we were passed in an empty string,
> ' there is no file to test so return FALSE.
> '''''''''''''''''''''''''''''''''''''''''''' If Trim(FileName) =
> vbNullString Then If IsMissing(ResultOnBadFile) = True Then IsFileOpen =
> False Else IsFileOpen = ResultOnBadFile End If Exit Function
> End If ''''''''''''''''''''''''''''''''''''''''''''
> ' if the file doesn't exist, it isn't open
> ' so get out now
> '''''''''''''''''''''''''''''''''''''''''''' V = Dir(FileName, vbNormal)
> If IsError(V) = True Then ' syntactically bad file name If
> IsMissing(ResultOnBadFile) = True Then IsFileOpen = False Else IsFileOpen =
> ResultOnBadFile End If Exit Function
> ElseIf V = vbNullString Then ' file doesn't exist. If
> IsMissing(ResultOnBadFile) = True Then IsFileOpen = False Else IsFileOpen =
> ResultOnBadFile End If Exit Function
> End If FileNum = FreeFile() '''''''''''''''''''''''''''''''''''''''
> ' Attempt to open the file and lock it.
> ''''''''''''''''''''''''''''''''''''''' Err.Clear
> Open FileName For Input Lock Read As #FileNum
> ErrNum = Err.Number ''''''''''''''''''''
> ' Close the file.
> '''''''''''''''''''' Close FileNum
> On Error GoTo 0 ''''''''''''''''''''''''''''''''''''''
> ' Check to see which error occurred.
> '''''''''''''''''''''''''''''''''''''' Select Case ErrNum Case 0
> '''''''''''''''''''''''''''''''''''''''''''' ' No error occurred. ' File is
> NOT already open by another user.
> '''''''''''''''''''''''''''''''''''''''''''' IsFileOpen = False Case 70
> '''''''''''''''''''''''''''''''''''''''''''' ' Error number for "Permission
> Denied." ' File is already opened by another user.
> '''''''''''''''''''''''''''''''''''''''''''' IsFileOpen = True Case Else
> '''''''''''''''''''''''''''''''''''''''''''' ' Another error occurred.
> Assume open. '''''''''''''''''''''''''''''''''''''''''''' IsFileOpen = True
> End Select End Function
>
>
>
>
> Pada 23 Januari 2014 17.15, him mah <himmah.mlg@gmail.com> menulis:
>
> terima kasih pak hari, sebenarnya kasus saya adalah seperti ini
>>saya punya dua file Access A dan B
>>
>>
>>di file B ada perintah yang hanya bisa dijalankan ketika file A tidak dalam
>> keadaan open (dibuka)
>>file B di buka dengan menjalankan perintah dari file A
>>
>>
>>jadi dari file A menjalankan perintah untuk membuka file B
>>setelah file B dibuka kemudian otomatis file A di close
>>
>>
>>mirip-mirip perintah untuk membuka atau menutup form
>>
>>
>>seperti ini pak
>>
>>
>>DoCmd.Close
>>DoCmd.OpenForm "formB"
>>
>>
>>cuma kalau kasus saya bukan forms tapi file
>>
>>
>>
>>
>>
>>
>>
>>Pada 23 Januari 2014 07.00, hari yanto <har_i20002000@yahoo.com> menulis:
>>
>>
>>
>>>
>>>[Attachment(s) from hari yanto included below]
>>>him mah....,
>>>
>>>
>>>Bila kita menutup aplikasi Ms Acces yang sedang dibuka oleh user lain,
>>> apalagi oleh kita sendiri, sepertinya tidak mungkin. Akan muncul pesan
>>> bahwa aktivitas tersebut tidak diperkenankan (denied).
>>>
>>>
>>>Akan tetapi, itu tidak berarti tidak jalan keluar untuk menutup aplikasi.
>>> Salah satunya, kita dapat memaksa tutup dengan memanfaatkan Task Manager
>>> (bila dilakukan secara manual).
>>>
>>>
>>>Dalam bahasa VBA, isian dari Task Manager itu bisa kita collecting satu
>>> persatu (dari pintu Windows Management Instrumentation --WMI -- service).
>>> Dari sinilah kita bisa memaksa Ms Access tutup.
>>>
>>>
>>>
>>>Sayangnya, ada kelemahan mendasar:
>>> 1. WMI tidak mendefinisikan nama file yang sedang dicollecting. Yang
>>> diuraikan hanya sebatas ProcessID atas aplikasi apapun yang sedang
>>> running. Sehingga kita tidak bisa mematikan 1 file ms Access yang sedang
>>> berjalan. Maka yang di-terminate adalah semua MS Access.
>>> 2. Karena mematikan menggunakan terminate, maka file bawaan Ms Access
>>> bila terbuka (*.idb) masih terpampang di folder. Belum bisa dihapus
>>> secara otomatis. Inipun sejatinya, bisa dihandel, asalkan tahu lokasi
>>> foldernya.
>>>
>>>
>>>Berikut ini adalah script untuk memaksa Ms Acces ditutup:
>>>
>>>
>>>Option Explicit
>>>Function matikan(ProcessName As String)
>>>Dim objWMIService As Object
>>>Dim colProcesses As Object
>>>Dim objProcess As Object
>>>Dim strComputer As String
>>>
>>>    strComputer = "."
>>>
>>>    Set objWMIService =
>>> GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
>>>    strComputer "\root\cimv2")
>>>
>>>    Set colProcesses = objWMIService.ExecQuery _
>>>    ("SELECT * FROM Win32_Process WHERE Name='" _
>>>    ProcessName "'")
>>>    For Each objProcess In colProcesses
>>>        objProcess.Terminate
>>>    Next objProcess
>>>
>>>    Set objProcess = Nothing
>>>    Set colProcesses = Nothing
>>>    Set objWMIService = Nothing
>>>
>>>
>>>End Function
>>>
>>>
>>>
>>>Cara menggunakannnya, kita tinggal memasukkan nama aplikasi yang sedang
>>> running. Bila Notepad. Isi dengan notepad.exe. Begitu pula dengan Ms
>>> Access:
>>>
>>>
>>>Private Sub Command4_Click()
>>>    matikan ("MSACCESS.EXE")
>>>End Sub
>>>
>>>
>>>Dari script yang ada di dalam Function matikan(), sejatinya kita bisa pula
>>> mengkoleksi semua aplikasi yang sedang running. Silahkan dicoba-coba.
>>>
>>>
>>>Terlampir adalah contoh Ms Access 2003 yang merangkum semua uarain
>>> diatas.
>>>
>>>
>>>
>>>Semoga bisa membantu dan memberi semangat.
>>>
>>>
>>>Hariyanto (Surabaya)
>>>
>>>
>>>
>>>
>>>On Thursday, 23 January 2014, 16:35, him mah wrote:
>>>
>>>
>>>Assalamu'alaikum Wr. Wb.
>>>
>>>Sambil cari-cari di google, saya mau minta tolong  ke milis ini dulu
>>>
>>>bagaimana caranya mengetahui suatu file itu lagi dibuka atau tidak
>>>misal filenya c:\test.accdb
>>>
>>>terus ketika file itu diketahui sedang terbuka maka perintah selanjutnya
>>> adalah file tersebut di close atau ditutup
>>>
>>>kira-kira VBA nya seperti apa ya?
>>>
>>>
> terima kasih
>>>
>>>
>>>
>>>
>>
>
>


__._,_.___
Reply via web post Reply to sender Reply to group Start a New Topic Messages in this topic (7)
Recent Activity:
SPAM IS PROHIBITED
.

__,_._,___

Tidak ada komentar:

Posting Komentar