Insert Page and Auto-Number
Intro
This tutorial explains how to create an Insert Page with an Auto-Number field. I'm sure that I'm not the first one to face this problem. I've been looking around at various web sites, including UDZone.com, and didn't manage to find a simple solution that would work.
Overview
- Problem: When creating an insert with UD, you cannot retreive the Auto-Number of the current record for later use.
 - Solution: Requires a little amount of coding to work around the problem.
 
The solution is to work with a recordset instead of a command. The difference is rather important. A Command is a one time SQL execution that allows you to insert, delete, or update your database. The problem is that once the command has executed, you can't manipulate the record you just modified. This is where the recordset comes in.
Important Update
I have updated this tutorial because I created simple extensions which you can use instead of the usual "Insert Page" behavior. The extensions are actually a lot simpler than what I described before. I noticed that a lot of the parsing done by the UltraDev behavior is not necessary if you plan to use ASP Recordsets and MS Access. It should also work with SQL Server.
Details
This is what the old Code looks like when you use the "Insert Page" behavior:
<%
  ' *** Insert Record: construct a sql insert statement and execute it
If (CStr(Request("MM_insert")) <> "") Then
 ' create the sql insert statement
  MM_tableValues = ""
  MM_dbValues = ""
  For i = LBound(MM_fields) To UBound(MM_fields) Step 2
  FormVal = MM_fields(i+1)
  MM_typeArray = Split(MM_columns(i+1),",")
  Delim = MM_typeArray(0)
  If (Delim = "none") Then Delim = ""
  AltVal = MM_typeArray(1)
  If (AltVal = "none") Then AltVal = ""
  EmptyVal = MM_typeArray(2)
  If (EmptyVal = "none") Then EmptyVal = ""
  If (FormVal = "") Then
  FormVal = EmptyVal
  Else
  If (AltVal <> "") Then
  FormVal = AltVal
  ElseIf (Delim = "'") Then ' escape quotes
  FormVal = "'" & Replace(FormVal,"'","''") 
  & "'"
  Else
  FormVal = Delim + FormVal + Delim
  End If
  End If
  If (i <> LBound(MM_fields)) Then
  MM_tableValues = MM_tableValues & ","
  MM_dbValues = MM_dbValues & ","
  End if
  MM_tableValues = MM_tableValues & MM_columns(i)
  MM_dbValues = MM_dbValues & FormVal
  Next
  MM_editQuery = "insert into " & MM_editTable ...
   ...  & " (" & MM_tableValues & ") values 
  (" & MM_dbValues & ")"
If (Not MM_abortEdit) Then
  ' execute the insert
  Set MM_editCmd = Server.CreateObject("ADODB.Command")
  MM_editCmd.ActiveConnection = MM_editConnection
  MM_editCmd.CommandText = MM_editQuery
  MM_editCmd.Execute
  MM_editCmd.ActiveConnection.Close
 If (MM_editRedirectUrl <> "") 
  Then
  Response.Redirect(MM_editRedirectUrl)
  End If
  End If
End If
  %>
The updated code as it appears using the Server Behavior:
<%
  ' *** Insert Record: ...
If (CStr(Request("MM_insertAuto")) <> "") Then
  If (Not MM_abortEdit) Then
  'Execute the insert
  'Retrieve record (assume a 1-1 relationship)
  Set MM_rs = Server.CreateObject("ADODB.Recordset")
  MM_rs.ActiveConnection = MM_editConnection
  MM_rs.Source = "SELECT * FROM " & MM_editTable
  MM_rs.CursorType = 1
  MM_rs.CursorLocation = 2
  MM_rs.LockType = 3
  MM_rs.Open()
  MM_rs_numRows = 0
  MM_rs.AddNew
  
  ' Fill in the fields on the form
  Dim varTemp 
  For i = LBound(MM_fields) To UBound(MM_fields) Step 2
  varTemp = MM_fields(i+1) 
  If (varTemp <> "NULL") And (varTemp <> "") Then 
  
  MM_rs.Fields(MM_columns(i)).value = varTemp
  End if 
  Next
 MM_rs.Update
  MM_rs.MoveLast
  MM_AutoNum = MM_rs.Fields(MM_editColumn).value
  MM_rs.Close
  If (MM_editRedirectUrl <> "") Then
  Response.Redirect(MM_editRedirectUrl)
  End If
  End If
End If
  %>
The code that has been removed was used to parse the correct type for a given field in an SQL Command. However, since I'm not using an SQL command, the whole code can be removed and replaced by a loop.
You can download the Extension Package here.
Comments
errors using this script
I keep getting the following error:
Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][ODBC Microsoft Access Driver] Operation must use an updateable query.
/registration/formtest.asp, line 107
It refers to these lines:
Recordset.Update
Recordset.MoveLast
GREAT
Great! But... what about EDIT record?
I must be stupid.
I can not seem to get this to work. Is there any better documentation on using the extentions? Do you need to use both?
What I am trying to do is insert a record, get the auto ID from Access and pass that to the next page which is a picture upload.
Also does this require the Jte OLEDB Provider or can it work with the MDB driver?
Thanks
Found something on Macromedia.com/support
I saw a way to do this on Macromedia.com/support/ultradev. I forget the actual technote, but I do remember them saying if you change ONE word from the Insert/Update or Delete behaviors it will passt eh Query String Values onto the redirect page.
If there are further questions, I'll grab the actual URL and post, but it's easy to find with a search.
-Ed
You must me logged in to write a comment.