Clausula distinct

Mi problema es que al aplicar la clausula distinct sobre una tabla de la forma:
Data2. RecordSource = "select distinct OT, Categoria, PrecioC, PVP from categorias order by OT"
Data2. Refresh
La cual tiene otros 2 campos más los cuales no me importan, me lo hace perfecto pero luego al querer modificar registros de la forma:
Data2. Recordset. Edit
Data2.Recordset.Fields("PVP") = Text4
Data2.Recordset.Update
Me sale el siguiente error:
Error 3027 en tiempo de ejecución
No se puede actualizar. La base de datos o el objeto es de solo lectura.
Y lo que quiero es que me aparezcan sólo estos registros y los pueda modificar luego.
¿Puede ser mi problema debido a que tengo que aplicar el distinct sobre todos los campos de la tabla?

2 Respuestas

Respuesta
1
Fíjate en propiedades de tu ADODC posiblemente lo tengas abierto como solo lectura.
En lo posible si quieres operar con recordsets actualizables utiliza siempre apertura CursorType=adOpenKeyset.
Por otro lado ejecuta esa misma consulta desde Access y fíjate si te permite actualizar el conjunto de registros, es una buena manera de verificar en algunos casos si el tipo de relaciones que se establecen permite o no realizar actualizaciones o agregado de registros a nuestras consultas.
Hola de nuevo, ¿Dónde busco las propiedades de ADODC y dónde abro como CursorType=adOpenKeyset?
No llevo mucho tiempo programando en VB6.0 y esta jerga no me es toidavía familiar. Un saludo.
ADODC = Ado Data Control
Es el control que te permite realizar tu conexión a la base de datos y definir el origen del recordset para trabajar con los datos enlazados.
Haciendo click con el botón derecho sobre el ADODC presiona Propiedades para abrirlas y en una de las pestañas encontraras el cursortype.
Hola, soy yo de nuevo, ya he encontrado el control ADODC, pero cómo debo conectarlo a la tabla de access en cuestión y si lo llamo Data2, ¿puedo realizar la consulta de la forma anterior?
Data2.RecordSource = "select distinct OT,Categoria,PrecioC,PVP from categorias order by OT"
Data2.Refresh
Muchas gracias por toda tu atención ya que esto es de vital importancia para mi.
¿Perdoname pero no entiendo lo último que me has preguntado? Puedes ser más extenso para aclararlo.
¿Lo qué quiero saber es si puedo visualizar el control Adodc (el que ya he conectado a la base de datos a través de odbc y he puesto en propiedad Datasource la consulta SQL) en un DBGrid?
Ok, ahora entiendo lo que pasa.
La diferencia es que si trabajas con ADO tienes que usar DataGrid y no la DBgrid que utilizas ya que esa es para DAO.
Puedes acivarla mediante componentes igual que lo haces con DBgrid.
He puesto el DataGrid y me funciona! Pero también si no es mucha molestia me gustaría saber que eventos uso para el control ADODC tales como: addnew, update, edit, movenext, movefirst,
moveprevious, movelast, findfirst..., etc.
¿Dónde puedo hacerme con la lista de ellos?
Ah! Y me sale un mensaje de Visual Basic al entrar en el formulario que carga los datos el cual dice:
No se ha encontrado ningún origen de datos compatible para este control. Agregue un control Data intrínseco o un control RemoteData al formulario.
GRACIAS de nuevo.
En ADO no existe el método .Edit
Las modificaciones las haces directamente.
Creo que es:
Para Agregar:
ADODC1. Recordset. AddNew
Para Igualar:
ADODC1.Recordset.Fields("TUCAMPO")= VariableConValor
Para Guardar los Cambios:
ADODC1.Recordset.Update
Para Borrar:
ADODC1.Recordset.Delete
Con respecto al Error Fíjate el DataSource del DataGrid que esté establecido el nombre de tu ADODC que tengas en el formulario activo.
OK! Ya he solucionado lo de antes, pero ahora al modificar un par de registros con:
ADODC1.Recordset.Fields("MICAMPO")= VariableConValor
Me sale el mensaje:
Microsoft DataGrid Control
Información de columna clave insuficiente o incorrecta;demasiadas filas afectadas por la actualización.
Además el campo PVP de la consulta:
Data2.RecordSource = "select distinct OT,Categoria,PrecioC,PVP from categorias order by OT"
Quiero que aparezca en el DataGrid pero no quiero seleccionarlo en la consulta y si no lo hago entonces no me aparece.
¿Cómo puedo hacerlo en SQL?
Muchas, Muchas Gracias.
¿1º - Tienes alguna clave principal definida en tu tabla?
PD: Recuerda que no podrás actualizar directamente sobre la grilla, deberás hacerlo manualmente buscando el registro por ID y luego igualando los campos uno por uno antes de hacer el update, ya que al utilizar el distinct una fila del datagrid puede ser equivalente a más de una en la tabla real.
2º - Si no pones el nombre del campo PVP en la consulta SQL es imposible que muestres su valor en la grilla.
Respuesta
1
El problemas esta en que problablemente existan varios registros con una misma ot, categoria, precioc y pvp para esa select y al intentar hacer el update no puede debido a que implica a varios registros. Prueba a realizar esta sentencia update en sql directamente, es decir update categorias set pvp=" text4 " where ot= and categoria= and precioc= and pvp=
Así lograras actualizar todos los registros

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas