[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