Ir al contenido


Foto

Asignar una tabla a un TADOQuery creado en tiempo de ejecución


  • Por favor identifícate para responder
16 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 septiembre 2010 - 10:10

Pues eso, se puede hacer lo siguiente?:



delphi
  1. var Tabla: TADOQuery;
  2. ...
  3.  
  4. procedure TForm1.FormCreate(Sender: TObject);
  5. begin
  6.   Tabla := TADOQuery.Create(Empleados);
  7.   DataSource1.Dataset := Tabla;
  8. end;



Porque al hacer eso no me muestra los datos y la tabla Empleados está abierto previamente.

Saludos.
  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 09 septiembre 2010 - 10:20



delphi
  1. var Tabla: TADOQuery;
  2. ...
  3.  
  4. procedure TForm1.FormCreate(Sender: TObject);
  5. begin
  6.   Tabla := TADOQuery.Create(Application);
  7.   Tabla.SQL.Text := 'Select * from empleados';
  8.   Tabla.Active := True;
  9.   DataSource1.Dataset := Tabla;
  10. end;



;)
  • 0

#3 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 09 septiembre 2010 - 10:22

Alli no estas asignando un Dataset a otro, simplemente le estas asignando el Owner que es quien se encarga de destruir el objeto.

Aparte de crearla debes activar el dataset en este caso con una consulta SQL

Cualquier duda avisas.


PD: Olvide la explicacion en la primera parte jeje
  • 0

#4 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 09 septiembre 2010 - 10:26

Hola
El asunto es crear el query y las conexiones.
Saludos

Archivos adjuntos


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 septiembre 2010 - 10:30

Gracias amigo Eduardo, fíjate, hay un problema con eso, dicha tabla tiene un campo lookup, no sabría cómo atacar esa parte a través de una consulta.

Saludos.
  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 09 septiembre 2010 - 10:30

Eso es otra cosa, dime que necesitas del campo y te ayudo  <:o)
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 septiembre 2010 - 10:57

Bueno, creo que me estaba complicando demasiado :D me vais a tener que perdonar, pero fíjate sería interesante ver cómo se podría esa manera de asignar una tabla en tiempo de ejecución, dejaré este hilo como modo de debate.

Saludos.
  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 09 septiembre 2010 - 11:10

Bueno, creo que me estaba complicando demasiado :D me vais a tener que perdonar, pero fíjate sería interesante ver cómo se podría esa manera de asignar una tabla en tiempo de ejecución, dejaré este hilo como modo de debate.

Saludos.

A ver si entiendo,
Asignar una tabla de una Db a un TADOQuery?



delphi
  1. var
  2. Tabla: TADOQuery;
  3. procedure TForm1.FormCreate(Sender: TObject);
  4. begin
  5.   Tabla := TADOQuery.Create(Application);
  6.   Tabla.Connection := //Tu conexión;
  7.   Tabla.SQL.Text := 'Select * from empleados';
  8.   Tabla.Active := True;
  9.   DataSource1.Dataset := Tabla;
  10. end;






  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 septiembre 2010 - 11:16

Yo me refería a un TADOQuery ya creado en el formulario y asignarlo a otro TADOQuery que se crea en tiempo de ejecución como variable global para luego asignarselo a un DataSource, no sé si ahora se entiende pues...

Saludos.
  • 0

#10 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 09 septiembre 2010 - 11:20

Gracias amigo Eduardo, fíjate, hay un problema con eso, dicha tabla tiene un campo lookup, no sabría cómo atacar esa parte a través de una consulta.

Saludos.


Cuando te refieres a "Dicha tabla" te refieres a un TADOTable? si es así la cosa cambia, entonces,  podrías simplemente adicionar a la consulta el campo de la Tabla al que hace refrencia el LookUp.






  • 0

#11 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 09 septiembre 2010 - 11:30

Yo me refería a un TADOQuery ya creado en el formulario y asignarlo a otro TADOQuery que se crea en tiempo de ejecución como variable global para luego asignarselo a un DataSource, no sé si ahora se entiende pues...

Saludos.


Claro amigo que puede hacer, incluso los TADODatasets y sus descendentes tienen método Clone



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   NuevoQuery: TADOQuery;
  4. begin
  5.   NuevoQuery := TADOQuery.Create(application);
  6.   NuevoQuery.Clone(ADOQuery1);// AdoQuery1 es el query que quieres clonar.
  7. end;


  • 0

#12 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 09 septiembre 2010 - 11:41

Continuo con algo acerca de clone.

El método Clone recibe dos parámetros, miren la definición:



