Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

cambiar el orden de coger datos en un for each, del ultimo al primero

Estas en el tema de cambiar el orden de coger datos en un for each, del ultimo al primero en el foro de Visual Basic clásico en Foros del Web. Hola avellaneda tu codigo Public Sub AltaEnBBDD(ByRef formulario As Form, tabla As String) Dim campos As String Dim valores As String Dim sentencia As String ...

  #31 (permalink)  
Antiguo 10/06/2008, 06:17
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 6 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

Hola avellaneda
tu codigo
Public Sub AltaEnBBDD(ByRef formulario As Form, tabla As String)
Dim campos As String
Dim valores As String
Dim sentencia As String
Dim crtlControl As Control
For Each crtlControl In formulario.Controls
If TypeOf crtlControl Is TextBox Then
valores = valores & "'" & crtlControl.Text & "', "
campos = campos & crtlControl.Tag & ", "
End If
Next crtlControl
If tabla = "paginas" Then
campos = campos & "codcli_pag"
valores = valores & "'" & claveAjena & "'"
End If
sentencia = "Insert Into " & tabla & " (" & campos & ")" & " Values (" & valores & ")"
MsgBox sentencia
frmNavegador.dbGestion.Execute "'" & sentencia & "'"
End Sub
pero me da este error

estoy ententando hacer un insert con esta sintaxis fuera de esta fuencion para ver si es el modo de escribirla y me da el mismo error, algo de como esta escrito esta mal(no tu código) la sintaxis y es con lo que no doy
  #32 (permalink)  
Antiguo 10/06/2008, 06:19
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 6 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

Creia que el día que participase en un hilo tan largo me iba a hacer ilusion
:P
  #33 (permalink)  
Antiguo 10/06/2008, 06:50
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

Hola!

Sigo pensando que si le das algunas vueltas al DataControl te evitarás tantos quebraderos de cabeza, pero aún así, creo que te estás complicando demasiado... creo que te resultaría mucho más sencillo algo así:

