Newsgroup: it.comp.lang.visual-basic
Titolo: Compattazione db

Salve ragazzi,
riprendendo il post un po' + in basso, mi direste cosa ne pensate di questa
procedura.
E' esatta o ci possono essere falle ( access non presente e cose varie).
Grazie anticipatamente.
- - - - - - -- - - - - -- - - - -
Private Sub Command1_Click()
Dim jetdb As JRO.JetEngine
'Cambio il cursore
Screen.MousePointer = 11
Set jetdb = New JRO.JetEngine
MsgBox "Chiudere tutte le finestre del programma ancora aperte",
vbInformation
'Compatto il db in un altro
jetdb.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
App.Path & _
                    "\laboratorio.mdb",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path &
"\laboratorio_compact.mdb"
'Ammazzo l'originale e lo ricopio
Kill App.Path & "\laboratorio.mdb"
FileCopy App.Path & "\laboratorio_compact.mdb", App.Path &
"\laboratorio.mdb"
Kill App.Path & "\laboratorio_compact.mdb"
MsgBox "Operazione effettuata con successo.", vbInformation
Screen.MousePointer = 0
Unload Me
End Sub
- - - - - - - -
Che ne pensate?

 vbInformation
Mi spiegheresti cosa (e come) può fare l'operatore a questo punto, visto che
c'è solo il bottone OK e immediatamente dopo parte la compattazione?

 immediatamente dopo parte la compattazione?
Suppongo che per "finestre del programma", intendesse le finestre di Access, non
del SUO programma e la MessageBox e' modale al programma non al sistema.
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
Statuto: 
http://www.it-lang-vb.net/docs/Statuto.txt
UGIdotNET - 
http://www.ugidotnet.org

 non al sistema.
Sě, in questo caso, ok, ma se il messaggio č esposto dallo stesso
progetto/EXE cui appartengono le finestre aperte (da chiudere)? Insomma, un
messaggio del tipo "Hai chiuso tutte le finestre?" e un vbYesNo+vbQuestion
lo metterei... ;-)

 E' esatta o ci possono essere falle ( access non presente e cose varie).
CUT
Mi sembra vada bene anche la tua.
Perņ io, quando utilizzavo Access, avevo fatto questa routine che oltre alla
compattazione, eseguiva anche il ripristino del DB ed ha funzionato per
anni:
Private Sub CmdCreazione_Click()
Dim sOldName As String
Dim sNewName As String
Dim sNewName2 As String
Dim nEncrypt As Integer
Dim PrtContesto As String
Dim Nome As String
Dim Msg As String
Dim Risposta As String
Dim X As String
On Error GoTo SUB_ERR
PrtContesto = "Funzioni di Utilitą"
MdiMainDB.PnlMdi = ""
nomedb = "DATI730.MDB"
StrPath1 = Percorso & "\"
Msg = "PROCEDO CON LA RISTRUTTURAZIONE E COMPATTAZIONE" & Chr(10) & _
      "DEL DATABASE " & Chr(10) & _
       UCase(StrPath1) & nomedb & " ?" & Chr(10) & Chr(10) & _
       "L'operazione richede alcuni minuti..."
Risposta = MsgBox(Msg, 33, PrtContesto)
If Risposta <> 1 Then
   Exit Sub
End If
'TestPath idx
Nome = Mid$(nomedb, 1, Len(nomedb) - 4)
sNewName = StrPath1 & nomedb
GoSub RIPRISTINA
sOldName = StrPath1 & nomedb
sNewName = StrPath1 & nomedb
GoSub COMPATTA
Exit Sub
SUB_ERR:
  If Err <> 32755 Then 'Annullamento dell'utente
     MsgErrore
  End If
  Screen.MousePointer = vbDefault
  Exit Sub
COMPATTA:
  Screen.MousePointer = vbHourglass
  MdiMainDB.PnlMdi = " Compattazione in corso. Attendere..."
  MdiMainDB.PnlMdi.Refresh
 
  nEncrypt = dbDecrypt ' 4
 
  If sOldName = sNewName Then
    sNewName2 = sNewName 'Salva il nuovo nome
    sNewName = Left(sNewName, Len(sNewName) - 1) & "N"
  End If
 
  Select Case idx
         Case 1, 7
              DBEngine.CompactDatabase sOldName, sNewName, dbLangGeneral, dbVersion30 +
nEncrypt, ";pwd=ATLANTA"
         Case 5
              DBEngine.CompactDatabase sOldName, sNewName, dbLangGeneral, dbVersion30 +
nEncrypt, ";pwd=dakota"
         Case Else
              DBEngine.CompactDatabase sOldName, sNewName, dbLangGeneral, dbVersion30 +
nEncrypt
  End Select
  DoEvents
  If VBA.Right(sNewName, 1) = "N" Then
    Kill sNewName2 'Elimina quello precedente
    Name sNewName As sNewName2 'Rinomina quello nuovo con il nome originale
    sNewName = sNewName2 'Reimposta il nome corretto
  End If
 
  MdiMainDB.PnlMdi = " Pronto."
  MdiMainDB.PnlMdi.Refresh
 
  Screen.MousePointer = vbDefault
  Return
RIPRISTINA:
  Screen.MousePointer = vbHourglass
 
  MdiMainDB.PnlMdi = " Ripristino in corso. Attendere..."
  MdiMainDB.PnlMdi.Refresh
 
  DBEngine.RepairDatabase sNewName
  MdiMainDB.PnlMdi = " Pronto."
  MdiMainDB.PnlMdi.Refresh
 
  Screen.MousePointer = vbDefault
  Return
End Sub
Buon lavoro!
Nibbler
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 >
Ciao Lupo,scusa ho postato solo il codice interessato quindi capisco che è
di difficile interpretazione.
Questa routine fa parte di un progetto a parte rispetto al mio gestionale e
serve tra l'altro per compattare, backuppare e altre cose sul db (si chiama
infatti Utility db)....
il mio è solo un messaggio di avviso "guarda che devi chiudere il programma
principale prima di eseguire sta cosa, sennò sono c###i tuoi!!!" d'altronde
è scritto in chiare lettere nel manuale.
Sono utility da far partire saltuariamente o a fine giornata.
Giustamente come mi fai notare era possibile prevedere una via di uscita in
caso non si volesse far partire la procedura.
Hai perfettamente ragione!!!
Grazie del consiglio.

 uscita in caso non si volesse far partire la procedura.
Già, questo in ogni caso.