SQLMacro.TXT

Developers of Microsoft ACCESS databases may want to produce hardcopy 
documentation of their SQL statements, but the SQL View in the Query Design 
Window is not easy to read and understand; neither is the SQL reported by the 
Database Documentor.

The WORD6 Macro that follows will format the SQL statement to make it much 
easier to read.  Copy and Paste from the ACCESS SQL View to a blank WORD 
document and run the macro.

As it stands the macro is not fully comprehensive - it doesn't cater for every 
SQL reserved word, but it covers most of the commonly used ones.  Others 
could be added easily to cover individual circumstances.

Macro FormatSQL ------------------------------------------------------

Sub MAIN
EditSelectAll

ScreenUpdating 0

FormatFont .Font = "Courier New", .Points = "11"



FormatTabs .Position = "1" + Chr$(34), .DefTabs = "0.5" + Chr$(34), .Align = 
0, .Leader = 0, .Set
FormatTabs .Position = "5" + Chr$(34), .DefTabs = "0.5" + Chr$(34), .Align = 
0, .Leader = 0, .Set

Replace("^p",    	        "")

Replace("TRANSFORM ",     	"TRANSFORM ^p")
Replace("SELECT ",        	"^pSELECT ^p")
Replace("PARAMETERS ",    	"PARAMETERS ^p^t")
Replace("DELETE ",        	"^pDELETE ^p")
Replace("DISTINCTROW ",   	"DISTINCTROW ^p^t")

Replace("INNER JOIN ",    	"^pINNER JOIN ^p^t")
Replace("LEFT JOIN ",     	"^pLEFT JOIN ^p^t")
Replace("RIGHT JOIN ",    	"^pRIGHT JOIN ^p^t")
Replace(" JOIN",          	" JOIN ")
Replace(" ON ",           	"^pON ^p^t")

Replace("FROM ",          	"^pFROM^p^t")
Replace("WHERE ",         	"^pWHERE^p^t")
Replace("ORDER BY ", 	        "^pORDER BY^p^t")
Replace("GROUP BY ", 	        "^pGROUP BY^p^t")
Replace("HAVING ", 		"^pHAVING^p^t")
Replace("INTO ",		"^pINTO^p^t")

Replace("DESC ", 		"^t DESC ")
Replace(", ",                   " ^p^t")
Replace(" AS ",	                "^t AS ")

Replace("PIVOT ", 		"^pPIVOT^p^t")
Replace("WITH OWNERACCESS OPTION", "^pWITH OWNERACCESS OPTION^p")
Replace(";^p", 		        "^p;^p^p")

ScreenUpdating 1
StartOfDocument

End Sub


Sub Replace(From$, To$)
EditReplace .Find = From$, .Replace = To$,  .MatchCase = 1, .WholeWord = 1,  
.ReplaceAll,  .Wrap = 1
End Sub

End of Macro FormatSQL------------------------------------------------



Here is the INVOICES query from the NWIND sample database:
----------------------------------------------------------------------
SELECT DISTINCTROW Orders.[Shipped Date], Orders.[Ship Name], Orders.[Ship 
Address], Orders.[Ship City], Orders.[Ship Region], Orders.[Ship Postal 
Code], Orders.[Ship Country], Orders.[Customer ID], Customers.[Company Name], 
Customers.Address, Customers.City, Customers.Region, Customers.[Postal Code], 
Customers.Country, Employees.[Last Name], Employees.[First Name], [Order 
Details].[Order ID], Orders.[Order Date], Orders.[Required Date], 
Orders.[Ship Via], [Order Details].[Product ID], Products.[Product Name], 
[Order Details].Quantity, [Order Details].[Unit Price], [Order 
Details].Discount, Orders.Freight
FROM Employees INNER JOIN ((Customers INNER JOIN Orders ON 
Customers.[Customer ID] = Orders.[Customer ID]) INNER JOIN (Products INNER 
JOIN [Order Details] ON Products.[Product ID] = [Order Details].[Product ID]) 
ON Orders.[Order ID] = [Order Details].[Order ID]) ON Employees.[Employee ID] 
= Orders.[Employee ID]
ORDER BY Orders.[Shipped Date];
----------------------------------------------------------------------

Put it through the FormatSQL macro to get:

----------------------------------------------------------------------
SELECT 
DISTINCTROW 
	Orders.[Shipped Date], 
	Orders.[Ship Name], 
	Orders.[Ship Address], 
	Orders.[Ship City], 
	Orders.[Ship Region], 
	Orders.[Ship Postal Code], 
	Orders.[Ship Country], 
	Orders.[Customer ID], 
	Customers.[Company Name], 
	Customers.Address, 
	Customers.City, 
	Customers.Region, 
	Customers.[Postal Code], 
	Customers.Country, 
	Employees.[Last Name], 
	Employees.[First Name], 
	[Order Details].[Order ID], 
	Orders.[Order Date], 
	Orders.[Required Date], 
	Orders.[Ship Via], 
	[Order Details].[Product ID], 
	Products.[Product Name], 
	[Order Details].Quantity, 
	[Order Details].[Unit Price], 
	[Order Details].Discount, 
	Orders.Freight
FROM
	Employees 
INNER JOIN  
	((Customers 
INNER JOIN  
	Orders
ON 
	Customers.[Customer ID] = Orders.[Customer ID]) 
INNER JOIN  
	(Products 
INNER JOIN  
	[Order Details]
ON 
	Products.[Product ID] = [Order Details].[Product ID])
ON 
	Orders.[Order ID] = [Order Details].[Order ID])
ON 
	Employees.[Employee ID] = Orders.[Employee ID]
ORDER BY
	Orders.[Shipped Date]
;

----------------------------------------------------------------------
which is much easier to read.

Uploaded by the author:
Andy Lee
64 Belmot Road
Tutbury
Burton-on-Trent
Staffs

100525,2536

