Imprimir página | Cerrar ventana

ERROR AL CREAR UNA TABLA

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84255
Fecha de impresión: 18/Julio/2019 a las 13:46


Tema: ERROR AL CREAR UNA TABLA
Publicado por: solbete
Asunto: ERROR AL CREAR UNA TABLA
Fecha de publicación: 27/Enero/2019 a las 20:59
Hola amigos, 

Llevo unos dias intentando cambiar el formato de un campo del tipo multivalor, pero al ejecutar el botón me da un error "13 no coinciden los tipos". Os cuento:

Mi BD se compone de varios campos, de los cuales hay unos cuantos que son multivalor, por lo que en ellos se pueden elegir mas de un valor. He creado una consulta (llamémosla CONSULTA1) asociada a una tabla que tiene estos campos multivalores y otros que no lo son. La creación de una nueva tabla la creo así:

CurrentDb.Execute "CREATE TABLE " & nomTabla & "([REFERENCIA] Text,[ID] Text,[TIPO_REGISTRO] Text,[DLG] Text,  [Nº_REF] Text,[ESTABLECIMIENTO] Text,[SAP] Text,[TIPO_TARIFA] Text, [TEMPORADA] Text, [OBSERVACIONES_DLG] Text,[REGISTRADO_EL] Text,[REGISTRADO_POR] Text,[TÉCNICO_DCC] Text, [INICIO_CARGA] Text, [ESTADO] Text, [FINALIZADO_EL] Text,[OBSERVACIONES_DCC] Text,[INICIO_REVISIÓN] Text, [FIN_REVISIÓN] Text, [REVISADO_POR] Text, [PAUSADO_EL] Text,[PAUSADO_CHM] Text)"

El campo "TIPO_TARIFA" es uno de los que son multivalor, que como veis en la nueva tabla que se crea la he definido como TEXTO: ...[TIPO_TARIFA] Text... al igual que el resto de campos. Todos serán textos recogidos de una consulta (CONSULTA1)

Luego tengo un conficional if...then que si se cumple actúa así (VER INSTRUCCION DE ABAJO)
Separa registros basándose en un campo con textos separados por barras.

Como veis indico rst("TIPO_TARIFA") que como indiqué es multivalor. Pero da error. Creo que al definir en la instrucción de arriba que en la nueva tabla creada sea texto ([TIPO_TARIFA] Text), no coinciden los tipos y por ello da el error. Mi pregunta: ¿Como puedo convertir los campos multivalor en textos con la información completa para que deje de ser multivalor? Por ejemplo, tengo este campo con valores PEQUE;GRAN;MEDIA. En la consulta se visualiza tal cual con opción de elegir varios valores. ¿Como puedo hacer que en una consulta se visualicen lo mismo pero como si fuera un texto? He probado cambiando en las propiedades de ese campo en la consulta la opcion de BUSQUEDA a cuadro de texto. Pero no funciona. Supongo que necesito una función que haga la conversión antes de aplicar esta instrucción:


CurrentDb.Execute "INSERT INTO CentroOperacionesDCC19([REFERENCIA],[ID],[TIPO_REGISTRO],[DLG],[Nº_REF],[ESTABLECIMIENTO],[SAP],[TIPO_TARIFA],[TEMPORADA],[OBSERVACIONES_DLG],[REGISTRADO_EL],[REGISTRADO_POR],[TÉCNICO_DCC],[INICIO_CARGA],[ESTADO], [FINALIZADO_EL],[OBSERVACIONES_DCC],[INICIO_REVISIÓN],[FIN_REVISIÓN],[REVISADO_POR],[PAUSADO_EL],[PAUSADO_CHM]) VALUES ('" & _
Split(rst("REFERENCIA"), "/")(i) & "','" & rst("ID") & "','" & rst("TIPO_REGISTRO") & "','" & rst("DLG") & "','" & rst("Nº_REF") & "','" & _
rst("ESTABLECIMIENTO") & "','" & rst("SAP") & "','" & rst("TIPO_TARIFA") & "','" & rst("TEMPORADA") & "','" & rst("OBSERVACIONES_DLG") & "','" & _
rst("REGISTRADO_EL") & "','" & rst("REGISTRADO_POR") & "','" & rst("TÉCNICO_DCC") & "','" & rst("INICIO_CARGA") & "','" & rst("ESTADO") & "','" & _
Nz(rst("FINALIZADO_EL"), vbNullString) & "','" & rst("OBSERVACIONES_DCC") & "','" & rst("INICIO_REVISIÓN") & "','" & _
Nz(rst("FIN_REVISIÓN"), vbNullString) & "','" & rst("REVISADO_POR") & "','" & rst("PAUSADO_EL") & "','" & rst("PAUSADO_CHM") & "')"


