Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   tdbgrid como tabla de referencia (https://www.clubdelphi.com/foros/showthread.php?t=86651)

jrla 11-09-2014 21:32:33

tdbgrid como tabla de referencia
 
hola a todos tengo una consulta mi duda es como hago para mover los datos de un dbgrid que lo tengo enlazado a una consulta de personal por departamento asta el

momento todo bien ya que me muestra todo el personal correspondiente lo que quiero hacer que la seleccionar con el puntero una

personal de dbgri1 me lo pase al dbgrid 2 que esa es la lista que en verda voy a guardar en mi base de datos gracias en este hilo

vi una repuesta que me pueda ayudar no entendí el procedimiento para palicarlo a mi xe6 clubdelphi.com/foros/showthread.php?t=76755 luego que tengo todos mi personal seleccionado como lo guardo en mi base de datos

Casimiro Notevi 11-09-2014 22:36:02

Te veo bastante perdido, lo que necesitas es el mejor libro que puedes encontrar sobre delphi y bases de datos, es este y es gratis.

jrla 11-09-2014 23:13:58

ni tanto
 
hola gracias por tu respuesta no estoy tan perdido como dije anterior mente tengo un dbgrid1 con datos filtrados atreves de un query que me muestra todo los trabajadores que están en un departamento... ahora que cuando el usuario seleccione en el dbrid1 los que se van de vacaciones y al presionar el button me pase dicha selección a dbgrid2 ............. en el dbgrid1 tengo las opciones activas row select y multi select

Código Delphi [-]
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientDataSet1.CreateDataSet;
  ClientDataSet1.Open;
end;

procedure TForm1.btnPasarRegistroClick(Sender: TObject);
var
  i: Integer;
begin
  ClientDataSet1.Append;
  with DBGrid1.DataSource.DataSet do         // de aquí es que me pierdo por el do sin el while 
   for i:= 0 to FieldCount-1 do
     ClientDataSet1.Fields[i].Value := Fields[i].Value; // asta aquí
  ClientDataSet1.Post;
end;

ecfisa 12-09-2014 04:17:35

Hola jrla.


Sería de mucha ayuda que nos dijeras con que gestor de base de datos estas trabajando (Firebird, MySQL, Paradox, Access, MS SQLServer,) y con que componentes te conectas a ella ? (BDE, ADO, IBX, DBExpres, ...)

Saludos :)

aguml 12-09-2014 09:07:30

hasta donde yo se, el with...do es algo especifico de delphi y simplemente es para evitar tener que hacer referencia al objeto que indique el with..do. En tu caso elimina la linea del with...do y en el for cambias la linea que se encuentra en su interior por esta: ClientDataSet1.Fields[i].Value*:=*DBGrid1.DataSource.DataSet.Fields[i].Value; En este caso no le veo mucho sentido ya que es una sola linea pero imagina que tuvieses que usar muchas referencias al mismo objeto, ahi si es mas util aunque se puede prescindir de ello. En builder podrias usar un puntero a objeto para acortar.


Quedaria asi:
Código PHP:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
ClientDataSet1->CreateDataSet;
  
ClientDataSet1->Open;
}

