Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Numero de ítem en dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=77706)

gianfranco_tont 17-02-2012 03:22:09

Dbgrid con fila numeradas
 
Hola foro, tengo un dbgrid con un clientdataset y lo que quiero hacer es que las filas se autonumeren, ejemplo. Cuando se crea una linea nueva en el grid que sea la 01 la siguen la 02 etc.

Ademas quiero que cuando guarro la información que esta en el from me lo guarde con un correlativo, tal como si fuese una from de facturación.

Caral 17-02-2012 03:26:31

Hola
Creo que sigues con el mismo problema con el dbgrid.
No se, pero creo que este tutorial te ayudara.
O por lo menos te dará ideas.
Saludos
PD: Esta recién salido del horno.:D
Con vuestro permiso.

gianfranco_tont 17-02-2012 18:26:38

gracias esto si me dio una idea pero aun tengo un problema, como dije estoy trabajando con clientdataset y necesito hacer la suma de dos columna horizantale y finalmente la suma de la column vertical:

quiero que el cliendatasetTOTAL debe ser igual al cliendatasetCOSTO * cliendatasetCANTIDAD y luego finalmente en un Edit1.text es igual a la suma detoda la culumna cliendatasetTOTAL.

roman 17-02-2012 19:11:46

Cita:

Empezado por gianfranco_tont (Mensaje 425364)
quiero que el cliendatasetTOTAL debe ser igual al cliendatasetCOSTO * cliendatasetCANTIDAD y luego finalmente en un Edit1.text es igual a la suma detoda la culumna cliendatasetTOTAL.

1. Agrega un campo calculado (CalculatedField) llamado Total y en el elevento OnCalcFields del ClientDataSet pones:

Código Delphi [-]
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
  DataSet['total'] := DataSet['costo']*DataSet['cantidad'];
end;

2. Agrega un campo agregado (AggregateField) llamado GranTotal y pones sus propiedades:

a. Expression: SUM(costo*cantidad)
b. Active: true

También te aseguras de poner en True la propiedad AggregatesActive del ClientDataSet.

3. Pones un DBEdit ligado a un datasource que esté ligado al ClientDataSet y en su propiedad DataField pones GranTotal.

// Saludos

gianfranco_tont 17-02-2012 19:25:34

DONDE AGREGO EL CAMPO: EN ADOQUERY? EN CLIENTDATASET O EN EL DBGRID?
1. Agrega un campo calculado (CalculatedField) llamado Total y en el elevento OnCalcFields del ClientDataSet pones:

DONDE AGREGO EL CAMPO: EN ADOQUERY? EN CLIENTDATASET O EN EL DBGRID?
2. Agrega un campo agregado (AggregateField) llamado GranTotal y pones sus propiedades:

a. Expression: SUM(costo*cantidad)
b. Active: true

También te aseguras de poner en True la propiedad AggregatesActive del ClientDataSet.

3. Pones un DBEdit ligado a un datasource que esté ligado al ClientDataSet y en su propiedad DataField pones GranTotal.

// Saludos

roman 17-02-2012 19:39:01

Los campos los agregas al ClientDataSet.

// Saludos

gianfranco_tont 17-02-2012 20:28:19

hice todo pero me aparecen todas los campos menos el grantotal.

gianfranco_tont 17-02-2012 20:41:30

el campo editing clientdataset1.aggregates no me apararece para relacionarlo con el dbedit1. sera que falto algo por hacer?

gianfranco_tont 20-02-2012 00:41:56

Cita:

Empezado por gianfranco_tont (Mensaje 425391)
el campo editing clientdataset1.aggregates no me apararece para relacionarlo con el dbedit1. sera que falto algo por hacer?

Porfavor necesito ayuda con eso si alguien sabes como resolverlo lo agradecería mucho...

gianfranco_tont 20-02-2012 02:05:15

Cita:

Empezado por gianfranco_tont (Mensaje 425486)
Porfavor necesito ayuda con eso si alguien sabes como resolverlo lo agradecería mucho...

Aun sigo con este problema

Caral 20-02-2012 03:35:00

Hola
En el IBClientDataSet hay una propiedad que se llama Agregates (la segunda).
Si presionas en la casilla de al lado te saldra una pantalla pequeña.
Ahí hay dos dibujos, si presionas el primero (izquierda) agregaras uno
Te posicionas en el que creaste, en la propiedad AgragateName pones (GranTotal), en expresión pones lo que dijo Roman.
Vas nuevamente al IBClientDataSet y en la propiedad AgragatesActive la pones en true.
Relacionas el dbedit con el IBClientDataSet y en la propiedad datasource pones grantotal.
Creo que va por ahí.
Nunca he usado el IBClientDataSet, solo lo revise.
Saludos

Delphius 20-02-2012 06:44:15

Hay tan sólo una 1h de diferencia entre tu post #9 y el #10.
Aquí la gente ayuda en cuanto puede, y quiere. No vengas con prisas ni urgencias. Ten paciencia, y tendrás las respuestas a su debido momento. No por postear cada 1h más te van a ayudar más... todo lo contrario: denotas más tu desesperación y menos ganas vamos a tener.
Uno de los puntos de la guía de estilo es pedir las cosas sin urgencias, respétala.

Saludos,

gianfranco_tont 20-02-2012 15:56:23

Cita:

Empezado por Caral (Mensaje 425495)
Hola
En el IBClientDataSet hay una propiedad que se llama Agregates (la segunda).
Si presionas en la casilla de al lado te saldra una pantalla pequeña.
Ahí hay dos dibujos, si presionas el primero (izquierda) agregaras uno
Te posicionas en el que creaste, en la propiedad AgragateName pones (GranTotal), en expresión pones lo que dijo Roman.
Vas nuevamente al IBClientDataSet y en la propiedad AgragatesActive la pones en true.
Relacionas el dbedit con el IBClientDataSet y en la propiedad datasource pones grantotal.
Creo que va por ahí.
Nunca he usado el IBClientDataSet, solo lo revise.
Saludos

El en punto 3 de román y en punto 3 tuyo de verdad no hay forma que pueda relacionar el campo creado en la grid y hay mas ni siquiera lo veo.

Caral 20-02-2012 17:28:44

Hola
Pon el campo total, hara lo mismo.
Saludos

gianfranco_tont 21-02-2012 06:17:51

Numero de ítem en dbgrid
 
Hola foro, estoy trabajando con un dbgrid atado a un datasource, luego a un dataset, luego a un dataset ro idee y finalmente a un adoquery. Quiero que cuando se agrega una fina nueva en el dbgrid en la columna ítem me refrene el numero de ítem ejemplo: 01'02'03 etc, alguien me puede indicar como hacerlo?

olbeup 21-02-2012 09:24:45

No se a que te refieres con el número de item, pero hay una propiedad DBGrid1.DataSource.DataSet.RecNo que te devuelve el número de registro y es automático y correlativo, pero esto es virtual y no te servirá de punto de referencia, si sólo quieres que se vea un número el RecNo te lo da.

Un saludo.

gianfranco_tont 21-02-2012 15:14:37

Ok si pudiera probar es eso lo que necesito, pero donde le coloco esta propiedad?

Casimiro Noteví 21-02-2012 16:12:14

Por favor, cuando no entiendas las soluciones que te dan, no abras otro hilo para ello, simplemente explica que no lo entiendes.
Gracias por tu colaboración.

He unido ambos hilos porque es lo mismo.

gianfranco_tont 21-02-2012 18:16:25

Cita:

Empezado por olbeup (Mensaje 425626)
No se a que te refieres con el número de item, pero hay una propiedad DBGrid1.DataSource.DataSet.RecNo que te devuelve el número de registro y es automático y correlativo, pero esto es virtual y no te servirá de punto de referencia, si sólo quieres que se vea un número el RecNo te lo da.

Un saludo.

Si me funciona pero fijare lo que me sucede:
Solo me muestra el numero del registro donde estoy ubicado pero al pasar a un registro nuevo me lo borra, es decir no se guarda en la columna ítem, sin embargo la secuencia la sigue perfecta. El otro problema es que solo me inicia a contar desde el segundo registro en el primero no me coloca nada.

Caral 21-02-2012 18:30:20

Hola
Código Delphi [-]
QueryTemp.SQL.Text := 'Select Max(Item) from TuTabla';
QueryTemp.Active := true;
TuQuery.Fields[0].AsInteger := QueryTemp.Fields[0].AsInteger+1;

Saludos

gianfranco_tont 21-02-2012 19:28:26

Caral, no entiendo lo del querytemp cual serria para mis el querytemp? Y en donde coló esta sentencia?

Caral 21-02-2012 19:30:19

Hola
Un query nuevo, otro query mas que normalmente yo uso para varias cosas, por eso lo llamo temporal.
Simplemente esta enlazado a la BD y se le asigna la labor que se quiera.
El codigo lo pones en el evento oncellclick del dbgrid.
Saludos

gianfranco_tont 21-02-2012 22:03:56

Me da un error de access violation al hacer click en el grid, lo coloque en el evento dbgrid1cellclick.

Caral 21-02-2012 22:15:52

Hola
No se que estas haciendo, lógicamente.
Me da la impresión, a ojo, que lo tendrías que hacer en el evento o procedimiento que crea una nueva linea al dbgrid, que es cuando necesitas que se cree un nuevo numero para el item.
Saludos

olbeup 22-02-2012 09:32:12

Hola gianfranco_tont

En tu SQL al principo pon un campo como el siguiente y después te diré para que es:
Código SQL [-]
SELECT
    0 AS NUMITEM <-- Este es el que vamos a modificar con el RecNo del DBGrid
    ,CAMPO1  |
    ,CAMPO2  | --> Esto son tus campos de la DB
    ,CAMPOX  |
    ,....
Después en el DrawColumnCell del DBGrid tienes que poner esto:
Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  FieldText: String;
  W: Integer;
begin
  if (DataCol = 0) then
    with DBGrid1.DataSource.DataSet do
      FieldText := IntToStr(RecNo);

  with DBGrid1 do
    if (DataCol = 0) then
    begin
      W := ((Rect.Right - Rect.Left) - Canvas.TextWidth(FieldText));
      DefaultDrawing := True;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + W -2, Rect.Top +2, FieldText);
    end
    else
      DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
Espero haberte orientado.

Un saludo.

ecfisa 23-02-2012 00:54:07

Hola gianfranco_tont.

En referencia a tu primer consulta:
Cita:

Hola foro, tengo un dbgrid con un clientdataset y lo que quiero hacer es que las filas se autonumeren, ejemplo. Cuando se crea una linea nueva en el grid que sea la 01 la siguen la 02 etc.
Creo que la opción más sencilla es que en el TClientDataSet, crees un campo calculado de tipo string (en el ejemplo lo llamo ClientDataSet1RecNo), mediante el Field Editor, ubícalo en el primer lugar de la lista de campos.

Luego en el evento OnCalcFields del TClientDataSet:
Código Delphi [-]
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
const
   NCEROS = 2; // Cantidad de ceros a la izquierda
begin
  with ClientDataSet1 do
    ClientDataSet1RecNo.AsString:= StringOfChar('0', NCEROS-Length(IntToStr(RecNo))) + IntToStr(RecNo);
end;
end;
Ese código dá exáctamente el resultado que solicitas.

Lógicamente es necesario que la propiedad DataSource del TDBGrid haga referencia al TDataSource que apunta al TClientDataSet.

Saludos.


La franja horaria es GMT +2. Ahora son las 05:40:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi