Como evitar duplicidade de registro na tabela?
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
Respostas
Joel Rodrigues
04/12/2012
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.
Osmar
04/12/2012
Nunca fiz chave composta, mas mesmo fazendo tem como enviar mensagem para o usário avisando da duplicidade. Uso firebird.
Osmar
Alan Souza
04/12/2012
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
Osmar
04/12/2012
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
Alan Souza
04/12/2012
declare StrUtils no uses.
Osmar
04/12/2012
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.
Alan Souza
04/12/2012
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)
Alan Souza
04/12/2012
Osmar
04/12/2012
Osmar
04/12/2012
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?
Osmar
04/12/2012
Alan Souza
04/12/2012
--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á.
Osmar
04/12/2012
Alan Souza
04/12/2012
Osmar
04/12/2012
Alan Souza
04/12/2012
Osmar
04/12/2012
Alan Souza
04/12/2012
qualquer coisa poste os erros ou scripts de criação...
Osmar
04/12/2012
Alan Souza
04/12/2012
IBQryMensalidadeANO_MENSALIDADE.AsInteger := YearOf(Date);
depois da
IBQryMensalidadeMES_MENSALIDADE.AsString := MES_MENSALIDADE[mes];
Osmar
04/12/2012
AsInteger dá pau, então coloquei AsDataTime, mas pegou uma data de 1905 nada haver.
IBQryMensalidadeANO_MENSALIDADE.AsInteger := YearOf(Date);
Osmar
04/12/2012
Alan Souza
04/12/2012
Osmar
04/12/2012
como faço o try/except?
Bruno Leandro
04/12/2012
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
Alan Souza
04/12/2012
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
Osmar
04/12/2012
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;
Alan Souza
04/12/2012
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.
Osmar
04/12/2012
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.
Osmar
04/12/2012
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.
Osmar
04/12/2012
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?
Alan Souza
04/12/2012
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.
Alan Souza
04/12/2012
Deivison Melo
04/12/2012
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.
Osmar
04/12/2012
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;
Alan Souza
04/12/2012
[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.
Osmar
04/12/2012
Ficou bem legal esse seu exemplo, você poderia então mudar o código?
Osmar
04/12/2012
Alguma sugestão?
Osmar.
Alan Souza
04/12/2012
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;
Osmar
04/12/2012
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;
Osmar
04/12/2012
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.
Alan Souza
04/12/2012
Osmar
04/12/2012
Você poderia mudar então o código?, não sei como fazer.
Osmar
Alan Souza
04/12/2012
uses DateUtils, DateUtil; if not IsValidDate(ano, mes, dia) then dia := DaysPerMonth(ano, mes);
Osmar
04/12/2012
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'
Alan Souza
04/12/2012
exemplos [url]http://www.activedelphi.com.br/forum/viewtopic.php?p=25724&sid=15da08b4e0c40994b107ce33a5f67143[/url]