Access - SQL no me trae el campo de tipo memo completo

 
Vista:
sin imagen de perfil

SQL no me trae el campo de tipo memo completo

Publicado por Jose (15 intervenciones) el 20/08/2015 14:13:29
Hola.

Tengo un formulario que muestra los registros de la tabla Programas. Uno de los campos (desc_larga) es de tipo memo. Cuando en el origen del registro del formulario indico el nombre de la tabla (o incluso "select * from Programas), no tengo problemas, pero si cambio en el código vb el recordsource ¡no me trae todo el campo memo! ¿Por qué?
Con los demás campos no hay problema...

Esto es parte del código del evento Form_Open:

sql = "SELECT DISTINCT Programas.Id, Programas.nombreprog, Programas.precio, Programas.descripcion_corta, Programas.descripcion_larga " + _
"FROM (((Programas INNER JOIN (Categorias INNER JOIN ProgramasCategorias ON Categorias.Id = ProgramasCategorias.IdCategoria) ON Programas.Id = ProgramasCategorias.IdPrograma) INNER JOIN (Dispositivos INNER JOIN ProgramasDispositivos ON Dispositivos.Id = ProgramasDispositivos.IdDispositivo) ON Programas.Id = ProgramasDispositivos.IdPrograma) INNER JOIN (Idiomas INNER JOIN ProgramasIdiomas ON Idiomas.Id = ProgramasIdiomas.IdIdioma) ON Programas.Id = ProgramasIdiomas.IdPrograma) INNER JOIN (Plataformas INNER JOIN ProgramasPlataformas ON Plataformas.Id = ProgramasPlataformas.IdPlataforma) ON Programas.Id = ProgramasPlataformas.IdPrograma " + _
"WHERE Idiomas.nombreid IN (" + listaidiom + ") AND Categorias.nombre IN (" + listacat + ") AND Dispositivos.nombre IN (" + listadisp + ") AND Plataformas.nombreplat IN (" + listaplat + ")" + _
"ORDER BY Programas.nombreprog"

Me.RecordSource = sql
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

SQL no me trae el campo de tipo memo completo

Publicado por Enrique Heliodoro (1664 intervenciones) el 20/08/2015 16:20:31
Para que Access funcione de forma correcta, modifica el concatenador (+) que estas aplicando (y que Access intenta soportar por compatibilidad) por el que se utiliza en Access (&), es probable que evites problemas y elimines el mas que probable error que se generara cuando 'entienda' que en lugar de concatenar aplique la función matemática de la suma.

Los campos de tipo memo son un tipo de campo bastante problemático (lo de 'memos' es un apodo bien ganado).

Si por la causa que fuere se intentan 'manipular' lo mas mínimo, Access lo manejara como un campo de texto y tomara los primeros ¿254? caracteres.

Solución, no manipularlo en absoluto, hasta el punto de que en muchas ocasiones se le omite en la generación de la SQL (en la que se filtra, ordena, agrupa) y de forma posterior se le enlaza incluso con otra SQL (obligara a conservar el ID que los asocia).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

SQL no me trae el campo de tipo memo completo

Publicado por Jose (15 intervenciones) el 20/08/2015 20:31:06
El cambio del + por & no ha resultado

Siguiendo lo que comentas de enlazarlo con otra SQL, he puesto un cuadro de texto independiente en el formulario y en el evento Form_current hago

Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM Programas WHERE id_Empresa = " & Str(Forms!admonprogramas.Id.Value), CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText

con idea de leer del rst el campo descripcion_larga y asignárselo al mencionado cuadro de texto... pero me da un error en tiempo de ejecución diciendo que "no se han asignado valores para alguno de los parámetros requeridos". La sentencia Select está correcta. ¿Se te ocurre qué puede pasar?

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

SQL no me trae el campo de tipo memo completo

Publicado por Enrique Heliodoro (1664 intervenciones) el 20/08/2015 22:01:38
Uno, la modificación del concatenador no era el problema, pero si se esta utilizando Access se debe utilizar de una forma correcta, así se evitan los errores asociados (por ejemplo si se trabaja con datos que puedan representar a números 'aunque sean textos', además de los problemas de que uno de los elementos no tenga valor).

Lo segundo ¿Access y ADO para trabajar en Access? ... yo acostumbro a utilizar las puertas para acceder no las ventanas (y eso representa ADO en Access cuando no se utiliza para asociar datos de otros entornos).

Yo no creo haber indicado que se le trate como un elemento independiente (aunque se pueda aunque no de esa forma) , me refería a que se manipulasen los datos (con la excepción de los de tipo Memo que NO ADMITEN MUCHAS MANIPULACIONES), esto es que de la SQL que recorta los memos se sacasen a los campos de tipo memo

Se tendría un conjunto de datos a los que le faltaría el incomprendido memo , para añadírselo:
La SQL anterior (sin memos) + la tabla con los campos MEMO
Se relacionarían por el (supuesto) dato común (si no esta en la 'sin memos' se le añade 'en lugar del memo')

Obtendríamos una nueva consulta que tendría los resultados anteriores y manipulados y además el memo sin manipular (fin).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

SQL no me trae el campo de tipo memo completo

Publicado por Jose (15 intervenciones) el 21/08/2015 00:51:38
He hecho lo que comentas. Cuando no hay mucho JOIN:

SELECT Programas.Id, Programas.nombreprog, Programas.precio, Programas.descripcion_corta, Programas_1.descripcion_larga
FROM Programas INNER JOIN Programas AS Programas_1 ON Programas.Id = Programas_1.Id;

trae bien el memo, pero cuando sí los hay:

SELECT DISTINCT Programas.Id, Programas.nombreprog, Programas.precio, Programas.descripcion_corta, Programas_1.descripcion_larga
FROM ((((Programas INNER JOIN (Categorias INNER JOIN ProgramasCategorias ON Categorias.Id = ProgramasCategorias.IdCategoria) ON Programas.Id = ProgramasCategorias.IdPrograma) INNER JOIN (Dispositivos INNER JOIN ProgramasDispositivos ON Dispositivos.Id = ProgramasDispositivos.IdDispositivo) ON Programas.Id = ProgramasDispositivos.IdPrograma) INNER JOIN (Idiomas INNER JOIN ProgramasIdiomas ON Idiomas.Id = ProgramasIdiomas.IdIdioma) ON Programas.Id = ProgramasIdiomas.IdPrograma) INNER JOIN (Plataformas INNER JOIN ProgramasPlataformas ON Plataformas.Id = ProgramasPlataformas.IdPlataforma) ON Programas.Id = ProgramasPlataformas.IdPrograma) INNER JOIN Programas AS Programas_1 ON Programas.Id = Programas_1.Id;

ya recorta el memo

Además, en ambos casos, al intentar modificar en el formulario da el error "No se puede actualizar este Recordset". ¡¡Vaya con los memos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

SQL no me trae el campo de tipo memo completo

Publicado por Enrique Heliodoro (1664 intervenciones) el 21/08/2015 23:07:07
Creo que no aplicas la alternativa que propuse, lo cual implica que no puedes juzgar si funciona y por lo tanto nada mas tengo que añadir.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
sin imagen de perfil

SQL no me trae el campo de tipo memo completo

Publicado por Jose (15 intervenciones) el 22/08/2015 17:13:18
Encontré el problema: es el DISTINCT. Access recorta el memo para no tener que comparar 65000 y pico caracteres, lo que podría tardar un horror, así que se queda con 255. Cambiando la forma de la SQL se soluciona. ¡Espero que le sirva a alguien!

sql = "SELECT * FROM Programas WHERE id IN " & _
"(SELECT DISTINCT Programas.Id " & _
"FROM (((Programas INNER JOIN (Categorias INNER JOIN ProgramasCategorias ON Categorias.Id = ProgramasCategorias.IdCategoria) ON Programas.Id = ProgramasCategorias.IdPrograma) INNER JOIN (Dispositivos INNER JOIN ProgramasDispositivos ON Dispositivos.Id = ProgramasDispositivos.IdDispositivo) ON Programas.Id = ProgramasDispositivos.IdPrograma) INNER JOIN (Idiomas INNER JOIN ProgramasIdiomas ON Idiomas.Id = ProgramasIdiomas.IdIdioma) ON Programas.Id = ProgramasIdiomas.IdPrograma) INNER JOIN (Plataformas INNER JOIN ProgramasPlataformas ON Plataformas.Id = ProgramasPlataformas.IdPlataforma) ON Programas.Id = ProgramasPlataformas.IdPrograma " & _
"WHERE Idiomas.nombreid IN (" & listaidiom & ") AND Categorias.nombre IN (" & listacat & ") AND Dispositivos.nombre IN (" & listadisp & ") AND Plataformas.nombreplat IN (" & listaplat & "))" & _
"ORDER BY nombreprog"

Me.RecordSource = sql
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar