Beispiel #1
0
        public static void Listar_Dicionario(string Conexao, string TABELA)
        {
            try
            {
                if (SysDAL.ListaSysDicionario.Exists(s => s.Nome_Tabela == TABELA))
                {
                    return;
                }
                else
                {
                    SqlDataReader dtr = null;
                    //Recupera as informações do dicionário das colunas referente a tabela da classe DTO,popula o objeto ListaSysDicionario e o adciona na lista ListaSysDicionario.
                    using (SqlConnection scn = new SqlConnection(Conexao))
                    {
                        try
                        {
                            scn.Open();
                            string     sql = "SELECT ID, NOME_TABELA, NOME_COLUNA, DESCRICAO_COLUNA FROM SYS_DICIONARIO WHERE  (NOME_TABELA = '" + TABELA + "')";
                            SqlCommand scm = new SqlCommand(sql, scn);
                            dtr = scm.ExecuteReader();

                            while (dtr.Read())
                            {
                                Sys_DicionarioDTO sysdicionarioDTO = new Sys_DicionarioDTO();
                                sysdicionarioDTO.Descricao_Coluna = dtr["DESCRICAO_COLUNA"].ToString();
                                sysdicionarioDTO.Nome_Coluna      = dtr["NOME_COLUNA"].ToString();
                                sysdicionarioDTO.Nome_Tabela      = dtr["NOME_TABELA"].ToString();
                                sysdicionarioDTO.Id = Convert.ToInt32(dtr["id"]);

                                SysDAL.ListaSysDicionario.Add(sysdicionarioDTO);
                            }
                        }
                        catch (SqlException ex)
                        {
                            throw ex;
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                        finally
                        {
                            if (dtr != null)
                            {
                                dtr.Close();
                            }
                            scn.Close();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Beispiel #2
0
        /// <summary>
        /// Método para gravar o histórico de alterações realizadas pelos usuários do sistema nas tabelas do banco de dados.
        /// </summary>
        /// <param name="ClasseDTO">Uma classe DTO que representa a tabela que foi alterada.</param>
        /// <param name="Conexao">Uma string de conexão com o bando de dados</param>
        /// <returns>Retorna true caso o histórico seja gravado com sucesso,e false caso ocorra algum problema durante a gravação do histórico.</returns>
        /// <remarks>Este método só aceita classes que implementaram a Interface IDTO.</remarks>
        public static bool Grava_Historico(IDTO ClasseDTO, string Conexao, string USUARIO, string CamposAdcionais = null, bool Backup = false, SqlCommand scm = null)
        {
            try
            {
                //String que será populada com os campos e valores alterados.
                StringBuilder sbHistorico = new StringBuilder();

                bool GravaCampo    = false;
                bool Alterou_Filha = false;

                //Adciona no Histórico campos adcionais se houver algum
                if (Backup == false & CamposAdcionais != null && CamposAdcionais.Trim() != "")
                {
                    sbHistorico.Append(CamposAdcionais + "|");
                }

                Object backupDTO = null;

                if (SysDTO.BackupsDTO.Exists(s => s.ID_CLASSE == ClasseDTO.ID_CLASSE) == true)
                {
                    //Recupera a classe DTO que foi copiada,essa classe contém os dados originais da tabela antes de serem alterados.
                    backupDTO = SysDTO.BackupsDTO.Single(s => s.ID_CLASSE == ClasseDTO.ID_CLASSE);
                }
                else
                {
                    return(false);
                }

                SysDTO.BackupsDTO.Remove((IDTO)backupDTO);

                //Cria um objeto HistoricoDTO que será populado com os dados da classe DTO copiada.
                HistoricoDTO dtoHistorico = new HistoricoDTO();

                dtoHistorico.TABELA = ClasseDTO.NOME_TABELA;

                //Lista o dicionário de campos,se já existir na lista não faz consulta no banco de dados.
                Listar_Dicionario(Conexao, ClasseDTO.NOME_TABELA);

                string   strUsuarioAnterior = "";
                DateTime dtDataAnterior     = DateTime.Today;

                //Esta variável será usada para guardar o número de campos da tabela que foram alterados pelo Usuário do Sistema.
                int intContagem = 0;

                //Pecorre todas as propriedade da Classe DTO para fazer verificação e comparação entre os dados da classe copiada e a classe atual.
                foreach (PropertyInfo propinfo in backupDTO.GetType().GetProperties())
                {
                    //Recupera o Id referente ao campo chave primária definido na tabela.
                    if (propinfo.Name.ToUpper() == "ID")
                    {
                        dtoHistorico.ID_REGISTRO = Convert.ToInt32(propinfo.GetValue(backupDTO, null));
                    }

                    //Data da última alteração realizada na tabela antes de ser alterada.
                    if (propinfo.Name.ToUpper() == "ULT_ATUAL")
                    {
                        dtDataAnterior = Convert.ToDateTime(propinfo.GetValue(backupDTO, null));
                    }
                    //Recupera o Usuário anterior e o Usuário Atual que alteraram dados na tabela.
                    if (propinfo.Name.ToUpper() == "USUARIO")
                    {
                        dtoHistorico.USUARIO = USUARIO;
                        //Usuário Anterior.
                        strUsuarioAnterior = propinfo.GetValue(backupDTO, null).ToString().Trim();
                    }

                    //***********************
                    //Faz histórico das classes filhas dentro de uma lista.
                    try
                    {
                        if (propinfo.PropertyType.GetGenericArguments().Count() > 0)
                        {
                            if (propinfo.PropertyType.GetGenericArguments()[0].GetInterfaces().ToList().Exists(s => s.Name == "IDTO"))
                            {
                                System.Collections.IList lista = (System.Collections.IList)propinfo.GetValue(ClasseDTO, null);

                                foreach (object obj in lista)
                                {
                                    PropertyInfo[] lista_prop  = obj.GetType().GetProperties();
                                    string         strAdcional = "";

                                    foreach (PropertyInfo prop in lista_prop)
                                    {
                                        if (prop.GetCustomAttributes(typeof(Historico_AtributosDTO), true).Length > 0)
                                        {
                                            strAdcional += prop.Name + "=" + (prop.GetValue(obj, null) == null ? "[Nulo]" : prop.GetValue(obj, null).ToString()) + "|";
                                        }
                                    }

                                    if (strAdcional.Length > 0)
                                    {
                                        Grava_Historico((IDTO)obj, Conexao, strAdcional.Substring(0, strAdcional.Length - 1));
                                    }
                                    else
                                    {
                                        Grava_Historico((IDTO)obj, Conexao, USUARIO);
                                    }
                                    if (((IDTO)obj).OPERACAO != SysDTO.Operacoes.Leitura)
                                    {
                                        Alterou_Filha = true;
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }

                    //***********************

                    //Recupera o valor anterior do campo na classe DTO que foi copiada.
                    string strValorAnterior = (propinfo.GetValue(backupDTO, null) == null ? "[Nulo]" : propinfo.GetValue(backupDTO, null).ToString());
                    //Recupera o valor na classe DTO atual.
                    string strValorAtual = (propinfo.GetValue(ClasseDTO, null) == null ? "[Nulo]" : propinfo.GetValue(ClasseDTO, null).ToString());

                    if (strValorAnterior.Trim() == "")
                    {
                        strValorAnterior = "[vazio]";
                    }
                    if (strValorAtual.Trim() == "")
                    {
                        strValorAtual = "[vazio]";
                    }

                    //Verifica se há alteração no campo
                    if (propinfo.GetValue(backupDTO, null) != null && (propinfo.GetValue(backupDTO, null).GetType() == typeof(decimal) | propinfo.GetValue(backupDTO, null).GetType() == typeof(double)))
                    {
                        decimal?valor1 = Convert.ToDecimal((strValorAnterior == "[Nulo]" ? null : strValorAnterior));
                        decimal?valor2 = Convert.ToDecimal((strValorAtual == "[Nulo]" ? null : strValorAtual));

                        if (valor1 != valor2)
                        {
                            GravaCampo = true;
                        }
                        else
                        {
                            GravaCampo = false;
                        }
                    }
                    else
                    {
                        if (strValorAnterior != strValorAtual)
                        {
                            GravaCampo = true;
                        }
                        else
                        {
                            GravaCampo = false;
                        }
                    }

                    //Se Backup = true irá fazer histórico de todos os campos exceto os que foram marcados com o atributo Historico_AtributosDTO.Gravavel = false
                    if (Backup == true)
                    {
                        GravaCampo = true;
                    }

                    //Verifica se o campo foi marcado com algum atributo personalizado
                    object[] atributos = propinfo.GetCustomAttributes(typeof(Historico_AtributosDTO), true);

                    foreach (Historico_AtributosDTO atrib in atributos)
                    {
                        //Verifica se o campo foi marcado como não gravável.
                        if (atrib.Atributo == SysDTO.Enum_Historico_Atributos.Gravavel)
                        {
                            GravaCampo = (bool)atrib.Valor;
                        }
                        if (atrib.Atributo == SysDTO.Enum_Historico_Atributos.Imagem)
                        {
                            GravaCampo = false;
                        }
                    }

                    //Recupera o valor anterior se o valor atual e o valor anterior forem diferentes,ou seja,se houve alteração nos dados.
                    if (GravaCampo == true)
                    {
                        //Recupera o dicionário do campo na lista de dicionários: ListaSysDicionario.
                        //Linq to Object: Usado para localizar o dicionário do campo dentro da lista: ListaSysDicionario.
                        //Se existir dicionário para o campo será gravado a descrição da coluna,caso contrário será usado o própio nome da propriedade na Classe DTO.
                        //Os campos da classe DTO: OPERACAO,ULT_ATUAL e USUARIO não serão gravados no histórico.
                        if (propinfo.Name.ToUpper() != "OPERACAO" & propinfo.Name.ToUpper() != "ULT_ATUAL" & propinfo.Name.ToUpper() != "USUARIO")
                        {
                            if (ListaSysDicionario.Exists(s => s.Nome_Tabela == ClasseDTO.NOME_TABELA & s.Nome_Coluna.ToUpper() == propinfo.Name.ToUpper()))
                            {
                                //Recupera a descrição da coluna no dicionário.
                                Sys_DicionarioDTO sysdicionarioDTO = ListaSysDicionario.Single(s => s.Nome_Tabela == ClasseDTO.NOME_TABELA & s.Nome_Coluna.ToUpper() == propinfo.Name.ToUpper());
                                //Adciona na StringBuilder a descrição da coluna e o valor anterior do campo alterado.
                                sbHistorico.Append(sysdicionarioDTO.Descricao_Coluna + " = " + strValorAnterior.Replace("|", ":") + "|");
                            }
                            else
                            {
                                //Adciona na StringBuilder o nome da propriedade da Classe DTO e o valor anterior do campo alterado.
                                sbHistorico.Append(propinfo.Name + "=" + strValorAnterior.Replace("|", ":") + "|");
                            }

                            //Adiciona +1 na contagem de campos que foram alterados.
                            intContagem++;
                        }
                    }
                }

                //Se não houve alteração nos dados
                if (intContagem == 0)
                {
                    dtoHistorico.ASSUNTO = "Dados registrados sem alteração.";

                    //Não grava histórico das classes filhas que não foram alteradas
                    if (ClasseDTO.OPERACAO == SysDTO.Operacoes.Leitura)
                    {
                        return(false);
                    }
                    //Se não alterou filha não faz nada
                    if (Alterou_Filha == true)
                    {
                        return(false);
                    }
                }
                else //Se houve alteração nos dados informa o número de campos que foram alterados
                {
                    if (Backup == true)
                    {
                        dtoHistorico.ASSUNTO = CamposAdcionais;
                    }
                    else
                    {
                        if (intContagem == 1)
                        {
                            dtoHistorico.ASSUNTO = intContagem + " registro alterado.";
                        }
                        else
                        {
                            dtoHistorico.ASSUNTO = intContagem + " registros alterados.";
                        }
                    }
                }

                //Grava o usuário e a data anterior às alterações.
                sbHistorico.Append("USUARIO Anterior=" + strUsuarioAnterior + "|");
                sbHistorico.Append("Data Anterior=" + dtDataAnterior.ToString("dd/MM/yyyy HH:mm:ss") + "|");

                //Seta os campos que foram alterados.
                dtoHistorico.HISTORICO = sbHistorico.ToString();

                //Grava no banco de dados o histórico dos campos que foram alterados.
                using (SqlConnection scn = new SqlConnection(Conexao))
                {
                    try
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.Append("INSERT INTO [LOG_SISTEMA]([ID_REGISTRO],[ASSUNTO],[HISTORICO],[USUARIO],[DATAHORA],[TABELA])");
                        sb.Append(" VALUES (@ID_REGISTRO,@ASSUNTO,@HISTORICO,@USUARIO,GETDATE(), @TABELA);SELECT SCOPE_IDENTITY();");

                        //No caso de um comando não fazer parte de uma begin transaction abre uma nova conexão
                        if (scm == null)
                        {
                            scm = new SqlCommand(sb.ToString(), scn);
                            scn.Open();
                        }

                        scm.Parameters.AddWithValue("@ID_REGISTRO", dtoHistorico.ID_REGISTRO);
                        scm.Parameters.AddWithValue("@ASSUNTO", dtoHistorico.ASSUNTO);
                        scm.Parameters.AddWithValue("@HISTORICO", dtoHistorico.HISTORICO);
                        scm.Parameters.AddWithValue("@USUARIO", dtoHistorico.USUARIO);
                        scm.Parameters.AddWithValue("@TABELA", dtoHistorico.TABELA);

                        dtoHistorico.ID = Convert.ToInt32(scm.ExecuteScalar());
                    }
                    catch (SqlException ex)
                    {
                        throw ex;
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        scn.Close();
                    }
                }

                return(true);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }