Hola amigos del Foro. Ahora solicitando su ayuda para analizar un código:
Uso: Delphi6, Firebird 2.0, IBX.
Explico:
Tengo un formulario para REGISTRAR datos con el concepto Maestro-Detalle. Les envío el código que estoy tratando de que funcione, pero marca el siguiente error:
Cita:
Project Archivo.exe raised exception class EDatabaseError with message 'Field 'LECHER' must have a value'. Process stopped. Use Step or Run to continue.
|
Entiendo lo q me dice...al campo LECHER le falta el dato ya que es parte de la clave primaria y no le esta llegando. Por cierto les comento los campos de la llave primaria de ambos tablas (MAestro y Detalle)
MAESTRO:
m_Lecher numeric(10)
m_mes numeric(2)
m_anio numeric(4)
DETALLE
m_Lecher numeric(10)
m_mes numeric(2)
m_anio numeric(4)
d_pbl_tipo numeric(3)
d_pbl_causa numeric(3)
Este error me lo muestra al dar click sobre el boton "btnAgregar" (Evento OnClick)
Código Delphi
[-]procedure TfrmPBLCaptura.btnAgregarClick(Sender: TObject);
begin
btnGuardar.Enabled:=True;
RegNuevo:=1;
dsPBLDetalle.Append;
dsPBLDetalle.FieldByName('LECHER').AsString:=edLecheria.Text;
dsPBLDetalle.FieldByName('pbl_mes').AsInteger:=cbxMes.ItemIndex+1;
dsPBLDetalle.FieldByName('pbl_anio').AsString:=mskAnio.Text;
dsPBLDetalle.FieldByName('id_pbl_tipo').AsInteger:=cbxTipoPBL.KeyValue;
dsPBLDetalle.FieldByName('id_pbl_causa').AsInteger:=cbxCausasPBL.KeyValue;
dsPBLDetalle.FieldByName('pbl_det_dias').AsString:=edDias.Text;
dsPBLDetalle.FieldByName('pbl_det_diferencia').AsString:=edDiferencia.Text;
dsPBLDetalle.Post;
AbrirDetalleGrid(Sender);
cbxTipoPBL.SetFocus;
end;
Exactamente en la linea del dsPBLDetalle.Append es donde marca el error....algo estoy haciendo mal.
Detalles de los componentes: Tengo 2 DataSet (dsPBLMaestro y dsPBLDetalle), en el detalle tengo enlazado en su propiedad DataSource el TDataSource que tiene el Maestro, por lo tanto según lo he consultado, para grabar el registro (si todo esta bien), lo hago de esta manera:
Código Delphi
[-]procedure TfrmPBLCaptura.btnGuardarClick(Sender: TObject);
begin
try
dsPBLDetalle.DataSource:=nil;
ModDatos.dbFluida.ApplyUpdates( [dsPBLMaestro, dsPBLDetalle] );
dsPBLDetalle.DataSource:=dSoPBLMaestro;
ModDatos.trsFluida.CommitRetaining;
except
on E: Exception do
begin
Application.MessageBox('El o los registros no pueden ser grabados en este momento, probablemente el registro que estas consultando esta siendo editado por otro usuario','Error', mb_ok+mb_IconError);
ShowMessage(E.Message);
ModDatos.trsFluida.RollbackRetaining;
end;
end;
mskAnio.SetFocus;
end;
Primeramente lo que hago es llenar EL MAESTRO, q cuando doy click sobre el botón (btnRegistrarDetalle) hace esto:
Código Delphi
[-]procedure TfrmPBLCaptura.btnRegistrarDetalleClick(Sender: TObject);
begin
if sBtnPresionado>0 then
begin
btnRegistrarDetalle.Enabled:=False;
dsPBLMaestro.FieldByName('id_origen_reporte').AsInteger:=sBtnPresionado;
dsPBLMaestro.Post;
AbrirTipoPBL_y_Causas(Sender); btnAgregar.Enabled:=True;
end Else
begin
Application.MessageBox('Debes seleccionar un ORIGEN DE REPORTE','Advertencia',mb_Ok+mb_IconExclamation);
end;
end;
Posteriormente lleno los campos para el detalle y doy click sobre el botón "btnAgregar" y hace esto en su evento OnClick:
Código Delphi
[-]procedure TfrmPBLCaptura.btnAgregarClick(Sender: TObject);
begin
btnGuardar.Enabled:=True;
RegNuevo:=1;
dsPBLDetalle.Append; dsPBLDetalle.FieldByName('LECHER').AsString:=edLecheria.Text;
dsPBLDetalle.FieldByName('pbl_mes').AsInteger:=cbxMes.ItemIndex+1;
dsPBLDetalle.FieldByName('pbl_anio').AsString:=mskAnio.Text;
dsPBLDetalle.FieldByName('id_pbl_tipo').AsInteger:=cbxTipoPBL.KeyValue;
dsPBLDetalle.FieldByName('id_pbl_causa').AsInteger:=cbxCausasPBL.KeyValue;
dsPBLDetalle.FieldByName('pbl_det_dias').AsString:=edDias.Text;
dsPBLDetalle.FieldByName('pbl_det_diferencia').AsString:=edDiferencia.Text;
dsPBLDetalle.Post;
AbrirDetalleGrid(Sender);
cbxTipoPBL.SetFocus;
end;
No sé donde me estoy equivocando...agradecere mucho alguien q me ayude a localizar lo q tengo mal??...
CÓDIGO COMPLETO:
Código Delphi
[-]unit pblCaptura;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, ExtCtrls, ComCtrls, Buttons, DBCtrls, Grids,
DBGrids, DB, IBCustomDataSet, IBQuery, Provider, DBClient, DBLocal,
DBLocalI;
type
TfrmPBLCaptura = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
cbxMes: TComboBox;
mskAnio: TMaskEdit;
Label3: TLabel;
edLecheria: TEdit;
Panel2: TPanel;
Panel11: TPanel;
dsPBLMaestro: TIBDataSet;
dsPBLDetalle: TIBDataSet;
dSoPBLMaestro: TDataSource;
dSoPBLDetalle: TDataSource;
qryCausas: TIBQuery;
qryConsultarLech: TIBQuery;
dSoConsultarLech: TDataSource;
qryLocal: TIBQuery;
dSoLocal: TDataSource;
Panel13: TPanel;
GroupBox1: TGroupBox;
sBtnBeneficiarios: TSpeedButton;
sBtnEncargado: TSpeedButton;
sBtnPromotor: TSpeedButton;
sBtnDiconsa: TSpeedButton;
sBtnOtroOrigen: TSpeedButton;
GroupBox2: TGroupBox;
DBMemo1: TDBMemo;
btnRegistrarDetalle: TBitBtn;
dSoTipoPBL: TDataSource;
qryTipoPBL: TIBQuery;
Panel4: TPanel;
Label4: TLabel;
Label5: TLabel;
cbxTipoPBL: TDBLookupComboBox;
cbxCausasPBL: TDBLookupComboBox;
dSoCausas: TDataSource;
btnGuardar: TBitBtn;
qryTipoPBLID_PBL_TIPO: TSmallintField;
qryTipoPBLPBL_TIPO_DESCRIPCION: TIBStringField;
qryDetalleRegsGrid: TIBQuery;
dSoDetalleRegsGrid: TDataSource;
qryCausasID_PBL_TIPO: TSmallintField;
qryCausasID_PBL_CAUSA: TSmallintField;
qryCausasPBL_CAUSA_DESCRIP_CORTA: TIBStringField;
qryCausasPBL_CAUSA_DESCRIP_LARGA: TMemoField;
qryInventarios: TIBQuery;
qryInventariosVENTA_INVENTARIOS: TIntegerField;
qryInventariosVTA_LIBRO: TIntegerField;
dSoInvenarios: TDataSource;
qryInventariosDIFER: TLargeintField;
IBClientDataSet1: TIBClientDataSet;
Panel3: TPanel;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
pnlDesabasto: TPanel;
Label6: TLabel;
edDias: TEdit;
pnlLlenado: TPanel;
GroupBox4: TGroupBox;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
edDiferencia: TEdit;
TabSheet2: TTabSheet;
DBGrid1: TDBGrid;
Panel5: TPanel;
GroupBox3: TGroupBox;
DBMemo2: TDBMemo;
btnAgregar: TBitBtn;
btnEliminar: TBitBtn;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure sBtnBeneficiariosClick(Sender: TObject);
procedure sBtnEncargadoClick(Sender: TObject);
procedure sBtnPromotorClick(Sender: TObject);
procedure sBtnDiconsaClick(Sender: TObject);
procedure sBtnOtroOrigenClick(Sender: TObject);
procedure cbxOperacionCloseUp(Sender: TObject);
procedure AbrirCausas(Sender: TObject);
procedure cbxOperacionChange(Sender: TObject);
procedure Panel1Enter(Sender: TObject);
procedure Panel1Exit(Sender: TObject);
procedure btnRegistrarDetalleClick(Sender: TObject);
procedure cbxTipoPBLExit(Sender: TObject);
procedure cbxTipoPBLCloseUp(Sender: TObject);
procedure AbrirTipoPBL_y_Causas(Sender: TObject);
procedure btnAgregarClick(Sender: TObject);
procedure btnGuardarClick(Sender: TObject);
procedure AbrirDetalleGrid(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure LimpiarCampos(Sender: TOBject);
procedure OcultarPaneles(Sender: TObject);
procedure Panel4Enter(Sender: TObject);
procedure edLecheriaExit(Sender: TObject);
procedure AbrirDetalle(Sender: TObject);
procedure pnlLlenadoEnter(Sender: TObject);
procedure DBGrid1CellClick(Column: TColumn);
procedure btnEliminarClick(Sender: TObject);
private
public
nTag,sBtnPresionado,RegNuevo:integer;
end;
var
frmPBLCaptura: TfrmPBLCaptura;
implementation
uses ModuloDatos,pblProblematicas;
{$R *.dfm}
procedure TfrmPBLCaptura.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
frmPBL.FormShow(Sender);
Action:=caFree;
end;
procedure TfrmPBLCaptura.sBtnBeneficiariosClick(Sender: TObject);
begin
GRoupBox1.Caption:='Origen del Reporte: BENEFICIARIOS';
sBtnPresionado:=1;
end;
procedure TfrmPBLCaptura.sBtnEncargadoClick(Sender: TObject);
begin
GRoupBox1.Caption:='Origen del Reporte: ENCARGADO DE TIENDA';
sBtnPresionado:=2;
end;
procedure TfrmPBLCaptura.sBtnPromotorClick(Sender: TObject);
begin
GRoupBox1.Caption:='Origen del Reporte: PROMOTOR SOCIAL';
sBtnPresionado:=3;
end;
procedure TfrmPBLCaptura.sBtnDiconsaClick(Sender: TObject);
begin
GRoupBox1.Caption:='Origen del Reporte: PERSONAL DE DICONSA';
sBtnPresionado:=4;
end;
procedure TfrmPBLCaptura.sBtnOtroOrigenClick(Sender: TObject);
begin
GRoupBox1.Caption:='Origen del Reporte: OTRO';
sBtnPresionado:=5;
end;
procedure TfrmPBLCaptura.cbxOperacionCloseUp(Sender: TObject);
begin
end;
procedure TfrmPBLCaptura.AbrirCausas(Sender: TObject);
begin
qryCausas.Close;
qryCausas.ParamByName('id_pbl').AsInteger:=nTag;
qryCausas.Open;
qryCausas.First;
end;
procedure TfrmPBLCaptura.cbxOperacionChange(Sender: TObject);
begin
cbxOperacionCloseUp(Sender);
end;
procedure TfrmPBLCaptura.Panel1Enter(Sender: TObject);
begin
ModDatos.trsFluida.Active:=False;
ModDatos.trsFluida.StartTransaction;
LimpiarCampos(Sender);
OcultarPaneles(Sender);
RegNuevo:=0;
btnGuardar.Enabled:=False;
btnAgregar.Enabled:=False;
btnEliminar.Enabled:=False;
PageControl1.ActivePageIndex:=0;
qryTipoPBL.Close;
qryCausas.Close;
qryConsultarLech.Close;
dsPBLMaestro.Close;
dsPBLDetalle.Close;
sBtnPresionado:=0;
sBtnBeneficiarios.Enabled:=False;
sBtnEncargado.Enabled:=False;
sBtnPromotor.Enabled:=False;
sBtnDiconsa.Enabled:=False;
sBtnOtroOrigen.Enabled:=False;
sBtnBeneficiarios.Down:=False;
sBtnEncargado.Down:=False;
sBtnPromotor.Down:=False;
sBtnDiconsa.Down:=False;
sBtnOtroOrigen.Down:=False;
btnRegistrarDetalle.Enabled:=False;
end;
procedure TfrmPBLCaptura.Panel1Exit(Sender: TObject);
begin
if not( (mskAnio.Text='') or (cbxMes.Items.Text='') or (edLecheria.Text='') ) then
begin
sBtnBeneficiarios.Enabled:=True;
sBtnEncargado.Enabled:=True;
sBtnPromotor.Enabled:=True;
sBtnDiconsa.Enabled:=True;
sBtnOtroOrigen.Enabled:=True;
btnRegistrarDetalle.Enabled:=True;
dsPBLMaestro.Close;
dsPBLMaestro.ParamByName('anio').AsString:=mskAnio.Text;
dsPBLMaestro.ParamByName('mes').AsInteger:=cbxMes.ItemIndex+1;
dsPBLMaestro.ParamByName('lecher').AsString:=edLecheria.Text;
dsPBLMaestro.Open;
if dsPBLMaestro.IsEmpty then
begin
dsPBLMaestro.Append;
dsPBLMaestro.FieldByName('lecher').AsString:=edLecheria.Text;
dsPBLMaestro.FieldByName('pbl_anio').AsString:=mskAnio.Text;
dsPBLMaestro.FieldByName('pbl_mes').AsInteger:=cbxMes.ItemIndex+1;
end Else
begin
dsPBLMaestro.Edit;
PageControl1.ActivePageIndex:=1;
case dsPBLMaestro.FieldByName('id_origen_reporte').AsInteger of
1 : begin
sBtnBeneficiarios.Down:=True;
sBtnPresionado:=1;
end;
2 : begin
sBtnEncargado.Down:=True;
sBtnPresionado:=2;
end;
3 : begin
sBtnPromotor.Down:=True;
sBtnPresionado:=3;
end;
4 : begin
sBtnDiconsa.Down:=True;
sBtnPresionado:=4;
end;
5 : begin
sBtnOtroOrigen.Down:=True;
sBtnPresionado:=5;
end;
end;
AbrirDetalleGrid(Sender);
end;
AbrirDetalle(Sender);
end Else
begin
Application.MessageBox('Ingrese datos validos para el registro de una problematica','Error', mb_Ok+mb_IconError);
mskAnio.SetFocus;
end;
end;
procedure TfrmPBLCaptura.btnRegistrarDetalleClick(Sender: TObject);
begin
if sBtnPresionado>0 then
begin
btnRegistrarDetalle.Enabled:=False;
dsPBLMaestro.FieldByName('id_origen_reporte').AsInteger:=sBtnPresionado;
dsPBLMaestro.Post;
AbrirTipoPBL_y_Causas(Sender);
btnAgregar.Enabled:=True;
end Else
begin
Application.MessageBox('Debes seleccionar un ORIGEN DE REPORTE','Advertencia',mb_Ok+mb_IconExclamation);
end;
end;
procedure TfrmPBLCaptura.AbrirDetalle(Sender: TObject);
begin
dsPBLDetalle.Close;
dsPBLDetalle.ParamByName('lecher').AsString:=edLecheria.Text;
dsPBLDetalle.ParamByName('mes').AsInteger:=cbxMes.ItemIndex+1;
dsPBLDetalle.ParamByName('anio').AsString:=mskAnio.Text;
dsPBLDetalle.Open;
end;
procedure TfrmPBLCaptura.cbxTipoPBLExit(Sender: TObject);
begin
if qryTipoPBL.Active then
begin
qryCausas.Close;
qryCausas.ParamByName('id_pbl').AsInteger:=cbxTipoPBL.KeyValue;
qryCausas.Open;
qryCausas.FetchAll;
end;
end;
procedure TfrmPBLCaptura.cbxTipoPBLCloseUp(Sender: TObject);
begin
PageControl1.ActivePageIndex:=0;
case cbxTipoPBL.KeyValue of
1:begin
pnlDesabasto.Visible:=True;
end;
2:begin
pnlLlenado.Visible:=True;
end;
end;
end;
procedure TfrmPBLCaptura.AbrirTipoPBL_y_Causas(Sender: TObject);
begin
qryTipoPBL.Close;
qryTipoPBL.Open;
qryTipoPBL.FetchAll;
end;
procedure TfrmPBLCaptura.btnAgregarClick(Sender: TObject);
begin
btnGuardar.Enabled:=True;
RegNuevo:=1;
dsPBLDetalle.Append;
dsPBLDetalle.FieldByName('LECHER').AsString:=edLecheria.Text;
dsPBLDetalle.FieldByName('pbl_mes').AsInteger:=cbxMes.ItemIndex+1;
dsPBLDetalle.FieldByName('pbl_anio').AsString:=mskAnio.Text;
dsPBLDetalle.FieldByName('id_pbl_tipo').AsInteger:=cbxTipoPBL.KeyValue;
dsPBLDetalle.FieldByName('id_pbl_causa').AsInteger:=cbxCausasPBL.KeyValue;
dsPBLDetalle.FieldByName('pbl_det_dias').AsString:=edDias.Text;
dsPBLDetalle.FieldByName('pbl_det_diferencia').AsString:=edDiferencia.Text;
dsPBLDetalle.Post;
AbrirDetalleGrid(Sender);
cbxTipoPBL.SetFocus;
end;
procedure TfrmPBLCaptura.btnGuardarClick(Sender: TObject);
begin
try
dsPBLDetalle.DataSource:=nil;
ModDatos.dbFluida.ApplyUpdates( [dsPBLMaestro, dsPBLDetalle] );
dsPBLDetalle.DataSource:=dSoPBLMaestro;
ModDatos.trsFluida.CommitRetaining;
except
on E: Exception do
begin
Application.MessageBox('El o los registros no pueden ser grabados en este momento, probablemente el registro que estas consultando esta siendo editado por otro usuario','Error', mb_ok+mb_IconError);
ShowMessage(E.Message);
ModDatos.trsFluida.RollbackRetaining;
end;
end;
mskAnio.SetFocus;
end;
procedure TfrmPBLCaptura.AbrirDetalleGrid(Sender: TObject);
begin
qryDetalleRegsGrid.Close;
qryDetalleRegsGrid.ParamByName('lecher').AsString:=edLecheria.Text;
qryDetalleRegsGrid.ParamByName('mes').AsInteger:=cbxMes.ItemIndex+1;
qryDetalleRegsGrid.ParamByName('anio').AsString:=mskAnio.Text;
qryDetalleRegsGrid.Open;
end;
procedure TfrmPBLCaptura.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_ESCAPE: mskAnio.SetFocus;
end;
end;
procedure TfrmPBLCaptura.LimpiarCampos(Sender: TObject);
begin
edDias.Text:='';
edDiferencia.Text:='';
end;
procedure TfrmPBLCaptura.OcultarPaneles(Sender: TObject);
begin
pnlDesabasto.Visible:=False;
pnlLlenado.Visible:=False;
end;
procedure TfrmPBLCaptura.Panel4Enter(Sender: TObject);
begin
OcultarPaneles(Sender);
LimpiarCampos(Sender);
end;
procedure TfrmPBLCaptura.edLecheriaExit(Sender: TObject);
begin
qryConsultarLech.Close;
qryConsultarLech.ParamByName('lecher').AsString:=edLecheria.Text;
qryConsultarLech.Open;
if qryConsultarLech.IsEmpty then
begin
Application.MessageBox('El numero de lecheria ingresado no existe en catálogo!','Error',mb_ok+mb_IconError);
edLecheria.SetFocus;
end;
end;
procedure TfrmPBLCaptura.pnlLlenadoEnter(Sender: TObject);
begin
qryInventarios.Close;
qryInventarios.ParamByName('lecher').AsString:=edLecheria.Text;
qryInventarios.ParamByName('mes').AsInteger:=cbxMes.ItemIndex+1;
qryInventarios.ParamByName('anio').AsString:=mskAnio.Text;
qryInventarios.Open;
if qryInventarios.IsEmpty then
begin
Application.MessageBox('No existen inventarios registrados para esta lecheria','Aviso',mb_Ok+mb_IconExclamation);
edDiferencia.SetFocus;
end Else
begin
edDiferencia.Text:=qryInventarios.fieldByName('difer').AsString;
end;
end;
procedure TfrmPBLCaptura.DBGrid1CellClick(Column: TColumn);
begin
btnEliminar.Enabled:=True;
btnGuardar.Enabled:=True;
end;
procedure TfrmPBLCaptura.btnEliminarClick(Sender: TObject);
begin
if Application.MessageBox('Estas seguro de ejectuar el proceso','Pregunta',mb_OkCancel+mb_IconQuestion)=idOk then begin
dsPBLDetalle.Delete;
dsPBLDetalle.ApplyUpdates;
ModDatos.trsFluida.Commit;
end;
end;
end.