Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-09-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
insertar registro en una tabla detalle cuando otra general no tiene datos aun

Hola nuevamente:

a ver si logro explicarme:

Tengo dos tablas:

TAGENDA TRECORDAR
ID_AGENDA-----------------| ID_RECORDAR
ID_EMPLEADO ------------------ID_AGENDA
FECHA DETALLE_ARECORDAR
ESTADO MOSTRAR DESDE // En teoria para mandar fecha en la cual empiece a avisar
FECHA
HORA

La idea es que en la aplicaciones pueden haber varios empleados utilizando el programa pero cada uno con agenda diferente al loguearse.
Pero no se me ilumina como crear la sentencia sql para agregar datos a la TAGENDA y relacionarla con la TRECORDAR

Alguna ayudita..


Saludos


novato_erick
Responder Con Cita
  #2  
Antiguo 19-09-2012
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola

Saludos
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 19-09-2012
ElMug ElMug is offline
Miembro
NULL
 
Registrado: jul 2012
Posts: 163
Poder: 12
ElMug Va por buen camino
En relaciones de uno-a-muchos, es la regla PRIMERO insertas datos en la relacion "uno" y DESPUES en la relacion "muchos".

Esto es la base de la integridad relacional.
Responder Con Cita
  #4  
Antiguo 19-09-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Cita:
ElMug:

En relaciones de uno-a-muchos, es la regla PRIMERO insertas datos en la relacion "uno" y DESPUES en la relacion "muchos".

Esto es la base de la integridad relacional.
Claro entiendo esa parte. Tal vez no me he dado a explicar:

en mi tabla TAGENDA aun no se ha generado un ID_AGENDA, la pregunta es como podría obtener el id de mi agenda para ser otorgado a mi TRECORDAR

Aqui esta nuevamente:

Código:
TAGENDA                                                     TRECORDAR
ID_AGENDA-----------------|                         ID_RECORDAR
ID_EMPLEADO                      ------------------ID_AGENDA
FECHA                                                  DETALLE_ARECORDAR
ESTADO                                                MOSTRAR DESDE // En teoria para mandar fecha en la cual empiece a avisar
                                                          FECHA
                                                          HORA

Saludos


novato_erick
Responder Con Cita
  #5  
Antiguo 19-09-2012
Salnhack Salnhack is offline
Miembro
NULL
 
Registrado: oct 2011
Ubicación: Cuba
Posts: 71
Poder: 13
Salnhack Va por buen camino
hola
no se mucho de SQL, pero una via seria que a la hora de crear el usuario cree tambien el registro en la tabla TAGENDA. Y despues a medidas que vallas introduciendo los datos de detalles de la agenda vas ingresando registro en TRecordar relacionado con la Agenda,

no se si me he sabido explicar y si es lo que quieres lograr.
Responder Con Cita
  #6  
Antiguo 20-09-2012
ElMug ElMug is offline
Miembro
NULL
 
Registrado: jul 2012
Posts: 163
Poder: 12
ElMug Va por buen camino
Cita:
Empezado por novato_erick Ver Mensaje
Claro entiendo esa parte. Tal vez no me he dado a explicar:

en mi tabla TAGENDA aun no se ha generado un ID_AGENDA, la pregunta es como podría obtener el id de mi agenda para ser otorgado a mi TRECORDAR

Aqui esta nuevamente:

Código:
TAGENDA                                                     TRECORDAR
ID_AGENDA-----------------|                         ID_RECORDAR
ID_EMPLEADO                      ------------------ID_AGENDA
FECHA                                                  DETALLE_ARECORDAR
ESTADO                                                MOSTRAR DESDE // En teoria para mandar fecha en la cual empiece a avisar
                                                          FECHA
                                                          HORA
Saludos


novato_erick
Diria que PRIMERO insertes la tira de TAgenda con el dato ID_Agenda y ENTONCES ya estria generado lo que necesitas que este generado, para luego usarlo.

En una relacion, no veo como se pueda usar un dato que aun no esta generado.
Responder Con Cita
  #7  
Antiguo 20-09-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola novato_erick.

Segun entiendo necesitas asignale de forma tentativa el ID de la tabla AGENDA a la tabla RECORDAR ya que le ingresas datos cuando aún no tenes guardado el registro correspondiente de AGENDA. También supongo que deseas que al abortar la operación de ingreso, en el punto que sea, quede deshecha la operación tanto para RECORDAR como para AGENDA.

Si no me equivoqué en la apreciación, existen varias soluciones las cuales dependen de la BD usada y de los componentes con que te conectas. En principio una solución es el uso de CachedUpdates.

En este enlace, se habla del tema de forma más o menos directa: ¿como obtener id del registro recien insertado?

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 23-09-2012
Avatar de elaguna
elaguna elaguna is offline
Miembro
 
Registrado: abr 2009
Ubicación: México
Posts: 51
Poder: 16
elaguna Va por buen camino
Hola qué tal.

A ver si comprendo, si estás manejando tablas y los datos de éstas vienen del servidor y la relación se establece en tu sistema, con CacheUpdates, ApplyUpdates, CancelUpdates y RevertRecord lo controlas y dejas que el servidor controle qué usuario actualizó primero el registro.

También depende el tipo de sistema que estés desarrollando si es web te recomendaría asignar ID's temporales y cuando confirmen los datos entonces cambias la clave por una definitiva.

Si es cliente servidor, lo que a mí me ha funcionado es usar TQuery y TClientDataSet para cosas indefinidas (como es tu caso), con eso tienes el control de "todo" lo que mandes a tu DB.

Si es multiusuario..., QUE VALIENTE!!!, yo ocuparía todo lo anterior y un lote de aspirinas.

Saludos.

Eduardo Laguna
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda)
Responder Con Cita
  #9  
Antiguo 26-09-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Gracias eficsa y elaguna, de ambas parte creo que encontré la solución:

Mi DB es en Firebird, los componente son de DBExpress, y la aplicacion es multiusuario Cliente Servidor.... Asi que me tome ya la Panadol ExtraFuerte....

En firebird realice lo siguiente:
Código SQL [-]

CREATE GENERATOR AGENDAID_AGENDA;

SET GENERATOR AGENDAID_AGENDA TO 0;

En un TSQLQuery llamado qCapturaId en la propiedad String hice esto:

Código SQL [-]
select gen_id(AGENDAID_AGENDA, 1) nuevo_id from rdb$database;

En el ClientDataSet utilice estos Eventos:

AfterApplyUpdate
Código Delphi [-]
procedure TdmLogicaNegocio.cdsAgendaAfterApplyUpdates(Sender: TObject;
  var OwnerData: OleVariant);
begin
cdsAgenda.Close;
cdsAgenda.Open;
end;
En el Evento AgendaNewRecord
Código Delphi [-]
procedure TdmLogicaNegocio.cdsAgendaNewRecord(DataSet: TDataSet);
begin
dmConecta.qCapturaID.Open;
try
  cdsAgendaID_AGENDA.AsInteger := dmConecta.qCapturaIDNUEVO_ID.AsInteger;
finally
dmConecta.qCapturaID.Close;
end;
end;

En el Evento ReconcileError

Código Delphi [-]
procedure TdmLogicaNegocio.cdsAgendaReconcileError(
  DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind;
  var Action: TReconcileAction);
begin
 Action := HandleReconcileError(DataSet, UpdateKind, E);
end;

En el evento OnShow de mi formulario pido que me abra el ClientDataSet y lo ponga en modo Insert,

Así que simplemente capturo el id que me me genero Firebird lo inserto en mi tabla agenda y mi tabla Recordar.

Bueno me funciono, ahora estoy haciendo las prueba con multiples usuarios y me ah trabajado bien...
Responder Con Cita
  #10  
Antiguo 26-09-2012
Avatar de elaguna
elaguna elaguna is offline
Miembro
 
Registrado: abr 2009
Ubicación: México
Posts: 51
Poder: 16
elaguna Va por buen camino
Qué bien si ya lo tienes controlado.

Lo de que es multiusuario y Cliente-servidor a la vez, creo que mejor deberías de dejarle todo al servidor.

Saludos.
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda)
Responder Con Cita
  #11  
Antiguo 26-09-2012
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Yo no uso FB, mas bien MYSQL pero supongo que es el mismo principio ya que no conozco bien los generadores de FB. En MySQL usamos un campo autoincrementado para llevar el control de las claves del registro maestro de manera que un pseudocódigo sería esto:

Código:
Abrimos la transaccion;
 Try 
   Poner la tabla maestra en mode insercion;
   Llenamos los datos de la maestra;
   Agregamos las filas que requiéramos en nuestra tabla detalle dejando en blanco con un valor conocido el campo que lo ligará a la maestra (yo uso -1 por ejemplo)
   Guardamos la maestra;
   Obtenemos el campo autoincrementado que se asignó al registro maestro;
   Sustituimos el campo correspondiente con ese valor en nuestras filas de detalle (que aun no se han guardado)
   Guardamos la tabla detalle (post);
   Aplicamos los cambios (commit)
 Except
   Hacemos un rollback si ocurre cualquier error
 end;
Al menos en MySQL el valor del campo autoincrementado es único por cada conexión y por cada transacción, de manera que nunca se repiten, lo más que llega a pasar es que ocurra un error y la transaccion se aborte por lo que el valor utilizado se pierde pero se garantiza que no lo obtenga cualquier otra conexión. Si no te preocupa dejar huecos en las claves primarias, es una buena solución y bastante sencilla.

En FB supongo que el generador hace lo mismo que el campo autoincrementado, ahí los expertos nos dirán.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #12  
Antiguo 28-09-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Cita:
AzidRain
En FB supongo que el generador hace lo mismo que el campo autoincrementado, ahí los expertos nos dirán
En realidad si hace lo mismo. Estamos hablando de sql standart aquí dejo este enlace http://es.wikipedia.org/wiki/Firebird. Tambien veo que utilizas Transacciones, lo mismo realice lo unico que para obtener el id generado desde el servidor utilizo un ClientDataSet con los eventos puesto anteriomente. y luego utilizando este modelo en transacciones.

Código SQL [-]
procedure TfrmPrincipal.btnAgregaAgendaClick(Sender: TObject);
var
ExitoAgenda :Boolean;

begin
 HoraA := dtpHora.Time;
 idAgenda := dmLogicaNegocio.cdsAgendaID_AGENDA.AsInteger; //Aqui es donde obtengo ya mi id que proviene del Generador del servidor llamado: AGENDAID_AGENDA
 TrnAgenda := dmConecta.FBLINUXCONECTION.BeginTransaction;
  try
  //// Instrucciones para guardar los datos En la Agenda
   with dmConecta.qAgenda do
   begin
     sql.Clear;
     sql.Add('Insert into Agenda (ID_AGENDA, ID_EMPLEADO, FECHA, ESTADO)');
     sql.Add(' Values (IdAgenda, idEmpleado, fecha, Estado)');
     ParamByName('pidAgenda').asInteger :=  idAgenda;
     ParamByName('pidEmpleado').AsInteger := StrToInt(dbeidEmpleado.Text);
     ParamByName('pFecha').AsDate := monthCalendar1.Date;
     ParamByNAme('pEstado').AsString := '1';
     ExecSQL;
   end;
   with dmConecta.qRecordatorio do
     begin
        Close;
        SQL.Clear;
        SQL.Add('Insert into RECORDATORIOS (ID_AGENDA, TITULO, MENSAJE, HORA)');
        SQL.Add('Values (:idAgenda, :Titulo, :Mensaje, :Hora)');
        idAgenda :=  dmLogicaNegocio.cdsAgendaID_AGENDA.asInteger;//dmConecta.qAgendaID_agenda.AsInteger;//(GEN_AGENDA_ID);
        ParamByName('idAgenda').AsInteger := idAgenda;
        ParamByName('Titulo').AsString := eTitulo.Text;
        ParamByName('Mensaje').AsString := mDetalle.Text;
        ParamByName('Hora').AsTime := HoraA;
        ExecSQL;
      begin
          dmConecta.FBLINUXCONECTION.CommitFreeAndNil(TrnAgenda);
          ExitoAgenda := True;
        end;
    end;
    Except
    on E: Exception do
    begin
      dmConecta.FBLINUXCONECTION.RollbackFreeAndNil(TrnAgenda);
      ShowMessage('Error Encontrado'+ e.Message);
    end;
    end;
    if ExitoAgenda = True then
    begin
      ShowMessage('Recordatorio Ingresado'+ 'Su Numero de Agenda es:' + dbeTomaConsecutivo.Text);
      dmConecta.qAgenda.Close;
      dmConecta.qRecordatorio.Close;
      dmLogicaNegocio.cdsAgenda.Close;
      MonthCalendar1.Date := Now;
      eTitulo.Text := '';
      mDetalle.Text :='';
      frmPrincipal.GroupBox1.Height := 178;
    end;
end;

Trato de que mi ClientDataSet se abra para obtener mi id en el evento OnEnter pero si utiliza el usuario la tecla Tab no se abre... aun estoy viendo como hago eso...

Gracias chicos

Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Insertar datos de una Tabla a otra usando where... verito_83mdq SQL 5 15-03-2011 19:28:59
Dbgrid para insertar en una tabla pero cogiendo datos de otra tabla taru MySQL 1 27-07-2006 15:36:12
Insertar datos cuando una tabla tiene col con identity La__X SQL 10 21-01-2006 00:27:23
Como insertar datos de una tabla en otra tabla? Salomon Firebird e Interbase 1 28-08-2003 11:29:40


La franja horaria es GMT +2. Ahora son las 20:57:50.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi