2011-10-20 19 views
13

में तालिका से संबंधित सभी प्रश्नों को कैसे ढूंढें मेरे पास डेटाबेस है। इसमें मेरे पास सैकड़ों टेबल, मैक्रोज़ और रूप हैं। कोई मेरी समस्या यह नहीं है कि मुझे सभी प्रश्नों, मैक्रोज़ जो विशिष्ट तालिका से संबंधित हैं, को ढूंढना है।एमएस एक्सेस

मैं माइक्रोसॉफ्ट acess उपयोग कर रहा हूँ 2000

लेकिन मैं भी मैं पहुँच 2007 में objet निर्भरता की कोशिश की, यह स्वचालित रूप से त्रुटियों और पास के बहुत से पता चला है।

क्या यह पाने के लिए कोई आसान तरीका है ???

धन्यवाद, षणमुगम

उत्तर

22

आप सिस्टम टेबल के खिलाफ एसक्यूएल क्वेरी को निष्पादित करने के लिए सीधे निर्भरता है कि और अधिक उपयोगकर्ता के अनुकूल रास्ते में 2003+ संस्करणों में दिखाए जाते हैं प्राप्त करने की कोशिश कर सकते हैं। मुझे यकीन है कि अगर 2000 (यह 2003+ में करता है) पर काम करता है, लेकिन यह कोशिश कर रहा लायक है नहीं कर रहा हूँ:

SELECT DISTINCT MSysObjects.Name 
FROM MSysQueries INNER JOIN MSysObjects ON MSysQueries.ObjectId=MSysObjects.Id 
WHERE (((MSysQueries.Name1) Like "*" & [TableName] & "*")) OR (((MSysQueries.Name2) Like "*" & [TableName] & "*")) 

आप एक्सेस सिस्टम टेबल की अनुमति है, तो जाँच करने के लिए आवश्यकता हो सकती है ...

आशा इससे

+1

हाय इगोर टूरमैन, यह वास्तव में सहायक था। क्या आप एक विशिष्ट क्वेरी से संबंधित प्रश्नों और तालिकाओं को कैसे ढूंढ सकते हैं? – shanmugamgsn

6

आप तृतीय-पक्ष सॉफ़्टवेयर खरीद सकते हैं जो आपके लिए यह करेगा, लेकिन मुझे इसकी आवश्यकता कभी महसूस नहीं हुई है। इसके बजाय, मैंने कुछ प्रक्रियाएं लिखीं जो यह करेंगे। उन्हें डीएओ के संदर्भ की आवश्यकता है।

पहला (SearchQueries) केवल प्रश्नों के पाठ की खोज करता है और बहुत तेजी से चलता है। दूसरा (सर्चडीबी) फॉर्म, मैक्रोज़, प्रश्न, रिपोर्ट, और कोड खोजता है। इसमें थोड़ा समय लगता है लेकिन बहुत गहन है। उपयोग बहुत आत्म-स्पष्टीकरणपूर्ण होना चाहिए, लेकिन यदि आप कुछ भी अनिश्चित हैं तो प्रश्न पूछें।

यहाँ प्रक्रियाओं का पूरा पाठ है:

Sub SearchQueries(SearchText As String, _ 
        Optional ShowSQL As Boolean = False, _ 
        Optional QryName As String = "*") 
    On Error Resume Next 
    Dim QDef As QueryDef 

    For Each QDef In CurrentDb.QueryDefs 
     If QDef.Name Like QryName Then 
      If InStr(QDef.SQL, SearchText) > 0 Then 
       Debug.Print QDef.Name 
       If ShowSQL Then Debug.Print QDef.SQL & vbCrLf 
      End If 
     End If 
    Next QDef 
End Sub 


'Updated: 1/19/09 Limit search by object name pattern 
Sub SearchDB(SearchText As String, _ 
      Optional ObjType As AcObjectType = acDefault, _ 
      Optional ObjName As String = "*") 
