PDA

Ver la Versión Completa : Crear un campo nuevo en una tabla?


JavierO
06-09-2005, 23:57:05
Hola a todos:

Mi situación es la siguiente.....

Como puedo crear un nuevo campo para una tabla, es decir no debe estar el campo fisicamente en la tabla dentro de la base de datos, mi campo se debe llamar lw_origen_servicio

Bueno primero lo intente creandolo de tipo fkCalculated, pero no me guarda los valores que le habia asignadopara cada registro. para despues utilizarlos en una comparacion en otro proceso, ya que me aparece en null.

Ya intente cambiando el fkcalculated y utilizando fkInternalCalc, pero no me deja dice que el campo lw_origen_servicio es desconocido.

Saludos y gracias de antemano.

P.D. estoy utilizando D6 y Access 2000

marcoszorrilla
07-09-2005, 07:18:06
Pues tiene que funcionarte con un campo calculado, pero debes de explicar más como piensas utilizarlo incluso poner algo de código para ver si alguien puede orientarte

Un Saludo.

JavierO
07-09-2005, 18:15:36
yo lo que entiendo es, que los campos calculados solo se asignan en el evento OnCalc, pero yo no lo puedo hacer alli por que para poder asignarle el valor se tienen que cumplir una serie de validaciones, y ese campo solo lo necesito para que me guarde un valor para posterirmente compararlo, no debo ni mistrarlo al usuario solo me va a servir para ver si un registro ya existe no lo vuelva a crear.



procedure Tsilfpr0002.PPR0002_INCLUYE_DORE_GENERAL();
begin
Q_Cursor.Close;
Q_Cursor.SQL.Clear;
Q_Cursor.SQL.Add(' SELECT ampp_prov_numero, ampp_mtpr_clave, SUM(ampp_cantidad) AS ampp_cant, SUM(ampp_centimetros_cubicos) AS ampp_cc ');
Q_Cursor.SQL.Add(' FROM sil_ajustes_mp_pedido ');
Q_Cursor.SQL.Add(' WHERE ampp_plan_clave = :gw_plan_clave_prod ');
Q_Cursor.SQL.Add(' AND ampp_ctmn_fecha = (SELECT MAX(ctmn_fecha) ');
Q_Cursor.SQL.Add(' FROM sil_contaminacion ');
Q_Cursor.SQL.Add(' WHERE ctmn_plan_clave = ampp_plan_clave ');
Q_Cursor.SQL.Add(' AND FORMAT(ctmn_fecha,''dd/mm/yyyy'') = :lw_fecha_operacion) ');
Q_Cursor.SQL.Add(' AND IIF(ISNULL(ampp_pedi_serie),:sil_pedi_pedi_serie,ampp_pedi_serie) = :sil_pedi_pedi_serie ');
Q_Cursor.SQL.Add(' AND IIF(ISNULL(ampp_pedi_numero),:sil_pedi_pedi_numero,ampp_pedi_numero) = :sil_pedi_pedi_numero ');
Q_Cursor.SQL.Add(' GROUP BY ampp_prov_numero, ampp_mtpr_clave ');
Q_Cursor.ParamByName('lw_fecha_operacion').Value := lw_fecha_operacion;
Q_Cursor.ParamByName('sil_pedi_pedi_serie').Value := T_PEDI.FieldValues['pedi_serie'];
Q_Cursor.ParamByName('sil_pedi_pedi_numero').Value := T_PEDI.FieldValues['pedi_numero'];
Q_Cursor.ParamByName('gw_plan_clave_prod').Value := gw_plan_clave;
Q_Cursor.Prepare;
Q_Cursor.Open;
while not Q_Cursor.Eof do
begin
...

