unit UAtualiza_BD; //Atualização do BD é chamado no Datamodule_Atualização //no evento oncreate interface uses UUpdadeDataBase.Interfaces, SysUtils, Dialogs, Forms; type TUpdateDataBase = class(TInterfacedObject, iUpdateDataBase) private FVersaoBD : Integer; procedure Update_0_To_1; procedure Update_1_To_2; procedure Update_2_To_3; procedure MostrarVersaoBD; procedure ExecutaSQL(aValue : String); procedure ExecutaSQLDirect(aValue : String); procedure ExecutaSQLAddColumn(aTable : String; aCampo : String; aTipoCampo : String); procedure ExecutaSQLAlterType(aTable : String; aCampo : String; aTipoCampo : String); procedure ExecutaSQLAlterColumn(aTable : String; aCampo : String; aToCampo : String); procedure ExecutaSQLDropColumn(aTabela : String; aCampo : String); procedure ExecutaSQLDropView(aView : String); procedure ExecutaSQLDropTable(aTable : String); procedure ExecutaSQLCreateView(aView : String; aSQL : String); procedure ExecutaSQLCreateTable(aTable : String; aSQL : String); procedure ExecutaSQLCreateGenerator(aGenerator : String); procedure ExecutaSQLDropGenerator(aGenerator : String); procedure ExecutaSQLCreateStoreProcedure(aProcedure : String; aSQL : String); procedure ExecutaSQLDropStoreProcedure(aProcedure : String); procedure ExecutaSQLDropIndex(aNameIndex : String); procedure ExecutaSQLCreateIndex(aNameIndex : String; aTable : String; aCampo : String); public constructor Create; destructor Destroy; override; function Versao(aValue : Integer) : iUpdateDataBase; function UpdateBD : iUpdateDataBase; class function New : iUpdateDataBase; end; implementation uses UDataModule_Atualizacao; { TUpdateDataBase } //Atualização do BD é chamado no Datamodule_Atualização //no evento oncreate procedure TUpdateDataBase.Update_0_To_1; var SQL : string; begin //01 //efetua atualizações no BD ExecutaSQLAddColumn('EMPRESAS', 'VERSAO_BD', 'Integer'); ExecutaSQLAlterColumn('EMPRESAS', 'CST_PADRAO', 'CST_ICMS_PADRAO'); ExecutaSQLAddColumn('EMPRESAS', 'CST_PIS_PADRAO', 'Varchar(10)'); ExecutaSQLAddColumn('EMPRESAS', 'CST_COFINS_PADRAO', 'Varchar(10)'); ExecutaSQLAddColumn('PRODUTOS', 'Taxa_Comissao', 'Double Precision'); ExecutaSQLAddColumn('RESUMO_PEDIDOS', 'FORMA_PAGAMENTO', 'Varchar(50)'); ExecutaSQLAddColumn('HISTORICO', 'TIPO_Orc_Ped_NFE', 'Varchar(10)'); ExecutaSQLAlterType('PRODUTOS', 'COLECAO', 'Varchar(15)'); ExecutaSQLDropColumn('PRODUTOS', 'Abre_Cons_Prod'); ExecutaSQLAddColumn('EMPRESAS', 'Abre_Cons_Prod', 'Varchar(3)'); ExecutaSQLAddColumn('EMPRESAS', 'ID_UNID_MEDIDA_PADRAO', 'Integer'); ExecutaSQLDropColumn('EMPRESAS', 'ID_Forma_Pamento_Entrada_Padrao'); ExecutaSQLAddColumn('EMPRESAS', 'ID_Forma_Pagto_Entrada_Padrao', 'Integer'); ExecutaSQLAddColumn('USUARIOS', 'Valor_Comissao', 'Double Precision'); ExecutaSQLAddColumn('EMPRESAS', 'FORN_CONSULTA_POR', 'Varchar(25)'); ExecutaSQLAddColumn('CONDICOES_PAGAMENTO', 'Cartao_Debito_Credito', 'Varchar(8)'); ExecutaSQLAddColumn('PEDIDOS', 'STATUS_SAT', 'Varchar(10)'); ExecutaSQLAddColumn('CONFIGURA_SAT', 'VERSAO', 'Varchar(5)'); ExecutaSQLAddColumn('EMPRESAS', 'ESPACO_BORDA_IMAGE_PRINC', 'Integer'); ExecutaSQLAddColumn('PEDIDOS', 'SAT_ANO_MES', 'Varchar(7)'); ExecutaSQLAddColumn('PEDIDOS', 'SAT_NOME_ARQUIVO_EMITIDO', 'Varchar(60)'); ExecutaSQLAddColumn('PEDIDOS', 'SAT_NUMERO_ID', 'Varchar(15)'); ExecutaSQLAlterType('PEDIDOS', 'SAT_NOME_ARQUIVO_EMITIDO', 'Varchar(150)'); ExecutaSQLAlterType('CONFIGURA_SAT', 'ARQ_LOG', 'Varchar(200)'); ExecutaSQLAlterType('CONFIGURA_SAT', 'IDENTAR_XML', 'Varchar(5)'); ExecutaSQLAlterType('CONFIGURA_SAT', 'EH_UTF8', 'Varchar(5)'); ExecutaSQLAlterType('CONFIGURA_SAT', 'SALVAR_CFE', 'Varchar(5)'); ExecutaSQLAlterType('CONFIGURA_SAT', 'SALVAR_CFE_CANC', 'Varchar(5)'); ExecutaSQLAlterType('CONFIGURA_SAT', 'SALVAR_ENVIO', 'Varchar(5)'); ExecutaSQLAlterType('CONFIGURA_SAT', 'SEPARAR_CNPJ', 'Varchar(5)'); ExecutaSQLAlterType('CONFIGURA_SAT', 'SEPARAR_MES', 'Varchar(5)'); ExecutaSQLAlterType('CONFIGURA_SAT', 'MODELO', 'Varchar(200)'); ExecutaSQLAddColumn('PEDIDOS', 'SAT_XML_EMITIDO', 'BLOB SUB_TYPE TEXT SEGMENT SIZE 80'); ExecutaSQLAlterType('ITENS_PED', 'CSOSN', 'Varchar(10)'); ExecutaSQLAlterType('ITENS_PED', 'CFOP', 'Varchar(10)'); ExecutaSQLDropColumn('ITENS_PED', 'CST'); ExecutaSQLDropColumn('ITENS_PED', 'CRT_Padro'); ExecutaSQLDropColumn('ITENS_PED', 'CSOSN_Padrao'); ExecutaSQLDropColumn('ITENS_PED', 'CST_ICMS_Padrao'); ExecutaSQLDropColumn('ITENS_PED', 'CST_IPI_Padrao'); ExecutaSQLDropColumn('ITENS_PED', 'CST_PIS_Padrao'); ExecutaSQLDropColumn('ITENS_PED', 'CST_COFINS_Padrao'); ExecutaSQLDropColumn('ITENS_PED', 'CST_COFINS_Padrao'); ExecutaSQLDropColumn('ITENS_PED', 'CFOP_Padrao'); ExecutaSQLAddColumn('ITENS_PED', 'CRT', 'Varchar(10)'); ExecutaSQLAddColumn('ITENS_PED', 'CST_ICMS', 'Varchar(10)'); ExecutaSQLAddColumn('ITENS_PED', 'CST_IPI', 'Varchar(10)'); ExecutaSQLAddColumn('ITENS_PED', 'CST_PIS', 'Varchar(10)'); ExecutaSQLAddColumn('ITENS_PED', 'CST_COFINS', 'Varchar(10)'); ExecutaSQLAddColumn('ITENS_PED', 'ID_PEDIDO_DEVOLUCAO', 'Integer'); ExecutaSQLAddColumn('ITENS_PED', 'ID_CLIENTE_DEVOLUCAO', 'Integer'); ExecutaSQLAddColumn('PEDIDOS', 'CPF_INFORMADO', 'Varchar(15)'); ExecutaSQLAddColumn('PEDIDOS', 'NUM_PESSOAS', 'Integer'); ExecutaSQLAddColumn('PEDIDOS', 'NUM_MESA', 'Integer'); ExecutaSQLAddColumn('EMPRESAS', 'SSLLIB_NFE', 'Varchar(25)'); ExecutaSQLAddColumn('EMPRESAS', 'CRYPTLIB_NFE', 'Varchar(25)'); ExecutaSQLAddColumn('EMPRESAS', 'HTTPLIB_NFE', 'Varchar(25)'); ExecutaSQLAddColumn('EMPRESAS', 'XMLSIGNLIB_NFE', 'Varchar(25)'); ExecutaSQLAddColumn('EMPRESAS', 'TENTATIVAS_NFE', 'Integer'); ExecutaSQLAddColumn('EMPRESAS', 'TIMEOUT_NFE', 'Integer'); ExecutaSQLAddColumn('EMPRESAS', 'SSLTYPE_NFE', 'Varchar(15)'); ExecutaSQLAddColumn('EMPRESAS', 'CAMINHO_CERTIFICADO_PFX_NFE', 'Varchar(150)'); ExecutaSQLAddColumn('EMPRESAS', 'SENHA_CERTIFICADO_NFE', 'Varchar(150)'); ExecutaSQLAddColumn('EMPRESAS', 'VERSAO_WEBSERVICE_NFE', 'Varchar(15)'); ExecutaSQLAddColumn('EMPRESAS', 'CONTADOR_NOME', 'Varchar(60)'); ExecutaSQLAddColumn('EMPRESAS', 'CONTADOR_EMAIL', 'Varchar(60)'); ExecutaSQLAddColumn('EMPRESAS', 'CONTADOR_TELEFONE', 'Varchar(20)'); ExecutaSQLAddColumn('CONTAS_PAGAR', 'ID_GRUPO_CONTAS', 'Integer'); ExecutaSQLAddColumn('CONTAS_RECEBER', 'ID_GRUPO_CONTAS', 'Integer'); ExecutaSQLAlterType('EMPRESAS', 'AMBIENTE_NFE', 'Varchar(15)'); ExecutaSQLAddColumn('PRODUTOS', 'ID_ALMOXARIFADO', 'Integer'); ExecutaSQLDropView('V_PARCELAMENTO'); SQL:=''; SQL:='CREATE VIEW V_PARCELAMENTO('+ 'ID_PARCELAMENTO, VALOR, ID_FORMA_PAGAMENTO, DATA_VENCIMENTO, ID_ORC_PED_NFE, '+ ' TIPO_ORC_PED_NFE, NOME, ID_COND_PAGAMENTO '+ ') AS '+ ' SELECT P.ID_PARCELAMENTO, P.VALOR, P.ID_FORMA_PAGAMENTO, P.DATA_VENCIMENTO, P.ID_ORC_PED_NFE, '+ ' P.Tipo_Orc_Ped_NFE, CP.NOME, CP.ID_COND_PAGAMENTO'+ ' FROM PARCELAMENTO P'+ ' LEFT JOIN CONDICOES_PAGAMENTO CP ON (P.ID_FORMA_PAGAMENTO = CP.ID_COND_PAGAMENTO)'; ExecutaSQLCreateView('V_PARCELAMENTO', SQL); ExecutaSQLDropTable('RESUMO_FINANC_RECEB_A_VISTA'); ExecutaSQLDropStoreProcedure('SP_GEN_RES_FIN_REC_A_VISTA_ID'); ExecutaSQLDropGenerator('GEN_RES_FIN_REC_A_VISTA'); SQL:=''; SQL:=' CREATE TABLE RESUMO_FINANC_RECEB_A_VISTA ( '+ ' ID_RESUMO Integer PRIMARY KEY, '+ ' VALOR_TOTAL Double Precision, '+ ' FORMA_PAGAMENTO Varchar(50) ); '; ExecutaSQLCreateTable('RESUMO_FINANC_RECEB_A_VISTA', SQL); ExecutaSQLCreateGenerator('GEN_RES_FIN_REC_A_VISTA'); SQL:=''; SQL:=' CREATE PROCEDURE SP_GEN_RES_FIN_REC_A_VISTA_ID '+ ' RETURNS (ID INTEGER) '+ ' AS '+ ' BEGIN '+ ' ID = GEN_ID(GEN_RES_FIN_REC_A_VISTA, 1); '+ ' SUSPEND; '+ ' END; '; ExecutaSQLCreateStoreProcedure('SP_GEN_RES_FIN_REC_A_VISTA_ID', SQL); ExecutaSQL('UPDATE EMPRESAS SET VERSAO_BD = 1 WHERE ID_EMPRESA > 0'); ExecutaSQL('COMMIT WORK'); FVersaoBD := 1; MostrarVersaoBD; end; procedure TUpdateDataBase.Update_1_To_2; var SQL : string; begin //02 //efetua atualizações no BD SQL:=''; SQL:=' CREATE TABLE GRUPOS_CONTAS ( '+ ' ID_Grupo_Contas integer PRIMARY KEY, '+ ' Nome Varchar(35), '+ ' Data_Cadastro Date, '+ ' Data_Alteracao Date); '; ExecutaSQLCreateTable('GRUPOS_CONTAS', SQL); ExecutaSQLCreateIndex('GRUPOS_CONTAS_ID_INDEX', 'GRUPOS_CONTAS', 'ID_Grupo_Contas'); ExecutaSQLCreateIndex('GRUPOS_CONTAS_NOME_INDEX', 'GRUPOS_CONTAS', 'Nome'); ExecutaSQLCreateGenerator('GEN_GRUPOS_CONTAS'); SQL:=''; SQL:=' CREATE PROCEDURE SP_GEN_GRUPOS_CONTAS_ID '+ ' RETURNS (ID INTEGER) '+ ' AS '+ ' BEGIN '+ ' ID = GEN_ID(GEN_GRUPOS_CONTAS, 1); '+ ' SUSPEND; '+ ' END; '; ExecutaSQLCreateStoreProcedure('SP_GEN_GRUPOS_CONTAS_ID', SQL); ExecutaSQLAddColumn('NFE', 'ID_FORNECEDOR', 'Integer'); ExecutaSQL('UPDATE EMPRESAS SET VERSAO_BD = 2 WHERE ID_EMPRESA > 0'); ExecutaSQL('COMMIT WORK'); FVersaoBD := 2; MostrarVersaoBD; end; procedure TUpdateDataBase.Update_2_To_3; begin //03 //efetua atualizações no BD FVersaoBD := 3; MostrarVersaoBD; end; constructor TUpdateDataBase.Create; begin FVersaoBD := 0; Datamodule_Atualizacao.SDS_Confere.Close; Datamodule_Atualizacao.SDS_Confere.Active:=FALSE; Datamodule_Atualizacao.SDS_Confere.DataSet.Active:=FALSE; Datamodule_Atualizacao.SDS_Confere.DataSet.CommandText:=''; Datamodule_Atualizacao.SDS_Confere.DataSet.CommandText:='SELECT * from EMPRESAS WHERE (ID_EMPRESA=1)'; Datamodule_Atualizacao.SDS_Confere.Connection:=DataModule_Atualizacao.SQLConnection1; Datamodule_Atualizacao.SDS_Confere.DataSet.Active:=true; Datamodule_Atualizacao.SDS_Confere.Active:=true; Datamodule_Atualizacao.SDS_Confere.Open; FVersaoBD := Datamodule_Atualizacao.SDS_Confere.FieldByName('VERSAO_BD').Value; end; destructor TUpdateDataBase.Destroy; begin inherited; end; procedure TUpdateDataBase.ExecutaSQL(aValue: String); begin try Datamodule_Atualizacao.SP_ID_QUERY.Close; Datamodule_Atualizacao.SP_ID_QUERY.SQL.CommaText:=''; Datamodule_Atualizacao.SP_ID_QUERY.SQL.CommaText:=''+aValue; Datamodule_Atualizacao.SP_ID_QUERY.ExecSQL; except on E: Exception do begin Showmessage('Ocorreu um Erro ao Atualizar o Banco de Dados: '+E.ToString); Showmessage('Comando SQL: '+aValue); Application.Terminate; end; end; end; procedure TUpdateDataBase.ExecutaSQLAddColumn(aTable, aCampo, aTipoCampo: String); begin ExecutaSQL('EXECUTE block as BEGIN if (NOT EXISTS (Select rdb$relation_name, rdb$field_name from rdb$relation_fields where (rdb$relation_name = '+QuotedStr(UpperCase(aTable))+' AND rdb$field_name = '+QuotedStr(UpperCase(aCampo))+' and rdb$SYSTEM_FLAG = 0) ))'+' then execute statement '+'''ALTER TABLE '+aTable+' ADD '+aCampo+' '+aTipoCampo+''''+';'+' END'); ExecutaSQL('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLAlterColumn(aTable, aCampo, aToCampo: String); begin ExecutaSQL('EXECUTE block as BEGIN if (EXISTS (Select rdb$relation_name, rdb$field_name from rdb$relation_fields where (rdb$relation_name = '+QuotedStr(UpperCase(aTable))+' AND rdb$field_name = '+QuotedStr(UpperCase(aCampo))+' and rdb$SYSTEM_FLAG = 0) ))'+' then execute statement '+'''ALTER TABLE '+aTable+' ALTER '+aCampo+' TO '+aToCampo+''''+';'+' END'); ExecutaSQL('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLAlterType(aTable, aCampo, aTipoCampo: String); begin ExecutaSQL('EXECUTE block as BEGIN if (EXISTS (Select rdb$relation_name, rdb$field_name from rdb$relation_fields where (rdb$relation_name = '+QuotedStr(UpperCase(aTable))+' AND rdb$field_name = '+QuotedStr(UpperCase(aCampo))+' and rdb$SYSTEM_FLAG = 0) ))'+' then execute statement '+'''ALTER TABLE '+aTable+' ALTER '+aCampo+' TYPE '+aTipoCampo+''''+';'+' END'); ExecutaSQL('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLDropGenerator(aGenerator: String); begin ExecutaSQLDirect('EXECUTE block as BEGIN if (EXISTS (Select rdb$generator_name from rdb$generators where (rdb$generator_name = '+QuotedStr(UpperCase(aGenerator))+') ))'+' then execute statement '+'''DROP GENERATOR '+aGenerator+''''+';'+' END'); ExecutaSQLDirect('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLDropIndex(aNameIndex: String); begin ExecutaSQLDirect('EXECUTE block as BEGIN if (EXISTS (Select rdb$index_name from rdb$indices where (rdb$index_name = '+QuotedStr(UpperCase(aNameIndex))+') ))'+' then execute statement '+'''DROP INDEX '+aNameIndex+''''+';'+' END'); ExecutaSQLDirect('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLCreateIndex(aNameIndex, aTable: String; aCampo : String); begin ExecutaSQLDirect('EXECUTE block as BEGIN if (NOT EXISTS (Select rdb$index_name from rdb$indices where (rdb$index_name = '+QuotedStr(UpperCase(aNameIndex))+') ))'+' then execute statement '+'''CREATE INDEX '+UpperCase(aNameIndex)+' ON '+UpperCase(aTable)+'( '+UpperCase(aCampo)+' )'+''''+';'+' END'); ExecutaSQLDirect('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLCreateGenerator(aGenerator: String); begin ExecutaSQLDirect('EXECUTE block as BEGIN if (NOT EXISTS (Select rdb$generator_name from rdb$generators where (rdb$generator_name = '+QuotedStr(UpperCase(aGenerator))+') ))'+' then execute statement '+'''CREATE GENERATOR '+aGenerator+''''+';'+' END'); ExecutaSQLDirect('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLDropStoreProcedure(aProcedure: String); begin ExecutaSQLDirect('EXECUTE block as BEGIN if (EXISTS (Select rdb$procedure_name from rdb$procedures where (rdb$procedure_name = '+QuotedStr(UpperCase(aProcedure))+') ))'+' then execute statement '+'''DROP PROCEDURE '+aProcedure+''''+';'+' END'); ExecutaSQLDirect('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLCreateStoreProcedure(aProcedure, aSQL: String); begin ExecutaSQLDirect('EXECUTE block as BEGIN if (NOT EXISTS (Select rdb$procedure_name from rdb$procedures where (rdb$procedure_name = '+QuotedStr(UpperCase(aProcedure))+') ))'+' then execute statement '+QuotedStr(aSQL)+';'+' END'); ExecutaSQLDirect('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLCreateTable(aTable, aSQL: String); begin ExecutaSQLDirect('EXECUTE block as BEGIN if (NOT EXISTS (Select rdb$relation_name from rdb$relations where (rdb$relation_name = '+QuotedStr(UpperCase(aTable))+' and rdb$SYSTEM_FLAG = 0) ))'+' then execute statement '+QuotedStr(aSQL)+';'+' END'); ExecutaSQLDirect('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLCreateView(aView : String; aSQL : String); begin ExecutaSQLDirect('EXECUTE block as BEGIN if (NOT EXISTS (Select rdb$relation_name from rdb$relations where (rdb$relation_name = '+QuotedStr(UpperCase(aView))+' and rdb$SYSTEM_FLAG = 0) ))'+' then execute statement '+QuotedStr(aSQL)+' ;'+' END'); ExecutaSQLDirect('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLDirect(aValue: String); begin try Datamodule_Atualizacao.SQLConnection1.ExecuteDirect(aValue); except on E: Exception do begin Showmessage('Ocorreu um Erro ao Atualizar o Banco de Dados: '+E.ToString); Showmessage('Comando SQL: '+aValue); Application.Terminate; end; end; end; procedure TUpdateDataBase.ExecutaSQLDropColumn(aTabela, aCampo: String); begin ExecutaSQL('EXECUTE block as BEGIN if (EXISTS (Select rdb$relation_name, rdb$field_name from rdb$relation_fields where (rdb$relation_name = '+QuotedStr(UpperCase(aTabela))+' AND rdb$field_name = '+QuotedStr(UpperCase(aCampo))+' and rdb$SYSTEM_FLAG = 0) ))'+' then execute statement '+'''ALTER TABLE '+aTabela+' DROP '+aCampo+''''+';'+' END'); ExecutaSQL('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLDropTable(aTable: String); begin ExecutaSQL('EXECUTE block as BEGIN if (EXISTS (Select rdb$relation_name from rdb$relations where (rdb$relation_name = '+QuotedStr(UpperCase(aTable))+' and rdb$SYSTEM_FLAG = 0) ))'+' then execute statement '+'''DROP TABLE '+aTable+''''+';'+' END'); ExecutaSQL('COMMIT WORK'); end; procedure TUpdateDataBase.ExecutaSQLDropView(aView: String); begin ExecutaSQL('EXECUTE block as BEGIN if (EXISTS (Select rdb$relation_name from rdb$relations where (rdb$relation_name = '+QuotedStr(UpperCase(aView))+' and rdb$SYSTEM_FLAG = 0) ))'+' then execute statement '+'''DROP VIEW '+aView+''''+';'+' END'); ExecutaSQL('COMMIT WORK'); end; procedure TUpdateDataBase.MostrarVersaoBD; begin Showmessage('Atualização De Banco de Dados Efetuada - Versao: '+intToStr(Datamodule_Atualizacao.SDS_Confere.FieldByName('VERSAO_BD').Value) ); end; class function TUpdateDataBase.New: iUpdateDataBase; begin Result := Self.Create; end; function TUpdateDataBase.UpdateBD: iUpdateDataBase; begin if FVersaoBD = 0 then begin Update_0_To_1; end; if FVersaoBD = 1 then begin Update_1_To_2; end; end; function TUpdateDataBase.Versao(aValue: Integer): iUpdateDataBase; begin Result := Self; FVersaoBD := aValue; end; end.