none
Ingresar datos haciendo uso del For Each in Request RRS feed

  • Pregunta

  • Buenos días:

    Me disculpo por publicar esta pregunta en este foro pero no he encontrado uno de ASP Clásico. Espero no estar infringiendo una norma por este hecho, en todo caso, si hay que moverlo a otro foro por mi esta bien pues lo que busco es un poco de ayuda. Gracias.

    Se trata de lo siguiente. Tengo un formulario con muchos campos así que se me ocurrió usar el nombre de los campos de dicho formulario como nombres de los campos en la base de datos para poder capturarlos e ingresarlos. 

    Pensé algo así:

    Cita:
    Temp="Select * From HACCP"
    Tabla1.Open Temp, Conexion,2,3,1
    Tabla1.AddNew

    For Each elemento In Request.QueryString
    Response.Write elemento & " = " & Request.QueryString(elemento) & "<br>"
    Tabla1(elemento)=Request.QueryString(elemento)
    Next

    Tabla1.UpDate 
    Tabla1.Close

    Pero obviamente no funciona. Si estoy usando el Request.QueryString es por conveniencia, pero se muy bien que también se puede usar el Request.Form 

    Se que se puede hacer pero no se como hacerlo. Probé inclusive poner el Tabla1.UpDate luego de la asignación del valor en la tabla pero igual, no funciona. ¿Alguien me puede dar una orientación por favor?

    Un saludo desde Lima, Perú

    viernes, 28 de diciembre de 2012 15:53

Todas las respuestas

  • El QueryString es de tipo NameValueCollection y probablemente lo que usted quiere es la propiedad AllKeys.  No programo en VB.net así que tal vez lo siguiente necesite algún ajuste pequeño:

    For Each clave In Request.QueryString.AllKeys
        Response.Write clave & " = " & Request.QueryString(clave) & "<br />"
    Next


    Jose R. MCP
    Code Samples

    viernes, 28 de diciembre de 2012 16:24
    Moderador
  • Muchas gracias por tu respuesta.

    Me explico. Tengo un formulario con más de 30 campos. Crear una rutina exclusiva para ingresar los 30 campos en una base de datos no sería problema, excepto que como ese formulario van a haber varios en el proyecto que estoy desarrollando. Entonces necesito encontrar una forma para poder simplificar el ingreso de los datos del formulario a la base de datos.

    Trabajo con Access. Si un campo se llama "lote" en la base de datos hay un campo llamado "lote" también. Y así con todos los campos del formulario. Todos tienen el mismo nombre e id que el campo de la tabla correspondiente en la base de datos.

    Con este código puedo tomar todos los nombre de campos del formulario así como sus valores

    For Each elemento in Request.QueryString

    Response.Write elemento & " = " & Request.QueryString(elemento) & "<br"

    Next

    Normalmente utilizo este tipo de código para ingresar datos a una base de datos

    Temp="Select * From BaseDeDatos"

    Tabla1.Open Temp, Conexion,2,3,1

    Tabla1.AddNew

    Tabla1("campo1")=Request("dato1")

    Tabla1("campo2")=Request("dato2")

    ....

    Tabla1("campoN")=Request("datoN")

    Tabla1.UpDate

    Tabla1.Close

    Ahora lo que necesito es unir ambos algoritmos y tener uno "universal" para poder usarlo en cualquier formulario y base de datos que tengan los mismo nombres de campo. Por eso mi código inicial el cual, obviamente, presenta error y por eso consulto sobre el tema

    Espero haberme explicado bien.

    Un saludo desde Lima, Perú

    viernes, 28 de diciembre de 2012 19:45
  • Pues creo que entiendo, lo que no me queda claro es si la solución que le di no le funciona y si no le funciona, por qué.  ¿Probó mi solución?  ¿Cuál fue el resultado?

    Jose R. MCP
    Code Samples

    viernes, 28 de diciembre de 2012 19:52
    Moderador
  • Es que lo que me sugeriste no hace que pueda ingresar los datos a la base de datos y eso es lo que me esta haciendo falta en mi código.
    viernes, 28 de diciembre de 2012 20:25
  • Pues no puse el código completo, pero mi fragmento le muestra la forma correcta de acceder a la información en el QueryString, que es una colección de parejas (nombre - valor).  Si usted dice que la sintaxis Tabla1("campo") = Request.QueryString("campo") funciona, entonces simplemente debe agregar esa línea al For Each:

    For Each clave In Request.QueryString.AllKeys
        Response.Write clave & " = " & Request.QueryString(clave) & "<br />"
        Tabla1(clave) = Request.QueryString(clave)
    Next
    Eso debería funcionar si es que es la sintaxis correcta para agregar registros a Tabla1, que supongo es un DataTable.


    Jose R. MCP
    Code Samples


    viernes, 28 de diciembre de 2012 20:30
    Moderador
  • Muchas gracias por la respuesta. Creo que no me estoy dejando entender y por eso me disculpo. 

    Si es correcto que

    Tabla1(elemento)=Request.QueryString(elemento) 

    funciona PERO lo que no funciona es el ingreso total de los datos. Si hago dato por dato y luego de la línea indicada pongo un Tabla1.UpDate, por supuesto que ingresa PERO como un registro no como un grupo de registros. Los 30 campos deben ser ingresados en otros tantos por registro. Es ahí donde tengo el problema. Fijate

    Temp="Select * From HACCP"
    Tabla1.Open Temp, Conexion,2,3,1
    Tabla1.AddNew (con esto estoy abriendo un nuevo registro que incluyen 30 campos)

    For Each elemento In Request.QueryString (aquí estoy empezando un bucle que cargará 30 campos de formulario con sus datos)
    Response.Write elemento & " = " & Request.QueryString(elemento) & "<br>" 
    Tabla1(elemento)=Request.QueryString(elemento) (aquí estoy agregando uno al registro abierto previamente)
    Next (continuo agregando registros)

    Tabla1.UpDate 
    Tabla1.Close

    La idea era que quedara algo así (en teoría)

    Temp="Select * From HACCP"
    Tabla1.Open Temp, Conexion,2,3,1
    Tabla1.AddNew

    For Each elemento In Request.QueryString
    Response.Write elemento & " = " & Request.QueryString(elemento) & "<br>" (campo 1)
    Tabla1(elemento)=Request.QueryString(elemento)

    Response.Write elemento & " = " & Request.QueryString(elemento) & "<br>" (campo 2)
    Tabla1(elemento)=Request.QueryString(elemento)

    Response.Write elemento & " = " & Request.QueryString(elemento) & "<br>" (campo 3)
    Tabla1(elemento)=Request.QueryString(elemento)

    Response.Write elemento & " = " & Request.QueryString(elemento) & "<br>" (campo 4)
    Tabla1(elemento)=Request.QueryString(elemento)

    ....

    Response.Write elemento & " = " & Request.QueryString(elemento) & "<br>" (campo 30)
    Tabla1(elemento)=Request.QueryString(elemento)

    Next

    Tabla1.UpDate 
    Tabla1.Close

    Pero no es así, pues se estanca en el primer elemento "campo1". Por eso es que estoy buscando una forma de poder hacerlo.

    He probado el INCLUDE de SQL pero la sintaxis tiene algunas limitaciones según el tipo de datos (si es hora y envían el dato 11:34 en formato de 24 horas, marca un error). Por eso es que estoy buscando una forma de poder ingresar grandes cantidades de datos de un formulario a una base de datos.

    Espero esta vez haberme explicado bien

    Un saludo desde Lima, Perú

    viernes, 28 de diciembre de 2012 21:10
  • Correcto.  El problema es que usted insiste en NO utilizar la solución que le di.  Este código que me está mostrando NO usa AllKeys.  El nombre de los campos está en AllKeys pero por alguna razón usted se rehúsa a utilizarlo.

    Un URL de la forma http://misitio.com/insertar?campo1=valor1&campo2=valor2&campo3=valor3 se insertaría a la tabla así:

    For Each clave In Request.QueryString.AllKeys
        Response.Write clave & " = " & Request.QueryString(clave) & "<br />"
        Tabla1(clave) = Request.QueryString(clave)
    Next
    Tabla1.Update

    Eso debe funcionar correctamente y debe insertar un único registro con los valores valor1, valor2 y valor3 en los campos campo1, campo2 y campo3 de la tabla vinculada a Tabla1.  ¿Ya probó esto exactamente como se lo muestro yo?  Si aún tiene problemas, entonces muéstreme su URL y muéstreme el resultado final en la base de datos.


    Jose R. MCP
    Code Samples


    viernes, 28 de diciembre de 2012 21:17
    Moderador
  • Request.form es una colección de los campos que vienen en un formulario.Puedes recorre esa colección.

    For Each Item In Request.Form
    x = Item y = Request.Form(Item) Response.Write "Item: " & X & " - " & Y

    Next

    Según entendí, deseas crear la cadena sql para insertar los registros.

    En el mismo bucle puedes ir creándola

    campos="":valores=""

    For Each Item In Request.Form
    x = Item y = Request.Form(Item) Response.Write "Item: " & X & " - " & Y

    if cadena="" then

    cadena=x

    valores=y

    else

    cadena=cadena & "," & x

    valores=valores & "'" & y & "'"' en caso de que son tipo texto o numérico con decimals, se encierra

    entre comillas simple

    Next

    conexion.execute "INSERT INTO TUBLA " & cadena & " SELECT " & valores

    Es esto lo que buscas?

    viernes, 28 de diciembre de 2012 21:47
  • Si es cierto, no fui claro. La usé y este es el mensaje de error que me aparece

    An error occurred on the server when processing the URL. Please contact the system administrator.

    If you are the system administrator please click here to find out more about this error.

    Es el mismo mensaje de error que aparece con mi bosquejo inicial, el cual es el motivo de mi consulta. No es que yo insista en no usarlo, todo lo contrario, eso hice y no dio resultado.

    No tengo posibilidad de publicar en línea el código total. El código completo que uso es este

    Temp="Select * From PROCRecepcionMateriaPrimaHACCP"
    Tabla1.Open Temp, Conexion,2,3,1
    Tabla1.AddNew

    For Each clave In Request.QueryString.AllKeys
         Response.Write clave & " = " & Request.QueryString(clave) & "<br />"
    Tabla1(clave) = Request.QueryString(clave)
    Next
    Tabla1.Update

    Tabla1.Close

    Y es más, si simplemente pongo

    For Each clave In Request.QueryString.AllKeys
         Response.Write clave & " = " & Request.QueryString(clave) & "<br />"
    Next

    me aparece el mismo error mencionado al inicio.

    Agradezco el apoyo.

    Un saludo desde Lima, Perú

    viernes, 28 de diciembre de 2012 22:00
  • Muchas gracias por responder guarracuco. Yo hice algo parecido

           

    varTemp="Insert Into PROCRecepcionMateriaPrimaHACCP "

    varCampos=""
    varValores=""

    For Each elemento In Request.QueryString
    If elemento="op" Then
    'no pasa nada
    Else
    Response.Write elemento & " = " & Request.QueryString(elemento) & "<br>"
    If varCampos="" Then
    varCampos=elemento
    varValores=Request.QueryString(elemento)
    Else
    varCampos=varCampos & "," & elemento
    varValores=varValores & "," & Request.QueryString(elemento)
    End If
    End If
    Next

    varTemp=varTemp & "(" & varCampos & ") Values (" & varValores & ")"
    response.write("<br><br>" & vartemp)

    Conexion.Execute varTemp

    Con este código el problema que encontré al testearlo en una vista SQL en Access es que cuando paso un dato en formato hora, la presencia de los dos puntos (12:34) me marcaba un error. Ya no avancé más porque el sueño y cansancio me ganó. Voy a probar tu sugerencia y comento apenas tenga resultados.

    Un saludo desde Lima, Perú

    viernes, 28 de diciembre de 2012 22:03
  • La idea de hacer algo como esto, es crear un módulo o función que puedas emplear para todo el sitio.

    Faltaría determinar el tipo de campo para proceder a dar el adecuado formato al valor, algo como:

    Abres un recordset vacío de la tabla que recibirá y recorres los campos

        Select Case fld.Type
        'attributes 16 si es un autonumerico
        Case 3 And fld.Attributes <> 16 '(3=int 16=identity)
                If IsNull(valor) Or valor = "" Then valor = 0
                cadena = cadena & Trim(Left(valor, fld.DefinedSize)) & ","
            'End If
        Case 200, 129, 120 '(200=vchar 8=Not NUll)
            If Len(valor) > 0 Then
                cadena = cadena & "'" & Trim(Left(valor, fld.DefinedSize)) & "',"
            End If
        Case 135
            If IsDate(valor) Then
                If fld.Precision = 23 Then
                    cadena = cadena & " cast('" & Format(valor, "yymmdd") & "' as DATETIME)" & ","
                Else
                    cadena = cadena & " cast('" & Format(valor, "hh:mm") & "' as SMALLDATETIME)" & ","
                End If
            End If
        Case 131
    ....etc

    Este segmento es para base de datos Microsoft SQLServer

    viernes, 28 de diciembre de 2012 23:20
  • Muchas gracias por la información. La voy a poner en práctica. Disculpa la demora pero tuve problemas familiares (es más, los sigo teniendo).

    Opté por este código

    varTemp="Insert Into PROCRecepcionMateriaPrimaHACCP "
    varCampos=""
    varValores=""
    			
    For Each elemento In Request.QueryString
    	If Trim(elemento)="op" Or Trim(elemento)="TAC" Or Trim(elemento)="JAC" Then
    		'no pasa nada
    	Else
    		If Request.QueryString(elemento)="" Then
    			'no pasa nada
    		Else
     			Response.Write Trim(elemento) & " = " & Request.QueryString(elemento) & "<br>"
    			If varCampos="" Then
    				varCampos=Trim(elemento)
    				varValores="'" & Request.QueryString(elemento) & "'"
    			Else
    				varCampos=varCampos & "," & Trim(elemento)
    				varValores=varValores & "," & "'" & Request.QueryString(elemento) & "'"
    			End If
    		End If
    	End If
    Next
    			
    varTemp=varTemp & "(" & varCampos & ") Values (" & varValores & ")"
    response.write("<br><br>" & vartemp)
    			
    Conexion.Execute varTemp

    No obstante estoy seguro que con tus ejemplos podré mejorar el código que generé.

    Un abrazo desde Lima, Perú

    sábado, 29 de diciembre de 2012 19:33