delphi
  1. procedure TCustomADODataSet.Clone(Source: TCustomADODataSet;
  2.   LockType: TADOLockType);
  3. begin
  4.   Close;
  5.   FRecordsetObject := Source.Recordset.Clone(LockTypeValues[LockType]);
  6.   try
  7.     Open;
  8.   except
  9.     FRecordsetObject := nil;
  10.     raise;
  11.   end;
  12. end;
  13.  
  14. // el tipo del segundo parámetro
  15.  
  16.   TADOLockType = (ltUnspecified, ltReadOnly, ltPessimistic, ltOptimistic,
  17.     ltBatchOptimistic)


  • 0

#13 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 09 septiembre 2010 - 11:53

Entré en duda no estoy seguro si es:



delphi
  1.   NuevoQuery.Clone(ADOQuery1);



o al reves



delphi
  1. ADOQuery1.Clone(NuevoQuery);



Pero de allí no se sale

Saludos
  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 septiembre 2010 - 11:53

Wow, nunca super para qué servía la propiedad Clone y ahora sé para qué srive, una cosa, la propiedad Clone sólo clona los campos de la tabla o con todos sus eventos, propiedades y campos de la tabla?.
  • 0

#15 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 09 septiembre 2010 - 12:08

Las propiedades y los campos son igualmente clonados, los eventos no estoy seguro habría que hacer una pequeña prueba.

Saludos
  • 0

#16 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 09 septiembre 2010 - 09:00

Leyendo la ayuda sobre Clone a mi humilde modo de ver, no realiza copia de los eventos. Lo que yo entiendo es que clona sólo el conjunto de datos físicos. No da indicio de que copie valores de algunas propiedades o eventos.

Pero como nunca he usado este método, no tengo la más remota idea de su alcance... intenté ver código de clone pero lo que hay es esto:



delphi
  1. procedure TCustomADODataSet.Clone(Source: TCustomADODataSet;
  2.   LockType: TADOLockType);
  3. begin
  4.   Close;
  5.   FRecordsetObject := Source.Recordset.Clone(LockTypeValues[LockType]);
  6.   try
  7.     Open;
  8.   except
  9.     FRecordsetObject := nil;
  10.     raise;
  11.   end;
  12. end;



Clone es una función que pertenece a una interface, como interface deja la implementación a cargo del objeto. El asunto es ¿Cuál es el objeto que la implementa? La variable RecordSet de TCustomADODataSet es de tipo _RecordSet ¡y este también es un interface!

No encuentro algo concreto.

Saludos,
  • 0

#17 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 10 septiembre 2010 - 10:57

Estuve realizando algunas pruebas y definitivamente el método clone solo "clona" los campos originales de la consulta, pero no lo hace con los eventos ni con los campos calculados ni con los LookUp. Aunque los eventos es fácil solucionarlos, lo de los campos LookUp es bién duro (al menos para mí) puesto que al llamar el método clone el nuevo Dataset es abierto automáticamente por lo cual es imposible manipular la  definición de campos con el dataset abierto, y al cerrarlo se pierde la clonación.

He desarrollado una pequeña aplicación de ejemplo (sin usar el método clone) que muestra como crear en tiempo de ejecución  un Dataset a partir de las propiedades SQL y Connection de otro, además de asignar un evento y crear un campo LookUp. Para ello he utilizado Access  y ADO en D7.



