Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-02-2009
Avatar de joelphi
joelphi joelphi is offline
Miembro
 
Registrado: feb 2009
Ubicación: Guerrero
Posts: 24
Poder: 0
joelphi Va por buen camino
Copiar informacion de un Tdataset a otro Tdataset

Primeramente Hola a todos los de foro..

Tengo un problemita creo yo.. sucede que estoy trabajando en una aplicacion en delphi en donde todo lo manejo por codigo..

El problema es el siguiente: quisiera saber como copiar los campos y la informacion que contienen de un Tdataset a otro Tdataset??..

Trabajo en Delphi 2007..

Agradeceria mucho a quien me ayudara en esto ya que me urge un poco.


Tengo este metodo.. pero no me permite hacer el Open .. me manda un error de Abstract Error.

Código Delphi [-]
Function TFrm_Datos.Clonar(Origen:TDataSet):TDataset;
var Campo :string;
i :integer;
Destino : TDataset;
begin
Destino := TDataSet.Create(Nil);
Destino.Open;   //--<--- aqui manda error (Abstract Error)
with Origen do
begin
open;
    while not EOF do
     begin
      Destino.Append;
      for i := 0 to FieldCount-1 do
      begin
        Campo := Origen.Fields[i].FieldName;
        Destino[Campo] := Origen[Campo];
      end;
     Destino.Post;
     Next;
 end;
Close;
end;
Destino.Close;
Result := Destino;
end;

Gracias.. y Saludos¡¡

Última edición por joelphi fecha: 19-02-2009 a las 07:35:24.
Responder Con Cita
  #2  
Antiguo 19-02-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Toma en cuenta que la clase TDataSet es la clase base de todos los datasets como TTable, TQuery, TIBTable, TADOTable, TADODataSet, TSQLDataSet y un muy largo etcétera. Como tal, implementa lo más general pero delega a los descendientes gran parte de la funcionalide específica de cada motor de bases de datos. Esto significa que muchos métodos de TDataSet son abstractos (directiva abstract), es decir, métodos que sólo se declaran pero no se implementan (pues son los descendientes quienes lo hacen).

Por ejemplo, DataSet.Open, si bien no es abstracto, eventualmente llama a InternalOpen, que sí lo es.

La consecuencia de lo dicho arriba es que la clase TDataSet no está para usarse, no puedes crear objetos de esa clase.

¿Cómo solucionar tu problema?

Pues en realidad no sabemos cuál es el problema. Es decir, tendrías que comentarnos cuál es el objetivo que persigues, qué pretenderías hacer con la copia del DataSet, para así poder orientarte mejor en como resolverlo.

// Saludos
Responder Con Cita
  #3  
Antiguo 19-02-2009
Avatar de joelphi
joelphi joelphi is offline
Miembro
 
Registrado: feb 2009
Ubicación: Guerrero
Posts: 24
Poder: 0
joelphi Va por buen camino
Question Gracias..

Hola¡¡
Antes que nada Gracias por su ayuda..

Bueno.. el problema es el siguiente: Sucede que tengo una aplicacion en donde creo todo mediante codigo (en runtime) en D2007 y uso como SMBD firebird 2.0...

Tengo una clase conexion en donde tengo 1 metodo que utilizo para las consultas.. Ahora en un Form tengo 6 LookupCombobox en donde tengo que vaciar las 6 diferentes consultas respectivamente.. pero hay un problema, se vacia la misma consulta a todos los Lookupcombos.. siempre la ultima consulta. Ya probe los ClienDataset y provider y sucedio lo mismo, por eso es que me atrevi a hacer ese metodo..

Lo que persivo es vaciar los datos al los LookupCombobox's y para eso debo retener informacion en memoria P/e en 6 TDataset's .. pero me encontre con ese problema..

Pido su ayuda ya que soy Jr en esto..

Saludos¡¡
Responder Con Cita
  #4  