Código:
...Execute("Insert Into clientes (e-mail, telefono, etc) Values (""" & txtE-mail & """, """ txtTelefono & """, " & restodecampos & ")")
directamente, en lugar de concatenar en una función de forma dinámica.

Si aún así lo que quieres es centralizar la creación de la sentencia, te propongo esta función:

Código:
Public Function AltaEnBBDD(ByVal Tabla As String, ByVal Campos As String, ByVal Mascara As String, ParamArray Controles() As Variant) As String
Dim i As Long
Dim SQL As String

    SQL = "INSERT INTO " & Tabla & " (" & Campos & ") VALUES (" & Mascara & ");"
    For i = 0 To UBound(Controles)
        SQL = Replace(SQL, "%", Controles(i).Text, 1, 1, vbTextCompare)
    Next i
    
    AltaEnBBDD = SQL
End Function
A la que invocarías, por ejemplo así:

Código:
MsgBox AltaEnBBDD("clientes", "e-mail, telefono", """%"", %", txtEmail, txtTelefono)
El parámetro "mascara" te serviría para distinguir cómo se delimitan los campos, ya que no se puede distinguir a priori qué campos son numéricos y cuales no. Sólo tienes que tener cuidado de poner tantos símbolos de porcentaje como campos en el segundo parámetro, y como controles después de la máscara.

Por otra parte, fíjate que tal y como lo estás haciendo ahora, te concatena una coma de más al final de la lista de campos y de la de valores.
  #34 (permalink)  
Antiguo 10/06/2008, 07:04
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 6 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

ya lo he pensado
que con tanto codigo mas me valdría hacerlo sin el foreach pero luego...como lo van a coger varios formularios...
mis dudas son y es que cada uno me dice una cosa es
-si el campo es numerico realmente da igual que vayan comillas?
-la sentencia COLUMNS no es necesaria?
-para que sirve el %
que hace esto SQL = Replace(SQL, "%", Controles(i).Text, 1, 1, vbTextCompare)??
despues de tanta historia ya se de sobras que es complicarse la vida, pero pasa que ese código lo entiendo, y tampoco quiero copiar por copiar y no saber por que hace lo que hace.
de todos modos con en el codigo que me has puesto en la primera casilla deberia resultar la sentencia como tu dices
pero estoy poniendo la misma consulta a mano (sin que coja los campos de ningun sitio, indicandoselos yo) y me da error de sintaxis
quitandole las comas de los numericos, dejandoselas, poniendo y quitando el columns
Hay algo que no esta bien escrito y no se que es
  #35 (permalink)  
Antiguo 10/06/2008, 07:42
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

Cita:
Iniciado por manzarinaa Ver Mensaje
.
mis dudas son y es que cada uno me dice una cosa es
-si el campo es numerico realmente da igual que vayan comillas?
-la sentencia COLUMNS no es necesaria?
Hay algo que no esta bien escrito y no se que es
Bueno, contestando y (espero) que finalizando.
A la primera pregunta ya la contesté (dá igual) y a la segunda lo mismo (no es que no sea necesaria, es que no se debe de poner).

En cuanto a tu código:
Por lo que veo en el mensaje de error que muestra, es que sobran las comas al final de los campos y de los valores y eso seguramente será porque no se cumple la condición de que la variable "tabla" sea igual a "paginas", por lo tanto le deberías poner un Else que recorte las cadenas en un carácter.

  #36 (permalink)  
Antiguo 10/06/2008, 10:24
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

Hola!

Realmente quería haberte comentado mejor el código que te he escrito, pero tenía que marcharme y no sabía si podría conectarme esta tarde. Te lo explico ahora:

El símbolo "%" de por sí no hace nada, el truco está en la función Replace, en la que le estás diciendo que lo cambie por otra cosa, en este caso, el contenido de la propiedad Text del control indicado en el bucle. Puedes poner interrogaciones, o literales más largos en lugar de "%" si lo prefieres, pero es importante que tanto en Replace como en la máscara utilices la misma cadena.

Los parámetros que contiene Replace son, por este orden:
- Cadena en la que se buscan subcadenas para reemplazar (SQL)
- Cadena que se quiere reemplazar ("%")
- Texto que se va a poner en lugar de la cadena anterior (propiedad Text)
- Desde qué caracter se empieza a buscar en SQL (desde el primero)
- Cuantas veces se va a sustituir (sólo 1; es decir, cambia la primera ocurrencia de "%", pero deja las demás. Si pones -1, las cambiaría todas, pero es no es lo que nos interesa aquí, ya que queremos que en cada posición se ponga el valor de un control distinto).
- Forma de comparación: vbTextCompare hace que no se tengan en cuenta las mayúsculas, aunque en este caso no haría falta, ya que "%" es siempre "%"

Además, Replace te devuelve la cadena con el reemplazo, por eso la volvemos a asignar a "SQL".

La "máscara" que te he puesto en el ejempplo tiene muchas comillas porque si quieres poner comillas dobles dentro de una cadena, tienes que ponerlas dos veces. La comilla simple también vale para delimitar cadenas-dentro-de-cadenas tal y como la pones tú, pero en mi caso es un hábito, las pongo así sin pensarlo, espero que no te confunda

La claúsula COLUMNS te va a fallar seguro porque como dice Avellaneda, no hay que ponerla.
  #37 (permalink)  
Antiguo 10/06/2008, 11:48
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 6 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

no lo he podido solucionar, pero muchisimas gracias por vuestro tiempo y por el interes que os habeis tomado, de verdad.
  #38 (permalink)  
Antiguo 14/06/2008, 03:08
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 6 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

Al final ha sido muy sencillo (suele pasar)
He llamado a todos los campos de los formularios que se pasaban txtDato
y en lugar de un for each he puesto un for normal
el codigo quedo asi
Public Sub AltaEnBBDD(ByRef formulario As Form, tabla As String)
Dim i As Integer
Dim valores As String
For i = 0 To formulario.txtDato.Count - 1
If Trim(formulario.txtDato(i).Tag) = "codcli_pag" Then
valores = valores & formulario.txtDato(i).Text & ", "
Else
valores = valores & "'" & formulario.txtDato(i).Text & "', "
End If
Next i
valores = Left(valores, Len(valores) - 2)
frmNavegador.dbGestion.Execute "Insert Into " & tabla & " values (" & valores & ")"
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:35.