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)
-   -   campos calculados (https://www.clubdelphi.com/foros/showthread.php?t=35822)

ercrizeporta 21-09-2006 17:13:55

campos calculados
 
hola, vuelvo de nuevo al mismo tema que expuse hace tiempo.
tngo una tabla que me almacena las lineas de pedidos,tiene los campos cant,pvp, codigoarticulo....el campo total (cant x pvp) lo he creado como un campo calculado. la clave primaria de esta tabla esta compuesta por dos campos (numerodelinea y numerodefactura).
El procedimiento para realizar el calculo de la columna calculada lo he puesto en el evento oncalculatefields. Y es ahora cuanod llega el problema, a la hora de insertar un registro en la tabla, justo despues de haber insertado el campo numerodefactura y antes de haber insertado el numerodelinea el programa me da un error diciendo que el Tdataset no esta en modo de edicion o inserción de datos. NO TENGO NI IDEA DE COMO ARREGLAR ESTO!!!POR FAVOR UNA AYUDA!!!

codigo
Código Delphi [-]
if (not tblinauxcant.isnull) and
     (not tblinauxpvp.isnull)then
   begin
    if tblinauxdto.IsNull then
     begin
        totallin:=
           tblinaux['cant']*tblinaux['pvp'];
     end
    else
     begin
        totallin:=
           tblinaux['cant']*tblinaux['pvp']*(100-tblinaux['dto'])/100;
    end;
     modulodatos.tblinaux.edit;
     modulodatos.tblinaux['total'].asfloat:=totallin;
  end;
   //AHORA CALCULO EL TOTAL DE TODAS LAS LINEAS
  total:=0;
  if (not modulodatos.tblinaux2.IsEmpty) then
    begin
      tblinaux2.First;
  end;
  while (not tblinaux2.Eof) do
    begin
       if (not tblinaux2cant.isnull) and
          (not tblinaux2pvp.isnull)then
        begin
          if tblinaux2dto.IsNull then
           begin
             totallinea:=
             tblinaux2['cant']*tblinaux2['pvp'];
           end
       else
        begin
          totallinea:=
          tblinaux['cant']*tblinaux['pvp']*(100-tblinaux['dto'])/100;
        end;
       end;
       total:=total+totallinea;
       tblinaux2.Next;
    end; //end while
    //guardo el total en la tabla auxiliar
    modulodatos.tbauxiliar.edit;
    tbAuxiliarneto.AsFloat:=total;
    modulodatos.tbauxiliar.post;
end;

reina 21-09-2006 21:36:06

Hola! estee...donde tenes puesto el edit..de "tbAuxiliarneto" ? Ademas como te compila eso si algunas de las tablas les referencias el "modulodatos" y a otros no? tenes algun with arriba? o acaso esto lo haces del md? :rolleyes:
Te transcribo las ultima 3 ultimas lineas de tu codigo:

modulodatos.tbauxiliar.edit;
tbAuxiliarneto.AsFloat:=total;
modulodatos.tbauxiliar.post;

Revisa bien el codigo..o corregime si estoy equivocada, salu2

aledieb 21-09-2006 22:27:52

Si entendi bien el código el problema lo tenes cuando asignas el calculo del total general:

Código:

    modulodatos.tbauxiliar.edit;
    tbAuxiliarneto.AsFloat:=total;
    modulodatos.tbauxiliar.post;

Deberia ser:
Código:

    modulodatos.tbauxiliar.edit;
    modulodatos.tbAuxiliarneto.AsFloat:=total;
    modulodatos.tbauxiliar.post;

También te recomiendo que rebices el resto del código, normalmente daria error por el mismo tema tal como te dijo reina

ercrizeporta 22-09-2006 01:22:01

no tiene importancia eso k me comentais, ya que el codigo esta en el modulodatos, asi que puedo llamar a esa tabla tanto poniendo modulodatos como sin ponerlo, por eso no hay problema. y no hay ningún fallo de compilación. El codigo expuesto es el que se encuentra en el evento oncalculatefields, y el error que me da es en ejecución cuando intento introducir una nueva linea despues de introducir el primer campo y acceder a este procedimiento (ya que se modifica la linea) me dice que el dataset no se encuentra ni en edit ni en insert y no me deja introducir la linea completamente.

espero haberme explicado bien, muchas gracias!!

reina 22-09-2006 02:10:56

Cita:

Empezado por ercrizeporta
no tiene importancia eso k me comentais, ya que el codigo esta en el modulodatos, asi que puedo llamar a esa tabla tanto poniendo modulodatos como sin ponerlo, por eso no hay problema. y no hay ningún fallo de compilación. El codigo expuesto es el que se encuentra en el evento oncalculatefields, y el error que me da es en ejecución cuando intento introducir una nueva linea despues de introducir el primer campo y acceder a este procedimiento (ya que se modifica la linea) me dice que el dataset no se encuentra ni en edit ni en insert y no me deja introducir la linea completamente.

espero haberme explicado bien, muchas gracias!!

Ahhhhh que bolu! claro neto es el campo jejeje..me perdi ahi! Bueno mira recomendacion tenes que tener mas prolijo el codigo porque es mejor para la coreccion, te beneficia!
Otra cosa vos en otro lado haces un insert? trabajas con transacciones? porque por ahi si asentas los datos se te cierra todas las tablas..y tenes que volver abrirlas, debugeaste el codigo? en que punto se te planta? porque ahi hablas del procedimiento y no de la linea donde da el error, es en post?...... Ademas para que tanto barullo con ese evento si lo puedes hacer mejor desde otro lugar del programa...:D

aledieb 25-09-2006 22:10:53

Para mi el error lo tenes porque no son campos calculados, son campos de la tabla, proba poniendo todo el código en beforepost.

Los campos calculados, para mi, son los que creas en el componente ttable o tquery para casos especiales (en fieldsdefs, creo que es el nombre correcto).

MaMu 10-06-2007 17:52:28

Problema con Campo Calculado
 
............

kuan-yiu 11-06-2007 10:51:29

Yo no suelo usar tablas pero creo que tendrás que hacer algo parecido a lo que se les hace a las querys para que puedas modificarlas.
En las querys debes poner el parámetro "RequestLive" a true, también es conveniente poner "CachedUpdates" a true. Además hay que asociar a la query un UpdateObject para que sepa cómo hacer las inserciones, modificaciones y borrados.

De todos modos si usas la búsqueda del foro encontrarás varios hilos en los que se habla de este tema, como por ejemplo:
Problemas al insertar en una tabla


La franja horaria es GMT +2. Ahora son las 04:55:02.

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