Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ayuda con ciclo for que no se repite (https://www.clubdelphi.com/foros/showthread.php?t=70367)

microbiano 17-10-2010 06:05:53

ayuda con ciclo for que no se repite
 
planteo el problema.

resulta que tengo un StringGrid el cual hace la funcion de detalle de factura, bien pues resulta que cuando agrego un producto hago lo siguiente:
1. si el registro ya esta en el Tstringgrid tomo los valores y le sumo lo que el usuario introduce, en caso de no existeis busco ese registro en la base de datos y loa grego al TstringGrid.

el problema surge en que el ciclo for cuando busca el registro en el TstrigGrid no funciona alguien tiene una idea adjunto todo el codigo de cuando pierde el foco un Tedit.
Código Delphi [-]
procedure TFfactura.txtcodigoExit(Sender: TObject);
var wcodigobarras: string;
    wprecio_total:Double;
    wprecio_venta:Double;
    i:Integer;
    {variables para modificaciones}
   wcodigomodificar,wdescripcionmodificar:string;
   wcantidadmodificar,wventa_totalmodificada:Integer;
   wdescuentomodificar,wpreciomodificar:Double;
   wtotalmodificar:Double;
 begin
 wcodigobarras:=Trim(Ffactura.txtcodigo.Text);
 if wcodigobarras<>'' then
    begin
     //recorro todos los registros del Tstring grig
     //ESte form es el que solo se ejecuta una vez aunque el tString tenga 10 filas por ejemplo    
     For i:=1 to Ffactura.SGFact.RowCount-1 do
      begin
        if Ffactura.SGFact.Cells[0,i]= Trim(wcodigobarras) then
         begin
         {tomo los registros que existen en el flexgrid de acuerdo al registro que introdujeron}
          wcodigomodificar:=Ffactura.SGFact.Cells[0,i]; //codigo barras
          wdescripcionmodificar:=Ffactura.SGFact.Cells[1,i]; //descripcion
          wcantidadmodificar:=StrToInt(Ffactura.SGFact.Cells[2,i]); //cantidad venta
          wpreciomodificar:=wprecioventa;
          wdescuentomodificar:=StrToFloat(Ffactura.SGFact.Cells[4,i]);//descuento
          {valido la variable de cantidad para ver si es mayor a uno}
            if wcantidad_venta<>0 then
             begin
              Ffactura.SGFact.Cells[0,i]:=wcodigobarras;//codigobarras
              Ffactura.SGFact.Cells[1,i]:=wdescripcionmodificar;//descripcion
              wventa_totalmodificada:=wcantidadmodificar+wcantidad_venta;//suma cantidad
              Ffactura.SGFact.Cells[2,i]:=IntToStr(wventa_totalmodificada);//asigno cantidad a celda
              wprecio_total:=(wventa_totalmodificada*wprecioventa);//multiplico la cantidad por precio
              Ffactura.SGFact.Cells[5,i] := Format('%8.2f',[wprecio_total]);
              calcula_totales;
              wcantidad_venta:=0;
              Ffactura.txtcodigo.Text:='';
              Ffactura.txtcodigo.SetFocus;
              Exit;
             end
            else
             begin
              Ffactura.SGFact.Cells[0,i]:=wcodigobarras;//codigobarras
              Ffactura.SGFact.Cells[1,i]:=wdescripcionmodificar;//descripcion
              wventa_totalmodificada:=wcantidadmodificar+1;//suma cantidad
              Ffactura.SGFact.Cells[2,i]:=IntToStr(wventa_totalmodificada);//asigno cantidad a celda
              wprecio_total:=(wventa_totalmodificada*wprecioventa);//multiplico la cantidad por precio
              Ffactura.SGFact.Cells[5,i] := Format('%8.2f',[wprecio_total]);
              calcula_totales;
              wcantidad_venta:=0;
              Ffactura.txtcodigo.Text:='';
              Ffactura.txtcodigo.SetFocus;
              Exit;
             end;
          {termino la informacion proporcionada}        
        end 
        else {si no existe el registro en el flexgrid lo busco en la base de datos y lo agrego}
         begin
          //MessageDlg('agregando registros nuevos a la lista', mtError, [MBOK], 0);
          with fmodulo.Qry_Temp2 do
           begin
           Close;
           sql.clear;
           SQL.Add('select * from articulo');
           SQL.Add('where codigobarras=:Pcodigobarras');
           Parameters.ParamByName('pcodigobarras').Value:=Trim(wcodigobarras);
            try
            Open;
             if not Fmodulo.Qry_Temp2.IsEmpty then
              begin
              while not Fmodulo.Qry_Temp2.Eof do
               begin
               If Cuenta > 1 then SGFact.RowCount := SGFact.RowCount + 1;
                wprecioventa:=StrToFloat(FieldByname('precioventa').AsVariant);
                Ffactura.SGFact.Cells[0,cuenta] := Ffactura.txtcodigo.Text;
                Ffactura.SGFact.Cells[1,Cuenta]:=(FieldByname('nombre').AsString);
                {verifico cuantos productos asigno para la venta
                 y determino el importe total}
                if wcantidad_venta<>0 then
                 begin
                 Ffactura.SGFact.Cells[2,Cuenta]:=IntToStr(wcantidad_venta);
                 wprecio_total:=(wcantidad_venta*wprecioventa);
                 end
                else
                 begin
                  Ffactura.SGFact.Cells[2,Cuenta]:='1';
                   wcantidad_venta:=StrToInt(SGFact.Cells[2,cuenta]);
                   wprecio_total:=(wcantidad_venta*wprecioventa);
                 end;
                   wprecio_venta:=FieldByname('precioventa').AsFloat;
                   Ffactura.SGFact.Cells[3,Cuenta]:=Format('%8.2n',[wprecio_venta]);
                   wcantidad_venta:=StrToInt(SGFact.Cells[2,cuenta]);
                   SGFact.Cells[4,Cuenta]:='0.00';
                   //SGFact.Cells[5,Cuenta]:=Format('%8.2f',[wprecio_total]);
                   Ffactura.SGFact.Cells[5,Cuenta] := Format('%8.2f',[wprecio_total]);
                   Cuenta:=cuenta+1;
                   calcula_totales;
                   Next;
                   Ffactura.txtcodigo.Text:='';
                   Ffactura.txtcodigo.SetFocus;
                   {limpio la variable de venta}
                   wcantidad_venta:=0;
                   Exit;
               end;
              end
             else
             begin
               MessageDlg('Registro'+chr(13)+'No localizado', mtError, [MBOK], 0);
               Ffactura.txtcodigo.Text:='';
               Ffactura.txtcodigo.SetFocus;
               Exit;
             end;
            except
            on E:EOleException do
             begin
              MessageDlg(Format('Error: %s    Codigo: %d', [E.Message, E.ErrorCode]), mtError, [mbOK], 0);
             end;
            end;
           end;
         end;   
      end;
    end;
end;

Casimiro Noteví 17-10-2010 12:27:06

Código:

For i:=1 to Ffactura.SGFact.RowCount-1 do
¿Has puesto un punto de ruptura (break point) en esa línea y
has visto qué valor contiene RowCount?

microbiano 17-10-2010 14:36:34

hola casimiro buen dia, si valido cuanto vale Rowcount es decir valido que siempre tenga por lo menos 3 registro como lo hago voy ejecutando el programa paso a paso.

microbiano 17-10-2010 16:11:20

problema resuelto
 
pues bien despues de unas horas de desvelo y de unas cuantas llamadas de mi linda esposa a dormir he resuelto el problema, pongo el codigo por si algun dia le sirve.... gracias esposita por aguantarme jejejeje.


Código Delphi [-]
procedure TFfactura.txtcodigoExit(Sender: TObject);
var wcodigobarras: string;
    wprecio_total:Double;
    wprecio_venta:Double;
    i:Integer;
    {variables para modificaciones}
   wcodigomodificar,wdescripcionmodificar:string;
   wcantidadmodificar,wventa_totalmodificada:Integer;
   wdescuentomodificar,wpreciomodificar:Double;
   wtotalmodificar:Double;
 begin
 wcodigobarras:=Trim(Ffactura.txtcodigo.Text);
 Ffactura.txtcodigo.Text:='';
 if wcodigobarras<>'' then
    begin
     //recorro todos los registros del Tstring grig
     For i:=1 to Ffactura.SGFact.RowCount-1 do
      begin
        if Ffactura.SGFact.Cells[0,i]= Trim(wcodigobarras) then
         begin
         {tomo los registros que existen en el flexgrid de acuerdo al registro que introdujeron}
          wcodigomodificar:=Ffactura.SGFact.Cells[0,i]; //codigo barras
          wdescripcionmodificar:=Ffactura.SGFact.Cells[1,i]; //descripcion
          wcantidadmodificar:=StrToInt(Ffactura.SGFact.Cells[2,i]); //cantidad venta
          wpreciomodificar:=wprecioventa;
          wdescuentomodificar:=StrToFloat(Ffactura.SGFact.Cells[4,i]);//descuento
          {valido la variable de cantidad para ver si es mayor a uno}
            if wcantidad_venta<>0 then
             begin
              Ffactura.SGFact.Cells[0,i]:=wcodigobarras;//codigobarras
              Ffactura.SGFact.Cells[1,i]:=wdescripcionmodificar;//descripcion
              wventa_totalmodificada:=wcantidadmodificar+wcantidad_venta;//suma cantidad
              Ffactura.SGFact.Cells[2,i]:=IntToStr(wventa_totalmodificada);//asigno cantidad a celda
              wprecio_total:=(wventa_totalmodificada*wprecioventa);//multiplico la cantidad por precio
              Ffactura.SGFact.Cells[5,i] := Format('%8.2f',[wprecio_total]);
              calcula_totales;
              wcantidad_venta:=0;
              Ffactura.txtcodigo.SetFocus;
              wcodigobarras:='';
              Exit;
             end
            else
             begin
              Ffactura.SGFact.Cells[0,i]:=wcodigobarras;//codigobarras
              Ffactura.SGFact.Cells[1,i]:=wdescripcionmodificar;//descripcion
              wventa_totalmodificada:=wcantidadmodificar+1;//suma cantidad
              Ffactura.SGFact.Cells[2,i]:=IntToStr(wventa_totalmodificada);//asigno cantidad a celda
              wprecio_total:=(wventa_totalmodificada*wprecioventa);//multiplico la cantidad por precio
              Ffactura.SGFact.Cells[5,i] := Format('%8.2f',[wprecio_total]);
              calcula_totales;
              wcantidad_venta:=0;
              Ffactura.txtcodigo.SetFocus;
              wcodigobarras:='';
              Exit;
             end;
          {termino la informacion proporcionada}
        end;
      end;
    end;
   {si no encuentra el registro en el TStringGrid lo agrego}
  if wcodigobarras<>'' then
   begin
    with fmodulo.Qry_Temp2 do
     begin
      Close;
      sql.clear;
      SQL.Add('select * from articulo');
      SQL.Add('where codigobarras=:Pcodigobarras');
      Parameters.ParamByName('pcodigobarras').Value:=Trim(wcodigobarras);
       try
        Open;
         if not Fmodulo.Qry_Temp2.IsEmpty then
          begin
           while not Fmodulo.Qry_Temp2.Eof do
            begin
             If Cuenta > 1 then SGFact.RowCount := SGFact.RowCount + 1;
              wprecioventa:=StrToFloat(FieldByname('precioventa').AsVariant);
              Ffactura.SGFact.Cells[0,cuenta] := wcodigobarras;
              Ffactura.SGFact.Cells[1,Cuenta]:=(FieldByname('nombre').AsString);
              {verifico cuantos productos asigno para la venta
                 y determino el importe total}
              if wcantidad_venta<>0 then
               begin
                Ffactura.SGFact.Cells[2,Cuenta]:=IntToStr(wcantidad_venta);
                wprecio_total:=(wcantidad_venta*wprecioventa);
               end
              else
               begin
                Ffactura.SGFact.Cells[2,Cuenta]:='1';
                wcantidad_venta:=StrToInt(SGFact.Cells[2,cuenta]);
                wprecio_total:=(wcantidad_venta*wprecioventa);
               end;
               wprecio_venta:=FieldByname('precioventa').AsFloat;
               Ffactura.SGFact.Cells[3,Cuenta]:=Format('%8.2n',[wprecio_venta]);
               wcantidad_venta:=StrToInt(SGFact.Cells[2,cuenta]);
               SGFact.Cells[4,Cuenta]:='0.00';
               //SGFact.Cells[5,Cuenta]:=Format('%8.2f',[wprecio_total]);
               Ffactura.SGFact.Cells[5,Cuenta] := Format('%8.2f',[wprecio_total]);
               Cuenta:=cuenta+1;
               calcula_totales;
               Next;
               Ffactura.txtcodigo.SetFocus;
               {limpio la variable de venta}
               wcodigobarras:='';
               wcantidad_venta:=0;
               Exit;
            end;
          end
         else
          begin
           MessageDlg('Registro'+chr(13)+'No localizado', mtError, [MBOK], 0);
           Ffactura.txtcodigo.Text:='';
           Ffactura.txtcodigo.SetFocus;
           Exit;
          end;
       except
        on E:EOleException do
         begin
          MessageDlg(Format('Error: %s    Codigo: %d', [E.Message, E.ErrorCode]), mtError, [mbOK], 0);
         end;
       end;
     end;
   end;
 end;

Aveces creo que mi esposa tiene razon, jejeje prefiero a mi amante(PC) que a ella, segun ella esta viendo quien se queda conmigo pero creo que ya elegi jajajaja

cloayza 18-10-2010 02:58:56

Amigo creo que podrias ahorrarte algunas lines haciendo lo siguiente:

:D
Código Delphi [-]
 //recorro todos los registros del Tstring grig
     For i:=1 to Ffactura.SGFact.RowCount-1 do
      begin
        if Ffactura.SGFact.Cells[0,i]= Trim(wcodigobarras) then
        begin
             {tomo los registros que existen en el flexgrid de acuerdo al registro que introdujeron}
             wcodigomodificar:=Ffactura.SGFact.Cells[0,i]; //codigo barras
             wdescripcionmodificar:=Ffactura.SGFact.Cells[1,i]; //descripcion
             wcantidadmodificar:=StrToInt(Ffactura.SGFact.Cells[2,i]); //cantidad venta
             wpreciomodificar:=wprecioventa;
             wdescuentomodificar:=StrToFloat(Ffactura.SGFact.Cells[4,i]);//descuento
             {valido la variable de cantidad para ver si es mayor a uno}

             Ffactura.SGFact.Cells[0,i]  :=wcodigobarras;//codigobarras
               Ffactura.SGFact.Cells[1,i]:=wdescripcionmodificar;//descripcion

             if wcantidad_venta<>0 then
               wventa_totalmodificada:=wcantidadmodificar+wcantidad_venta
             else
               wventa_totalmodificada:=wcantidadmodificar+1;

             Ffactura.SGFact.Cells[2,i]:=IntToStr(wventa_totalmodificada);//asigno cantidad a celda
             wprecio_total:=(wventa_totalmodificada*wprecioventa);//multiplico la cantidad por precio
             Ffactura.SGFact.Cells[5,i] := Format('%8.2f',[wprecio_total]);
             calcula_totales;
             wcantidad_venta:=0;
             Ffactura.txtcodigo.SetFocus;
             wcodigobarras:='';
             Exit;

          {termino la informacion proporcionada}
        end;
      end;
    end;

Saludos

microbiano 18-10-2010 16:57:09

ok gracias lo considerare, pero aunque parezca absurdo, creo que es mania de venir de visual Basic jejeje.

BlueSteel 18-10-2010 17:20:49

Hola Microbiano...

Hace tiempo yo tube que realizar un proceso similar... y utilice los StringGrid para ingresar temporalmente los detalles de las Facturas / Orden de Compra y otros documentos similares.... Mi problema era que cuando el usuario queria eliminar una o modificar un producto me generaba algun error... aunque no era siempre....

Para solucionar eso lo que hice fue utilizar el componente JvMemoryData de la Jedi... que basicamente es una tabla de memoria temporal y es muy sencilla de utilizar...

Si quieres te dejo algunos ejemplos

Salu2:p:D


La franja horaria es GMT +2. Ahora son las 08:44:45.

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