Como evitar duplicidade de registro na tabela?

Delphi

04/12/2012

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

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

04/12/2012

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.
GOSTEI 0
Osmar

Osmar

04/12/2012

Joel,

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

Osmar
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

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
GOSTEI 0
Osmar

Osmar

04/12/2012

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
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

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

declare StrUtils no uses.
GOSTEI 0
Osmar

Osmar

04/12/2012

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.
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

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)
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

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.
GOSTEI 0
Osmar

Osmar

04/12/2012

certo, mas como criar a unique?
GOSTEI 0
Osmar

Osmar

04/12/2012

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?
GOSTEI 0
Osmar

Osmar

04/12/2012

agora consegui fazer a unique só com os dois campos como vc pediu.
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

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á.
GOSTEI 0
Osmar

Osmar

04/12/2012

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?
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

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.
GOSTEI 0
Osmar

Osmar

04/12/2012

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.
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

ele não cria se os campos que compõem a unique já se repetirem nos dados gravados, é necessário apagar para criar, pode ser isso o erro, mas qualquer coisa posta o erro pra dar pra analisar.
GOSTEI 0
Osmar

Osmar

04/12/2012

todas vezes q vou testar apago todos os dadnos da tabela, mas um detalhe faltou tratar o campo ANO_MENSALDIADE
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

como assim faltou tratar?
qualquer coisa poste os erros ou scripts de criação...
GOSTEI 0
Osmar

Osmar

04/12/2012

faltou colocar no codigo a linha que pega o ano para a coluna ANO_MENSALIDADE, isto é, você está sugerindo pegar só o ano ou dd/mm/aaaa?
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

só adicionar o campo ANO_MENSALIDADE no SQL da IBQuery, criar o campo no Fields Editor e adicionar a linha:

IBQryMensalidadeANO_MENSALIDADE.AsInteger := YearOf(Date);


depois da

IBQryMensalidadeMES_MENSALIDADE.AsString  := MES_MENSALIDADE[mes];
GOSTEI 0
Osmar

Osmar

04/12/2012

só estava faltando alinha.

AsInteger dá pau, então coloquei AsDataTime, mas pegou uma data de 1905 nada haver.

IBQryMensalidadeANO_MENSALIDADE.AsInteger := YearOf(Date);
GOSTEI 0
Osmar

Osmar

04/12/2012

beleza, resolvi o campo ANO_MENSALIDADE estava definido como DATE mudei para inteiro funcionou perfeito, e agora como fazer para mandar a mensagem p o usuário.
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

é que na minha concepção o campo ANO_MENSALIDADE era INTEGER, ou SMALLINT
GOSTEI 0
Osmar

Osmar

04/12/2012

Alan,
como faço o try/except?
GOSTEI 0
Bruno Leandro

Bruno Leandro

04/12/2012

pra usar try voce pode usar assim

try
query.close;
query.open;
.
.
.
Except
showmessage('passei aqui porque ocorreu um erro');
end;


existe um material mais completo neste site http://www.delphibasics.co.uk/RTL.asp?Name=Try
mas se tiver mais alguma duvida é só postar
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

exemplo de try/except

try
  IBQryMensalidade.Post;
except
  IBQryMensalidade.Cancel;
  Application.MessageBox('Ocorreu um erro ao salvar o registro!', 'Validação', MB_ICONERROR);
end;  


a partir daí vc pode personalizar a mensagem, colocar o erro gerado ou tratar para quando for um código de erro específico vc colocar outra mensagem
GOSTEI 0
Osmar

Osmar

04/12/2012

esta dando erro e ocorre quando vai para o segundo loop na linha do Isert.


procedure TFrmFinanceiro.cxButton1Click(Sender: TObject);
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

try

DmDados.IBQryMensalidade.close;
DmDados.IBQryMensalidade.open;

dia := strtoint(EdtDia_Base.Text);

for mes := 0 to 12 do