void __fastcall TForm1::btnPasarRegistroClick(TObject *Sender)
{
  
ClientDataSet1->Append;
  
  for(
int i=0<= FieldCount-1i++)
     
ClientDataSet1->Fields[i]->Value DBGrid1->DataSource->DataSet->Fields[i]->Value;
  
ClientDataSet1->Post;



Casimiro Notevi 12-09-2014 10:41:06

Cita:

Empezado por jrla (Mensaje 481227)
hola gracias por tu respuesta no estoy tan perdido

Bastante perdido, pero no debes molestarte por eso, todos estamos perdidos en algún momento :rolleyes:

jrla 12-09-2014 11:57:31

ninguna molestia
 
Cita:

Empezado por Casimiro Notevi (Mensaje 481254)
Bastante perdido, pero no debes molestarte por eso, todos estamos perdidos en algún momento :rolleyes:

hola casimiro no me molesto :-S simplemente me siento frustrado al realizar algo que quiero y me complique tanto
la otra pregunta es mi gestor de base de datos es interbase y me conecto con IBTransaction1:eek:

Casimiro Notevi 12-09-2014 12:00:40

Cita:

Empezado por jrla (Mensaje 481259)
hola casimiro no me molesto :-S simplemente me siento frustrado al realizar algo que quiero y me complique tanto
la otra pregunta es mi gestor de base de datos es interbase y me conecto con IBTransaction1:eek:

Por eso te he enlazado el libro La cara oculta de Delphi, todas esas dudas desaparecerán si lo lees.

IBTransaction no es para conectar con una base de datos.

jrla 12-09-2014 12:03:38

aclara miento
 
Cita:

Empezado por aguml (Mensaje 481242)
hasta donde yo se, el with...do es algo especifico de delphi y simplemente es para evitar tener que hacer referencia al objeto que indique el with..do. En tu caso elimina la linea del with...do y en el for cambias la linea que se encuentra en su interior por esta: ClientDataSet1.Fields[i].Value*:=*DBGrid1.DataSource.DataSet.Fields[i].Value; En este caso no le veo mucho sentido ya que es una sola linea pero imagina que tuvieses que usar muchas referencias al mismo objeto, ahi si es mas util aunque se puede prescindir de ello. En builder podrias usar un puntero a objeto para acortar.

[/php]

muchas gracias por el aclara miento......... en las lineas del dataset la avia modificado solo me falta era el puntero y la del for me confundí al indicarle el field del dbgrd a aumentar

aguml 12-09-2014 12:40:45

uffff que dificil es entenderte :confused:. ¿el español es tu lengua nativa? porque parece que uses el google translator (aunque no creo que ni él lo haga tan mal :D).
A ver si puedes aclararme un poquito mejor lo que me comentas porque me pierdo.

jrla 12-09-2014 13:39:18

el perdido :D
 
Cita:

Empezado por Casimiro Notevi (Mensaje 481260)
IBTransaction no es para conectar con una base de datos.

yo utilizo interbase el que trae embarcadero xe6 creo que se conecta con ibconasole y en mi form tengo par enlazar a a mi base de datos un tibdata base

ecfisa 12-09-2014 13:50:31

Hola jrla.

Para el ejemplo crea dos tablas iguales, menos en el nombre claro :)
Código SQL [-]
SET TERM ^;

CREATE TABLE TEST (
    ID      INTEGER,
    CADENA  VARCHAR(50)
)^

CREATE TABLE TEST2 (
    ID      INTEGER,
    CADENA  VARCHAR(50)
)^

SET TERM ;^
Y cargale algunos datos a la primer tabla (orígen).

En un form pone,
Código:

1 (un ) TIBDatabase    (IBDatabase1)
1 (dos) TIBTransaction (IBTransaction1)
2 (dos) TIBDataSet    (ibdsSource y ibdsTarget)
2 (dos) TDataSource    (dsSource, dsTarget)
2 (dos) TDBGrid.      (dbgSource, dbgTarget)
1 (un ) TButton        (btnPassData)

Ejemplo:
Código PHP:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
/* tabla origen */
  
ibdsSource->Close();
  
ibdsSource->Database IBDatabase1;
  
ibdsSource->SelectSQL->Text "SELECT * FROM TEST";
  
ibdsSource->Open();
  
// DataSource origen
  
dsSource->DataSet ibdsSource;
  
// DBGrid origen
  
dbgSource->DataSource dsSource;
  
dbgSource->Options TDBGridOptions(dbgSource->Options)<< dgMultiSelect;
  
dbgSource->Options TDBGridOptions(dbgSource->Options)<< dgRowSelect;
  
dbgSource->PopupMenu PopupMenu1;

  
/* tabla destino */
  
ibdsTarget->Close();
  
ibdsTarget->Database IBDatabase1;
  
ibdsTarget->SelectSQL->Text "SELECT * FROM TEST2";
  
ibdsTarget->Open();
  
// DataSource destino
  
dsTarget->DataSet ibdsTarget;
  
// DBGrid destino
  
dbgTarget->DataSource dsTarget;
}

void __fastcall TForm1::btnPassDataClick(TObject *Sender)
{
  if (
dbgSource->SelectedRows->Count 0) {
    for(
int i 0dbgSource->SelectedRows->Counti++) {
      
ibdsSource->GotoBookmark((void*)dbgSource->SelectedRows->Items[i].c_str());
      
ibdsTarget->Insert();
      for(
int j 0ibdsSource->Fields->Countj++)
        
ibdsTarget->Fields->Fields[j]->Value ibdsSource->Fields->Fields[j]->Value;
      
ibdsTarget->Post();
    }
  }


El código pasa los registros que hayas seleccionado en dbgSource (mediante Ctrl+Click) a dbgTarget (en realidad de ibdsSource a ibdsTarget), cuando se presiona el botón btnPassData.

Está realizado y probado en C++ Builder 6 y Firebird 2.5.

Saludos :)

