 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Invitado
|
Publicado: Mar 05 Abr, 2005 6:09 pm Asunto: Una dudilla sobre inserciones y datasets |
|
|
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 |
|
 |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Mar 05 Abr, 2005 6:10 pm Asunto: Olvidé identificarme |
|
|
| Pues eso, que la de la duda de antes soy yo... |
|
| Volver arriba |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Mie 06 Abr, 2005 8:32 am Asunto: |
|
|
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 |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Jue 07 Abr, 2005 4:41 pm Asunto: |
|
|
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 |
|
 |
shackletta Lt JG

Registrado: 01 Dic 2004Mensajes: 68
|
Publicado: Jue 07 Abr, 2005 5:08 pm Asunto: |
|
|
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....  |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Jue 07 Abr, 2005 7:45 pm Asunto: |
|
|
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 |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Jue 07 Abr, 2005 7:47 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|