2009-03-26 22 views

risposta

16

Perché non tenere una copia vuota del database a portata di mano. Alla fine del mese, salva il database esistente, quindi copia il database vuoto al suo posto.

+0

Questo significa anche che si fa non è necessario compattare e riparare. – Fionnuala

+0

Ottima risposta. Molto pragmatico. – JohnFx

+0

E quindi è necessario replicare eventuali correzioni o miglioramenti sul database vuoto. Lo sto facendo da un po ', ma è molto incline agli errori, per non dire noioso. Darò a provare le altre soluzioni. – mvbentes

0

Poiché si tratta di un'azione ripetitiva, sarebbe meglio se si facesse un semplice script SQL per farlo.

DELETE FROM <table1>; 
DELETE FROM <table2>; 
... 
DELETE FROM <tablen>; 
+3

L'accesso MS non consente di avere più di una query DELETE nello script. –

11

La risposta di Craig è semplice e ragionevole. Se vuoi davvero una soluzione programmatica, il seguente script VBA cancellerà tutti i dati da ogni tabella escludendo le tabelle nascoste. Richiede DAO sia abilitato - in Visual Basic Editor, andare in Strumenti -> Riferimenti, e spuntare Microsoft DAO 3.6 Object Library, quindi OK:

Public Sub TruncateTables() 
'Majority of code taken from a data dictionary script I can no longer source nor find the author 

On Error GoTo Error_TruncateTables 

Dim DB As DAO.Database 
Dim TDF As DAO.TableDef 
Dim strSQL_DELETE As String 

Set DB = CurrentDb() 

    For Each TDF In DB.TableDefs 
     If Left(TDF.Name, 4) <> "MSys" Then 
      strSQL_DELETE = "DELETE FROM " & TDF.Name & ";" 
      DB.Execute strSQL_DELETE 
     End If 
    Next 

MsgBox "Tables have been truncated", vbInformation, "TABLES TRUNCATED" 
DB.Close 

Exit_Error_TruncateTables: 
    Set TDF = Nothing 
    Set DB = Nothing 
    Exit Sub 

Error_TruncateTables: 
    Select Case Err.Number 
     Case 3376 
      Resume Next 'Ignore error if table not found 
     Case 3270 'Property Not Found 
      Resume Next 
     Case Else 
      MsgBox Err.Number & ": " & Err.Description 
      Resume Exit_Error_TruncateTables 
    End Select 
End Sub 
0

Evidenziare tutte le righe e quindi premere il tasto Canc sulla tastiera. Se l'accesso sta facendo quella cosa, è che non ti lascia andare in fondo, quindi vai in una cella e fai clic su Ctrl + freccia giù. Per evidenziare tutte le righe, evidenzia la riga superiore, quindi scorri fino alla riga inferiore e tieni premuto Maiusc mentre selezioni la riga inferiore. Tutte le righe dovrebbero essere evidenziate.

8

Ottima risposta da Alistair, sebbene debba essere aggiornata. La vecchia istruzione if causerebbe errori e la vecchia stringa dinamica non funzionerebbe su tabelle con nomi che hanno uno spazio. Tratterebbe un nome come "informazioni sulla persona" come "persona". Ho aggiornato il codice e reso un po 'più semplice l'aggiunta di eccezioni all'istruzione if, se si desidera che alcune tabelle conservino i propri dati.

Public Sub TruncateTables() 
    'Majority of code taken from a data dictionary script I can no longer source nor find the author 

    On Error GoTo Error_TruncateTables 

    Dim DB As DAO.Database 
    Dim TDF As DAO.TableDef 
    Dim strSQL_DELETE As String 

    Set DB = CurrentDb() 

     For Each TDF In DB.TableDefs 
      If Not (TDF.Name Like "MSys*" Or TDF.Name Like "~*" Or Len(TDF.Connect) > 0) Then 
       'This will prevent system, temporary and linked tables from being cleared 
       strSQL_DELETE = "DELETE FROM " & "[" & TDF.Name & "]" 
       DB.Execute strSQL_DELETE 
      End If 
     Next 

    MsgBox "Tables have been truncated", vbInformation, "TABLES TRUNCATED" 
    DB.Close 

    Exit_Error_TruncateTables: 
     Set TDF = Nothing 
     Set DB = Nothing 
     Exit Sub 

    Error_TruncateTables: 
     Select Case Err.Number 
      Case 3376 
       Resume Next 'Ignore error if table not found 
      Case 3270 'Property Not Found 
       Resume Next 
      Case Else 
       MsgBox Err.Number & ": " & Err.Description 
       Resume Exit_Error_TruncateTables 
     End Select 
    End Sub 
+1

Attenzione! Questo cancellerà anche qualsiasi tabella collegata. Modificherò per aggiungere la condizione 'Len (tdf.Connect) = 0' per impedirlo. – mvbentes

0

Verranno eliminati tutti i dati di tutte le tabelle ad eccezione di tabelle di sistema

Dim T As TableDef 
DoCmd.SetWarnings False 
For Each T In CurrentDb.TableDefs 
    If T.Name Like "d2s_*" Then 
     DoCmd.RunSQL "DELETE * FROM " & T.Name 
    End If 
Next T 
DoCmd.SetWarnings True 

Un altro approccio: (Basato su suggerimento del Christopher Duke)

Dim T As TableDef 
DoCmd.SetWarnings False 
For Each T In CurrentDb.TableDefs 
    If Not Left(T.Name, 4) = "MSys" Then 
     DoCmd.RunSQL "DELETE * FROM [" & T.Name & "]" 
    End If 
Next T 
DoCmd.SetWarnings True 
Problemi correlati