Newsgroup: it.comp.appl.access
Titolo: [?] Compattazione Database

Salve
Da una maschera, mediante pulsante, vorrei lanciare la Compattazione del
Database, ma senza usare DBEngine.CompactDatabase che mi obbliga ad
avere il db chiuso e acrearne un copia, vorrei semplicemnte riuscire a
fare quello che fa Strumenti->Utilità di database->compatta.
Ho provato con RunCommand o con le macro ma mi chiede la destinazione
Ho provato con DoCmd.DoMenuItem ma non riesco ad individuare la barra di
menu giusta
Ho provato le sendkeys ma non funge
Che posso fare??
Grazie

 ha scritto nel messaggio
news:3A7143E7...@nospam.it...

Hai già visto le soluzioni proposte nel sito comune?
http://members.xoom.it/_XOOM/it_db_access/faq50.htm
http://members.xoom.it/_XOOM/it_db_access/tips10.htm
Ciao.




 Grazie mille
Per favore scrivi la tua risposta dopo il messaggio precedente (come faccio
io);
Ti invio i due collegamenti:
'---------------- inizio uno --------------
Come posso compattare l'mdb in uso?
Autore: Federico Luciani
Ho preparato questo script che se eseguito da un mdb, lo chiude, lo compatta
e lo riapre.
Prima di eseguire lo script e' consigliabile chiudere tutte le forms.
Per eseguirlo basta usare, da access, la shell in questo modo:
  Dim strPath As String
  strPath = "wscript.exe " & "C:\Temp\Compact.vbs " & Chr$(34) &
CurrentDb.Name & Chr$(34)
  Call Shell(strPath, vbNormalFocus)
attenzione ad usare il giusto path per Compact.vbs
Naturalmente per funzionare, nel pc deve essere presente Windows Script
Host! per windows 98 seconda edizione, non ci sono problemi, per gli altri
os non saprei; magari controllate che sul pc ci sia wscript.exe, altrimenti
e' possibile scaricarlo dal sito MS.
Attenzione, lo script, cosi' come e', non funziona con gli mdb protetti da
password; invece funziona benissimo se si usa la protezione a livello
utente.
Copiate il codice seguente in un file di testo e salvatelo come Compact.vbs
'*******************************************************************
'start code
'*******************************************************************
'Nome:        Compact.vbs
'Descrizione: compatta e riapre l'mdb in uso
'Autore:      Federico Luciani
'Creato:      10/11/2000
'Utilizzo:    dall'mdb eseguire:
'   Dim strPath As String
'   strPath = "wscript.exe " & "C:\Temp\Compact.vbs " & Chr$(34) &
CurrentDb.Name & Chr$(34)
'   Call Shell(strPath, vbNormalFocus)
'
'*******************************************************************
Set objArgs = WScript.Arguments
Call Init()
Dim objMDB
Dim objFSO
Dim strMdbFile
Dim strTmpFile
'nome e path dell'mdb passato come argomento allo script
strMdbFile = objArgs(0)
Set objFSO = CreateObject("Scripting.FileSystemObject")
'genera un nome file temporaneo
strTmpFile = objFSO.GetTempName
strTmpFile = Left(strMdbFile, InstrRev(strMdbFile, "\")) & strTmpFile
'si collega alla sessione access aperta
Set objMDB = WScript.GetObject(strMdbFile)
'minimizza la finestra di access
objMDB.RunCommand 11
'chiude l'mdb in uso
objMDB.CloseCurrentDatabase
'compatta l'mdb in un file temporaneo
objMDB.Dbengine.CompactDatabase strMdbFile, strTmpFile
'Msgbox strMdbFile & " -> " & strTmpFile
'elimina l'mdb originale
objFSO.DeleteFile(strMdbFile)
'copia il file tempraneo nel'mdb originale
objFSO.CopyFile strTmpFile, strMdbFile
'elimina il file temporaneo
objFSO.DeleteFile(strTmpFile)
'riapre l'mdb compattato
objMDB.OpenCurrentDatabase strMdbFile
'maximizza la finestra di access
objMDB.RunCommand 10
Set objFSO = nothing
Set objMDB = nothing
'*******************************************************************
'Controlla che il parametro sia un file mdb
'*******************************************************************
Sub Init()
 'controlla che l'argomento sia un mdb
  If objArgs.Count  < 1 Then WScript.Quit
  If Right(objArgs(0),4) <> ".mdb" Then
    Msgbox "Il file selezionato non e' un mdb.",  16, "Errore!"
    WScript.Quit
  End If
End Sub
'*******************************************************************
'end code
'*******************************************************************
 '---------------- fine uno --------------
'---------------- inizio due --------------
Compattare tutti i BackEnd dal FrontEnd. (95/97)
Fornitore: Riccardo Pozzi e Federico Luciani
Sub CompattaBE()
   'Autore: Riccardo Pozzi e Federico Luciani
On Error GoTo gestErr
   Dim backend As String
   Dim strSQL As String
   Dim rs As Recordset
   Dim risp As Integer
   Dim copia As String
   Dim msg As String
   strSQL = "SELECT Trim([Database]) AS DB " & _
            "FROM MSysObjects " & _
            "GROUP BY Trim([Database]), MSysObjects.Type " & _
            "HAVING (((MSysObjects.Type)=6));"
   Set rs = CurrentDb.OpenRecordset(strSQL)
   If rs.EOF And rs.BOF Then GoTo esci
   risp = MsgBox("Procedere con salvataggio e compattazione?",  _
      vbQuestion + vbYesNo)
   If risp <> vbYes Then Exit Sub
   DoCmd.Hourglass True
   DoCmd.SetWarnings False
   rs.MoveFirst
   msg = ""
   Do
       backend = rs![DB]
       msg = backend & vbCrLf & msg
       DBEngine.RepairDatabase backend
       DBEngine.CompactDatabase backend, backend & ".new"
       copia = Dir(backend & ".bak")
       If copia <> "" Then Kill backend & ".bak"
       Name backend As backend & ".bak"
       Name backend & ".new" As backend
       rs.MoveNext
   Loop Until rs.EOF
   MsgBox "Compattazione terminata per i seguenti DB:" & _
      vbCrLf & msg, vbExclamation
esci:
   rs.Close
   DoCmd.SetWarnings True
   DoCmd.Hourglass False
   Exit Sub
gestErr:
   MsgBox Err.Number & " - " & Err.Description
   GoTo esci
End Sub
Nota: Attenzione, prima di lanciare la procedura, chiudere tutte le maschere
legate.
'---------------- fine uno --------------
Ciao.

ig wrote:

Era una domanda che anche io avevo esposto, e Federico Luciani (proprio
giovedì) mi ha suggerito:
SendKeys "%SUC"  (che pero' funziona solo se la voce di menu
Strumenti-Utilita-Compatta e' visibile)
Nel mio caso ha funzionato correttamente.
Altrimenti prova a controllare se nella maschera (di utilizzo) sia attivo
il controllo dei Menu' .