Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comparar datos, numeros (https://www.clubdelphi.com/foros/showthread.php?t=80212)

Caral 09-09-2012 22:02:36

Comparar datos, numeros
 
Hola a todos
Os explico:
Tengo dos forms
en uno tengo un stringrid, en el otro tengo un edit.
coloco un dato en el edit y este se coloca en una celda del stringrid
por cada dato se va colocando en la celda de abajo del stringrid.
El asunto:
Quiero saber si el numero que se va a poner en el stringrid ya esta (osea esta repetido), si es asi que lo indique y no lo ponga.
Para esto me imagino que hay que hacer un recorrido de las columnas del stringrid y compararlo con el edit.

Hice esto pero me indica que esta repetido si es el primer dato, despues se lo salta:
Código Delphi [-]
 if  SGFact.Cells[2,SGFact.Row] = FSelProdFact.Edit2.Text then
 begin
 Valor:=SGFact.Cells[2,SGFact.Row]
 ShowMessage(Valor);   
 end;

Como veréis no he podido.
Me ayudáis, por favor.
Gracias
Saludos

Casimiro Notevi 09-09-2012 22:19:44

¿Has mirado usando el debug y deteniendo el programa (breakpoint) para ver qué valores tienen?

Caral 09-09-2012 22:34:58

Hola
No amigo, no sabria como hacerlo, pero el programa no da errores, es simplemente hacer una comparacion de los numeros que tienen las celdas con el del edit.
Gracias.
Saludos

Casimiro Notevi 09-09-2012 22:39:45

Pones un breakpoint (punto de ruptura) en la línea:
Código Delphi [-]
if  SGFact.Cells[2,SGFact.Row] = FSelProdFact.Edit2.Text then
Ejecutas el programa y se detendrá ahí. Con el ratón te pones encima del código y verás un 'hint' que te dará el valor que tiene.

ecfisa 09-09-2012 22:41:06

Hola amigo :)

Prueba con esta función que a mi me está funcionando bién:
Código Delphi [-]
function ExisteNro(SG: TStringGrid; const aNum: string; const aCol: Integer): Boolean;
var
  r: Integer;
begin
  Result := False;
  r      := SG.FixedRows;
  while (r < SG.RowCount-1) and not Result do
  begin
    Result := SG.Cells[aCol, r] = aNum;
    inc(r);
  end;
end;

// prueba
procedure TForm1.Button1Click(Sender: TObject);
begin
  // en Col 1 puse unos números
  if not ExisteNro(StringGrid1, Edit1.Text, 1) then  
    StringGrid1.Cells[1, StringGrid1.Row] := Edit1.Text;
end;
asi vamos descartando posibilidades...

Saludos. :)

Caral 09-09-2012 23:22:47

Hola
Me funciona pero la segunda vez me da un error de is not a valid floating point value.
estoy seguro que es por otra razon, la estoy buscando amigo.
Este es el codigo completo para que lo veas:

Código Delphi [-]
procedure TFFactura.BitBtn2Click(Sender: TObject);
var i,e : integer;
Valor: String;
begin
// ************ Boton de Agregar **************
   FSelProdFact:=TFSelProdFact.Create(self);
   FSelProdFact.Precio := Label15.Caption;
 // Filtra las series que ya estan en la factura
   If (SGFact.RowCount = 2) AND (SGFact.Cells[2,1] = '') then FSelProdFact.Filtro := ''
   else
   begin
      FSelProdFact.Filtro := 'NumSerie <> '+ SGFact.Cells[2,1];
      i:=2;
      While i < SGFact.RowCount do
      begin
         FSelProdFact.Filtro := FSelProdFact.Filtro + ' AND NumSerie <> '+SGFact.Cells[2,i];
         i:=i+1;
      end;
    end;
   try
      If CBFactura.Text = 'Productos' then
      begin
      FSelProdFact.CheckBox1.Checked:= True;
      end;
      If CBFactura.Text = 'Materiales' then
      begin
      FSelProdFact.BitBtn4.Visible:= False;
      FSelProdFact.CheckBox1.Checked:= False;
    //  FSelProdFact.Edit2.ReadOnly:= False;
      end;
      FSelProdFact.ShowModal;
   finally
      // si no presiona cancelar en FSelProdFact
      If FSelProdFact.Cancela = False then
      Begin
      If Cuenta > 1 then SGFact.RowCount := SGFact.RowCount + 1;
      // si se vende un producto
      If FSelProdFact.CheckBox1.Checked = True then
      begin
         QTemp.Close;
         QTemp.SQL.Text := 'SELECT Descripcion|| '' '' ||Categoria|| '' '' ||SubCategoria AS Descr, Precio1 FROM Articulos '+
                           'WHERE CodParte = '+QuotedStr(FSelProdFact.Edit1.Text);
         QTemp.Open;
      end;

      // Si se vende un Material
      If FSelProdFact.CheckBox1.Checked = False then
      begin
         QTemp.Close;
         QTemp.SQL.Text := 'SELECT Descripcion AS Descr FROM Materiales '+
                           'WHERE CodMaterial = '+QuotedStr(FSelProdFact.Edit1.Text);
         QTemp.Open;
      end;
     
   // codigo que ve funcion de ecfisa
  // revisa la columna 2
    if not ExisteNro(SGFact, FSelProdFact.Edit2.Text, 2) then
    begin
      //  SGFact.Cells[2, SGFact.Row] := FSelProdFact.Edit2.Text;
 
         SGFact.Cells[0,cuenta] := FSelProdFact.Edit1.Text;
         SGFact.Cells[1,cuenta] := QTemp.Fields[0].AsString;
         SGFact.Cells[2,cuenta] := FSelProdFact.Edit2.Text;
         SGFact.Cells[3,cuenta] := FSelProdFact.Edit3.Text;
         SGFact.Cells[4,cuenta] := Format('%8.2f',[FSelProdFact.FloatEdit1.Value]);
         SGFact.Cells[5,cuenta] := Format('%8.2f',[FSelProdFact.FloatEdit1.Value * StrToFloat(SGFact.Cells[3,cuenta])]);
         If FSelProdFact.CBIV.Checked then SGFact.Cells[6,cuenta] := 'Si' else SGFact.Cells[6,cuenta] := 'No';
         Cuenta := Cuenta +1;
         QTemp.Close;
         SortGrid(SGFact,0,0);
         CalculaTotales;
         end;
         end;

      FSelProdFact.Free;
      end;

end;
Saludos

Casimiro Notevi 09-09-2012 23:28:05

En principio, sin ningún delphi para probar, esto está mal:

Código Delphi [-]
While i < SGFact.RowCount do

Ya que el contador es desde cero, así que tendrá que ser:

Código Delphi [-]
While i < SGFact.RowCount-1 do

Fíjate en el código de ecfisa.

ecfisa 09-09-2012 23:40:25

Cita:

Empezado por Casimiro Notevi (Mensaje 442528)
En principio, sin ningún delphi para probar, esto está mal:

Código Delphi [-]
While i < SGFact.RowCount do

Hola.

Si fuera la cota de un for/to/do sería tál como dices. Pero en este caso se compara por '<', es decir que el máximo valor que alcanzará 'i' (al ser de tipo entero) es RowCount-1.

Saludos. :)

ecfisa 09-09-2012 23:48:40

Hola.

Estuve mirando el código y por el tipo de error (is not a valid floating point value), diría que se produce en esta línea:
Código Delphi [-]
SGFact.Cells[5,cuenta] := Format('%8.2f',[FSelProdFact.FloatEdit1.Value * StrToFloat(SGFact.Cells[3,cuenta])]);
Muy probablemente haya en la columna 3 algún valor que no puede ser convertido a número flotante ya sea por espacios, formato del separador decimal, ...

Saludos. :)

Caral 09-09-2012 23:50:08

Hola
Si amigo, esa parte no tiene problemas, siempre ha funcionado.
Me da la impresion que cuando se cumple la condicion de la funcion no se guarda el dato en el stringgrid pero crea una nueva linea vacía.
El problema esta en un procedimiento que se llama CalculaTotales que hace los calculos de cada columna, al estar vacia la ultima lanza el error.
El asunto es:
Como haga para que no se cree esa columna o linea nueva ?.
Saludos

ecfisa 10-09-2012 00:09:33

Hola.

No sé si haya otra parte del código que pudiera estar interfiriendo, pero en estas líneas:
Código Delphi [-]
     ... 
    // revisa la columna 2
    if not ExisteNro(SGFact, FSelProdFact.Edit2.Text, 2) then
    begin
        // (*)
    end;
    ...
(*) El código que esta aquí no se ejecuta si FSelProdFact.Edit2.Text es igual a algún valor de la columna 2.

La prueba completa que hice por si te sirviera de algo es:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
var
  r: Integer;
begin
  with StringGrid1 do
  begin
    // inicializar
    FixedCols:= 1;
    FixedRows:= 1;
    Rowcount := 12;
    Rows[0].CommaText:= ' ,1,2,3,4,5'; // cabecera de columnas
    // valores a columna 2
    for r := FixedRows to RowCount-3  do
      Cells[2,r]:= FormatFloat('0.0000',r*PI);
    // posicionar en la última celda libre de columna 2
    Col := 2;
    Row := RowCount-2;
    // un valor existente en Edit1
    Edit1.Text := FormatFloat('0.0000', 3*PI); 
  end;

end;

function ExisteNro(SG: TStringGrid; const aNum: string; const aCol: Integer): Boolean;
var
  r: Integer;
begin
  Result := False;
  r      := SG.FixedRows;
  while (r < SG.RowCount-1) and not Result do
  begin
    Result := SG.Cells[aCol, r] = aNum;
    inc(r);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not ExisteNro(StringGrid1, Edit1.Text, 2) then
    StringGrid1.Cells[2, StringGrid1.Row] := Edit1.Text;
end;
...

Saludos :)

Caral 10-09-2012 00:16:08

Hola
Muy interesante amigo, pero esto si necesito verlo con mas detenimiento para entenderlo.
Gracias.
saludos


La franja horaria es GMT +2. Ahora son las 12:43:14.

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