Fórum Como evitar duplicidade de registro na tabela? #430302

04/12/2012

0

Pessoal,

Como evitar que as mensalidades do mesmo aluno sejam inseridas em duplicidade no mesmo ano.

Osmar.


procedure TFrmFinanceiro.cxButton1Click(Sender: TObject);
var
dia : integer;
begin
dia := strtoint(EdtDia_Base.Text);
begin
if cxCheckListBox1.Items[0].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(1)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(1)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'MATRÍCULA';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'MATRÍCULA';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[1].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(1)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(1)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'JANEIRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'JANEIRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[2].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(2)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(2)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'FEVEREIRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'FEVEREIRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[3].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(3)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(3)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'MARÇO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'MARÇO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[4].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(4)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(4)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'ABRIL';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'ABRIL';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[5].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(5)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(5)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'MAIO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'MAIO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[6].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(6)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(6)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'JUNHO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'JUNHO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[7].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(7)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(7)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'JULHO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'JULHO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[8].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(8)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(8)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'AGOSTO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'AGOSTO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[9].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(9)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(9)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'SETEMBRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'SETEMBRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[10].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(10)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(10)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'OUTUBRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'OUTUBRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[11].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(11)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(11)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'NOVEMBRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'NOVEMBRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;

begin
if cxCheckListBox1.Items[12].Checked then
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := (inttostr(dia)+'/'+ inttostr(12)+'/'+copy(datetostr(date),7,4));

begin
case dayofweek(StrToDate(inttostr(dia)+'/'+ inttostr(12)+'/'+copy(datetostr(date),7,4))) of
1 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 1;
end;

7 : begin
IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value := IBQryMensalidade.FieldByName('DATA_VENCIMENTO').Value + 2;
end;
end;
end;

IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
IBQryMensalidadeMES_MENSALIDADE.AsString := 'DEZEMBRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end
else
begin
IBQryMensalidade.Insert;
IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
IBQryMensalidade.FieldByName('Situacao').Value := 'Isento';
IBQryMensalidadeMES_MENSALIDADE.AsString := 'DEZEMBRO';
IBQryMensalidadeESCOLA.AsString := sEscola;
end;
end;
IBQryMensalidade.Post;
IBQryMensalidade.Refresh;
IBQryMensalidade.Close;
IBQryMensalidade.Open;
IBQryAluno.Close;
IBQryAluno.Open;
end;
end.
Osmar

Osmar

Responder

Posts

04/12/2012

Joel Rodrigues

Vou confessar que não li seu código, mas com base na sua pergunta, tenho uma sugestão: por que não definir uma chave primária composta?
Por exemplo: CODIGO DO ALUNO, MÊS, ANO. Assim, não poderia ser cadastrada a mensalidade do mesmo mês, do mesmo ano, para o mesmo aluno, duas vezes.
Boa sorte.
Responder

Gostei + 0

04/12/2012

Osmar

Joel,

Nunca fiz chave composta, mas mesmo fazendo tem como enviar mensagem para o usário avisando da duplicidade. Uso firebird.

Osmar
Responder

Gostei + 0

05/12/2012

Alan Souza

alterei seu código pra poder entendê-lo, mantive sua lógica mas dentro de um laço:

const
  MES_MENSALIDADE = array [0..12] of String = ('MATRÍCULA', 'JANEIRO', 'FEVEREIRO',
                    'MARÇO', 'ABRIL', 'MAIO', 'JUNHO', 'JULHO', 'AGOSTO', 'SETEMBRO',
                    'OUTUBRO', 'NOVEMBRO', 'DEZEMBRO');
var
  dia, mes: Word;
  vencimento: TDateTime;
begin
  dia := strtoint(EdtDia_Base.Text);
  for mes := 0 to {Pred(cxCheckListBox1.Items[mes].Count)} 12 do
  begin
    IBQryMensalidade.Insert;
    IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := IBQryAlunoMATRICULA.AsString;
    IBQryMensalidade.FieldByName('Situacao').Value := IfThen(cxCheckListBox1.Items[mes].Checked, 'Aberta', 'Isento');
    IBQryMensalidadeMES_MENSALIDADE.AsString := MES_MENSALIDADE[mes];
    IBQryMensalidadeESCOLA.AsString := sEscola;
    if cxCheckListBox1.Items[mes].Checked then
    begin
      vencimento := EncodeDate(YearOf(Date), IfThen(mes = 0, 1, mes), dia);

      case DayOfWeek(vencimento) of
      1: IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 1;
      7: IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 2;
      else
        IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento;
      end;

      IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
    end;

    IBQryMensalidade.Post;
    IBQryMensalidade.Refresh;
    IBQryMensalidade.Close;
    IBQryMensalidade.Open;
    IBQryAluno.Close;
    IBQryAluno.Open;
  end;
end;



agora pra validar a data e aluno, dá pra criar uma constraint no próprio IBQuery IBQryMensalidade, só criar uma e configurar (infelizmente não tenho como testar agora nem achei nenhum exemplo disponível...)

desse modo dá pra validar e retornar a mensagem, mas é altamente recomendável criar a PK composta sugerida pelo Joel mesmo assim
Responder

Gostei + 0

05/12/2012

Osmar

olha esta dando erro nessa linha:

Uso Delphi 2010 tive que adicionar essas duas funções na uses math e DateUtils.

IBQryMensalidade.FieldByName('Situacao').Value := IfThen(cxCheckListBox1.Items[mes].Checked, 'Aberta', 'Isento');


[DCC Error] UFinanceiro.pas(235): E2250 There is no overloaded version of 'IfThen' that can be called with these arguments
Responder

Gostei + 0

06/12/2012

Alan Souza

desculpe, estou tão acostumado a usar que esqueci de citar a unit!

declare StrUtils no uses.
Responder

Gostei + 0

06/12/2012

Osmar

Alan,

Agora compilou, olha não tenho muita experiência, você poderia fazer o código da constraint, a tabela está assim:

COD_MENSALIDADE (chave primária)
MATRICULA_MENSALIDADE
DATA_VENCIMENTO
DATA_PAGAMENTO
SITUACAO
MES_MENSALIDADE
DIA_BASE
ESCOLA (chave estrangeira)

Quanto a chave composta também nunca fiz uso Firiberd/IbExpert.
Responder

Gostei + 0

06/12/2012

Alan Souza

cria o campo ano_mensalidade, exclua sua PK e faça do seguinte modo:

ALTER TABLE TABELA ADD CONSTRAINT PK_TABELA PRIMARY KEY (MATRICULA_MENSALIDADE, MES_MENSALIDADE, ANO_MENSALIDADE)

assim sua chave será composta pela matrícula, mês e ano. Quando for cadastrado os valores repetidos, a chave não deixará salvar outro registro. Então basta validar com um try/except para quando der a exceção relativa à PK, mostrar msg pro usuário.

(caso o campo cod_mensalidade seja necessário como seu identificador único, crie uma unique key para ele)
Responder

Gostei + 0

06/12/2012

Alan Souza

tem outra opção também, sem precisar excluir a PK que já existe: criar uma unique para os campos matricula, mês e ano ao invés de PK, vai ter o mesmo efeito e vc não perde a PK já criada.
Responder

Gostei + 0

06/12/2012

Osmar

certo, mas como criar a unique?
Responder

Gostei + 0

06/12/2012

Osmar

Alan,

consegui fazer a unique, mas tem um detalhe, quando tentei fazer a mesma só com os campos MATRICULA_MENSALIDADE e DATA_VENCIMENTO dava erro, então também foi incluso o campo chave primaria COD_MENSALIDADE, ou seja ficaram os três campos na unique, então compilou.

Obs: Lembro que no próximo ano será lançado na tebela o mesmo aluno com a mesma MATRICULA_MENSALIDADE a diferença de inserção fica apenas por conta da data que será diferente devido ao ano, então pergunto neste caso o sistema permite a inserção?
Responder

Gostei + 0

06/12/2012

Osmar

agora consegui fazer a unique só com os dois campos como vc pediu.
Responder

Gostei + 0

06/12/2012

Alan Souza

vamos lá:

--deixe a tabela com essa estrutura
COD_MENSALIDADE (PK)
MATRICULA_MENSALIDADE (UK)
DATA_VENCIMENTO
DATA_PAGAMENTO
SITUACAO
MES_MENSALIDADE (UK)
DIA_BASE
ESCOLA (FK)
ANO_MENSALIDADE (UK)

ou seja, terá uma PK, uma FK e uma UK

para criá-las:
--PK
ALTER TABLE TABELA ADD CONSTRAINT PK_TABELA PRIMARY KEY (COD_MENSALIDADE)
--FK
ALTER TABLE TABELA ADD CONSTRAINT FK_TABELA FOREIGN KEY (ESCOLA) REFERENCES TABELAESCOLA (CAMPORELACAOESCOLA)
--UK
ALTER TABLE TABELA ADD CONSTRAINT UK_TABELA UNIQUE (MATRICULA_MENSALIDADE, MES_MENSALIDADE, ANO_MENSALIDADE)

desse modo ele permitiria a inserção no ano seguinte, porque os valores não vão compor um conjunto único, pois o ano mudará.
Responder

Gostei + 0

06/12/2012

Osmar

veja só você incluiu o campo ANO_MENSALIDADE(ainda não tenho esse campo na tabela), tem necessidade já que no campo DATA_VENCIMENTO eu terei o ano com a seguinte estrutura dd/mm/aaaa?
Responder

Gostei + 0

06/12/2012

Alan Souza

dá até pra fazer com o campo data_vencimento no lugar de um campo de ano, mas pelo o que eu vi tem horas que esse campo não é preenchido, e isso pode gerar problemas quando for inserido um registro com matrícula e mês igual e data vazia.
Responder

Gostei + 0

06/12/2012

Osmar

desculpe, vc tem razão, vou fazer como vc sugeriu, mas antes disso fui testar com os dois campos na unique e deu pau, a informação do erro tem como referencia a unique.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar