Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Una dudilla sobre inserciones y datasets

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Una dudilla sobre inserciones y datasets Responder citando

Hola a todos, espero que alguien pueda ayudarme, porque ya le he dado muchas vueltas a este tema y no he conseguido solucionarlo ¿qué es lo que estoy pasando por alto? o ¿que es lo que me falta por hacer?

Os explico, pido al usuario unos datos que despúes quiero almacenar en una tabla de una BD. Se trata de una BD Access, local, y la conexión la hago con ADO. La tabla donde quiero insertar se llama Titulaciones y está asociada a la ADOTableTit. En un principio yo abría la ADOTableTit (con el método Open) y después hacía lo que he copiado a continuación:


// Preparo la ADOTable en modo inserción
Data1->ADOTableTit->ReadOnly = false;
Data1->ADOTableTit->Edit();

// Cierro y limpio la ADOQuery
Data1->ADOQuery2->Close();
Data1->ADOQuery2->SQL->Clear();

// Introduzco la sentencia SQL de inserción y la ejecuto
Data1->ADOQuery2->SQL->Add("INSERT INTO Titulaciones (COD_TIT, TITULO, PLAN)");
Data1->ADOQuery2->SQL->Add("VALUES ("+Codigo+",'"+Nom_Tit+"',"+Plan+")");
Data1->ADOQuery2->ExecSQL();


Data1->ADOTableTit->Post();
Data1->ADOTableTit->ReadOnly = true;


El Problema es que cuando lo ejecuto me dice que esa operación no se puede realizar en un dataset abierto, pero si que inserta el nuevo registro en la tabla Titulaciones. Probé a cerrar la ADOTableTit, pero lógicamente me dice que la operación no se puede realizar en un dataset cerrado.

Este es el mensaje que me sale ahora (con el código que he copiado arrriba)-> ADOTableTit: Cannot perform this action on an open dataset

Haciendo otras pruebas me decía que no lo podía hacer porque el dataset no estaba en "edit or insert mode", y ¿cómo puedo cambiar el estado del dataset?, porque se puede consultar, pero se puede cambiar???

Muchas gracias anticipadas por vuestra atención y por vuestras respuestas. Esto acabará provocándome pesadillas.....
Volver arriba
Mensaje    Asunto: Olvidé identificarme Responder citando

Pues eso, que la de la duda de antes soy yo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Has probado a hacer solo lo siguiente:

Código:
// Introduzco la sentencia SQL de inserción y la ejecuto
Data1->ADOQuery2->SQL->Clear();
Data1->ADOQuery2->SQL->Add("INSERT INTO Titulaciones (COD_TIT, TITULO, PLAN)");
Data1->ADOQuery2->SQL->Add("VALUES ("+Codigo+",'"+Nom_Tit+"',"+Plan+")");
Data1->ADOQuery2->Prepare();
Data1->ADOQuery2->ExecSQL();


Con ese código ya introducess la tupla en la tabla titulaciones, el resto de codigo que has puesto es cuando la inserción no la realizas en modo SQL, y claro al mezclar código de un tipo y otro obtienes el citado error.

Ciao.
_________________
OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Hola shackletta,


Trataré de explicar lo puedo observar en tu código.

Primero:

Hay varias formas de poder agregar datos a tu tabla, pero al parecer tienes una confusión de como operan los componentes.

Lo digo porque utilizas un ADOTable y un ADOQuery y con ambos se pueden agregar datos a tu tabla pero operan de manera diferente.

Cita:

// Preparo la ADOTable en modo inserción
Data1->ADOTableTit->ReadOnly = false;
Data1->ADOTableTit->Edit();


Aclaración... no estas preparando el ADOTable en modo inserción....le estas cambiando el estado a modo Edición, ademas para esto es necesario primero abrir la tabla y no veo la instrucción

Código:

Data1->ADOTableTit->Open();


Segundo:
Si utilizas el ADOTable para agergar tus datos, toma en cuenta que al abrir la tabla te regresará todos los registros de la misma. Si el objetivo es solo insertar los datos esto no es una buena opción.....es mejor usar el ADOQuery.