begin
DmDados.IBQryMensalidade.Insert;
DmDados.IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := DmDados.IBQryAlunoMATRICULA.AsString;
DmDados.IBQryMensalidade.FieldByName('Situacao').Value := IfThen(cxCheckListBox1.Items[mes].Checked, 'Aberta', 'Isento');
DmDados.IBQryMensalidadeMES_MENSALIDADE.AsString := MES_MENSALIDADE[mes];
DmDados.IBQryMensalidadeANO_MENSALIDADE.AsInteger := YearOf(Date); //função para pegar só o ano
DmDados.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: DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 1;
7: DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 2;
else
DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento;
end;

DmDados.IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
end;
end;

DmDados.IBQryMensalidade.Post;

except
DmDados.IBQryMensalidade.Cancel;
Application.MessageBox('Ocorreu um erro ao salvar o registro!', 'Validação', MB_ICONERROR);
end;


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

GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

no except coloque:

except on E: Exception do
begin
DmDados.IBQryMensalidade.Cancel;
Application.MessageBox(PChar('Ocorreu um erro ao salvar o registro!' + #13 + E.Message), 'Validação', MB_ICONERROR);
end;

assim o erro será mostrado na mensagem e dá pra saber o porquê ter ocorrido.
GOSTEI 0
Osmar

Osmar

04/12/2012

Alan,

Está dando erro e não consegue entrar na mensagem, veja como esta:


procedure TFrmFinanceiro.cxButton1Click(Sender: TObject);
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

try

DmDados.IBQryMensalidade.close;
DmDados.IBQryMensalidade.open;

dia := strtoint(EdtDia_Base.Text);

for mes := 0 to 12 do

begin
DmDados.IBQryMensalidade.Insert;
DmDados.IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := DmDados.IBQryAlunoMATRICULA.AsString;
DmDados.IBQryMensalidade.FieldByName('Situacao').Value := IfThen(cxCheckListBox1.Items[mes].Checked, 'Aberta', 'Isento');
DmDados.IBQryMensalidadeMES_MENSALIDADE.AsString := MES_MENSALIDADE[mes];
DmDados.IBQryMensalidadeANO_MENSALIDADE.AsInteger := YearOf(Date); //função para pegar só o ano
DmDados.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: DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 1;
7: DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 2;
else
DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento;
end;

DmDados.IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
end;
end;

except on E: Exception do
begin
DmDados.IBQryMensalidade.Cancel;
Application.MessageBox(PChar('Ocorreu um erro ao salvar o registro!' + #13 + E.Message), 'Validação', MB_ICONERROR);
end;
end;

DmDados.IBQryMensalidade.Post;
DmDados.IBQryMensalidade.Refresh;
DmDados.IBQryMensalidade.Close;
DmDados.IBQryMensalidade.Open;
DmDados.IBQryAluno.Close;
DmDados.IBQryAluno.Open;
end;
end.
GOSTEI 0
Osmar

Osmar

04/12/2012

Pessoal,

Consegui resolver, dois problemas estavam acontecendo: 1º só estava rodando a aplicação em run-time e em 2º essa função (E.Message) mim trazia a mensagem quando rodava em run-time junto com a mensagem que eu queria enviar para o usuário.

Agradeço a todos que colaboraram.

Osmar.
GOSTEI 0
Osmar

Osmar

04/12/2012

Alan,
Ao instalar o sistema em outra escola, que trata as mensalidades e a matrícula com valores diferentes, o sistema não permite fazer novos lançamentos, porque o código que fizemos anteriormente só permite lançar uma vez devido a unique,a nova ideia seria selecionar no CheckListBox, Exemplo: fevereiro a dezembro (valor de cada mensalidade 100,00) e clica em gerar as mensalidades. Depois selecionar no CheckListBox apenas MATRICULA (valor da matrícula 150,00)e clica em gerar as mensalidades. Como faremos agora?
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

então, Osmar, pelo o que eu entendi do seu código quando não tivesse selecionado o mês no CheckListBox o registro seria gravado mesmo assim, ficando com a situação "Isento" e sem data de vencimento nem dia base.

não sei qual sua necessidade, mas pode ser feito duas coisas inicialmente:
- somente gravar o registro quando a situação dele for "Aberta". Para isso, só passar a linha

  if cxCheckListBox1.Items[mes].Checked then
  begin


para antes do Insert

  DmDados.IBQryMensalidade.Insert;


- analisar antes do Insert se o registro existe (Locate, SQL, aí o critério é seu) e se existir e for "Aberta", você faz um edit/post ao invés de um insert/post.
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

onde está "Aberta" na última linha é "Isento"
GOSTEI 0
Deivison Melo

Deivison Melo

04/12/2012

Explica sua real necessidade, ou seja, todo o processo que vc necessita para que com isso
algum colaborador possa ajudar vc da melhor forma possível, de forma que vc venha a
concluir seu código e tirar todas as suas dúvidas.
GOSTEI 0
Osmar

Osmar

04/12/2012

Alan,
Essa linha não compilou:
if cxCheckListBox1.Items[mes].Checked then
begin
Fiz assim e deu certo: if ClbLancar.Checked[mes] then
Dessa forma fica até melhor porque não tem necessidade de colocar isento já que só vai inchar o banco, mas faço uma ressalva, ao acrescentar essa linha acima fiz um teste, supondo que o usuário erre e tente lançar a mesma mensalidade duas vezes dá pau e não entra na mensagem da exceção.
Alan, estive pensando em melhor o código, veja bem: existem 2 dbgrid um está ligado a tabela de ALUNOS e o outro a tabela de MENSALIDADE, quando se trata de uma escola que o valor das mensalidades é diferente do valor da matrícula, é necessário por exemplo: marcar no cxCheckListBox1 os meses de 02 a 12 (valor das mensalidades 100,00) ai vem o inconveniente desmarcar os 10 meses e marcar no cxCheckListBox1 só a matrícula (valor 150,00), conclusão imagine o usuário ficar marcando e desmarcando cada aluno todas a vezes, então pensei em criar um edit só para o valor da matrícula, nesse caso ele só habilitava o cxCheckListBox1 uma vez e ia só selecionado no dbgrid que aponta para a tabela de ALUNOS e depois clicando no botão gerar mensalidades, mas nesse caso não sei como fazer o código, que deve ficar assim: exemplo:

MATRICULA 150,00(edit valor da matricula)
FEVEREIRO 100,00(edit valor da mensalidade)
MARÇO 100,00(edit valor da mensalidade)
ABRIL 100,00(edit valor da mensalidade)
MAIO 100,00(edit valor da mensalidade)
JUNHO 100,00(edit valor da mensalidade)
JULHO 100,00(edit valor da mensalidade)
AGOSTO 100,00(edit valor da mensalidade)
SETEMBRO 100,00(edit valor da mensalidade)
OUTUBRO 100,00(edit valor da mensalidade)
NOVEMBRO 100,00(edit valor da mensalidade)
DEZEMBROO 100,00(edit valor da mensalidade)

O Código está assim:

procedure TFrmFinanceiro.cxButtonClick(Sender: TObject);
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
If not Mensagem('Serão Lançadas todas as Mensalidades do Ano para o Aluno, Você tem certeza?') then
Exit;
try
DmDados.IBQryMensalidade.close;
DmDados.IBQryMensalidade.open;
dia := strtoint(EdtDia_Base.Text);

for mes := 0 to 12 do

if ClbLancar.Checked[mes] then
begin
DmDados.IBQryMensalidade.Insert;
DmDados.IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := DmDados.IBQryAlunoMATRICULA.AsString;
DmDados.IBQryMensalidade.FieldByName('Situacao').Value := IfThen(ClbLancar.Checked[mes], 'Aberta', 'Isento');
DmDados.IBQryMensalidadeMES_MENSALIDADE.AsString := MES_MENSALIDADE[mes];
// DmDados.IBQryMensalidadeANO_MENSALIDADE.AsInteger := YearOf(Date); //função para pegar só o ano
DmDados.IBQryMensalidadeANO_MENSALIDADE.AsInteger := StrToInt(EdtAno.Text); // converte texto para inteiro
DmDados.IBQryMensalidadeVALOR_MENSALIDADE.AsFloat := EdtValorMensalidade.Value;
DmDados.IBQryMensalidadeESCOLA.AsString := sEscola;

if ClbLancar.Checked[mes] then
begin
vencimento := EncodeDate(StrToInt(EdtAno.Text), IfThen(mes = 0, 1, mes), dia);
case DayOfWeek(vencimento) of
1: DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 1;
7: DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 2;
else
DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento;
end;
DmDados.IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
end;
end;
except on E: Exception do
begin
DmDados.IBQryMensalidade.Cancel;
Application.MessageBox(PChar('As Mensalidades deste Aluno já foram geradas neste Ano!' + #13), 'ATENÇÃO!', MB_ICONERROR);
abort;
end;
end;
DmDados.IBQryMensalidade.Post;
Application.MessageBox('As Mensalidades foram geradas com sucesso!', 'Atenção', mb_iconinformation + mb_ok);
end;

GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

fiz um pequeno mockup para tentar projetar como penso o problema:

[url]http://i.imgur.com/LfwpzxP.jpg[/url]

o intervalo é definido pelas ComboBox, mas o CheckListBox pode ser usado sem problemas, caso precise se "pular" um mês.

Quanto à validação que você comentou não estar funcionando, é por que o erro ocorre no Post, que não está dentro do bloco try que captura a exceção.
GOSTEI 0
Osmar

Osmar

04/12/2012

Alan,
Ficou bem legal esse seu exemplo, você poderia então mudar o código?
GOSTEI 0
Osmar

Osmar

04/12/2012

Alan,

Alguma sugestão?

Osmar.
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

passa o código do insert/post para uma function ou procedure e chama dependendo da sua necessidade (matrícula ou mês) passando os dados necessários.

algo assim:
procedure InsereMensalidade(Ano, Mes, DiaBase: Word; Valor: Real; Matricula, Escola: String);
begin
  if not DmDados.IBQryMensalidade.Locate('MATRICULA_MENSALIDADE;ANO_MENSALIDADE;MES_MENSALIDADE', VarArrayOf([Matricula, Ano, Mes]), [loCaseInsensitive]) then
begin
  DmDados.IBQryMensalidade.Insert;
  DmDados.IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := Matricula;
  DmDados.IBQryMensalidade.FieldByName('Situacao').Value := 'Aberta';
  DmDados.IBQryMensalidadeMES_MENSALIDADE.AsString := MES_MENSALIDADE[Mes];
  DmDados.IBQryMensalidadeANO_MENSALIDADE.AsInteger := Ano; 
  DmDados.IBQryMensalidadeVALOR_MENSALIDADE.AsFloat := Valor;
  DmDados.IBQryMensalidadeESCOLA.AsString := Escola;

  vencimento := EncodeDate(Ano, IfThen(mes = 0, 1, mes), DiaBase);
  case DayOfWeek(vencimento) of
  1: DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 1;
  7: DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 2;
  else
    DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento;
  end;
  DmDados.IBQryMensalidadeDIA_BASE.Value := DiaBase;
end;
end;
GOSTEI 0
Osmar

Osmar

04/12/2012

Alan,
Resolvi deixar com a inserção do 'Isento', já que se retirar atrapalha os formulários já criados, também optei por inserir o EdtValorMatricula como você sugeriu. Quanto a novas mudanças só se fossem para introduzir as opções de combobox também como sugestão sua, mas estou satisfeito como está.
Agradeço a todos que tentaram ajudar e principalmente a você, que DEUS abençoe a todos. veja como ficou:

procedure TFrmFinanceiro.cxButtonClick(Sender: TObject);
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
try
DmDados.IBQryMensalidade.close;
DmDados.IBQryMensalidade.open;
dia := strtoint(EdtDia_Base.Text);
for mes := 0 to 12 do
begin
DmDados.IBQryMensalidade.Insert;
DmDados.IBQryMensalidadeMATRICULA_MENSALIDADE.AsString := DmDados.IBQryAlunoMATRICULA.AsString;
DmDados.IBQryMensalidade.FieldByName('Situacao').Value := IfThen(ClbLancar.Checked[mes], 'Aberta', 'Isento');
DmDados.IBQryMensalidadeMES_MENSALIDADE.AsString := MES_MENSALIDADE[mes];
DmDados.IBQryMensalidadeANO_MENSALIDADE.AsInteger := StrToInt(EdtAno.Text);

if ClbLancar.Items[mes] = ClbLancar.Items[0]then
begin
DmDados.IBQryMensalidadeVALOR_MENSALIDADE.AsFloat := EdtValorMatricula.value
end
else
if DmDados.IBQryMensalidadeSITUACAO.AsString = 'Isento' then
begin
DmDados.IBQryMensalidadeVALOR_MENSALIDADE.AsFloat := 0;
end
else
begin
DmDados.IBQryMensalidadeVALOR_MENSALIDADE.AsFloat := EdtValorMensalidade.Value;
end;
DmDados.IBQryMensalidadeESCOLA.AsString := sEscola;

if ClbLancar.Checked[mes] then
begin
vencimento := EncodeDate(StrToInt(EdtAno.Text), IfThen(mes = 0, 1, mes), dia);
case DayOfWeek(vencimento) of
1: DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 1;
7: DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento + 2;
else
DmDados.IBQryMensalidade.FieldByName('DATA_VENCIMENTO').AsDateTime := vencimento;
end;
DmDados.IBQryMensalidadeDIA_BASE.Value := EdtDia_Base.Text;
end;
end;
DmDados.IBQryMensalidade.Post;

except on E: Exception do
begin
DmDados.IBQryMensalidade.Cancel;
Application.MessageBox(PChar('As Mensalidades deste Aluno já foram geradas neste Ano!' + #13), 'ATENÇÃO!', MB_ICONERROR);
abort;
end;
end;
GOSTEI 0
Osmar

Osmar

04/12/2012

Alan,

Estou com um problema, ou seja, quando o dia base é 29 ou 30, o código não consegue tratar corretamente o mês de FEVEREIRO, então só consegue gerar a matrícula e o mês de janeiro.

Osmar.
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

valida se a data é válida antes de passar pro parâmetro, se não for sugira outra.
GOSTEI 0
Osmar

Osmar

04/12/2012

Alan,
Você poderia mudar então o código?, não sei como fazer.
Osmar
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

esse código vai pegar o último dia do mês caso a data seja inválida.

uses DateUtils, DateUtil;
  
if not IsValidDate(ano, mes, dia) then
  dia := DaysPerMonth(ano, mes);
GOSTEI 0
Osmar

Osmar

04/12/2012

Alan,
Esta dando o erro abaixo, observei que só tenho essa função nos RX para Delphi 7, mas estou usando o Delphi 2010, você sabe algum linke onde posso baixar?

[DCC Fatal Error] UFinanceiro.pas(18): F1026 File not found: 'DateUtil.dcu'
GOSTEI 0
Alan Souza

Alan Souza

04/12/2012

faça uma função para pegar o último dia do mês e ano selecionado, não deve ser difícil.

exemplos [url]http://www.activedelphi.com.br/forum/viewtopic.php?p=25724&sid=15da08b4e0c40994b107ce33a5f67143[/url]
GOSTEI 0
POSTAR