Si me podéis ayudar, os lo agradecería muchísima. Saludos



Respuestas:
Publicado por: jilo
Fecha de publicación: 28/Enero/2019 a las 19:27
prueba asi
 ......Cstr(rst("TIPO_TARIFA")).....


-------------
Espero te sirva !!!!!!
Iñaki


Publicado por: solbete
Fecha de publicación: 28/Enero/2019 a las 20:22
Gracias @Jilo,
Sale un error: error 3001 en tiempo de ejecución "Argumento no válido"
He probado también rst(CStr("TIPO_TARIFA")), y lo mismo. Creo que esta formula no la acepta los campos multivalor. Qué difícil 

Quizá exista otra manera, cambiando en  la instrucción siguiente, en el apartado de [TIPO_TARIFA] Text por otro que no sea Text, es decir, creando la tabla con datos multivalor

CurrentDb.Execute "CREATE TABLE " & nomTabla & "([REFERENCIA] Text,[ID] Text,[TIPO_REGISTRO] Text,[DLG] Text,  [Nº_REF] Text,[ESTABLECIMIENTO] Text,[SAP] Text,[TIPO_TARIFA] Text, [TEMPORADA] Text, [OBSERVACIONES_DLG] Text,[REGISTRADO_EL] Text,[REGISTRADO_POR] Text,[TÉCNICO_DCC] Text, [INICIO_CARGA] Text, [ESTADO] Text, [FINALIZADO_EL] Text,[OBSERVACIONES_DCC] Text,[INICIO_REVISIÓN] Text, [FIN_REVISIÓN] Text, [REVISADO_POR] Text, [PAUSADO_EL] Text,[PAUSADO_CHM] Text)"



A ver si nos puede ayudar alguien con esto que me trae loquito. Gracias 




Publicado por: Mihura
Fecha de publicación: 28/Enero/2019 a las 20:32
Además de esperar a ver si aparece alguien que sea capaz de echarte un cable ...

Yo no uso BAJO NINGÚN CONCEPTO los campos multivalor, bueno y otros colegas que conozco tampoco, son un tremendo dolor de muelas. 

Plantéate redefinir la BD, cuál sería su coste. A la hora de sopesar los tiempos no sólo pienses en este problema sino en los que tendrás en el futuro.

Una posible solución es cambiar el campo multivalor por uno tipo TEXTO o MEMO en la que guardes los distintos valores que vayas a tener separados por (;) o (|) ...


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: solbete
Fecha de publicación: 28/Enero/2019 a las 20:44
Hola,

Si, ya veo que son problemáticos y en el futuro puede, como dices lo tendré aún más. El problema es que la tabla principal debe estar vinculada a una lista de sharepoint donde los datos son multivalor y al descargarse se descargan igualmente. Si pudiera hacer que se descarguen estos campos multivalor en tipo texto o memo manteniendo la estructura del valor es decir, todas las opciones elegidas desde la lista sharepoint tipo OPCION A;OPCION B, seria lo suyo. 

Gracias por el interés. 


Publicado por: Mihura
Fecha de publicación: 28/Enero/2019 a las 22:15
Mírate estos enlaces:

https://docs.microsoft.com/es-es/office/vba/access/concepts/data-access-objects/manipulate-multivalued-fields-with-dao" rel="nofollow - Tratar multivalor con DAO

http://neckkito.xyz/nck/index.php/ejemplos/13-formularios/93-campos-multivalor-en-cascada" rel="nofollow - Ejemplo de Nekkito


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: solbete
Fecha de publicación: 29/Enero/2019 a las 22:11
Muy buen ejemplo, de hecho utilizaré parte de este para mi BD, pero no me sirve para lo que quiero. Necesito convertir multivalores en texto / valores únicos con todas las opciones elegidas en los campos multivalor. Cada día lo veo más complicado, por lo que veo. 

Gracias por la ayuda


Publicado por: mounir
Fecha de publicación: 29/Enero/2019 a las 22:20
Hola!

Mírate este hilo, en el hay un ejemplo de crear tablas con campo multivalor.

http://www.rogersaccesslibrary.com/forum/query-a2k10-multivaluefields_topic575.html" rel="nofollow - http://www.rogersaccesslibrary.com/forum/query-a2k10-multivaluefields_topic575.html

-------------
Un Saludo.


Publicado por: mounir
Fecha de publicación: 29/Enero/2019 a las 23:53
Hola!

Este código te pasa Campo Multivalor a Texto, adáptalo a tus necesidades:

Private Sub Comando2_Click()

Dim rs As DAO.Recordset

Dim rsMV As DAO.Recordset

Dim strOut As String

Dim lngLen As Long

Dim strResult As String

Dim strSQL As String

strSQL = "SELECT [NombreCampoMV] FROM [NombreTabla]"

Set rs = DBEngine(0)(0).OpenRecordset(strSQL, dbOpenDynaset)

Do While Not rs.EOF

        Set rsMV = rs(0).Value

        Do While Not rsMV.EOF

            If Not IsNull(rsMV(0)) Then

            strOut = strOut & rsMV(0) & ", "

            End If

            rsMV.MoveNext

        Loop
       
        strOut = strOut & vbCrLf
            
        Set rsMV = Nothing

    rs.MoveNext

Loop

lngLen = Len(strOut) - 2

If lngLen > 0 Then

    strResult = Left(strOut, lngLen)

    NombreTextBox = strResult

End If

Set rs = Nothing

Set rsMV = Nothing

End Sub


-------------
Un Saludo.


Publicado por: solbete
Fecha de publicación: 30/Enero/2019 a las 12:44
Que bueno, voy a probar. Se me ocurre otra cosa desde mis pocos conocimientos. Realmente necesito que la tabla vinculada o importada de una lista de sharepoint se convierta todos los campos en texto.
Entiendo es ahí donde entra en acción el codigo de mounir. Como tengo mas de un campo multivalor tendré que añadir mas de uno a
strSQL = "SELECT [NombreCampoMV] FROM [NombreTabla]"
Qué lio, jejeje


Publicado por: solbete
Fecha de publicación: 31/Enero/2019 a las 12:18
Hola, no me funciona. Sale el mismo error. Al adaptarlo a mi código y aplicarlo el campo multivalor lo considera valor vacio. He creado una funcion con este codigo y aplicado a una consulta y nada. Lo veo complicado. Sigo probando mas opciones. A lo mejor, es imposible hacerlo, no se si access tiene esta opción de conversión de multivalores. Si a alguien se le ocurre algo, agradezco su ayuda. Si no es posible, deberia cambiar mi BD
Gracias a los que me han dado su valiosa aportación.


Publicado por: mounir
Fecha de publicación: 31/Enero/2019 a las 13:13
Hola!

El código que te he posteado funciona perfectamnete.

Te dejo otro enlace de Neckkito que hace lo mismo y con ejemplo

http://neckkito.xyz/nck/index.php/ejemplos/16-controles/125-campos-multivalor" rel="nofollow - http://neckkito.xyz/nck/index.php/ejemplos/16-controles/125-campos-multivalor

-------------
Un Saludo.



Imprimir página | Cerrar ventana