Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-09-2011
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Algo curioso con las tablas en firebird

Hola como están todos?

Mi caso es el siguiente:

Tengo un formulario llamado frmProveedores el cual Agrego los atributos correspondientes como su respectivo ID, NIF, contacto, etc.

bueno aplico el siguiente código simple para guardarlo en el btnGuardar:

Código Delphi [-]
procedure TFrmProveedores.btnGuardarClick(Sender: TObject);

begin
  if Application.MessageBox('¿Desea Agregar Otro?', 'Confirmación',
    MB_ICONQUESTION OR MB_YESNO) = ID_NO then
  begin
    dmacceso.cdsProveedores.Applyupdates(0);
    Close;
  end
  else
  Begin
    dmacceso.cdsProveedores.Active := False;
    dmacceso.cdsProveedores.Active := True;
    dmacceso.cdsProveedores.Last;
    dmacceso.cdsProveedores.Insert;
  end;

end;

Reviso mi aplicación lo busco en mi lista de proveedores y ahí esta no hay problema para ir mas aya en la verificación abro el Firebird ISQL Tool para ver los datos y si están.

Bueno el problema esta en que al abrir otro formulario para agregar cuentas a un proveedor me aparece.

Pero al darle el post al data set dice que el id_proveedor esta vacio.

pero si cierro la aplicación y vuelvo abrirla abriendo el formulario de agregar cuenta ahi si no hay problema.

Alguien ha pasado por esto?

Saludos

novato_erick
Responder Con Cita
  #2  
Antiguo 18-09-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Veo que uno de los datos que agregas es el ID.
Puede que agregues ID=0 y luego los triggers se encarguen de darle el siguiente número al campo.
En ese caso el Dataset habrá dado la instrucción a FB de que guarde el registro y ha guardado una copia en memoria, para no tener que releerlo.
Mientras no cierres esa tabla/trasnaccion/conexión, el Dataset no se enterará de que en la base de datos se han modificado los datos insertados.

Tienes dos opciones si ese es el problema:
1. Generas el ID antes de insertar y lo asignas al campo.
2. Insertas ID=0 y luego refrescas los datos. No recuerdo la instrucción, pero se que existe.

Si es un generador, puedes tener un SQL que ejecute algo como lo siguiente:

Código SQL [-]
SELECT gen_id(NOMBRE_GENERADOR) from RDB$DATABASE
RDB$DATABASE tiene siempre un solo registro.
Con esto y un trigger que haga más o menos esto:
Código SQL [-]
TRIGGER BEFORE INSERT
begin
  if (new.ID is null) or (new.ID =0) then
     new.ID = gen_id(NOMBRE_GENERADOR);
  ... 
end
Responder Con Cita
  #3  
Antiguo 18-09-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Para mi que el problema está en el manejo de las transacciones y/o en el nivel de aislamiento de las mísmas.
¿Por casualidad, haces commit o commitretaing después del post? ¿Qué nivel de aislamiento tienes configurados para las transacciones?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 01-10-2011
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Este es mi procedimiento en el boton de guardar corrijanme ya que no he logrado refrescar los datos sin tener que cerrar toda la aplicación.

Código Delphi [-]
procedure TFrmProveedores.Button1Click(Sender: TObject);

begin
  if Application.MessageBox('¿Desea Agregar Otro?', 'Confirmación',
    MB_ICONQUESTION OR MB_YESNO) = ID_NO then
        begin
          dmacceso.cdsProveedores.Applyupdates(0);
          Main.FrmPrincipal.iCloseClick(FrmProveedores);
          Close;
        end
         else
            Begin
              dmacceso.cdsProveedores.Active := False;
              dmacceso.cdsProveedores.Active := True;
              dmacceso.cdsProveedores.ApplyUpdates(0);
              dmacceso.cdsProveedores.Last;
              dmacceso.cdsProveedores.Insert;
            end;

end;

utilizo directamente dbEdit mi conexion es dbexpress. y mi base da datos firebird.

Saludos
Responder Con Cita
  #5  
Antiguo 02-10-2011
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
hola novato_erick, te pongo el código de como lo hago yo

Código Delphi [-]
procedure TFDominios.SpeedButton2Click(Sender: TObject);
//------------------------------------------------------------------------------
//************************************************************[  Grabar  ]******
//------------------------------------------------------------------------------
begin
      try  //1
       //Aquí validamos y hacemos todo lo que sea necesario antes de Grabar, como por ejemplo confirmar el agregar otro registro, etc
       FCreadorTablas.post;   //Graba los Datos
       FCreadorTablas.IBTransaction1.CommitRetaining; //Confirma la Transición, haciendo visible el dato para todos, ojo si tienes un querry, es mejor reactivarlo
       //Aquí debes hacer, lo posterior a grabar, como borrar datos de componentes no conectado a la B.D., poner visible/enable o no botones, paneles, etc

     except //1
       on E: Exception do  //Captura el Mensaje de error
       begin
         //Mostramos el mensaje (DOM G-2) es mi identificador de error, lo que hago es DOM son las tres primeras letras del Form (Dominios) en este caso G, el modulo grabar y 2,
         //  por que en este caso dentro de grabar seria el segundo control de excepciones (he eliminado el otro para no complicar las cosas, ya que grababa en dos módulos diferentes)
         ShowMessage('DOM G-2 Se ha producido un error, y no se ha creado el Dominio,'+#13+#10+
                     'Error: ['+E.Message+']');  //E.Message sería el mensaje de error original
         FCreadorTablas.IBTransaction1.RollbackRetaining;  // Si se ha producido un error, desbloqueamos los valores introducidos para que no siga los datos activos, ya que nos
                                                                             // podría dar problemas e incluso bloquearnos la aplicación
       end;
     end;//1
end;
//1 Es muy importante una cadena Try Except end para controlar cuando se te produzca un error, no quede el sistema con fallos e incluso bloqueado
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #6  
Antiguo 09-10-2011
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
hola he estado trabajando con transacciones como me lo han recomendado primero que nada les quiero agradecer a los que me han contestado en este foro Gracias Sres...

Leyendo un poco más sobre las transacciones en delphi el cual el libro Delphi 7 del autor Marco Cantú he realizado el siguiente procedimiento:
Código Delphi [-]
procedure TFrmProveedores.Button1Click(Sender: TObject);
var
  TB : TTransactionDesc;
begin
  if Application.MessageBox('¿Desea Agregar Otro?', 'Confirmación',
    MB_ICONQUESTION OR MB_YESNO) = ID_NO then
        begin
        TB.TransactionID := 1;
        TB.IsolationLevel := xilREADCOMMITTED;
        dmconexion.sqlDB.StartTransaction(TB);
        end;
            try
               dmacceso.cdsProveedores.Applyupdates(0);
               dmconexion.sqlDB.Commit(TB);
               Main.FrmPrincipal.iCloseClick(FrmProveedores);
               Close;
            except
               dmconexion.sqlDB.Rollback(TB);
end;
 
end;

veo y reviso en la base de datos y ok esta bien pero aun asi sigo con el problema que si deseo por ejemplo agregar otros atributos al registro desde otro formulario por ejemplo llamado cuenta de proveedor no puedo seleccionarlo pero si aparece en el registro.

Que sucederá alguna idea?

Saludos

novato_erick
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
Algo más que "maestro/detalle": 3 tablas Chandra_ Firebird e Interbase 1 21-12-2010 20:07:03
Muy curioso gluglu La Taberna 10 21-06-2007 03:14:31
Algo curioso al salir de un edit... me lo graba JoanKa Varios 6 20-01-2007 00:26:42
Curioso despertador marcoszorrilla Humor 1 19-05-2006 09:02:29
Algo curioso que me paso, por si les sirve jwmoreira Firebird e Interbase 0 09-07-2005 01:46:53


La franja horaria es GMT +2. Ahora son las 10:07:00.


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