Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Agregando articulos a un StringGrid (https://www.clubdelphi.com/foros/showthread.php?t=93663)

feliz-58 23-12-2018 04:42:17

Agregando articulos a un StringGrid
 
Saludos, gracias por haber colaborando conmigo en uno que otro punto y por siempre estar dispuestos a ayudarme a aprender cosas nuevas de ustedes que saben mucho de esto.

Tengo un string grid, al cual quiero agregar artículos y quitar según sea el caso, ya en este foro he preguntado sobre quitar y me han dado formas eficientes de hacerlo, pero un inconveniente al agregar.

Mi string grid consta de 7 columnas:
1- Referencia -------------------- Para que aquí valla el código del articulo
2- Cantidad -------------------- Obviamente la cantidad de cuantos artículos se van a facturar
3- Concepto -------------------- La descripción del articulo
4- Precio --------------------- El precio individual de cada articulo
5- Neto --------------------- Aquí el total de cantidad x Precio
6- ITBIS ---------------------- Aquí si aplica ITBIS, Neto * 18/100
7- Total ---------------------- Neto + ITBIS

Como saben, para que no pierda el formato de las cabeceras, un strind Grid debe al menos contener 1 fila adicional aparte de la fila del encabezado. Aquí comienza mi inconveniente.

Para agregar articulos hago esto:
Código Delphi [-]
Var
Precios, Neto, Impuesto  : Real;
Begin
SG.Row := SG.Rowcount - 1;
SG.Cells[0, SG.Row] := IntToStr(CodProd);
SG.Cells[1, SG.Row] := FaddProducto.Ecantidad.Text;
SG.Cells[2, SG.Row] := FaddProducto.Qtemp.FieldByName('Descripcion').AsString;
// Precio 1 -----------------------------------------------
if FaddProducto.RB1.Checked = true then
Precios:= StrtoFloat(FaddProducto.EPrecio.Text);
// Precio 2 -----------------------------------------------
if FaddProducto.RB2.Checked = true then
Precios:= StrtoFloat(FaddProducto.EPrecio2.Text);
// Precio 3 -----------------------------------------------
if FaddProducto.RB3.Checked = true then
Precios:= StrtoFloat(FaddProducto.EPrecio3.Text);
// Precio 4 -----------------------------------------------
if FaddProducto.RB4.Checked = true then
Precios:= StrtoFloat(FaddProducto.EPrecio4.Text);
//----------------------------------------------------------
SG.Cells[3, SG.Row] := FloattoStr(Precios);
SG.Cells[4, SG.Row] := FloatToStr(Precios * Strtofloat(FaddProducto.Ecantidad.Text));
Neto:= Precios * Strtofloat(FaddProducto.Ecantidad.Text);
// Impuesto ------------------------------------------------
if Faddproducto.AplicaITBIS.Checked = true then
Begin
SG.Cells[5, SG.Row] := FaddProducto.Qtemp.FieldByName('ITBIS').AsVariant/100 * Precios;
Impuesto:= FaddProducto.Qtemp.FieldByName('ITBIS').AsVariant/100 * PrecioS;
SG.Cells[6, SG.Row] :=  Floattostr(neto+Impuesto);
end
else
Begin
SG.Cells[5, SG.Row] := '0';
SG.Cells[6, SG.Row] :=  Floattostr(neto);
end;
//----------------------------------------------------------
SG.RowCount := SG.RowCount + 1;
end;

Que pasa con esto, que siempre al final, tengo que dejar el "SG.RowCount := SG.RowCount + 1;" Para que la siguiente linea este lista para introducir el nuevo articulo.

¿Que Necesito?
Quiero una forma eficiente de ignorar si es el primer articulo que se va a agregar (ya que hay una fila vacía en el string grid) o si es otro (2do, 3ro, Etc), para no tener que dejar una fila vacia al final de cada ves que agrego un articulo, es decir que la fila se cree en el momento que se va a insertar el articulo. Ya que si pongo "SG.RowCount := SG.RowCount + 1;" al inicio del código, la primera ves que se inserta, deja un espacio vació, obviamente porque ya había uno ahí.

Gracias!

Casimiro Notevi 23-12-2018 13:39:01

No entiendo qué quieres decir con lo de las líneas vacias, ni lo de "perder el formato de las cabeceras".

feliz-58 23-12-2018 15:17:50

2 Archivos Adjunto(s)
Cita:

Empezado por Casimiro Notevi (Mensaje 530147)
No entiendo qué quieres decir con lo de las líneas vacias, ni lo de "perder el formato de las cabeceras".

En la imagen 1, esta el string grid normalmente con una fila vacia, en el numero dos, si eliminas la fila, la cabecera pierde el color de fondo, etc.

ecfisa 23-12-2018 22:24:05

Hola.

Si no entendí mal el problema, tendría que quedar así:
Código Delphi [-]
...
Var
  Precios, Neto, Impuesto, ITBIS : Real;
Begin
  if SG.Row = SG.FixedRows then // ¿ estamos la línea de cabeceras ?
    SG.Row := SG.Row + 1;  // avanzar una linea
  //----------------------------------------------------------
  {
     ... el resto de tu código 
  }
  //----------------------------------------------------------
  SG.RowCount := SG.RowCount + 1; // Agregar otra línea
  SG.Row := SG.Row + 1;           // el siguiente ingreso irá en la línea agregada
end;

Saludos :)

feliz-58 23-12-2018 22:50:15

Cita:

Empezado por ecfisa (Mensaje 530152)
Hola.

Si no entendí mal el problema, tendría que quedar así:
Código Delphi [-]
...
Var
  Precios, Neto, Impuesto, ITBIS : Real;
Begin
  if SG.Row = SG.FixedRows then // ¿ estamos la línea de cabeceras ?
    SG.Row := SG.Row + 1;  // avanzar una linea
  //----------------------------------------------------------
  {
     ... el resto de tu código 
  }
  //----------------------------------------------------------
  SG.RowCount := SG.RowCount + 1; // Agregar otra línea
  SG.Row := SG.Row + 1;           // el siguiente ingreso irá en la línea agregada
end;

Saludos :)

"Fuera de Rango"

creo que lo enfocaste mal, me explico, la primera vez que se va a trabajar con el Grid, esta la cabecera mas 1 fila vacia, con mi codigo, "lleno" esa fila vacia y finalmente agrego la linea siguiente, es decir queda asi:

Código Delphi [-]
Var
Precios, Neto, Impuesto  : Real;
Begin
SG.Row := SG.Rowcount - 1;
 //----------------------------------------------------------
  {
     ... el resto del código 
  }
  //----------------------------------------------------------
SG.RowCount := SG.RowCount + 1;

Seria igual a esto:

---Cabecera---
---Primer articulo---
---Fila Vacia-----

con mi codigo, cada vez que agrego un articulo, al final tengo que dejar la siguiente linea, porque si agrego la linea antes de agregar el articulo, la primera vez, quedaría una fila vacia Arriba, es decir.
Código Delphi [-]
Var
Precios, Neto, Impuesto  : Real;
Begin
SG.RowCount := SG.RowCount + 1;
SG.Row := SG.Rowcount - 1;
 //----------------------------------------------------------
  {
     ... el resto del código 
  }
  //----------------------------------------------------------

---Cabecera---
---Fila Vacia-----
---Primer articulo---

feliz-58 23-12-2018 22:57:53

Posible solucion...
 
Creo que lo resolvi haciendo esto:

Código Delphi [-]
if (SG.RowCount = 2) and (SG.Cells[0, SG.Row] = '') then

else
SG.RowCount := SG.RowCount + 1; // Agregar otra línea

SG.Row := SG.Rowcount - 1;

cloayza 27-12-2018 16:34:53

Nunca me ha cuajado porque muchos foreros utilizan StringGrid para mostrar datos en vez de usar TDBGrid u otra variante como TwwDBGrid de Infopower...

Según mi humilde opinión es como reinventar la rueda...:D

Podrían indicar que beneficios nos brinda esta técnica de usar StringGrid v/s DBGrid..

Se los agradezco y talvez me pueda reconvertir...
Un abrazo

feliz-58 27-12-2018 18:48:29

Cita:

Empezado por cloayza (Mensaje 530198)
Nunca me ha cuajado porque muchos foreros utilizan StringGrid para mostrar datos en vez de usar TDBGrid u otra variante como TwwDBGrid de Infopower...

Según mi humilde opinión es como reinventar la rueda...:D

Podrían indicar que beneficios nos brinda esta técnica de usar StringGrid v/s DBGrid..

Se los agradezco y talvez me pueda reconvertir...
Un abrazo

Mira realmente en mi caso no había explorado la posibilidad de usar el DBGrid con el clientdataset pero la diferencia es abismal, y el uso es muy versátil.


La franja horaria es GMT +2. Ahora son las 17:12:37.

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