Dim db As Database, obj As AccessObject, Ctl As Control, Prop As Property 
Dim Frm As Form, Rpt As Report, mdl As Module 
Dim objLoaded As Boolean, Found As Boolean, Instances As Long 
Dim SLine As Long, SCol As Long, ELine As Long, ECol As Long 

    On Error GoTo Err_SearchDB 

    Set db = CurrentDb 
    Application.Echo False 

    '=============================================== 
    'Search queries 
    If ObjType = acDefault Or ObjType = acQuery Then 
     Debug.Print "Queries:" 
     SearchQueries SearchText, False, ObjName 
     Debug.Print vbCrLf 
    End If 


    '=============================================== 
    'Search forms 
    If ObjType = acDefault Or ObjType = acForm Then 
     Debug.Print "Forms:" 
     On Error Resume Next 
     For Each obj In CurrentProject.AllForms 
      If obj.Name Like ObjName Then 
       objLoaded = obj.IsLoaded 
       If Not obj.IsLoaded Then DoCmd.OpenForm obj.Name, acDesign, , , , acHidden 
       Set Frm = Application.Forms(obj.Name) 
       For Each Prop In Frm.Properties 
        Err.Clear 
        If InStr(Prop.Value, SearchText) > 0 Then 
         If Err.Number = 0 Then 
          Debug.Print "Form: " & Frm.Name & _ 
             " Property: " & Prop.Name & _ 
             " Value: " & Prop.Value 
         End If 
        End If 
       Next Prop 
       If Frm.HasModule Then 
        SLine = 0: SCol = 0: ELine = 0: ECol = 0: Instances = 0 
        Found = Frm.Module.Find(SearchText, SLine, SCol, ELine, ECol) 
        Do Until Not Found 
         Instances = Instances + 1 
         SLine = ELine + 1: SCol = 0: ELine = 0: ECol = 0 
         Found = Frm.Module.Find(SearchText, SLine, SCol, ELine, ECol) 
        Loop 
        If Instances > 0 Then Debug.Print "Form: " & Frm.Name & _ 
         " Module: " & Instances & " instances" 

       End If 
       For Each Ctl In Frm.Controls 
        For Each Prop In Ctl.Properties 
         Err.Clear 
         If InStr(Prop.Value, SearchText) > 0 Then 
          If Err.Number = 0 Then 
           Debug.Print "Form: " & Frm.Name & _ 
              " Control: " & Ctl.Name & _ 
              " Property: " & Prop.Name & _ 
              " Value: " & Prop.Value 
          End If 
         End If 
        Next Prop 
       Next Ctl 
       Set Frm = Nothing 
       If Not objLoaded Then DoCmd.Close acForm, obj.Name, acSaveNo 
       DoEvents 
      End If 
     Next obj 
     On Error GoTo Err_SearchDB 
     Debug.Print vbCrLf 
    End If 


    '=============================================== 
    'Search modules 
    If ObjType = acDefault Or ObjType = acModule Then 
     Debug.Print "Modules:" 
     For Each obj In CurrentProject.AllModules 
      If obj.Name Like ObjName Then 
       objLoaded = obj.IsLoaded 
       If Not objLoaded Then DoCmd.OpenModule obj.Name 
       Set mdl = Application.Modules(obj.Name) 
       SLine = 0: SCol = 0: ELine = 0: ECol = 0: Instances = 0 
       Found = mdl.Find(SearchText, SLine, SCol, ELine, ECol) 
       Do Until Not Found 
        Instances = Instances + 1 
        SLine = ELine + 1: SCol = 0: ELine = 0: ECol = 0 
        Found = mdl.Find(SearchText, SLine, SCol, ELine, ECol) 
       Loop 
       If Instances > 0 Then Debug.Print obj.Name & ": " & Instances & " instances" 
       Set mdl = Nothing 
       If Not objLoaded Then DoCmd.Close acModule, obj.Name 
      End If 
     Next obj 
     Debug.Print vbCrLf 
    End If 


    '=============================================== 
    'Search macros 
    If ObjType = acDefault Or ObjType = acMacro Then 
     'Debug.Print "Macros:" 
     'Debug.Print vbCrLf 
    End If 


    '=============================================== 
    'Search reports 
    If ObjType = acDefault Or ObjType = acReport Then 
     Debug.Print "Reports:" 
     On Error Resume Next 
     For Each obj In CurrentProject.AllReports 
      If obj.Name Like ObjName Then 
       objLoaded = obj.IsLoaded 
       If Not obj.IsLoaded Then DoCmd.OpenReport obj.Name, acDesign 
       Set Rpt = Application.Reports(obj.Name) 
       For Each Prop In Rpt.Properties 
        Err.Clear 
        If InStr(Prop.Value, SearchText) > 0 Then 
         If Err.Number = 0 Then 
          Debug.Print "Report: " & Rpt.Name & _ 
             " Property: " & Prop.Name & _ 
             " Value: " & Prop.Value 
         End If 
        End If 
       Next Prop 
       If Rpt.HasModule Then 
        SLine = 0: SCol = 0: ELine = 0: ECol = 0: Instances = 0 
        Found = Rpt.Module.Find(SearchText, SLine, SCol, ELine, ECol) 
        Do Until Not Found 
         Instances = Instances + 1 
         SLine = ELine + 1: SCol = 0: ELine = 0: ECol = 0 
         Found = Rpt.Module.Find(SearchText, SLine, SCol, ELine, ECol) 
        Loop 
        If Instances > 0 Then Debug.Print "Report: " & Rpt.Name & _ 
         " Module: " & Instances & " instances" 

       End If 
       For Each Ctl In Rpt.Controls 
        For Each Prop In Ctl.Properties 
         If InStr(Prop.Value, SearchText) > 0 Then 
          Debug.Print "Report: " & Rpt.Name & _ 
             " Control: " & Ctl.Name & _ 
             " Property: " & Prop.Name & _ 
             " Value: " & Prop.Value 
         End If 
        Next Prop 
       Next Ctl 
       Set Rpt = Nothing 
       If Not objLoaded Then DoCmd.Close acReport, obj.Name, acSaveNo 
       DoEvents 
      End If 
     Next obj 
     On Error GoTo Err_SearchDB 
     Debug.Print vbCrLf 
    End If 

Exit_SearchDB: 
    Application.Echo True 
    Exit Sub 
Err_SearchDB: 
    Application.Echo True 
    Debug.Print Err.Description 
    Debug.Assert False 
    Resume 
End Sub 
+0

आपके उत्तर mwolfe02 के लिए धन्यवाद। (देर से उत्तर के लिए क्षमा करें)। जैसा कि आपने कहा था कि पहला मॉड्यूल सरल और समझने में आसान था। जबकि दूसरा मेरे लिए बहुत जटिल था। लेकिन मैंने अभी तक दोनों की कोशिश नहीं की। मैं टॉमो द्वारा कार्यालय जाउंगा और दोनों कोशिश करूँगा और आपको बता दूंगा। अगर मैं और समझ नहीं पाया तो मैं जानूंगा। – shanmugamgsn

+1

बहुत बहुत धन्यवाद। बस याद रखें कि कोड चलाने के लिए आपको डीएओ (टूल्स | संदर्भ | माइक्रोसॉफ्ट ऑफिस डेटा Acceess इंजन ऑब्जेक्ट्स जोड़ें ...) – ankostis

+0

@ mwolfe02 यह एक मूर्ख सवाल हो सकता है, लेकिन आपके पास दो Err_Search डीबी शर्तें क्यों हैं जब प्रोग्राम त्रुटि पर Err_SearchDB पर जाना चाहिए? – 114

2
SELECT DISTINCT 
MSysObjects.Name, MSysQueries.Name1, MSysQueries.Name2, MSysQueries.Expression 
FROM 
MSysQueries 
INNER JOIN 
MSysObjects ON MSysQueries.ObjectId = MSysObjects.Id; 

यह मैं सब कुछ मैं के लिए देख रहा था की एक तालिका दी। धन्यवाद इगोर।

+1

क्या आप इगोर के उत्तर में किए गए परिवर्तनों को समझाने के लिए [संपादित कर सकते हैं] जिससे इसका नेतृत्व हुआ? –

+0

यह बेहद सहायक था, धन्यवाद! –

2

अन्य लोगों के लिए जो इस पृष्ठ को मेरे जैसा करते हैं, नीचे एक भिन्नता है जिसमें सभी प्रश्नों के सारणी या अभिव्यक्तियों में एक स्ट्रिंग के अवसर शामिल हैं। (यह एक्सेस 2003 और एक्सेस 2013 दोनों में काम करता था।)

SELECT DISTINCT 
MSysObjects.Name, MSysQueries.Name1, MSysQueries.Name2, MSysQueries.Expression 
FROM 
MSysQueries 
INNER JOIN 
MSysObjects ON MSysQueries.ObjectId = MSysObjects.Id 
WHERE 
( (((MSysQueries.Name1) Like "*" & [String to search for] & "*")) 
OR (((MSysQueries.Name2) Like "*" & [String to search for] & "*")) 
OR (((MSysQueries.Expression) Like "*" & [String to search for] & "*")) ) 

And "Comment: You will be prompted once, for the [String to search for]"<>"" 
And "Comment: The starting point for this code came from link:"<> 
"http://stackoverflow.com/questions/7831071/how-to-find-all-queries-related-to-table-in-ms-access# " 
; 
संबंधित मुद्दे