﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>StrataFrame Forum » StrataFrame Application Framework - V1 » Business Objects and Data Access (How do I?)  » Integridade Referencial</title><generator>InstantForum 2017-1 Final</generator><description>StrataFrame Forum</description><link>http://forum.strataframe.net/</link><webMaster>StrataFrame Forum</webMaster><lastBuildDate>Sat, 30 May 2026 12:34:33 GMT</lastBuildDate><ttl>20</ttl><item><title>Integridade Referencial</title><link>http://forum.strataframe.net/FindPost29389.aspx</link><description>Eu preciso adicionar algumas restrições de integridade para impedir que sejam deletados registros que sejam chaves estrangeiras em outras tabelas. Até aí tudo bem no Deployment Database&amp;nbsp;do SF é moleza!&lt;br/&gt;&lt;br/&gt;Mas como capturar as excessões causadas por essa excessão e tratá-las mostrando uma mensagem mais amigavel ao usuário Final, sem que apareceça aquela tela do SF de tarja vermelha que parece&amp;nbsp;que o "mundo vai acabar".&lt;br/&gt;&lt;br/&gt;Não achei uma maneira até agora.&amp;nbsp;</description><pubDate>Mon, 25 Apr 2011 09:05:15 GMT</pubDate><dc:creator>Marcio Valerio Silva</dc:creator></item><item><title>RE: Integridade Referencial</title><link>http://forum.strataframe.net/FindPost29917.aspx</link><description>Que é isto! De nada, não é incômodo nenhum. &lt;br/&gt;&lt;br/&gt;Vai postando que a gente vai tentando ajudar. Uma dica, se conseguir postar em Inglês, mesmo que seja usando aqueles tradutores do Google, a sua pergunta poderá ser lida por todo mundo. Às vezes eu não estou aqui no momento e então outra pessoa pode tentar te ajudar também. Mas se não se sentir à vontade para isto, pode ir colocando em Português que sempre que dá eu entro e tento responder.&lt;br/&gt;&lt;br/&gt;Abração.</description><pubDate>Mon, 25 Apr 2011 09:05:15 GMT</pubDate><dc:creator>Ivan George Borges</dc:creator></item><item><title>RE: Integridade Referencial</title><link>http://forum.strataframe.net/FindPost29916.aspx</link><description>Ola Ivan,&lt;br/&gt;&lt;br/&gt;Muito Obrigado por enquanto, gostei da informação de envio da mensagem para o e-mail. Vou adotar algo parecido aqui.&lt;br/&gt;&lt;br/&gt;Desculpe incomodar, mas foi necessário nesse momento.&lt;br/&gt;&lt;br/&gt;Até mais.</description><pubDate>Mon, 25 Apr 2011 07:58:30 GMT</pubDate><dc:creator>Marcio Valerio Silva</dc:creator></item><item><title>RE: Integridade Referencial</title><link>http://forum.strataframe.net/FindPost29914.aspx</link><description>Olá Márcio.&lt;br/&gt;&lt;br/&gt;Primeiro, se você estiver procurando lidar com a mensagem de excessão, como eu te disse, deveria dar uma olhada no UnhandledExceptionFound no seu Program.cs. Neste ponto, você pode capturar a mensagem e lidar com ela como quiser. Eu, por exemplo, monto um form onde coloco a mensagem que foi capturada e um diálogo com o usuário tentando traduzir o que aconteceu. Além disto, mando automaticamente esta mensagem para nosso email de suporte, com identificação do erro e quando e onde ocorreu. Se der uma olhada no Help, vai encontrar explicação sobre isto em Application Framework -&amp;gt; Application -&amp;gt; WinForms -&amp;gt; Appmain.vb (program.cs) File -&amp;gt; UnhandledExceptionFound().&lt;br/&gt;&lt;br/&gt;Quanto a lidar com a situação de não permitir uma exclusão caso o registro corrente já tenha sido utilizado como uma ForeignKey em outra tabela, o ideal seria que criasse um BusinessObject Base para sua aplicação e colocasse o código para lidar com isto no BeforeDelete do mesmo. Depois, deveria criar todos os seus BO herdando deste seu BaseBO.&lt;br/&gt;&lt;br/&gt;Nos seus forms, caso não queira que a mensagem de Exclusão apareça automaticamente, deveria configurá-los com AutoShowDeleteConfirmation = False. E mais uma vez, se espera ter isto como padrão em todos os seus forms, deveria criar um Form Base, configurar as propriedades que queira neste form e depois fazer com que todos os forms de sua aplicação herdem de seu BaseForm.&lt;br/&gt;&lt;br/&gt;No seu BaseBO, no BeforeDelete, a propriedade This.TableName te dirá em qual tabela o usuário está tentando excluir e a partir daí você pode testar nas outras tabelas onde este registro pode ter sido utilizado se existe a ForeignKey da tabela corrente, e em caso positivo, informar ao usuário inclusive onde foi usado. &lt;br/&gt;&lt;br/&gt;Então, se não foi usado, você mostra uma mensagem de confirmação de Exclusão, já que a automática foi desligada, e pega a resposta do cliente confirmando a Exclusão.&lt;br/&gt;&lt;br/&gt;No fim, se encontrou o registro usado em outra tabela ou se o usuário não confirmou a exclusão, você faz "e.Cancel = True", isto cancelará a exclusão.&lt;br/&gt;&lt;br/&gt;O BeforeDelete sempre será executado e é nele que você vai testar se o Delete realmente deve ser obedecido.</description><pubDate>Mon, 25 Apr 2011 07:31:48 GMT</pubDate><dc:creator>Ivan George Borges</dc:creator></item><item><title>RE: Integridade Referencial</title><link>http://forum.strataframe.net/FindPost29910.aspx</link><description>Olá Ivan!&lt;br/&gt;&lt;br/&gt;Olha o melhor que eu consegui até agora foi o seguinte:&lt;br/&gt;&lt;br/&gt;Criei um código no BO assim:&lt;br/&gt;&lt;br/&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;[quote]public string DeleteRegistroIR(int _id)&lt;br/&gt;{&lt;br/&gt;string _retorno = string.Empty;&lt;br/&gt;StringBuilder sqlBuilder = new StringBuilder();&lt;br/&gt;sqlBuilder.AppendFormat("Delete {0} where clientesId = {1}", this.TableName, _id.ToString());&lt;br/&gt;using (SqlCommand cmd = new SqlCommand())&lt;br/&gt;{&lt;br/&gt;cmd.CommandText = sqlBuilder.ToString();&lt;br/&gt;try&lt;br/&gt;{&lt;br/&gt;this.ExecuteNonQuery(cmd);&lt;br/&gt;}&lt;br/&gt;catch (SqlException ex)&lt;br/&gt;{&lt;br/&gt;_retorno = ex.Message;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;return _retorno;&lt;br/&gt;}[/quote]&lt;br/&gt;&lt;br/&gt;E adicioneu&amp;nbsp;no evento&amp;nbsp;&amp;nbsp;BeforeDelete para parar a execução da deleção do form conforme abaixo:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;&lt;font color=#0000ff size=2 face=Consolas&gt;[quote]private void frmClientes_BeforeDelete(MicroFour.StrataFrame.Business.BeforeDeleteEventArgs e)&lt;br/&gt;{ &lt;br/&gt;e.Cancel = true;&lt;br/&gt;string _mensagem = clientesBO1.DeleteRegistroIR(clientesBO1.ClientesId);&lt;br/&gt;if (!string.IsNullOrEmpty(_mensagem))&lt;br/&gt;{&lt;br/&gt;MessageBox.Show("Exclusão não Permitida! \n Há Informações Vinculadas em Outros Registros!", "", MessageBoxButtons.OK, MessageBoxIcon.Stop);&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;}[/quote]&lt;br/&gt;&lt;br/&gt;Desta forma quando o BO me retorna alguma mensagem informo o usuário que o registro&amp;nbsp;não será excluido, pois&amp;nbsp;existe informação em outra tabela relacionada.&lt;br/&gt;&lt;br/&gt;Outro problema é que desta forma eu não consegui separar a tabela que gerou o conflito afim de informar o usuário, para que mesmo assim ele queira excluir o registro ele possa excluir as informações de tabelas referenciadas e depoi concluir a exclusão.&lt;br/&gt;&lt;br/&gt;No código acima eu não gostei&amp;nbsp;que após a confimação de deleção mesmo se o usuário não confirmar&amp;nbsp;a deleção é excutado o evento BeforeDelete eu acredito que não deveria pois não foi confirmado a deleção pelo usuário.&lt;br/&gt;&lt;br/&gt;Por favor me passe a forma correta de executar este procedimento.&lt;br/&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;font size=2 face=Consolas&gt;&lt;font size=2 face=Consolas&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;</description><pubDate>Sun, 24 Apr 2011 16:39:12 GMT</pubDate><dc:creator>Marcio Valerio Silva</dc:creator></item><item><title>RE: Integridade Referencial</title><link>http://forum.strataframe.net/FindPost29904.aspx</link><description>Olá Ivan Ainda estou com uma dificuldade.&lt;br/&gt;&lt;br/&gt;Dentro do Form onde é que eu consigo pegar a string da excessão. Eu já tentei de diversas formas e até agora eu não consegui.&lt;br/&gt;&lt;br/&gt;Alguns clientes não aceitam muito bem a mensagem em ingles do banco de dados e eu realmente preciso fazer algo mais simplificado ao diaer ao cliente que é uma questão de integridade referencial e não um erro comum.&lt;br/&gt;&lt;br/&gt;Hoje aparece assim a mensagem: &lt;br/&gt;&lt;br/&gt;[quote]SqlException&lt;br/&gt;&amp;nbsp; The DELETE statement conflicted with the REFERENCE constraint "NovosTitulos". The conflict occurred in database "m2enterprise", table "dbo.RenegociacaoNovosTitulos", column 'CtaReceberId'.&lt;br/&gt;The statement has been terminated.[/quote]&lt;br/&gt;&lt;br/&gt;E eu gostaria simplesmente de mostrar a mensagem dizendo que trata-se de uma informação constante na tabela "xxxx" do banco de dados&lt;br/&gt;&lt;br/&gt;Se você puder me passar o meio eu agradeço muito!&lt;br/&gt;&lt;br/&gt;Um bom feriado e até mais.&lt;br/&gt;&lt;br/&gt;At,&lt;br/&gt;&lt;br/&gt;Marcio Valerio da Silva</description><pubDate>Thu, 21 Apr 2011 16:58:28 GMT</pubDate><dc:creator>Marcio Valerio Silva</dc:creator></item><item><title>RE: Integridade Referencial</title><link>http://forum.strataframe.net/FindPost29391.aspx</link><description>Dê uma olhada no seu AppMain.vb/Program.cs na Sub UnhandledExceptionFound.&lt;br/&gt;&lt;br/&gt;Lá você pode por exemplo setar e.Handled = True e manipular a excessão como desejar.</description><pubDate>Thu, 20 Jan 2011 07:40:42 GMT</pubDate><dc:creator>Ivan George Borges</dc:creator></item></channel></rss>