Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   delphi7 null into type integer (https://www.clubdelphi.com/foros/showthread.php?t=93917)

Saul Rivera 08-05-2019 18:34:31

delphi7 null into type integer
 
Hola tengo un problema al insertar datos a una tabla en sql los campos son enteros pero al momento de ingresar me tira un error que dice: could not Convert variant od type null into type integer.
Tengo 3 TcxLookupComboBox

1 = codigo de proveedor
2 = codigo de orden de trabajo
3 codigo de proyecto


entre el 2 y 3 hay una excepción si quiero agregar la orden de trabajo no agrego el codigo de proyecto y viceversa

pero se guardan esos 3 datos cuando hago el insert si me pueden ayudar con esto lo agradeceria


los 3 combobox estan asociados a un dataSourse y los dataSourse a un dataset


Saludos

mRoman 08-05-2019 22:00:09

Bueno yo lo que haría sería esto:

Deberías tener un "código de proyecto" igual a 0 con una descripción que dijera "Sin código de proyecto" o alguna otra descripción...(o ya lo tienes definido?), si no lo tienes definido, sería esta la solución. Cuando el valor de TcxLookUpComboBox, sea igual a 0, le envías este valor como parámetro al SQL y que lo almacene en tu base de datos.

(Seria mucho mejor si enviaras algo de código)

Algo así seria la idea....

Espero te sirva.

Saul Rivera 08-05-2019 22:42:17

mRoman gracias por responder, las tres lineas de otro color son las que tengo para capturar esos datos
este es el codigo de mi boton guardar
Código Delphi [-]
procedure TfrmRequisicion.ActSaveExecute(Sender: TObject);
begin

  try
    dmMain2.tblRequisicionHdr.FieldByName('USUARIO').AsString := Usuario;
    dmMain2.tblRequisicionHdr.FieldByName('POR_COBRAR').AsBoolean := ckPorCobrar.Checked;
    dmMain2.tblRequisicionHdr.Post;
  except
      on e: Exception do

      end;

  dnData.Buttons.Post.Click;
  dmMain2.muInsertarRequisicion.ParamByName('NUM_REQUISICION').AsInteger := dmMain2.tblRequisicionHdr.FieldByName('NUM_REQUISICION').AsInteger;
  dmMain2.muInsertarRequisicion.ParamByName('POR_COBRAR').AsBoolean := ckPorCobrar.Checked;
  dmMain2.muInsertarRequisicion.ParamByName('COD_PROVEEDOR').AsString := cblProveedores.EditValue;
  dmMain2.muInsertarRequisicion.ParamByName('NUM_OT_TRABAJO').AsInteger := cblOrdenTrabajo.EditValue;
  dmMain2.muInsertarRequisicion.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.EditValue;
  end;
  dmMain2.muInsertarRequisicion.Open;
  dmMain2.muInsertarRequisicion.Close;


  btnSave.Enabled := False;
  btnNew.Enabled := True;

  gbDatos.Enabled := False;
  dnData.Enabled := False;
  gvData.Enabled := False;
  DisplayReport(dmMain2.tblRequisicionHdr.FieldByName('NUM_REQUISICION').AsString);
  dmMain2.tblRequisicionHdr.Filtered := False;
end;
en mi dataset tengo este codigo para guardar esas lineas
Código SQL [-]
UPDATE  INV_REQUISICION_HDR 
SET POR_COBRAR = :POR_COBRAR, 
COD_PROVEEDOR = :COD_PROVEEDOR, 
NUM_OT_TRABAJO = :NUM_OT_TRABAJO, 
ID_PROYECTO = :ID_PROYECTO
WHERE NUM_REQUISICION = :NUM_REQUISICION

mRoman 09-05-2019 19:34:28

Que base de datos usas?
Como tienes definido tu campo? (NOT NULL)

Saul Rivera 09-05-2019 19:44:21

sql server

si permite null
porque puede llevar asignado o no esos campos al guardar la requisiscion

mRoman 09-05-2019 21:03:59

Bueno Saúl, mira no manejo SQL Server, soy mas de Firebird, pero considero puede aplicar para tu DBMS ya q jugaré un poco con la lógica a reserva de que alguien mas de una mejor opción.

Agregaría unos CheckBox en cada Combo, los cuales pudieran estar a un costado del Combo (TcxLookupComboBox) que me servirán para usarlos en un IF dentro de tu siguiente código:

Código Delphi [-]
 
  dnData.Buttons.Post.Click;
  dmMain2.muInsertarRequisicion.ParamByName('NUM_REQUISICION').AsInteger := 
  dmMain2.tblRequisicionHdr.FieldByName('NUM_REQUISICION').AsInteger;
  dmMain2.muInsertarRequisicion.ParamByName('POR_COBRAR').AsBoolean := ckPorCobrar.Checked;
  dmMain2.muInsertarRequisicion.ParamByName('COD_PROVEEDOR').AsString := cblProveedores.EditValue;
  if (cBoxOrdenTrab.Checked) and not(cBoxProyecto.Checked) then
  begin
        dmMain2.muInsertarRequisicion.ParamByName('NUM_OT_TRABAJO').AsInteger := cblOrdenTrabajo.EditValue;
        dmMain2.muInsertarRequisicion.ParamByName('ID_PROYECTO').AsInteger :=null; 
  end Else
  begin
       if not(cBoxOrdenTrab.Checked) and (cBoxProyecto.Checked) then
       begin
           dmMain2.muInsertarRequisicion.ParamByName('NUM_OT_TRABAJO').AsInteger :=null;
           dmMain2.muInsertarRequisicion.ParamByName('ID_PROYECTO').AsInteger:=cblProyectos.EditValue;
       end Else
       begin
            if (cBoxOrdenTrab.Checked) and (cBoxProyecto.Checked) then
           begin
                dmMain2.muInsertarRequisicion.ParamByName('NUM_OT_TRABAJO').AsInteger := cblOrdenTrabajo.EditValue;
                dmMain2.muInsertarRequisicion.ParamByName('ID_PROYECTO').AsInteger := cblProyectos.EditValue;
           end Else
           begin
                Application.MessageBox('Error, debes seleccionar una Orden de Trabajo o Proyecto','Aviso', mb_ok+mb_IconError);
           end; 
       end;
  end;
  dmMain2.muInsertarRequisicion.Open;
  dmMain2.muInsertarRequisicion.Close;

  btnSave.Enabled := False;
  btnNew.Enabled := True;

  gbDatos.Enabled := False;
  dnData.Enabled := False;
  gvData.Enabled := False;
  DisplayReport(dmMain2.tblRequisicionHdr.FieldByName('NUM_REQUISICION').AsString);
  dmMain2.tblRequisicionHdr.Filtered := False;


A este código le veo un problema...deberás encontrar la forma de que NO SE EJECUTE este código:
Código Delphi [-]
  dmMain2.muInsertarRequisicion.Open;
  dmMain2.muInsertarRequisicion.Close;

  btnSave.Enabled := False;
  btnNew.Enabled := True;

  gbDatos.Enabled := False;
  dnData.Enabled := False;
  gvData.Enabled := False;
  DisplayReport(dmMain2.tblRequisicionHdr.FieldByName('NUM_REQUISICION').AsString);
  dmMain2.tblRequisicionHdr.Filtered := False;

Cuando entre y se ejecute esta linea:
Código Delphi [-]
                Application.MessageBox('Error, debes seleccionar una Orden de Trabajo o Proyecto','Aviso', mb_ok+mb_IconError);

Ya que posterior a esta, se abrira/cerrara el DataSet y se ejecutara todo lo demás.
Código Delphi [-]
dmMain2.muInsertarRequisicion.Open;
dmMain2.muInsertarRequisicion.Close;

Bueno espero te sirva...lo hice sin tener Delphi a la mano. Ya nos dirás como te fue.

Saludos.


La franja horaria es GMT +2. Ahora son las 11:45:17.

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