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 02-04-2008
Cecilio Cecilio is offline
Miembro
 
Registrado: ago 2007
Posts: 140
Poder: 17
Cecilio Va por buen camino
Copias de DataSet

Hola.
Tengo un problema y lo llevo arrastrando algun tiempo y no se como solventarlo.

Tengo un DataModule con una IBdatabase, etc.
Entre estos componentes hay un IBdataset que es el que nos interesa para mi problema.

En un procedimiento tengo:
Código:
 // Procedimiento principal.
var
  cv: TdataSet;
  s,a: string;
 begin

s:='select * from articulos';

dm.IBDataSet1.SelectSQL.Text:=s;
dm.IBDataSet1.Active:=true;;
cv:= dm.IBDataSet1; 
// copio el dataset del DataModule a uno locar. (AQUI LA MADRE DEL CORDERO)

cv.First;

while not cv.Eof do
begin
   s:=cv.FieldByName('Codigo').AsString;
   a:=cv.FieldByName('Almacen').AsString;

  getcv(s,a,c,v); // LA SEGUNDA MADRE DEL CORDERO
Segundo Procecimiento

Código:
procedure GetCV(cod: string; al: string; var C: Double; var V: Double);
var
  cv: TdataSet;
  s: string;
begin

s:='select entrada, salida from existencias';
s:=s+' where codigo='+quotedstr(cod)+' and almacen='+quotedstr(al);

dm.IBDataSet1.SelectSQL.Text:=s;
dm.IBDataSet1.Active:=true;
cv:=dm.IBDataSet1;
c:=cv.FieldByName('entrada').AsFloat;
v:=cv.FieldByName('salida').AsFloat;

end;
¿ cual es el problema ?

En el procedimiento principal, tengo un DataSet que es una copia del DataModule.IBDataSet1

Cuando invoco al segundo procecimiento ( GetCV )

El dataset del primer procedimiento es como si contuviese los datos del segundo, perdiento lo que tenía.

Algo estoy haciendo mal, o quizá no sea la forma de manejar estos componentes.

No quiero tener en DataModule un montón de IBdataset para cada procedimiento.

¿ Como lo resuelvo ?

Gracias.
__________________
Saludos Cordiales.
------------------

Responder Con Cita
  #2  
Antiguo 02-04-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Una pequeña puntualización:
Código Delphi [-]
cv:= dm.IBDataSet1; 
// copio el dataset del DataModule a uno locar. (AQUI LA MADRE DEL CORDERO)
No estás copiando nada. En memoria RAM, solo tienes un conjuto de registros al que accedes desde dos punteros:
- uno el "dm.Ibdataset1"
- otro puntero el "cv"

Si cierras la consulta mediante el "cv" o mediante el "dm.Ibdataset1", estás actuando sobre los mismos datos.

Lo normal es tener un IBdataset por cada tabla que quieras modificar. En todas las aplicaciones, tengo una rutina del tipo:
Código Delphi [-]
function CreaQry(const TheSql:string):Tibquery;
begin
   Result := Tibquery.create(nil);
   Result.Database := midtb;
   Result.Transaction := trans1;
   Result.sql.text := TheSql;
end;

Ahora solo tienes que llamar a la función así:
Código Delphi [-]
var q:Tibquery;
begin 
  q := CreaQry('update tabla set miCampo = 3 where codigo =2');
  q.ExecSql;
  q.Sql.Text := 'select * from tabla';
  q.Open;
  ....
  FreeAndnil(q);

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 02-04-2008
Cecilio Cecilio is offline
Miembro
 
Registrado: ago 2007
Posts: 140
Poder: 17
Cecilio Va por buen camino
Me has aclarado mucho.
No había tenido en cuenta lo de los punteros.

He resuelto el problema de una forma a ver si está bien así:
Código Delphi [-]
procedure Taltamod.GetCV(cod: string; al: string; var C: Double; var V: Double);
var
  cv: TIBdataSet; // HE AGREGADO ESTO
  s: string;
begin
//
//
s:='select entrada, salida from existencias';
s:=s+' where codigo='+quotedstr(cod)+' and almacen='+quotedstr(al);
{
dm.IBDataSet1.SelectSQL.Text:=s;
dm.IBDataSet1.Active:=true;
cv:=dm.IBDataSet1;
} // ASI ESTABA ANTES

cv:=TIBdataset.Create(Application);
cv.Database:=dm.IBDatabase1;
cv.Transaction:=dm.IBTransaction1;
cv.SelectSQL.Text:=s;
cv.Active:=true;

c:=cv.FieldByName('entrada').AsFloat;
v:=cv.FieldByName('salida').AsFloat;
cv.Free;

Pregunto: ¿ haciendo esto, es decir usando un TIBDataSet nuevo, sería la forma correcta de trabajar con DataSet para obtener datos puntuales ?

Gracias.
__________________
Saludos Cordiales.
------------------

Responder Con Cita
  #4  
Antiguo 03-04-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Si, es correcto, aunque puedes mejorarlo haciendote algunas preguntas:

1- ¿Necesito poder modificar los registros?
Si - usa un TIbDataset
No - usa un TibQuery y sigue leyendo.

2- ¿Necesito recorrer los registros del query hacia delante y hacia atrás?
Si - Sigo usando un Tibquery
No - Usar un TibSql

Imagina, necesitamos recorrer todos los registros de un Query para añadir un campo a un combobox. Solo necesitamos recorrer los registros una sola vez, desde el principio del dataset hasta el final, pues usamos un ibSql.

Necesitamos una consulta oculta que usaremos para buscar la descripción de los clientes desde varias ventanas, necesitamos mover el puntero del dataset en ambos sentidos, hacia delante y hacia atrás, usamos un Ibquery.

Obviamente el ibsql es el que menos recursos consume, después va el ibquery y el que más consume, por así decirlo es el ibdataset.

Acabo de ver una incongruencia en el código:

Código Delphi [-]
cv:=TIBdataset.Create(Application);
...
cv.Free
Dices que el objeto "Application" será el que lo destruya, pero después tú mismo te encargas de destruirlo. Esto puede provacar errores al cerrar tu programa, donde no podrás situar puntos de ruptura. Puedes usar estas dos alternativas:

Código Delphi [-]
cv:=TIBdataset.Create(Application);
...
FreeAndNil(cv);

o bien:
Código Delphi [-]
cv:=TIBdataset.Create(nil);
...
cv.Free


Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 03-04-2008 a las 11:57:47.
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
Copiar el contenido de un DataSet a otro DataSet Javi2 Varios 82 22-11-2022 09:26:16
copias de seguirdad MiGuEJeReZ MySQL 1 02-10-2006 16:40:11
copias incrementales afxe Varios 1 25-08-2006 16:52:56
copias de archivo santiago22 API de Windows 2 29-07-2005 16:30:40
Copias de Seguridad noa C++ Builder 1 25-02-2004 17:52:27


La franja horaria es GMT +2. Ahora son las 10:46:23.


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