Te dejo un ejemplo de como insertar tus datos con ADOTAble

Código:


//Ejemplo inserción de datos utilizando ADOTable

//Abrir la tabla,
Data1->ADOTableTit->Open();

//Agregar un registro en blanco
Data1->ADOTableTit->Append();

//Asignar valores a tus campos
Data1->ADOTableTit->Fields->FieldByName("Cod_Tit")->Value = Codigo;
Data1->ADOTableTit->Fields->FieldByName("Titulo")->Value = Titulo;
Data1->ADOTableTit->Fields->FieldByName("Plan")->Value = Plan;

//Guardar los datos
Data1->AdoTableTit->Post();

//Cerrar la tabla
Data1->ADOTableTit->Close();



Esto es suficiente para tu proposito, por lo que no sé porque intentas mezclar ADOTable con ADOQuery para insertar tu registro.

El ejemplo con ADOQuery es el que posteo XyVy.

Suerte
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muchas gracias a los 2, vereis, resulta que realmente estaba confundida, porque es la primera vez que trabajo con Builder y la verdad es que no encuentro las cosas bien explicadas en ningún sitio, ahora, poco a poco ya me voy aclarando un poco más, sobre todo gracias a este foro.

La verdad es que pensaba que aunque hiciera la inserción mediante una claúsula SQL, tenía que tener la tabla preparada. Al final opté por hacerlo de la siguiente manera (que es prácticamente lo mismo que la opción propuesta por Buildero). Ah! lo de que la tabla tenía que estar abierta sí que lo sabía, y de hecho sí que lo tengo en el código, pero muchas gracias por la explicación que me has dado.

// Si la tabla no está activa, la activo
if (Data1->ADOTableTit->Active == false)
Data1->ADOTableTit->Open();


// Añado un nuevo registro al final de la tabla
Data1->ADOTableTit->Append();

// Introduzco los valores escritos por el usuario en dicho registro
Data1->ADOTableTit->FieldValues[AnsiString("COD_TIT")]= EditCod->Text;
Data1->ADOTableTit->FieldValues[AnsiString("TITULO")]=EditNom->Text;
Data1->ADOTableTit->FieldValues[AnsiString("PLAN")]=EditPlan->Text;

// Antes de proceder a confirmar la inserción, compruebo que la
// tabla esté en modo inserción o edición, y si no lo está, la
// pongo en modo edición con el método Edit()
if (Data1->ADOTableTit->State != dsEdit ||
Data1->ADOTableTit->State != dsInsert)
Data1->ADOTableTit->Edit();

// Confirmo la inserción y cierro la tabla
Data1->ADOTableTit->Post();
Data1->ADOTableTit->Close();

Pues eso, que lo de modo inserción y edición de la tabla lo encontré después de poner la consulta, y ahora ya lo tengo claro. Aunque, si tal como explica Buildero es mejor emplear la ADOQuery cambiaré el código y lo haré como dijo XyVy

Muchas gracias a los 2, bueno, y a todos los participantes del foro.Ciao, y hasta la próxima, que seguro que no tardaré mucho.... Laughing
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Solo una observación...

Cita:

// Antes de proceder a confirmar la inserción, compruebo que la
// tabla esté en modo inserción o edición, y si no lo está, la
// pongo en modo edición con el método Edit()
if (Data1->ADOTableTit->State != dsEdit ||
Data1->ADOTableTit->State != dsInsert)
Data1->ADOTableTit->Edit();


No es necesario el este código, ya que al invocar el método Append(), el estado del dataset es Insert (dsInsert) por loq ue esta parte de tu código es innecesaria.

Y no te preocupes, a todos nos pasa cuando nos aventuramos con algo nuevo.

Te recomiendo que cheques la ayuda F1, ahi viene muy bien explicado como trabajar con los componentes ADO.

Suerte y saludos
Volver arriba
Mensaje    Asunto: Responder citando

El del mensaje anterior fui yo, sorry, se me olvido logearme.

Saludos
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.