delphi
  1. unit UMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, DB, ADODB, DBCtrls, Grids, DBGrids, StdCtrls, ExtCtrls;
  8.  
  9. type
  10.   TClon = class(TForm)
  11.     Con: TADOConnection;
  12.     qrCaballos: TADOQuery;
  13.     dsCaballos: TDataSource;
  14.     dsClonCaballos: TDataSource;
  15.     Panel1: TPanel;
  16.     bnClonar: TButton;
  17.     grCaballos: TDBGrid;
  18.     nvCaballos: TDBNavigator;
  19.     DBNavigator1: TDBNavigator;
  20.     DBGrid1: TDBGrid;
  21.     tbRefPersonas: TADOTable;
  22.     qrCaballosIdCaballo: TIntegerField;
  23.     qrCaballosCaballo: TWideStringField;
  24.     qrCaballosIdPropietario: TIntegerField;
  25.     qrCaballosPropietario: TStringField;
  26.     procedure bnClonarClick(Sender: TObject);
  27.     procedure qrCaballosNewRecord(DataSet: TDataSet);
  28.     procedure FormCreate(Sender: TObject);
  29.   private
  30.   procedure ClonNewRecord(DataSet: TDataSet);
  31.     { Private declarations }
  32.   public
  33.     { Public declarations }
  34.   end;
  35.  
  36. var
  37.   Clon: TClon;
  38.  
  39. implementation
  40.  
  41. {$R *.dfm}
  42.  
  43. procedure CrearCamposPersistentes(aDataSet : TDataSet);
  44. var
  45.   i: Integer;
  46.   NuevoCampo: TField;
  47. begin
  48.   with aDataSet do
  49.   begin
  50.     FieldDefs.Update;
  51.     for i := 0 to  FieldDefs.Count -1 do
  52.     begin
  53.       NuevoCampo := nil;
  54.       case FieldDefs[i].DataType of
  55.         ftString : NuevoCampo := TField( TStringField.Create( aDataSet ));
  56.         ftWideString : NuevoCampo := TField( TWideStringField.Create( aDataSet ));
  57.         ftLargeint : NuevoCampo := TField( TLargeintField.Create( aDataSet ));
  58.         ftSmallint : NuevoCampo := TField( TSmallIntField.Create( aDataSet ));
  59.         ftInteger : NuevoCampo := TField( TIntegerField.Create( aDataSet ));
  60.         ftBoolean : NuevoCampo := TField( TBooleanField.Create( aDataSet ));
  61.         ftFloat : NuevoCampo := TField( TFloatField.Create( aDataSet ));
  62.         ftCurrency : NuevoCampo := TField( TCurrencyField.Create( aDataSet ));
  63.         ftBCD : NuevoCampo := TField( TBCDField.Create( aDataSet ));
  64.         ftDate : NuevoCampo := TField( TDateField.Create( aDataSet ));
  65.         ftTime : NuevoCampo := TField( TTimeField.Create( aDataSet ));
  66.         ftDateTime : NuevoCampo := TField( TDateTimeField.Create( aDataSet ));
  67.         ftAutoInc : NuevoCampo := TField( TAutoIncField.Create( aDataSet ));
  68.         ftBlob : NuevoCampo := TField( TBlobField.Create( aDataSet ));
  69.         ftMemo : NuevoCampo := TField( TMemoField.Create( aDataSet ));
  70.         ftGraphic : NuevoCampo := TField( TGraphicField.Create( aDataSet ));
  71.         else
  72.           raise Exception.Create( 'El "'+ FieldDefs[i].DisplayName +'"' + ' no es soportado.' );
  73.       end;
  74.       if NuevoCampo <> nil then
  75.       with NuevoCampo do
  76.       begin
  77.         FieldName := aDataSet.FieldDefs[i].DisplayName;
  78.         Size := aDataSet.FieldDefs[i].Size;
  79.         DataSet := aDataSet;
  80.       end;
  81.     end;
  82.   end;
  83. end;
  84.  
  85. procedure TClon.bnClonarClick(Sender: TObject);
  86. var
  87. qrClon : TADOQuery;
  88. begin
  89. qrClon:= TADOQuery.Create(Self);
  90. qrClon.Connection := Con;
  91. qrClon.SQL := qrCaballos.SQL;
  92. CrearCamposPersistentes(qrClon);
  93. with TStringField.Create(qrClon) do  //Aquí creamos el campo lookUp
  94.     begin
  95.     FieldName := 'ClonPropietario';
  96.     FieldKind := fkLookup;
  97.     DataSet := qrClon;
  98.     Name := 'ClonPropietario';
  99.     KeyFields := 'IdPropietario';
  100.     LookupDataSet := tbRefPersonas;
  101.     LookupKeyFields := 'IdPersona';
  102.     LookupResultField := 'Nombre';
  103.     qrClon.FieldDefs.Add('ClonPropietario', ftString, 20, False);
  104.     end;
  105. dsClonCaballos.DataSet := qrClon;
  106. qrClon.OnNewRecord:= ClonNewRecord; // El procedimiento debe tener los mismos
  107. //parámetros que el evento
  108. qrClon.Open;
  109. end;
  110.  
  111. procedure TClon.ClonNewRecord(DataSet: TDataSet);
  112. begin
  113. Showmessage('Agregando en el clon')
  114. end;
  115.  
  116. procedure TClon.qrCaballosNewRecord(DataSet: TDataSet);
  117. begin
  118. Showmessage('Agregando')
  119. end;
  120.  
  121. procedure TClon.FormCreate(Sender: TObject);
  122. var
  123. BaseDeDatos, ConStr : String;
  124. begin
  125.     Con.Close;//Por si se queda abierto en tiempo de diseño
  126.   // Obtiene la ruta y el nombre de la base de datos
  127.   ConStr := '';
  128.   BaseDeDatos := ExtractFilePath(Application.ExeName)+'DB.MDB';
  129.   if not FileExists(BaseDeDatos)  then raise
  130.   exception.Create('Error al cargar Base de Datos')else
  131.   begin
  132.   ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
  133.             'Data Source='+BaseDeDatos+';'+
  134.             'Persist Security Info=False;'+
  135.             'Jet OLEDB:Database Password=admin';
  136.   Con.ConnectionString := ConStr;
  137.   Con.Open;
  138.   qrCaballos.Open;
  139. end;
  140.  
  141. end;
  142.  
  143. end.



Archivos adjuntos


  • 0




IP.Board spam blocked by CleanTalk.