diff --git a/decompose.vbs b/decompose.vbs new file mode 100644 index 0000000..f7b6c89 --- /dev/null +++ b/decompose.vbs @@ -0,0 +1,149 @@ +' Usage: +' cscript decompose.vbs + +' Converts all modules, classes, forms and macros from an Access Project file (.adp) to +' text and saves the results in separate files to . Requires Microsoft Access. +Option Explicit + +Const acForm = 2 +Const acModule = 5 +Const acMacro = 4 +Const acReport = 3 +Const acQuery = 1 +Const acExportTable = 0 + +' BEGIN CODE +Dim fso, relDoc, ACCDBFilename, sExportpath +Set fso = CreateObject("Scripting.FileSystemObject") +Set relDoc = CreateObject("Microsoft.XMLDOM") + +If (Wscript.Arguments.Count = 0) Then + MsgBox "Please provide the .accdb database file", vbExclamation, "Error" + Wscript.Quit() +End If +ACCDBFilename = fso.GetAbsolutePathName(Wscript.Arguments(0)) + +If (Wscript.Arguments.Count = 1) Then + sExportpath = "" +Else + sExportpath = Wscript.Arguments(1) +End If + + +exportModulesTxt ACCDBFilename, sExportpath + +If (Err <> 0) And (Err.Description <> Null) Then + MsgBox Err.Description, vbExclamation, "Error" + Err.Clear +End If + +Function exportModulesTxt(ACCDBFilename, sExportpath) + Dim myComponent, sModuleType, sTempname, sOutstring + Dim myType, myName, myPath, hasRelations + myType = fso.GetExtensionName(ACCDBFilename) + myName = fso.GetBaseName(ACCDBFilename) + myPath = fso.GetParentFolderName(ACCDBFilename) + + 'if no path was given as argument, use a relative directory + If (sExportpath = "") Then + sExportpath = myPath & "\Source" + End If + 'On Error Resume Next + fso.DeleteFolder (sExportpath) + fso.CreateFolder (sExportpath) + On Error GoTo 0 + + Wscript.Echo "starting Access..." + Dim oApplication + Set oApplication = CreateObject("Access.Application") + Wscript.Echo "Opening " & ACCDBFilename & " ..." + If (Right(ACCDBFilename, 4) = ".adp") Then + oApplication.OpenAccessProject ACCDBFilename + Else + oApplication.OpenCurrentDatabase ACCDBFilename + End If + oApplication.Visible = False + + Wscript.Echo "exporting..." + Dim myObj + For Each myObj In oApplication.CurrentProject.AllForms + Wscript.Echo "Exporting FORM " & myObj.FullName + oApplication.SaveAsText acForm, myObj.FullName, sExportpath & "\" & myObj.FullName & ".form.txt" + oApplication.DoCmd.Close acForm, myObj.FullName + Next + For Each myObj In oApplication.CurrentProject.AllModules + Wscript.Echo "Exporting MODULE " & myObj.FullName + oApplication.SaveAsText acModule, myObj.FullName, sExportpath & "\" & myObj.FullName & ".module.txt" + Next + For Each myObj In oApplication.CurrentProject.AllMacros + Wscript.Echo "Exporting MACRO " & myObj.FullName + oApplication.SaveAsText acMacro, myObj.FullName, sExportpath & "\" & myObj.FullName & ".macro.txt" + Next + For Each myObj In oApplication.CurrentProject.AllReports + Wscript.Echo "Exporting REPORT " & myObj.FullName + oApplication.SaveAsText acReport, myObj.FullName, sExportpath & "\" & myObj.FullName & ".report.txt" + Next + For Each myObj In oApplication.CurrentDb.QueryDefs + Wscript.Echo "Exporting QUERY " & myObj.Name + oApplication.SaveAsText acQuery, myObj.Name, sExportpath & "\" & myObj.Name & ".query.txt" + Next + For Each myObj In oApplication.CurrentDb.TableDefs + If Not Left(myObj.Name, 4) = "MSys" Then + Wscript.Echo "Exporting TABLE " & myObj.Name + oApplication.ExportXml acExportTable, myObj.Name, , sExportpath & "\" & myObj.Name & ".table.txt" + 'put the file path as a second parameter if you want to export the table data as well, instead of ommiting it and passing it into a third parameter for structure only + End If + Next + + hasRelations = False + relDoc.appendChild relDoc.createElement("Relations") + For Each myObj In oApplication.CurrentDb.Relations 'loop though all the relations + If Not Left(myObj.Name, 4) = "MSys" Then + Dim relName, relAttrib, relTable, relFoTable, fld + hasRelations = True + + relDoc.ChildNodes(0).appendChild relDoc.createElement("Relation") + Set relName = relDoc.createElement("Name") + relName.Text = myObj.Name + relDoc.ChildNodes(0).LastChild.appendChild relName + + Set relAttrib = relDoc.createElement("Attributes") + relAttrib.Text = myObj.Attributes + relDoc.ChildNodes(0).LastChild.appendChild relAttrib + + Set relTable = relDoc.createElement("Table") + relTable.Text = myObj.Table + relDoc.ChildNodes(0).LastChild.appendChild relTable + + Set relFoTable = relDoc.createElement("ForeignTable") + relFoTable.Text = myObj.ForeignTable + relDoc.ChildNodes(0).LastChild.appendChild relFoTable + + Wscript.Echo "Exporting relation " & myObj.Name & " between tables " & myObj.Table & " -> " & myObj.ForeignTable + + For Each fld In myObj.Fields 'in case the relationship works with more fields + Dim lf, ff + relDoc.ChildNodes(0).LastChild.appendChild relDoc.createElement("Field") + + Set lf = relDoc.createElement("Name") + lf.Text = fld.Name + relDoc.ChildNodes(0).LastChild.LastChild.appendChild lf + + Set ff = relDoc.createElement("ForeignName") + ff.Text = fld.ForeignName + relDoc.ChildNodes(0).LastChild.LastChild.appendChild ff + + Wscript.Echo " Involving fields " & fld.Name & " -> " & fld.ForeignName + Next + End If + Next + If hasRelations Then + relDoc.InsertBefore relDoc.createProcessingInstruction("xml", "version='1.0'"), relDoc.ChildNodes(0) + relDoc.Save sExportpath & "\relations.rel.txt" + Wscript.Echo "Relations successfuly saved in file relations.rel.txt" + End If + + oApplication.CloseCurrentDatabase + oApplication.Quit + +End Function \ No newline at end of file