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 a todos! Tengo este código: sentencia = "Insert into " & tabla & " values('" For Each crtlControl In formulario.Controls If TypeOf crtlControl Is ...

  #1 (permalink)  
Antiguo 09/06/2008, 12:35
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
[Solucionado] cambiar el orden de coger datos en un for each, del ultimo al primero

Hola a todos!
Tengo este código:
sentencia = "Insert into " & tabla & " values('"
For Each crtlControl In formulario.Controls
If TypeOf crtlControl Is TextBox Then
sentencia = sentencia & crtlControl.Text & "', '"
End If
Next crtlControl
sentencia = Left(sentencia, Len(sentencia) - 3)
sentencia = sentencia & ")"
MsgBox sentencia
Es para dar un alta, en principio lo hace bien, lo que veo ahora es que el orden en que el foreach me coge los controles está al revésel primero me sale el ultimo y demás.
Hay manera de cambiar este orden??

Última edición por manzarinaa; 14/06/2008 a las 04:03 Razón: solucionado
  #2 (permalink)  
Antiguo 09/06/2008, 13:01
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 otra vez!

No puedes cambiar el orden en que se enumeran, y además es arbitrario y poco fiable.

En su lugar, tienes que crear primero un array de controles, ordenarlo utilizando por ejemplo la propiedad TabIndex, y hacer la concatenación después, recorriendo el array.
  #3 (permalink)  
Antiguo 09/06/2008, 13:08
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

Lo que puedes hacer es concatenarlos al reves.

Tu lo haces de la siguiente manera:

Código:
         If TypeOf crtlControl Is TextBox Then
            sentencia = sentencia & crtlControl.Text & "', '"
        End If
Y si tus text son:

A, B, C, al concatenarse quedan ABC

Si quieres que se forme CBA debes hacer algo como:


Código:
         If TypeOf crtlControl Is TextBox Then
             sentencia = crtlControl.Text & "', '" & sentencia
         End If
Fijate que ahi concateno sentencia al final.

Suerte!
__________________
Saludoss
Guille
  #4 (permalink)  
Antiguo 09/06/2008, 14:24
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

OH! mi salvador :P
ya lo pense.....pero no quierooo
llevo 5 dias con esta funcion y queria algo algo en vez de for each pues un for ouchhh y ya está jo si, me tocará hacerlo asi
me extraña que para dar altas en una base de datos no hayan inventado algo más sencillo
Gracias! me resigno, y me pongo a arreglarlo para que se ponga al revés
  #5 (permalink)  
Antiguo 09/06/2008, 14:33
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

Ahhh! si tu problema es con la bd entonces tengo otra solucion mas linda :P

la sentencia insert se puede escribir de varias manera

Código:
INSERT INTO (TABLA) VALUES(VALOR_COL1, VALOR_COL2,....)
ó

Código:
INSERT INTO (TABLA) COLUMNS(NOMBRE_COLX, NOMBRE_COLY,..) VALUES(VALOR_COLX, VALOR_COLY,...)
De esa manera puedes hacer insert cambiando el orden de las columnas para que te sea mas cómodo (ten en cuenta que en la base no cambia el orden, solo es más comodo para hacer el insert), y hasta puedes hacer update con algunas columnas, no todas (mientras las que no pongas acepten el null).

Espero que te sirva, saludos!
__________________
Saludoss
Guille
  #6 (permalink)  
Antiguo 09/06/2008, 15:58
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

Mañana lo miro con calma, muchas gracias si sirve ya pondre algo por aqui, creo que podre poner en las tags los nombres de los campos, no? :P
Muchas gracias
  #7 (permalink)  
Antiguo 10/06/2008, 01:16
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

JO que función
que no me la ejecutaaaa
a ver si alguien ve el fallo por dios, que ya me va a dar algo
Dim campos As String
Dim valores As String
Dim sentencia As String
Dim crtlControl As Control

valores = " values('"
campos = " columns("
For Each crtlControl In formulario.Controls
If TypeOf crtlControl Is TextBox Then
If crtlControl.Tag = "Telefono" Or crtlControl.Tag = "idcli" Or crtlControl.Tag = "idpag" Then
valores = Left(valores, Len(valores) - 2)
valores = valores & crtlControl.Text & ", '"
Else
valores = valores & crtlControl.Text & "', '"
End If
campos = campos & crtlControl.Tag & ", "
'guardo la clave ajena
If crtlControl.Tag = "idcli" Then
claveAjena = CInt(crtlControl.Text)
End If
End If
Next crtlControl
'inserto la clave ajena
If tabla = "paginas" Then
campos = campos & "codcli_pag, "
valores = Left(valores, Len(valores) - 2)
valores = valores & claveAjena & ", '"
End If
valores = Left(valores, Len(valores) - 3)
valores = valores & ")"
campos = Left(campos, Len(campos) - 2)
campos = campos & ")"
sentencia = "Insert Into (" & tabla & ") " & valores & campos
MsgBox sentencia
frmNavegador.dbGestion.Execute "'" & sentencia & "'"
End Sub
  #8 (permalink)  
