Newsgroup: it.comp.appl.access
Titolo: Valanghe di query.

Ciao a tutti.
Piccolo problema che mi capita, quasi spesso.
Realizzando dei programmini (per mio uso e consumo) mi succede di vedere
crescere a dismisura delle query che inizialmente mi servivamo, ma poi man
mano modificando, correggendo, sostituendo ecc. ecc. mi ritrovo con delle
query che, porbabilmente, non hanno più nulla a che spartire con il resto
del database.
A questo punto mi chiedo:
- c'è un metodo per evitare che ciò accada?
- c'è un'utility che analizza l'esecuzione del programma e alla fine mi
elenca tutto ciò che è stato attivato? indi per cui, per esclusione, puoi
tranquillamente cancellare tutto ciò che è superfluo.

 tranquillamente cancellare tutto ciò che è superfluo.
Lorenzo Coronati e Sib hanno fatto un'utile funzione per verificare se una
tabella o una query è utilizzata da qualche parte nel DB. Presto sarà sul
Sito Comune, intanto eccotela:
Autori: Sib e LoreCoro
Public Function Segugio(Nome As String, Optional dettagli As Boolean) As
Boolean
'serve per verificare se una query o tabella e' usata in una form o in un
Report
'se si imposta dettagli a true, vengono elencati form e report contenenti la
stringa
On Error GoTo annulla
Dim ro As Recordset
Dim f As Variant
Dim m As Module
Dim qdf As QueryDef
Dim str As String
Dim intL As Integer
Dim intP As Integer
'Dim intMas As Integer 'Serve per riaprire le maschere
'Dim strMasAp() As String 'Serve per riaprire le maschere
Segugio = False
Set ro = CurrentDb.OpenRecordset("SELECT Name, Type FROM MSysObjects WHERE
Flags = 0;", dbOpenSnapshot)
ro.MoveFirst
DoCmd.Echo False
DoCmd.SetWarnings False
'intMas = MaschereAperte(strMasAp) 'Serve per riaprire le maschere
Do Until ro.EOF
    Select Case ro!Type
        Case -32768 'form
            DoCmd.OpenForm ro!Name, acDesign, , , , acHidden
            Set f = Forms(ro!Name)
            If TrovaStringa(Nome, f.RecordSource) Or TrovaDentro(Nome,
Forms(ro!Name)) Then
                Segugio = True
                If dettagli Then Debug.Print "Form " & ro!Name & vbCr;
Else: GoTo esci
            End If
            If f.HasModule Then
                Set m = f.Module
                If TrovaNelModulo(m, Nome) Then
                    Segugio = True
                    If dettagli Then Debug.Print "Modulo di classe della
form " & ro!Name & vbCr; Else GoTo esci
                End If
            End If
            DoCmd.Close acForm, ro!Name, acSaveNo
        Case -32764 'report
            DoCmd.OpenReport ro!Name, acViewDesign
            Set f = Reports(ro!Name)
            If TrovaStringa(Nome, f.RecordSource) Then
                Segugio = True
                If dettagli Then Debug.Print "Report " & ro!Name & vbCr;
Else GoTo esci
            End If
            If f.HasModule Then
                Set m = f.Module
                If TrovaNelModulo(m, Nome) Then
                    Segugio = True
                    If dettagli Then Debug.Print "Modulo di classe del
Report " & ro!Name & vbCr; Else GoTo esci
                End If
            End If
            DoCmd.Close acReport, ro!Name, acSaveNo
        Case -32761 'moduli
            DoCmd.OpenModule ro!Name
            Set m = Modules(ro!Name)
            If TrovaNelModulo(m, Nome) Then
                Segugio = True
                If dettagli Then Debug.Print "Modulo " & ro!Name & vbCr;
Else GoTo esci
            End If
            DoCmd.Close acModule, ro!Name, acSaveNo
        Case 5 'query
            Set qdf = CurrentDb.QueryDefs(ro!Name)
            intP = InStr(1, qdf.SQL, "FROM", vbTextCompare) + 5
            If InStr(1, qdf.SQL, "WHERE", vbTextCompare) > 0 Then
                intL = InStr(1, qdf.SQL, "WHERE", vbTextCompare) - (InStr(1,
qdf.SQL, "FROM", vbTextCompare) + 5)
            Else
                intL = Len(qdf.SQL) - (InStr(1, qdf.SQL, "FROM",
vbTextCompare) + 5)
            End If
            str = Mid(qdf.SQL, intP, intL)
            If TrovaStringa(Nome, str) Then
                Segugio = True
                If dettagli Then Debug.Print "Query " & ro!Name & vbCr; Else
GoTo esci
            End If
        Case Else
    End Select
    ro.MoveNext
Loop
esci:
DoCmd.Echo True
DoCmd.SetWarnings True
Set ro = Nothing
Set f = Nothing
Set m = Nothing
Set qdf = Nothing
'Serve per riaprire le maschere
'If intMas > 0 Then
'    For intL = 1 To intMas
'        DoCmd.OpenForm strMasAp(intL, 1), , , strMasAp(intL, 2)
'    Next
'End If
Exit Function
annulla:
MsgBox "Si è verificato un errore (" & Err.Number & ")" & Error(Err.Number),
vbCritical + vbOKOnly, "Errore"
Resume esci
End Function
Public Function TrovaStringa(parte As String, stringa As String) As Boolean
    TrovaStringa = InStr(1, stringa, parte)
End Function
Public Function MaschereAperte(str() As String) As Integer 'Serve per
riaprire le maschere
Dim fm As Form
    MaschereAperte = 0
    ReDim str(Forms.Count, 2)
    For Each fm In Forms
        MaschereAperte = MaschereAperte + 1
        str(MaschereAperte, 1) = fm.Name
        str(MaschereAperte, 2) = fm.Filter
    Next
End Function
Public Function TrovaDentro(Nome As String, f As Form) As Boolean
Dim ctl As Control
TrovaDentro = False
For Each ctl In f
    If ctl.ControlType = acListBox Or ctl.ControlType = acComboBox Then
        If ctl.RowSourceType = "Table/query" Then TrovaDentro =
TrovaStringa(Nome, ctl.RowSource) Or TrovaDentro
    End If
Next
End Function
Public Function TrovaNelModulo(m As Module, s As String) As Boolean
'ricerca la stringa s nel modulo m
'On Error GoTo annulla
Dim ri As Long, ci As Long, rf As Long, cf As Long
Dim strSinistra As String, strDestra As String
TrovaNelModulo = m.Find(s, ri, ci, rf, cf)
esci:
Exit Function
annulla:
'MsgBox Err & ": " & Err.Description
TrovaNelModulo = False
Resume esci
End Function
--
Ciao, AntoGal
*************************************************
Home Page (area programmatori di VolFtp)
http://volftp.mondadori.com/italiani/galletta/
per scaricare un gioco di DAMA ITALIANA
*************************************************

Fantasticoooooooooo, e una manna soprattutto per chi non è un programmatore
e non progetta a tavolino il database.
bye
Lore;-)

tranquillamente cancellare tutto ciò che è superfluo.
mi pare che qualche giorno fa qualcuno avesse iniziato un thread
proprio per annunciare che aveva realizzato un'applicazione in
proposito.  Lorenzo Coronati, forse?
--
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/


...................é una manna (voce del verbo essere).
A cosa ti riferisci? Alla funzione appena messa a disposizione da Antonio
(come al solito puntuale e disponibile) o alla mia richiesta?
Ciao
Alfio

 Set ro = CurrentDb.OpenRecordset("SELECT Name, Type FROM MSysObjects WHERE
Flags = 0;", bOpenSnapshot)
Scrivetela cosi':
Set ro = CurrentDb.OpenRecordset("SELECT Name, Type FROM MSysObjects WHERE
Flags = 0 AND Flags = 8;", bOpenSnapshot)
Tutto qui.


 Flags = 0 OR Flags = 8;", bOpenSnapshot)
