[firebase-br] RES: RES: Script
Alexandre
camilo em apollosistemas.com.br
Qui Jan 3 16:47:30 -03 2013
Aqui na empresa, fazemos toda a manutenção da base de dentro do delphi,
segue o exemplo de uma tabela,
Obs.: temos uma procedure para cada tabela, e chamo-as na ordem correta
devido as chaves, o código pode ser melhorado, mas
Já estava pronto, e não tive tempo para melhorá-lo ainda. De qualquer forma,
espero que te de uma ajuda.
//--------------------------------------------------------------------------
--------
procedure TfrmAtualiza.AtualizaLNC_PENSAO;
begin
Memo1.Lines.Add('Aguarde, Estamos atualizando estruturas e dados da
tabela LNCPENSAO ');
IBTAtualiza.Active := False;
Application.ProcessMessages;
ibAuxiliar.SelectSQL.Text :=
'SELECT COUNT(*)EXISTE FROM RDB$GENERATORS WHERE
RDB$GENERATOR_NAME = ''GEN_LNCPENSAO_ID'';';
ibAuxiliar.Open;
if ibAuxiliar.FieldByName('EXISTE').AsInteger = 0 Then
Begin
IbAtualiza.SelectSQL.Text := 'CREATE GENERATOR
GEN_LNCPENSAO_ID;';
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text := 'COMMIT;';
IbAtualiza.ExecSQL;
End;
ibAuxiliar.Close;
ibAuxiliar.SelectSQL.Text :=
'SELECT COUNT(*)EXISTE FROM RDB$RELATIONS WHERE RDB$RELATION_NAME
= ''LNCPENSAO''';
ibAuxiliar.Open;
if ibAuxiliar.FieldByName('EXISTE').AsInteger = 0 then
Begin
IbAtualiza.SelectSQL.Text := 'CREATE TABLE LNCPENSAO (PSO_ID
INTEIRO NOT NULL ); ';
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text := 'COMMIT;';
IbAtualiza.ExecSQL;
end;
ibAuxiliar.Close;
ibAuxiliar.SelectSQL.Text := 'SELECT * FROM LNCPENSAO WHERE PSO_ID =
-1';
ibAuxiliar.Open;
if ibAuxiliar.FieldDefs.IndexOf('CODEVENTO') = -1 then
Begin
IbAtualiza.SelectSQL.Text := 'ALTER TABLE LNCPENSAO ADD
CODEVENTO CODEVENTO';
IbAtualiza.ExecSQL;
End;
if ibAuxiliar.FieldDefs.IndexOf('CODCALCULO') = -1 then
Begin
IbAtualiza.SelectSQL.Text := 'ALTER TABLE LNCPENSAO ADD
CODCALCULO INTEIRO';
IbAtualiza.ExecSQL;
End;
if ibAuxiliar.FieldDefs.IndexOf('PSO_EVNBASE') = -1 then
Begin
IbAtualiza.SelectSQL.Text := 'ALTER TABLE LNCPENSAO ADD
PSO_EVNBASE STRING';
IbAtualiza.ExecSQL;
End;
if ibAuxiliar.FieldDefs.IndexOf('PSO_EVNVALOR') = -1 then
Begin
IbAtualiza.SelectSQL.Text := 'ALTER TABLE LNCPENSAO ADD
PSO_EVNVALOR STRING';
IbAtualiza.ExecSQL;
End;
if ibAuxiliar.FieldDefs.IndexOf('PSO_PERC') = -1 then
Begin
IbAtualiza.SelectSQL.Text := 'ALTER TABLE LNCPENSAO ADD
PSO_PERC DMVALOR';
IbAtualiza.ExecSQL;
End;
if ibAuxiliar.FieldDefs.IndexOf('CODFUNCIONARIO') = -1 then
Begin
IbAtualiza.SelectSQL.Text := 'ALTER TABLE LNCPENSAO ADD
CODFUNCIONARIO INTEIRO';
IbAtualiza.ExecSQL;
End;
ibAuxiliar.Close;
IbAtualiza.SelectSQL.Text := 'COMMIT;';
IbAtualiza.ExecSQL;
ibAuxiliar.SelectSQL.Text :=
'Select Count (RDB$RELATION_NAME) AS Existe from
RDB$RELATION_CONSTRAINTS where RDB$CONSTRAINT_NAME = ''PK_LNCPENSAO''';
ibAuxiliar.Open;
IF ibAuxiliar.FieldByName('EXISTE').AsInteger = 0 THEN
Begin
IbAtualiza.SelectSQL.Text :=
'ALTER TABLE LNCPENSAO ADD CONSTRAINT PK_LNCPENSAO PRIMARY
KEY (PSO_ID)';
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text := 'COMMIT;';
IbAtualiza.ExecSQL;
End;
// CHAVE ESTRANGEIRA
ibAuxiliar.SelectSQL.Text :=
'Select Count (RDB$RELATION_NAME) AS Existe from
RDB$RELATION_CONSTRAINTS where RDB$CONSTRAINT_NAME =
''FK_LNCPENSAO_X_EVENTOS''';
ibAuxiliar.Open;
IF ibAuxiliar.FieldByName('EXISTE').AsInteger = 0 THEN
Begin
IbAtualiza.SelectSQL.Text :=
'ALTER TABLE LNCPENSAO ADD CONSTRAINT
FK_LNCPENSAO_X_EVENTOS FOREIGN KEY (CODEVENTO) REFERENCES
TABEVENTOS(CODEVENTO) ON UPDATE CASCADE';
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text := 'COMMIT;';
IbAtualiza.ExecSQL;
End;
ibAuxiliar.SelectSQL.Text :=
'Select Count (RDB$RELATION_NAME) AS Existe from
RDB$RELATION_CONSTRAINTS where RDB$CONSTRAINT_NAME =
''FK_LNCPENSAO_X_CALCULO''';
ibAuxiliar.Open;
IF ibAuxiliar.FieldByName('EXISTE').AsInteger = 0 THEN
Begin
IbAtualiza.SelectSQL.Text :=
'ALTER TABLE LNCPENSAO ADD CONSTRAINT
FK_LNCPENSAO_X_CALCULO FOREIGN KEY (CODCALCULO) REFERENCES CALCULO (CODIGO)
ON UPDATE CASCADE';
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text := 'COMMIT;';
IbAtualiza.ExecSQL;
End;
ibAuxiliar.SelectSQL.Text :=
'Select Count (RDB$RELATION_NAME) AS Existe from
RDB$RELATION_CONSTRAINTS where RDB$CONSTRAINT_NAME =
''FK_LNCPENSAO_X_FUNCIONARIOS''';
ibAuxiliar.Open;
IF ibAuxiliar.FieldByName('EXISTE').AsInteger = 0 THEN
Begin
IbAtualiza.SelectSQL.Text :=
'ALTER TABLE LNCPENSAO ADD CONSTRAINT
FK_LNCPENSAO_X_FUNCIONARIOS FOREIGN KEY (CODFUNCIONARIO) REFERENCES
FUNCIONARIOS (CODFUNCIONARIO) ON UPDATE CASCADE';
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text := 'COMMIT;';
IbAtualiza.ExecSQL;
End;
// TRIGGER
ibAuxiliar.SelectSQL.Text :=
'SELECT COUNT(*) EXISTE FROM RDB$TRIGGERS WHERE RDB$TRIGGER_NAME =
''LNCPENSAO_BI'' AND RDB$RELATION_NAME = ''LNCPENSAO''';
ibAuxiliar.Open;
IF ibAuxiliar.FieldByName('EXISTE').AsInteger = 0 THEN
Begin
IbAtualiza.SelectSQL.Text :=
'CREATE OR ALTER TRIGGER LNCPENSAO_BI FOR LNCPENSAO
'+#13+
'ACTIVE BEFORE INSERT POSITION 0 '+#13+
'AS '+#13+
'BEGIN '+#13+
' IF (NEW.PSO_ID IS NULL) THEN '+#13+
' NEW.PSO_ID = GEN_ID(GEN_LNCPENSAO_ID,1); '+#13+
'END';
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text := 'COMMIT;';
IbAtualiza.ExecSQL;
End;
ibAuxiliar.Close;
IbAtualiza.SelectSQL.Text :='COMMENT ON TABLE LNCPENSAO IS
''Lancamentos para calculo de pensao alimenticia.''';
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text :=
'COMMENT ON COLUMN LNCPENSAO.PSO_EVNBASE IS '+QuotedStr(
'Eventos deverao ser lancados separados por ponto e virgula
(;)' +#13+
'Eventos para compor a base de Pensao Alimenticia, caso
CODCALCULO estaja vazio.'+#13+
'Se este campo estiver preenchido, será desconsiderado as
configuracoes de acumular pensao nos eventos.');
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text :=
'COMMENT ON COLUMN LNCPENSAO.PSO_EVNVALOR IS '+QuotedStr(
'Eventos deverao ser lancados separados por ponto e
virgula(;) '+#13+
'Os eventos lancados neste campo, serao somados ao evento de
pensao calculado, gerando assim um novo valor para o evento de pensao.');
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text :=
'COMMENT ON COLUMN LNCPENSAO.PSO_PERC IS ''Percentual para
calculo da pensao alimenticia.''';
IbAtualiza.ExecSQL;
IbAtualiza.SelectSQL.Text := 'COMMIT;';
IbAtualiza.ExecSQL;
end;
//--------------------------------------------------------------------------
--------
Alexandre Camilo.
Mais detalhes sobre a lista de discussão lista