Antiguo 10/06/2008, 01:16
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

bueno claveAjena es publica está en el opcion explicit
  #9 (permalink)  
Antiguo 10/06/2008, 01:51
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

Si es para dar altas, ¿por qué no enlazas los controles con un DataControl, y utilizas el método AddNew del Recordset del DataControl?

Apenas te requeriría código y es el gestor de base de datos el que se encarga de claves y esas cosas.
  #10 (permalink)  
Antiguo 10/06/2008, 01:54
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

jo, por que eo ni se como se utiliza
  #11 (permalink)  
Antiguo 10/06/2008, 02:45
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

Hola manzarinaa,

Prueba así (las líneas comentadas son de tu código y las debes eliminar)

Código:
'valores = " values('"
'campos = " columns("
For Each crtlControl In Me.Controls
    If TypeOf crtlControl Is TextBox Then
        If crtlControl.Tag = "Telefono" Or crtlControl.Tag = "idcli" Or crtlControl.Tag = "idpag" Then
    '       valores = Left(valores, Len(valores) - 2)
            valores = valores & "'" & crtlControl.Text & "', "
    '    Else
    '        valores = valores & crtlControl.Text & "', '"
    '    End If
            campos = campos & crtlControl.Tag & ", "
        End If
        'guardo la clave ajena
        If crtlControl.Tag = "idcli" Then
            claveAjena = CInt(crtlControl.Text)
        End If
    End If
Next crtlControl
'inserto la clave ajena
If tabla = "paginas" Then
  '  campos = campos & "codcli_pag, "
  '  valores = Left(valores, Len(valores) - 2)
  '  valores = valores & claveAjena & ", '"
    campos = campos & "codcli_pag"
    valores = valores & "'" & claveAjena & "'"
End If
'valores = Left(valores, Len(valores) - 3)
'valores = valores & ")"
'campos = Left(campos, Len(campos) - 2)
'campos = campos & ")"
'sentencia = "Insert Into (" & tabla & ") " & valores & campos
sentencia = "Insert Into " & tabla & " (" & campos & ")" & " Values (" & valores & ")"

MsgBox sentencia
  #12 (permalink)  
Antiguo 10/06/2008, 02:51
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

Bueno, es mas fácil de lo que parece:

- Añade un DataControl al formulario y establece las propiedades:
* Databasename con la ruta completa hasta el fichero de access.
* Asegúrate que Connect tiene el tipo correcto de base de datos. Para acceder a Access 2000 necesitarás tener el Service Pack 6 instalado.
* En RecordSource pon el nombre de la tabla, o una instrucción SELECT si quieres restringir la consulta.

- En cada control textbox:
* Asigna en DataSource el nombre del DataControl.
* Asigna en DataField el nombre del campo que maneja ese textbox.

Y ya está: al ejecutar, te aparecerá directamente en el textbox el valor del campo, puedes cambiar de registro utilizando las flechas del datacontrol, y modificando el contenido del textbox, se actualizará la base de datos al cambiar de registro.

Para agregar un registro, tienes que llamar a (Nombre del DataControl).Recordset.AddNew
  #13 (permalink)  
Antiguo 10/06/2008, 02:56
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

el uso de la palabra clave me, no es valida, si cambio me por formulario solo me coge el primer campo
  #14 (permalink)  
Antiguo 10/06/2008, 02:56
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

vale voy a probar lo tuyo txoco
  #15 (permalink)  
Antiguo 10/06/2008, 03:10
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

donde esta el datacontrol???
  #16 (permalink)  
Antiguo 10/06/2008, 03:11
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

Me.Controls lo puse para hacer la prueba, si el Form se llama "formulario", sustituye Me por formulario.

¿Sólo te coge el primer campo? a mi me funciona perfectamente. ¿Los Tag estáan bien puestos?

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

Hola avellaneda
es por este if
If crtlControl.Tag = "Telefono" Or crtlControl.Tag = "idcli" Or crtlControl.Tag = "idpag" Then
que es en el que controlo que si me esta entrando un campo numerico o no
  #18 (permalink)  
Antiguo 10/06/2008, 03:32
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

el data control es el data de la barra de herramientas??
  #19 (permalink)  
Antiguo 10/06/2008, 03:34
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

y estoy con DAO ¿puede ser?
  #20 (permalink)  
Antiguo 10/06/2008, 03:51
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!

Efectivamente, el acceso es DAO, pero para ADO funcionaría igual.

El DataControl aparece en la paleta de controles básicos, entre el Image y el contenedor OLE.

El uso del Tag te va a dar problemas en ese caso porque sólo admite números, no cadenas, si lo que quieres es comprobar si el texto sólo contiene números, la función IsNumeric(<cadena>) te devuelve un Boolean diciéndotelo.
  #21 (permalink)  
Antiguo 10/06/2008, 03:58
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

pero los nombres del campo son cadenas siempre, no? es lo que yo tengo en las tags
  #22 (permalink)  
Antiguo 10/06/2008, 04:01
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

de todos modos os pongo el error que me da por que yo creo que puede ser que no haya que darle tantas vueltas (que yo ya no se se si echarme a llorar)
el motor de base de daor microsoft jet no puede encontrar la tabla o consulta de entrada
  #23 (permalink)  
Antiguo 10/06/2008, 04:11
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

Ups, primero, corregirme, que el Tag sí que admite cadenas. De hecho, si le asignas un número, lo convierte

Para corregir el error que te da, comprueba que has escrito bien el nombre de la tabla en el RecordSource del DataControl. Te recomiendo que despliegues las combos en lugar de teclear, y si alguna te aparece vacía, es que alguna propiedad de las que te he dicho está mal configurada, por lo que tendrás que revisarlas.

Y no llores, que esto al principio es más paciencia que otra cosa
  #24 (permalink)  
Antiguo 10/06/2008, 04:22
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

si esto es sin el data control, como estaba antes.
el datacontrol lo he puesto y no entiendo como va
por que parece solo un campo ¿??¿?¿?¿?¿
  #25 (permalink)  
Antiguo 10/06/2008, 04:41
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
Hola avellaneda
es por este if
If crtlControl.Tag = "Telefono" Or crtlControl.Tag = "idcli" Or crtlControl.Tag = "idpag" Then
que es en el que controlo que si me esta entrando un campo numerico o no
¿Y para qué quieres controlar si el campo es numérico, para poner o no las comillas simples entre el campo?

No es necesario, la instrucción INSERT INTO admite los valores numéricos tanto entre comillas como sin ellas.

Código:
For Each crtlControl In formulario.Controls
    If TypeOf crtlControl Is TextBox Then
        valores = valores & "'" & crtlControl.Text & "', "
        campos = campos & crtlControl.Tag & ", "
    End If
Next crtlControl
Sin necesidad de comparar campos.

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

Y entonces por queeee
  #27 (permalink)  
Antiguo 10/06/2008, 05:04
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: cambiar el orden de coger datos en un for each, del ultimo al primero

  #28 (permalink)  
Antiguo 10/06/2008, 05:08
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

Pero...

¿Copiaste el código que puse?

Esa consulta está mal, el nombre de la tabla no debe de ir entre paréntesis y la palabra "columns" sobra.

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

ya el codigo esta actualmente asi:
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
valores = "'"
For Each crtlControl In formulario.Controls
If TypeOf crtlControl Is TextBox Then
If crtlControl.Tag = "idcli" Then
claveAjena = CInt(crtlControl.Text)
Else
valores = valores & crtlControl.Text & "', '"
campos = campos & crtlControl.Tag & ", "
End If
If crtlControl.Tag = "idcli" Then
claveAjena = CInt(crtlControl.Text)
End If
End If
Next crtlControl
If tabla = "paginas" Then
valores = Left(valores, Len(valores) - 2)
campos = campos & "codcli_pag"
valores = valores & claveAjena
Else
valores = Left(valores, Len(valores) - 3)
End If
campos = Left(campos, Len(campos) - 2)
sentencia = "INSERT INTO " & tabla & " (" & campos & ")" & " VALUES (" & valores & ")"
MsgBox sentencia
frmNavegador.dbGestion.Execute "'" & sentencia & "'"
End Sub
y sale el mismo error
  #30 (permalink)  
Antiguo 10/06/2008, 05:49
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

Veo que, efectivamente, no has copiado el código como lo puse.

Coloca el código de la respuesta #11 con la rectificación de la respuesta #25.

Las líneas que empiezan por una comilla simple y están marcadas en verde, hay que eliminarlas.

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 07:06.