Antiguo 19-02-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Pero entonces, si quieres manejar seis consultas distintas, ¿por qué copiar el contenido (registros) además de la estructura?
Cita:
Empezado por joelphi Ver Mensaje
quisiera saber como copiar los campos y la informacion que contienen de un Tdataset a otro Tdataset??..
Podrías aclararnos:

1. ¿Qué componentes de acceso a datos estás utilizando?
2. ¿Cuál es en sí la consulta SQL?
3. ¿Qué hace que los seis data sets sean diferentes?
4. ¿Cómo vacías esa información a los controles lookup combo box?

Un saludo.

Al González.
Responder Con Cita
  #5  
Antiguo 19-02-2009
Avatar de joelphi
joelphi joelphi is offline
Miembro
 
Registrado: feb 2009
Ubicación: Guerrero
Posts: 24
Poder: 0
joelphi Va por buen camino
Componentes que Utilizo..

Utilizo una clase de coneccion y Objetos Como de FibPlus
-TpFIBDatabase
-TpFIBQuery
-TpFIBDataSet
-TpFIBTransaction

Código Delphi [-]
 
//Utilizo este metodo
function TConexion.Consultar(CodigoSQL: String): TDataSource;
begin
    With Dataset Do //--Dataset es tipo TpFIBDataset
    Begin
         Close;
         SQLs.SelectSQL.Clear;;
         SQLs.SelectSQL.Add(CodigoSQL);
         Prepare;
         Try
              Open;
         Except on E:Exception do
         Begin
              Raise;
              Exit;
         End;         
       End;
     End; 
    Result:= TDataSource.Create(Nil);
    Result.DataSet:=Dataset;
end;

* Son seis consltas a diferentes tablas.. Eso hace diferente las consultas..
*y para el vaciado es asi: Un ejemplo.

Código Delphi [-]
 
cxLookupComboBox1.Properties.ListSource:= Conexion.Consulta      "Select * From Tabla");     
     cxLookupComboBox1.Properties.KeyFieldNames:='Codigo';
     cxLookupComboBox1.Properties.ListFieldNames:='Nombre';


NOTA: Utilizo en patron singleton para apuntar a la misma memoria pero solo con la clase Conexion..

Espero y Me ayuden ya que llevo varios dias tratando de solucionar este problema..

Gracias¡¡
Responder Con Cita
  #6  
Antiguo 19-02-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
No es como yo lo haría, pero así como dentro de TConexion.Consultar creas un TDataSource, me parece que podrías crear también el "TpFIBDataset" que asignas a dicho TDataSource.

Pero debes asegurarte de destruir ambos objetos cuando ya no se necesiten (por ejemplo, al destruir o cerrar el formulario donde están los TcxLookupComboBox).

Por otro lado, te aconsejo revisar la manera en que manejas las excepciones dentro de TConexion.Consultar. Como lo has puesto no ayuda en nada. Cuando modifiques ese método usa un Try-Except para liberar cualquier objeto que haya creado la rutina, ya que ésta terminará de manera anormal.

"Re-elevar" la excepción ("Raise;") está bien cuando antes de esa instrucción haces los "Free" que se ameritan (si no hay nada que "cerrar", liberar o validar, una reelevación no tiene sentido). Y cualquier instrucción detrás de Raise (como ese "Exit") siempre es innecesaria.

Entiendo que eres novel, como humildemente te declaras, pero con mayor razón resulta imperativo que te animes a estudiar concienzudamente algo más sobre el manejo de memoria, la POO y los bloques Try de Delphi. No dudes en abrir nuevos hilos en Club Delphi para exponer las dudas que te vayan surgiendo. Trataremos de ayudarte en base a nuestra capacidad de tiempo y conocimiento.

Y siempre atrévete a leer la ayuda (aunque a veces sea "escasa" o esté en inglés). Quizá tardes una hora en entender un párrafo de 10 líneas (como me sucedió a mí muchas veces), pero la impronta que eso dejará en ti no tendrá precio.

Saludos.

Al González.

Última edición por Al González fecha: 19-02-2009 a las 21:09:44.
Responder Con Cita
  #7  
Antiguo 19-02-2009
Avatar de joelphi
joelphi joelphi is offline
Miembro
 
Registrado: feb 2009
Ubicación: Guerrero
Posts: 24
Poder: 0
joelphi Va por buen camino
Gracias..

Hola¡¡

Gracias.. Por la ayuda.. me quedo en claro el objetivo.. que estudie mas y pida ayuda menos...

Espero dar una respuesta asi algun dia Sr. Gonzalez..

Estudiare mas.. y gracias nuevamente.
Responder Con Cita
  #8  
Antiguo 19-02-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
No señor, creo que lo ha tomado por otro lado.

He comenzado diciéndote cómo solucionarlo, y luego invitándote a seguir exponiendo tus dudas para ayudarte. No comprendo tu comentario.

En fin, espero se aprecie esto de manera más justa y veamos más tarde cómo llevas avanzado este caso. Reitero: no dudes en preguntarnos y pedir ayuda si te atoras con algo.

Saludos.

Al González.

Última edición por Al González fecha: 19-02-2009 a las 22:00:47.
Responder Con Cita
  #9  
Antiguo 19-02-2009
Avatar de joelphi
joelphi joelphi is offline
Miembro
 
Registrado: feb 2009
Ubicación: Guerrero
Posts: 24
Poder: 0
joelphi Va por buen camino
Smile Creo que no me explique..

Tiene razon Sr. como le dije soy jr, y ademas soy estudiante creo que su consejo es muy claro para mi.. y eso lo que hare; estudiar lo que me dijo. y leer todo lo que se me ponga enfrente referente a delphi y poo..

Asi que por eso el comentario con todo respeto..

Tiene razon en los errores.. me gustara que viera completa la clase .. si tuviera tiempo..
Responder Con Cita
  #10  
Antiguo 19-02-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
OK (este delirio paranoide mío ).

¿Cómo ves esto de modificar TConexion.Consultar para que dentro de él se cree también un objeto TpFIBDataSet?

Así como haces el TDataSource.Create, también podrías hacer un TpFIBDataSet.Create. Lo cual se conoce como crear una instancia de objeto.

Así podrías conseguir que exista un nuevo y distinto conjunto de datos (data set) con cada llamada al método TConexion.Consultar. Ya que de otra manera creas distintos TDataSource, pero todos "apuntando" al mismo conjunto de datos (razón por la que la última consulta realizada aparece en todos los LookupComboBox).
Responder Con Cita
  #11  
Antiguo 19-02-2009
Avatar de joelphi
joelphi joelphi is offline
Miembro
 
Registrado: feb 2009
Ubicación: Guerrero
Posts: 24
Poder: 0
joelphi Va por buen camino
Ok..

Perfecto Sr..

Pero antes debo decirle que en el constructor de la clase creo el Objeto pFIBDataset.. y cada vez que uso Tconexion.Consultar().. solo lo reuso.. pero apuntado ala misma direccion de memoria..

lo mejorare el Metodo con lo que me explico ..

Gracias nuevamente Sr.. Trabajare en ello..
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
Componentes que heredan de TDataset noob Conexión con bases de datos 1 14-10-2008 16:41:00
TDataSet,TDataSource,TclientDataSet teote Conexión con bases de datos 1 17-07-2008 16:52:31
Paso de parámetros a TDataset arturom Firebird e Interbase 9 04-04-2008 18:04:03
TDataSet Delphi Lite 10 JoseAntonio Conexión con bases de datos 2 24-02-2007 05:00:57
creando componente con Tdataset Descendents OOP 4 12-01-2004 21:39:04


La franja horaria es GMT +2. Ahora son las 16:01:05.


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