Ver Mensaje Individual
  #14 (permalink)  
Antiguo 18/10/2004, 16:02
Avatar de AlZuwaga
AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 8 meses
Puntos: 535
Función para hacer insert's "simples" a una tabla (está en desarrollo)
Si se trata de un insert algo más complejo con "parseo" de cadenas, validaciones server-side, etc, mejor dejar esto de lado y construir la sentencia SQL normalmente

Todos los campos del formulario deberán llamarse como los campos de la tabla donde se insertarán y tendrán como prefijo uno de los siguientes (para todos los casos, sin las comillas):
- "str" para datos que se inserten en campos text *
- "num" para datos que se inserten en campos numéricos
- "s_n" para datos que se inserten en campos si/no
- "ni_" para todo campo del formulario que no se desee insertar en la BD (ej: el botón submit )

Los campos tipo 'si/no' deberán tener valor predeterminado = No en la tabla.
El motivo de esto es que si el checkbox no ha sido 'checkeado', no aparece en la colección FORM. Y si no aparece, no se puede establecer el valor como FALSE... quedando su valor como el valor predeterminado del campo en la tabla (o ninguno)


Código:
<%
Function Insertar(Tabla)
	' Empiezo a construir la sentencia SQL
	SQL = "INSERT INTO " & Tabla & " ("
	' Reviso la colección FORM para colocar el nombre de los campos en la sentencia SQL
	For i = 1 to Request.Form.Count()
		Campo = Request.Form.key(i)
		' Verifico que el campo sea "insertable"
		If Left(Campo, 3) <> "ni_" Then
			'El campo es "insertable"
			Campo = Replace(Campo, "str", "")
			Campo = Replace(Campo, "num", "")
			Campo = Replace(Campo, "s_n", "")
			SQL = SQL & Campo & ", "
		End if
	next 
	'Quito la última comilla, el espacio final y concateno
	SQL = Mid(SQL, 1, Len(SQL) - 2)
	SQL = SQL & ") VALUES ("
	'Recorro nuevamente la colección FORM para seguir generando la sentencia SQL
	For i = 1 to Request.Form.count()
		' Obtengo el tipo de dato, el nombre de campo y el valor del mismo
		Tipo = Left(Request.Form.key(i), 3)
		Campo = Mid(Request.Form.key(i),4 , Len(Request.Form.key(i)))
		Valor = Request.Form.item(i)
		
		' Si se trata de una campo text lo coloco entre apóstrofes
		If Tipo = "str" Then SQL = SQL & "'" & Replace(Valor, "'", "''") & "', "
		' Si se trata de un campo numérico va sin los apóstrofes
		If Tipo = "num" Then
			SQL = SQL & Valor & ", "
			' Si el valor ingresado no es un número, arroja un mensaje de error y detiene el proceso
			If NOT IsNumeric(Valor) Then
				Response.Write "<STRONG>Error:</STRONG> " _
					& "El campo '" & campo & "' recibe valores incorrectos" _
					& " (<span style='color:#FF0000'>" & Valor & "</span>). Debería ser un número válido.<br>" _
					& "La operación no se ha efectuado."
				Response.End
			End if
		End if
		' Si es un campo si/no convierto a True (-1) si es que ha sido 'checkeado'.
		' Si no ha sido 'checkeado' no lo puedo identificar, así que el campo en la tabla deberá...
		'... tener como valor predeterminado False (0, No o lo que corresponda)
		If Tipo = "s_n" Then
			If Valor <> "" Then Valor = -1 Else Valor = 0
			SQL = SQL & Valor & ", "
		End if
		
	next 
	' Nuevamente elimino la última comilla y el espacio
	SQL = Mid(SQL, 1, Len(SQL) - 2)
	' Finalmente, cierro la sentencia SQL
	SQL = SQL & ")"
	
	' Le doy a la función el valor de la sentencia SQL
	Insertar = SQL
End Function
%>

Formulario de ejemplo:

Código:
<form ...>
Nombre: <input name="strNombre" type="text">
Apellido: <input name="strApellido" type="text">
Edad: <input name="numEdad" type="text">
Este no se guarda: <input name="ni_Control" type="text">
Activo? <input name="s_nActivado" type="checkbox" value="checkbox">
<input name="ni_Submit" type="submit" value="Enviar">
</form>

Se la llama así:

Código:
<%
'Reemplazar Response.Write por objetoConexion.Execute
Response.Write(Insertar("MiTabla"))
%>

Todavía no la usé ni sé si vale la pena usarla, pero se me ocurrió hacerla


Correcciones:
- 21/10/2004 La línea marcada con * decía "txt", como prefijo, cuando debía decir "str". Fue modificado en el texto original.
__________________
...___...

Última edición por AlZuwaga; 21/10/2004 a las 12:28