** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - como grabar una matriz en una tabla
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradocomo grabar una matriz en una tabla

 Responder Responder Página  12>
Autor
Mensaje
kkodalton Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 01/Diciembre/2011
Localización: España
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Tema: como grabar una matriz en una tabla
    Enviado: 05/Abril/2020 a las 10:25
Hola

Me gustaria saber como puedo grabar una matriz unidimensional en una tabla de la manera mas eficiente (50), los 50 campos de la matriz se corresponde con los 50 de la tabla a guardar.

En realidad mi matriz es bidimensional , però he pensado que mejor ir grabando registro a registro A(500000,50)

De Vb no se mucho
mi pregunta es , he de utilitzar para grabar cada campo el .Update?

o por medio del insert into tabla ...
como lo hago para los 50 campos ?

Espero que entendais mi problema y muchas gracias
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 05/Abril/2020 a las 10:45
La cuestión es si has sido 'astuto' al crear la tabla y los nombres de campos incluyen un número de orden, o el nombre de cada campo es de su padre y de su madre ...  LOL

¿Como tienes definida la tabla?
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
kkodalton Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 01/Diciembre/2011
Localización: España
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 05/Abril/2020 a las 12:29
Si , los campos son mes_año 
Estos serian los campos :
id usuario
012010
022010
032010
etc.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 05/Abril/2020 a las 13:00
Te recomendaría que en los nombres de campos no uses blancos y que comiencen al menos con una letra, te evitará muchos problemas en su uso.
- yo llamaría a los campos IdUsuario, C012010, C022010, ...

¿ Cómo es la correspondencia de campos con los valores de la tabla ?
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 05/Abril/2020 a las 15:59
Quizás buscas algo así?

NOTA: mtz es la matriz bidimensional

dim i as Long, x as Long

For i = LBound(mtz, 1) To UBound(mtz, 1) 'Para recorrer la primera dimensión
    For x = LBound(mtz, 2) To UBound(mtz, 2) 'Para recorrer la segunda dimensión
    
    CurrentDb.Execute ("INSERT INTO MiTabla (MiCampo1, MiCampo2) VALUES ('" & _
    mtz(i, x) & "','" & mtz(i, x) & "');")
    
    Next x
Next i

Pero como bien dice Mihura, es importante saber cual es tu situación específica. Sera difícil aplicarlo a tu caso sin tener claro el tipo de campo (Si son de texto o numéricos, por el tema de las comillas simples), de si la tabla tiene algún campo requerido, que los datos cumplan con las validaciones, etc.

De todos modos puedes consultar, ya que tienes al menos dos modos de hacerlo según tu situación
El saber no ocupa lugar, sólo tiempo
Arriba
kkodalton Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 01/Diciembre/2011
Localización: España
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 05/Abril/2020 a las 18:46
hola de nuevo y gracias por contestar


A ver, imaginar que  tengo definida una matriz con estos valores:

Se que no se representa asi en acces, pero es para acabar antes:

 matriz unidimensional :mtz(20)

Valores mtz:  (540,457,0,7688,7679.4445.... ,456)

Lbound y Ubound acabo de mirar que significa, pero la verdad no lo entiendo mucho.
Pero yo querria añadir todos los valores de la matriz, en una tabla, con lo que lbound no creo me sirva.

Si utilizo el metodo "insert into  mitabla ( aqui tengo que espeficicar todos los campos?? 

No existe una manera de decir insertar todos los datos de esta matriz a esta tabla?????
la matriz hace referencia a los mismos campos ordenados que representa la tabla, asi por ejemplo el valor 540 quiero que se guarde en el 
campo1 de la tabla, 457 es el segundo, y asi ...


Espero no haberos liado mas
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 05/Abril/2020 a las 18:58
¿Podrías cambiar los nombres de los campos de la tabla a ... ?

IdUsuario
Campo01
Campo02
Campo03
.
.
Campo50




Editado por Mihura - 05/Abril/2020 a las 18:58
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 05/Abril/2020 a las 19:43
Creo entender que si la matriz tiene 50 valores, deber introducir cada valor en un campo diferente, es decir, tienes 50 campos, correcto? y que la matriz, es unidimensional

Prueba a obtener los nombres de cada campo en cada vuelta del bucle, y de ese modo cada campo tendrá el valor que le corresponde al item de la matriz en el mismo orden

Quizás algo así:

Dim i As Long, tabla As DAO.TableDef

Set tabla = CurrentDb.TableDefs("MiTabla")

For i = LBound(mtz) To UBound(mtz) 'Para recorrer los datos de la matriz de valores

    x = x + 1 'x+1 porque al ser una colección Fields empieza en uno, dejarlo en cero produciría error
    CurrentDb.Execute ("INSERT INTO MiTabla ( " & tabla.Fields(x).Name & ") VALUES ('" & mtz(i) & "');")
    
Next i


NOTA:
i= LBound(Matriz) significa que el bucle empezara con el ítem más bajo de la matriz, es decir, desde el principio
i= UBound(Matriz) significa que el bucle se repetirá hasta encontrar el ítem más alto en la matriz, es decir, hasta el final

Es importante, que la cantidad de valores en la matriz sea la misma o menos que campos en la tabla, de otro modo generará error por no encontrar el campo

Prueba a ver si te sirve Wink

Edito: eso te creará tantos registros como valores tenga la matriz, si solo quieres un registro con todos los campos rellenos, hay que abordarlo de manera diferente. Voy a darle una vuelta y luego nos cuentas porque no sé donde quedo la matriz bidimensional que decías al principio


Editado por Dabellaso - 05/Abril/2020 a las 19:54
El saber no ocupa lugar, sólo tiempo
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 05/Abril/2020 a las 20:03

Quizás esto te sirva mejor:

Dim i As Long
Dim dbs As DAO.Database
Dim tabla As DAO.TableDef
Dim campo As DAO.Field
Dim strListaCampos As String
Dim strListaValores As String

    Set dbs = CurrentDb
    Set tabla = dbs.TableDefs("MiTabla")
    
    For Each campo In tabla.Fields 'Para recorrer los campos existentes en la tabla
        strListaCampos = strListaCampos & IIf(strListaCampos = "", "", ",") & campo.Name
    Next campo
    
    For i = LBound(mtz) To UBound(mtz) 'Para recorrer los datos de la matriz de valores
        strListaValores =strListaValores & IIf(strListaValores = "", "", ",") & "'" & CStr(mtz(i)) & "'"
    Next i

    CurrentDb.Execute ("INSERT INTO MiTabla (" & strListaCampos & ") VALUES (" & strListaValores & ");")

Esto creará un sólo registro, pero del mismo modo, la cantidad de campos y la cantidad de valores deben ser iguales



Editado por Dabellaso - 05/Abril/2020 a las 21:11
El saber no ocupa lugar, sólo tiempo
Arriba
kkodalton Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 01/Diciembre/2011
Localización: España
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 05/Abril/2020 a las 22:19
un millon de gracias, mañana lo pruebo
Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3239
Enlace directo a este mensaje Enviado: 07/Abril/2020 a las 14:36
Para simplificar bastante el uso de bucles, podrías convertir a cadena de caracteres, cada línea del arreglo, usando la instrucción Join.
Más o menos algo asi:
For i=0 to ubound(arreglo)
StrSql=join(arreglo(i), ",")
Currentdb.execute "insert into Tutabla " . StrSql
...
...


Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 07/Abril/2020 a las 15:46
Matriz bidimensional A(500000, 50)

Si hacemos un INSERT por cada datome salen veinticinco millones de posibles inserciones ... 

Supongo que cada registro de la tabla tiene 50 campos ... y sigo esperando la repuesta de si se pueden cambiar los nombres de los campos ... Tongue


Editado por Mihura - 07/Abril/2020 a las 15:46
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3239
Enlace directo a este mensaje Enviado: 07/Abril/2020 a las 16:45
Mi idea es ejecutar el Insert por cada línea del arreglo. Que mi código no esté completo, no lo dudo. Lo escribí desde el móvil a la ligera.
Saludos.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 07/Abril/2020 a las 16:49
Nunca un código esta terminado ...  LOL

Yo lo digo porque en este caso, con ese número de registros mejor con un recordset, te ahorras los tiempos de cierre/apertura de cada SQL.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 07/Abril/2020 a las 19:40
Efectivamenete puede evitar el bucle " For i = .... To .... "

y usar,  "  VariableTexto = Join(mtz,",")  "  (sin el ítem de la matriz)


Pero como dice Mihura usar INSERTSQL en cada vuelta de bucle al recorrer una matriz bidimensional generará una barbaridad de registros. 

El último código que posteé sólo crea un registro pero claro, usando una matriz unidimensional que yo entiendo que tiene 50 valores , para almacenar en 50 campos. No se de donde sacará el resto de registros.

La opción del Recordset también me gusta, pero sigo si saber si tiene una matriz unidimensional ,o una bidimensional.

Esperemos la opinión del intersado y si Mihura tiene la bondad, me gustaría saber como enfoca él la solución, por el tema del cambio de nombre de los campos. Así puedo practicar con las lecciones de uno de los grandes maestros del foro

Saludos

Edito para corregir el nombre de Mihura, que lo escribí mal Wink


Editado por Dabellaso - 07/Abril/2020 a las 20:00
El saber no ocupa lugar, sólo tiempo
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable