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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-12-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Novato con DBExpress necesita entender como trabajan

He estado leyendo varios tutoriales sobre DBExpress pero no acabo de entender cual es la dinámica adecuada para trabajar con estos componentes. Sobre un ejemplo de formulario de edición real voy a explicar mis dudas haber si alguien me puede echar una mano para entenderlos.
En el formulario tengo cuatro conjuntos de componentes DBExpress, compuestos cada uno por TSQLQuery, TDataSetProvider, TClientDataset y TDataSource.
Un conjunto apuntando al registro que quiero editar "Expte" y los otros 3 para rellenar 3 DBLookupComboBox (Tipo,Zona y Estado).
En el onShow del formulario cargo los combos y dependiendo de una variable Modo [ (A) Append y (M) Edit ] edito un registro. Este es el código:
Código Delphi [-]
procedure TAveriasExpteEdit.UniFormShow(Sender: TObject);
begin

   CargaTipos;
   CargaZonas;
   CargaEstados;

   cdsExpte.Close;
   queryExpte.CommandText := 'select * from AVEAVEDIA where AVEDIA_CODIGO=:codigo';
   cdsExpte.Params.ParamByName('codigo').AsInteger := Codigo;
   cdsExpte.Open;
   case Modo of
    'A' : cdsExpte.Append;
    'M' : cdsExpte.Edit;
   end;

end;
y cargo los datos de los combos:
Código Delphi [-]
procedure TAveriasExpteEdit.CargaTipos;
begin
  cdsTipo.Close;
  queryTipo.CommandText :=  'select AVETIP_CODIGO,AVETIP_DESCRIP,AVETIP_ACTIVO '+
                   'from AVEAVETIP where AVETIP_ACTIVO=1 order by AVETIP_DESCRIP';
  cdsTipo.Open;
end;
Cuestiones:
1. Está bien que las operaciones de apertura y cierre se hagan sobre el ClientDataset?
2. El CommandText y la carga de parametros (cdsExpte.Params.ParamByName('codigo').AsInteger := Codigo;) debe aplicarse sobre el TSQLQuery o sobre el clientDataSet?
3. En definitiva, como de correcto es el código que he puesto arriba?:
Un saludo.

Última edición por ecfisa fecha: 10-12-2013 a las 15:59:59. Razón: Quitar carita de código
Responder Con Cita
  #2  
Antiguo 10-12-2013
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Cita:
Empezado por apicito Ver Mensaje
1. Está bien que las operaciones de apertura y cierre se hagan sobre el ClientDataset?
Si. El clientdataset se encargara de traer los datos mediante el proveedor.

Cita:
Empezado por apicito Ver Mensaje
2. El CommandText y la carga de parametros (cdsExpte.Params.ParamByName('codigo').AsInteger := Codigo;) debe aplicarse sobre el TSQLQuery o sobre el clientDataSet?

Nunca he usado commandtext desde un clientdataset pero siempre paso los parametros asi. No toco para nada el sqlquery.

Saludos
Responder Con Cita
  #3  
Antiguo 11-12-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Gracias por tu respuesta. Lo he hecho así y funciona perfectamente.
Planteo o tra pregunta:
Para grabar los datos hago:
Código Delphi [-]
  try
    cdsExpte.Post;
    cdsExpte.ApplyUpdates(0);
  except
    showmessage('Non se poido grabar');
    Exit;
  end;
  ModalResult := mrOk;
No me graba nada. Ni cuando modifico un registro existente ni al crear uno nuevo.
En el caso de ser un alta, como cojo un autoincremnetal desde un generador para clave primaria?
Responder Con Cita
  #4  
Antiguo 11-12-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Cita:
Empezado por apicito Ver Mensaje
No me graba nada. Ni cuando modifico un registro existente ni al crear uno nuevo.
En el caso de ser un alta, como cojo un autoincremnetal desde un generador para clave primaria?
Me auto respondo.
Si que graba, el problema esta en el autoinclemental. Como no he encontrado nada en DBExpress me he creado una función global y cojo el autoinckemental desde mi aplicación y no desde el generador de la base de datos:
Código Delphi [-]
function getAutoincremental : integer;
begin
  result := Round((now() - 25569) * 86400);
end;
Hasta ahora había utilizado los componentes IbObjects que permite crear el auto incremental metiendole en la propiedad GeneratorLinks el valor adecuado:
Código Delphi [-]
  QueryFras.GeneratorLinks.Clear;
  QueryFras.GeneratorLinks.Text:='FRAS_CODIGO=FRAS';
donde FRAS es un generador de la base de datos.
Ahora voy a investigar como se manejan las transacciones con DBExpress. Por que noto que cuando vuelvo del formulario de edición y hago refresh del ClientDataSet del DBGrid no me muestra el valor que acabo de introucir, sino el de la anterior modificación, como si solo cerrara la transacción cuando destruyo el formulario.
Responder Con Cita
  #5  
Antiguo 11-12-2013
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Hola

El metodo applyupdates devuelve el numero de errores encontrados al aplicar las actualizaciones. Mas o menos manejo las transacciones asi:

Código Delphi [-]
var
  Td:TTransactionDesc;
Begin
  td.TransactionID:=1;
  td.IsolationLevel:=xilREADCOMMITTED;
  SQLConnection1.StartTransaction(td);
  if FVClientDataSet1.ApplyUpdates(0)=0then
    SQLConnection1.Commit(td)
  else
    begin
      SQLConnection1.Rollback(td);
      ShowMessage('Hubo errores')
    end;
end;

Applyupdates no muestra excepciones para mostrarlas debes manejar el evento reconcileerror.

Espero te sea util

Saludos
Responder Con Cita
  #6  
Antiguo 11-12-2013
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Gracias Caminante por la ayuda. Ahora veo como debo utulizar las transacciones.
Responder Con Cita
  #7  
Antiguo 20-02-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 412
Poder: 14
bulc Va por buen camino
Qué sistema de bases de datos usas?

Cita:
Empezado por apicito Ver Mensaje
He estado leyendo varios tutoriales sobre DBExpress pero no acabo de entender cual es la dinámica adecuada para trabajar con estos componentes. Sobre un ejemplo de formulario de edición real voy a explicar mis dudas haber si alguien me puede echar una mano para entenderlos.
En el formulario tengo cuatro conjuntos de componentes DBExpress, compuestos cada uno por TSQLQuery, TDataSetProvider, TClientDataset y TDataSource.
Un conjunto apuntando al registro que quiero editar "Expte" y los otros 3 para rellenar 3 DBLookupComboBox (Tipo,Zona y Estado).
En el onShow del formulario cargo los combos y dependiendo de una variable Modo [ (A) Append y (M) Edit ] edito un registro. Este es el código:
Código Delphi [-]
procedure TAveriasExpteEdit.UniFormShow(Sender: TObject);
begin

   CargaTipos;
   CargaZonas;
   CargaEstados;

   cdsExpte.Close;
   queryExpte.CommandText := 'select * from AVEAVEDIA where AVEDIA_CODIGO=:codigo';
   cdsExpte.Params.ParamByName('codigo').AsInteger := Codigo;
   cdsExpte.Open;
   case Modo of
    'A' : cdsExpte.Append;
    'M' : cdsExpte.Edit;
   end;

end;
y cargo los datos de los combos:
Código Delphi [-]
procedure TAveriasExpteEdit.CargaTipos;
begin
  cdsTipo.Close;
  queryTipo.CommandText :=  'select AVETIP_CODIGO,AVETIP_DESCRIP,AVETIP_ACTIVO '+
                   'from AVEAVETIP where AVETIP_ACTIVO=1 order by AVETIP_DESCRIP';
  cdsTipo.Open;
end;
Cuestiones:
1. Está bien que las operaciones de apertura y cierre se hagan sobre el ClientDataset?
2. El CommandText y la carga de parametros (cdsExpte.Params.ParamByName('codigo').AsInteger := Codigo;) debe aplicarse sobre el TSQLQuery o sobre el clientDataSet?
3. En definitiva, como de correcto es el código que he puesto arriba?:
Un saludo.
¿Usas Firebird?
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Delphi, Indy, SSL Cuales versiones trabajan bien con cuales ?. Como se configuran ? rolandoj Internet 12 23-03-2014 18:07:41
¿Como entender el signo "?" en Java Script? Deiv HTML, Javascript y otros 12 16-12-2006 00:54:23
Stored Procedures, como trabajan? Carlos Hurtado Firebird e Interbase 7 29-12-2005 06:12:05
Entender una sentencia Renees Varios 5 02-09-2005 20:35:01
Novato con DBExpress Esau Conexión con bases de datos 1 06-06-2003 20:43:32


La franja horaria es GMT +2. Ahora son las 09:03:56.


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