como grabar una matriz en una tabla |
Responder | Página 12> |
Autor | |
kkodalton
Nuevo Unido: 01/Diciembre/2011 Localización: España Estado: Sin conexión Puntos: 32 |
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 |
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 13990 |
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 ...
¿Como tienes definida la tabla?
|
|
kkodalton
Nuevo Unido: 01/Diciembre/2011 Localización: España Estado: Sin conexión Puntos: 32 |
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.
|
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 13990 |
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 ?
|
|
Dabellaso
Asiduo Unido: 18/Noviembre/2012 Localización: España Estado: Sin conexión Puntos: 338 |
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
|
|
kkodalton
Nuevo Unido: 01/Diciembre/2011 Localización: España Estado: Sin conexión Puntos: 32 |
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
|
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 13990 |
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 |
|
Dabellaso
Asiduo Unido: 18/Noviembre/2012 Localización: España Estado: Sin conexión Puntos: 338 |
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 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
|
|
Dabellaso
Asiduo Unido: 18/Noviembre/2012 Localización: España Estado: Sin conexión Puntos: 338 |
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
|
|
kkodalton
Nuevo Unido: 01/Diciembre/2011 Localización: España Estado: Sin conexión Puntos: 32 |
Enviado: 05/Abril/2020 a las 22:19 |
un millon de gracias, mañana lo pruebo
|
|
guarracuco
Moderador Unido: 24/Abril/2004 Localización: EEUU Estado: Sin conexión Puntos: 3239 |
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 ... ... |
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 13990 |
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 ...
Editado por Mihura - 07/Abril/2020 a las 15:46 |
|
guarracuco
Moderador Unido: 24/Abril/2004 Localización: EEUU Estado: Sin conexión Puntos: 3239 |
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.
|
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 13990 |
Enviado: 07/Abril/2020 a las 16:49 |
Nunca un código esta terminado ...
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.
|
|
Dabellaso
Asiduo Unido: 18/Noviembre/2012 Localización: España Estado: Sin conexión Puntos: 338 |
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
Editado por Dabellaso - 07/Abril/2020 a las 20:00 |
|
El saber no ocupa lugar, sólo tiempo
|
|
Responder | Página 12> |
Tweet
|
Ir al foro | Permisos de foro Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |