PDA

Ver la Versión Completa : Comparar datos, numeros


Caral
09-09-2012, 22:02:36
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:

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: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:

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:


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:

While i < SGFact.RowCount do

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

While i < SGFact.RowCount-1 do

Fíjate en el código de ecfisa.

ecfisa
09-09-2012, 23:40:25
En principio, sin ningún delphi para probar, esto está mal:

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:

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:

...
// 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:

...
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