if not(VarIsNull(lw_prov_numero)) or (lw_prov_numero <> '') then
begin
T_DORE_SD.First;
while not(T_DORE_SD.Eof) and
((T_DORE_SD.FieldByName('dore_origen_dosificacion').Value <> 'S') or
(T_DORE_SD.FieldByName('lw_origen_servicio').Value <> 'P') or
(T_DORE_SD.FieldByName('dore_mtpr_clave').Value <> Q_Cursor.FieldByName('plsm_mtpr_clave').Value) or
(T_DORE_SD.FieldByName('dore_prov_numero').Value <> lw_prov_numero)) do
begin
T_DORE_SD.Next;
end;
if (T_DORE_SD.FieldByName('dore_origen_dosificacion').Value = 'S') and
(T_DORE_SD.FieldByName('lw_origen_servicio').Value = 'P') and
(T_DORE_SD.FieldByName('dore_mtpr_clave').Value = Q_Cursor.FieldByName('plsm_mtpr_clave').Value) and
(T_DORE_SD.FieldByName('dore_prov_numero').Value = lw_prov_numero) then
begin
if (T_DORE_SD.FieldByName('dore_cant_sobre_dosificacion').Value <> lw_cantidad) then
begin
T_DORE_SD.Edit;
T_DORE_SD.FieldByName('dore_cant_sobre_dosificacio').Value := lw_cantidad;
end;
end
else
begin
if not(T_DORE_SD.FieldByName('dore_mtpr_clave').IsNull) then
begin
T_DORE_SD.Append; //CREATE_RECORD;
end;
T_DORE_SD.Append;
T_DORE_SD.FieldByName('dore_origen_dosificacion').Value := 'S';
T_DORE_SD.FieldByName('dore_mtpr_clave').Value := Q_Cursor.FieldValues['plsm_mtpr_clave'];
T_DORE_SD.FieldByName('dore_prov_numero').Value := lw_prov_numero;
T_DORE_SD.FieldByName('dore_cant_sobre_dosificacion').Value := lw_cantidad;
T_DORE_SD.FieldByName('dore_tipo_dosificacion').Value := Q_Cursor.FieldValues['plsm_tipo_dosificacion'];
T_DORE_SD.FieldByName('lw_origen_servicio').Value := 'P';
// Asignacion de valores basicos
T_DORE_SD.FieldByName('dore_mtpr_clave').Value := Q_Cursor.FieldValues['plsm_mtpr_clave'];
T_DORE_SD.FieldByName('dore_numero').Value := T_DORE_SD.RecordCount + 1;
T_DORE_SD.FieldByName('dore_usuario_creo').Value := gw_usuario;
T_DORE_SD.FieldByName('dore_fecha_creo').Value := now;
end;
end;
end;

...

Q_Cursor.Next;
end;
Q_Cursor.Close;
lwct_lw_incluye_dore_general := 'N';
end;

ContraVeneno
07-09-2005, 23:20:51
Otra forma de evitar que se dupliquen registros, es definiendo una llave con valores únicos. En caso de que el dato se duplique, el prorama generaría una excepción que puedes manejar a tu antojo.

JavierO
08-09-2005, 01:10:31
creo que me explique mal no es que valide que si existe no lo duplique....


si no que si ya existe,o lo tengo en el grid solo le cambie la cantidad...es decir en base a una formula que me va a dar ciertos parametros y aparte de algunos requerimientos manuales que haya solicitado el cliente para cierto pedido... entonces se proporciona la cantidad que va a producir y me genera en automatico algunos detalles(registros) con ciertas cantidades en un dbgrid, pero al cliente se le ocurre cambiar la cantidad que va a producir entonces se tiene que volver a recalcular toda la información, cambiando los registros que se generaron en forma automática y dejando la informacion manual que introdujo el cliente.

nuk3zito
28-12-2005, 00:11:58
Entonces no necesitas un campo calculado.
Crea un campo normal, pero accesa a él mediante Edit y Post, de otra forma, el campo calculado siempre será regido por ciertos eventos y con Edit y Post tu decides donde y cuando modificarlo.
Podrías modificar tu nuevo campo en el evento BeforePost, te servirá mucho ese evento para este caso.