jrla 12-09-2014 14:10:25

vuelvo a explicar mi duda
 
hola a todos att el perdido.......... lo que tengo es lo siguiente tengo un form que se llama organizar curso donde tengo un combobox con todos los departamentos y un button enlazado a un query que me hace una consulta a la tabla trabajadores y me filtra los mismo de acuerdo a la selección del combobox y me lo mostrara en un stringrid ecfisa me ayudo con esa parte y buscando en los hilos vi que era mejor trabajar con un dbgrid entonces agregue un datasourse1 y lo enlace a mi query y mi dbgrid1 lo enlace a datasourse1 y este me muestra mi consulta

aquí viene el problema mi tutor dijo pero si yo quiero seleccionar algunos trabajadores de departamento y no a todos y crear otra lista .... y entonces agregue un 2 dbgri2 y un clienta dataset1 .... a dbgrid1 le active las opciones multiselec y rowslect lo que quiero hacer es que cuando marque los trabajadores del dbgrid 1 y precione un button los pase al dbgrid 2 y esa es la lista de trabajadores que voy a almacenar en mi base de datos esa es mi historia

ecfisa 12-09-2014 14:33:36

Hola jrla.

Claro, pero al usar un TDBGrid como receptor de los datos, sí o sí tenes que emplear una tabla ya que ese componente funciona en relación con ellas (la representa visualmente) y si usas la misma tabla vas a duplicar información.

Si usas una sola tabla, se me ocurre como mas lógico borrar los registros no seleccionados ...

¿ Es eso lo que buscas hacer? ¿ Dejar en la tabla sólo los registros seleccionados ?

Saludos :)

jrla 12-09-2014 14:52:32

ecfisas
 
aplique tu línea de código y me sale esto c_str isno a member of tbytedynarray y undefined symbol popupmenu1
con la explicación de tu código entendí que mi 2 dbgrid debe estar enlazado a la tabla que quiero almacenar verdad ?... o me equivoco

ecfisa 12-09-2014 16:06:57

Hola jrla.
Cita:

Empezado por jrla (Mensaje 481272)
aplique tu línea de código y me sale esto c_str isno a member of tbytedynarray

Es por eso que aclare: C++ Builder 6. En esta versión TBookmarkList, está declarado así:
Código PHP:

typedef void *TBookmark

Eso cambió a partir de C++ Builder 2009 y aparentemente XE6 declara la propiedad TBookmarkList (Items) de tipo TByteDynArray, de allí que indique que el método c_str() no es miembro de ...
Pero realmente desconozco la definición y uso en XE6, tendría que buscar y leer al respecto.


Cita:

Empezado por JRLA (Mensaje 481272)
y undefined symbol popupmenu1

¿ Y en que parte del código de mi mensaje metí un TPopupMenu llamado popupmenu1 ? :confused:


Cita:

Empezado por jrla (Mensaje 481272)
con la explicación de tu código entendí que mi 2 dbgrid debe estar enlazado a la tabla que quiero almacenar verdad ?... o me equivoco

No te equivocas en absoluto, es así. De ese modo se guardarían en la segunda tabla los registros seleccionados.

Saludos :)

jrla 12-09-2014 16:31:41

aqui esta la propieda PopupMenu
 
Cita:

// DBGrid origen
dbgSource->DataSource = dsSource;
dbgSource->Options = TDBGridOptions(dbgSource->Options)<< dgMultiSelect;
dbgSource->Options = TDBGridOptions(dbgSource->Options)<< dgRowSelect;
dbgSource->PopupMenu = PopupMenu1;
la ultima línea

aguml 12-09-2014 17:05:28

A ver, hay algo que no tengo claro, el filtrado ¿quieres guardarlo? Si es asi lo mejor es que crees una nueva tabla (por ejemplo la puedes llamar "filter") y ahí guardas. Si no quieres guardar ese filtrado ¿por que no usas un TStringGrid para mostrarlos? Este no necesita de una tabla y viene a ser lo mismo.

ecfisa 12-09-2014 17:13:05

Cita:

Empezado por jrla (Mensaje 481292)
la ultima línea

Te pido mil disculpas, juro que no lo ví :o, solo borra la línea y el error desaparecerá ;)

Saludos :)

jrla 12-09-2014 17:20:51

listo
 
Código PHP:

http://docwiki.embarcadero.com/Libraries/XE6/en/System.Types.TByteDynArray 

ya borre la línea....... investigue y me sale estoy referente a tbytedynarray que opinas


La franja horaria es GMT +2. Ahora son las 08:37: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