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 

¿Cómo puedo actualizar una tabla a partir de una consulta?
Ir a página Anterior  1, 2
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Responder citando

Bueno con Locate ya lo he conseguido, al final he sustituido el ARRAYOFCONST por un OPENARRAY:

Código:
frmMaquinas->dataMaquinas->Locate("maq_nserie;maq_nmod",VarArrayOf(OPENARRAY(Variant,(SQLBusMaq->FieldByName("maq_nserie")->AsString, SQLBusMaq->FieldByName("maq_nmod")->AsString))),TLocateOptions());


Ya con esto funciona. Aún así, todavía sigo interesado con lo que has comentado César Wink

saludos y gracias de nuevo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

ercea escribió:
Código:
frmMaquinas->dataMaquinas->Locate("maq_nserie;maq_nmod",VarArrayOf(ARRAYOFCONST((    SQLBusMaq->FieldByName("maq_nserie")->AsString, SQLBusMaq->FieldByName("maq_nmod")->AsString)),TLocateOptions());

¡Te ha faltado poco para acertar! Smile

Según la ayuda de Builder, un locate con VarArray sería así, por ejemplo:
Código:
TLocateOptions Opts;
Opts.Clear();
Opts <<loPartialKey>FieldByName("maq_nserie")->AsString;
values[1] = SQLBusMaq->FieldByName("maq_nmod")->AsString;
frmMaquinas->dataMaquinas->Locate("maq_nserie;maq_nmod",VarArrayOf(values, 2), Opts);

De todas maneras, insisto: ¿no te resultaría más sencillo con un query?
Código:
TQuery *Buscar = new TQuery(this);
Buscar->SQL->Text = "SELECT * FROM dataMaquinas WHERE maq_nserie = :maq_nserie AND maq_nmod = :maq_nmod";
Buscar->ParamByName("maq_nserie")->AsString = SQLBusMaq->FieldByName("maq_nserie")->AsString;
Buscar->ParamByName("maq_nmod")->AsString = SQLBusMaq->FieldByName("maq_nmod")->AsString;
Buscar->Prepare();
Buscar->Open();

_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Gracias Angel por responder. El problema que tengo al usar el Query, es que luego no sé como "trasladar" el contenido de la tabla de esa tupla en el formulario de "Editar Maquinas", es decir despues de escribir el código que me has puesto, luego no sé como coger los datos de la tabla para mostrarlo en un formulario de edición (con dbedits y demás) para editar los datos.

Pongo dataMaquinas->Edit() (para activar la edición de datos), pero lo que consigo es mostrar los datos del primer registro, no se "mueve" donde quiero, no sé explicarme bien :S, pero prefiero con Query en vez de Locate... sobre todo por tema de eficiencia (ya que como lo hago ahora mismo, hago la búsqueda, y luego al seleccionar la máquina que quiero hace un Locate... con que es menos eficiente)

saludos! y lo siento por ser tan pesado Embarassed

EDITO: Os pongo unas capturas para ver si así me explico mejor xD. Mirad este es el formulario general de máquinas:



Tiene un IBDataSet apuntando al componente IBDataBase (que lo tengo en el formulario principal del programa), su correspondiente componente de transacciones, y un datasource para el grid (el datasource apunta al IBDataSet, y el grid al datasource).

Ahora este es el formulario de búsqueda (al pulsar el botón Buscar, se abriría este formulario):



Como veis, tiene unos cuantos edits para concretar la búsqueda (algunos son provisionales), un IBQuery para realizar dicha búsqueda, un datasource que apunta a este IBQuery, y un grid que apunta al datasource.

Pues bien tenemo en ejecución y sale algo así:



Pulso el botón buscar y concreto la búsqueda (en este caso máquinas con nº de serie que empiecen por 37), y sale lo siguiente:



Ahora selecciono dicho resultado y pulso el botón "Editar", y vereis el resultado (el formulario contiene DBEdits, DBMemo, y un TImage (para el truco de guardar imagenes JPEG en la tabla)):



Como veis, no es la máquina que había seleccionado en el grid del formulario de busqueda (el nº de serie es 12121, mientras que el que yo había seleccionado empezaba por 37)... concretamente es la primera tupla de la tabla máquinas... a esto es a lo que me refiero si uso Query en vez de Locate, ya que el botón "Editar" lo que hace es:

Código:

if(!SQLBusMaq->IsEmpty())
{
//...
    frmMaquinas->dataMaquinas->Edit(); //es el IBDataSet

//... aqui tengo las funciones para cargar imagenes JPEGS provenientes de un Blob

    frmEditarMaq->Show();
    frmBuscarMaq->Hide();
}


En fin, espero que ahora me haya explicado mejor, y otra vez más siento ser tan pesado. De todos modos, a unas malas, tiraré de Locate por mucho que me pese

gracias por vuestra paciencia, saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Vale, vamos por partes. Ten en cuenta que con el query realmente lo que estás haciendo es crear una tabla que se ajusta a los datos que indicas, no te estás situando en el registro real de la tabla real cosa que si haces con el locate.

Repasando el hilo me he dado cuenta de una cosa que ponías en el primer mensaje:
Cita:
Hasta ahora lo que he conseguido ha sido intentos fallidos, ya que lo que hacía era copiar en los dbedits->Text el contenido de cada campo del componente SQL del formurario de búsqueda (dbedit->Text = SQL->FieldByName("Campo")->AsString).

Se me había pasado por alto. Los dbedit de ese fornulario, ¿a que tabla apuntan? Tú puedes forzar como haces a que el valor sea uno, pero lo que haces es referirlo a la tabla asociada a los elementos, y no al query. Además, hasta donde yo he vsito, un query no puedes actualizarlo como uantabla; es decir: no puede hacer Query1->Insert() de la misma forma que haces Table1->Insert().

La única alternativa que te queda al locate es indexar la tabla (lo tienes fácil con ese campo que comentabas que es diferente ¿registro?) y utliizar GotoKey() y demás instrucciones de búsqueda indexada.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Perfecto Ángel, todo mas claro Very Happy. Lo del primer comentario era mis primeras chapucillas que hacía xD (además que usaba Paradox, ahora estoy con Firebird)

Lo dicho, gracias a todos Wink

saludos!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
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.