{"id":2163,"date":"2026-08-24T11:39:17","date_gmt":"2026-08-24T14:39:17","guid":{"rendered":"https:\/\/code4delphi.com.br\/blog\/?p=2163"},"modified":"2026-08-24T14:01:29","modified_gmt":"2026-08-24T17:01:29","slug":"master-detail-no-delphi-com-firedac","status":"publish","type":"post","link":"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/","title":{"rendered":"Master-Detail no Delphi com FireDAC: vinculando dois DataSets"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">O relacionamento Master-Detail \u00e9 muito utilizado em sistemas para apresentar dados que possuem uma rela\u00e7\u00e3o de depend\u00eancia. Alguns exemplos comuns s\u00e3o pedidos e seus itens, clientes e seus endere\u00e7os ou notas fiscais e seus produtos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste artigo, veremos como configurar esse relacionamento no Delphi utilizando o FireDAC. O foco principal ser\u00e1 o v\u00ednculo entre os dois DataSets, feito com apenas tr\u00eas propriedades.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O projeto completo utilizado neste exemplo est\u00e1 dispon\u00edvel no GitHub: <a href=\"https:\/\/github.com\/Code4Delphi\/Master-Detail\" target=\"_blank\" rel=\"noopener\">Code4Delphi\/Master-Detail \u2014 Master Detail Delphi<\/a><\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_81 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title ez-toc-toggle\" style=\"cursor:pointer\">Sum\u00e1rio<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Alternar tabela de conte\u00fado\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#O_que_e_um_relacionamento_Master-Detail\" >O que \u00e9 um relacionamento Master-Detail?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#Componentes_utilizados\" >Componentes utilizados<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#%F0%9F%93%8D_Configurando_o_vinculo_Master-Detail_%F0%9F%93%8D\" >\ud83d\udccd Configurando o v\u00ednculo Master-Detail \ud83d\udccd<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#MasterSource\" >MasterSource<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#MasterFields\" >MasterFields<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#IndexFieldNames\" >IndexFieldNames<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#Como_o_vinculo_funciona_durante_a_navegacao\" >Como o v\u00ednculo funciona durante a navega\u00e7\u00e3o<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#Inserindo_os_dados_de_demonstracao\" >Inserindo os dados de demonstra\u00e7\u00e3o<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#Ordem_de_inicializacao\" >Ordem de inicializa\u00e7\u00e3o<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#%E2%AD%90_Relacionamentos_com_mais_de_um_campo\" >\u2b50 Relacionamentos com mais de um campo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/code4delphi.com.br\/blog\/master-detail-no-delphi-com-firedac\/#%E2%AC%87%EF%B8%8F_Download_do_exemplo\" >\u2b07\ufe0f Download do exemplo<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"O_que_e_um_relacionamento_Master-Detail\"><\/span>O que \u00e9 um relacionamento Master-Detail?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No relacionamento Master-Detail, um registro do DataSet mestre pode estar relacionado a v\u00e1rios registros do DataSet detalhe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No exemplo deste artigo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>FDMemTableMaster <\/strong>representa os registros mestres;<\/li>\n\n\n\n<li><strong>FDMemTableDetail <\/strong>armazena os registros de detalhe;<\/li>\n\n\n\n<li>o campo <strong>FDMemTableMaster.Id<\/strong> identifica o registro mestre;<\/li>\n\n\n\n<li>o campo <strong>FDMemTableDetail.id_master<\/strong> informa a qual registro mestre cada detalhe pertence.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Assim, quando o usu\u00e1rio navega pelos registros do mestre, o FireDAC apresenta automaticamente apenas os detalhes relacionados ao registro atual.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Componentes_utilizados\"><\/span>Componentes utilizados<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O formul\u00e1rio do exemplo possui dois <strong>TFDMemTable<\/strong>, dois <strong>TDataSource<\/strong> e dois <strong>TDBGrid<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"510\" height=\"412\" src=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/image-12.png\" alt=\"\" class=\"wp-image-2171\" srcset=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/image-12.png 510w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/image-12-300x242.png 300w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FDMemTableMaster \u2192 DataSourceMaster \u2192 DBGrid1;<\/li>\n\n\n\n<li>FDMemTableDetail \u2192 DataSourceDetail \u2192 DBGrid2.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Os dados s\u00e3o criados em mem\u00f3ria apenas para facilitar a demonstra\u00e7\u00e3o. O mesmo conceito pode ser aplicado a outros DataSets do FireDAC, de acordo com a estrat\u00e9gia utilizada para carregar os dados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%93%8D_Configurando_o_vinculo_Master-Detail_%F0%9F%93%8D\"><\/span>\ud83d\udccd Configurando o v\u00ednculo Master-Detail \ud83d\udccd<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O ponto principal do exemplo est\u00e1 no m\u00e9todo ConfigurarVinculoMasterDetail:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>procedure TMasterDetailView.ConfigurarVinculoMasterDetail;\nbegin  \n  FDMemTableDetail.MasterSource := DataSourceMaster;\n  FDMemTableDetail.MasterFields := 'Id';\n  FDMemTableDetail.IndexFieldNames := 'id_master';\nend;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">procedure<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">TMasterDetailView.ConfigurarVinculoMasterDetail<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">begin<\/span><span style=\"color: #F6F6F4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  FDMemTableDetail.MasterSource := DataSourceMaster;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  FDMemTableDetail.MasterFields := <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">Id<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  FDMemTableDetail.IndexFieldNames := <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">id_master<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">end<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Estamos definindo as propriedades via c\u00f3digo, mas voc\u00ea tamb\u00e9m pode fazer isso de forma RAD, diretamente pelo Object Inspector.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"MasterSource\"><\/span>MasterSource<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>FDMemTableDetail.MasterSource := DataSourceMaster;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">FDMemTableDetail.MasterSource := DataSourceMaster;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A propriedade <strong>MasterSource <\/strong>pertence ao DataSet detalhe. Ela indica qual <strong>TDataSource<\/strong> fornece o registro mestre atual.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como <strong>DataSourceMaster <\/strong>est\u00e1 conectado ao <strong>FDMemTableMaster<\/strong>, o FireDAC consegue acompanhar a navega\u00e7\u00e3o realizada no DataSet mestre.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"MasterFields\"><\/span>MasterFields<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>FDMemTableDetail.MasterFields := 'Id';<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">FDMemTableDetail.MasterFields := <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">Id<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A propriedade <strong>MasterFields <\/strong>informa qual campo do DataSet mestre ser\u00e1 relacionado ao campo definido em <strong>IndexFieldNames <\/strong>no detalhe.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"IndexFieldNames\"><\/span>IndexFieldNames<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>FDMemTableDetail.IndexFieldNames := 'id_master';<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">FDMemTableDetail.IndexFieldNames := <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">id_master<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A propriedade <strong>IndexFieldNames <\/strong>\u00e9 configurada no DataSet detalhe e informa qual campo ser\u00e1 utilizado para localizar e organizar os registros relacionados ao mestre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste exemplo, <strong>id_master <\/strong>funciona como a chave de liga\u00e7\u00e3o dentro de <strong>FDMemTableDetail<\/strong>. Cada registro de detalhe possui nesse campo o <strong>Id <\/strong>do respectivo registro mestre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Portanto, o v\u00ednculo deste exemplo pode ser representado da seguinte forma:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>DataSet mestre<\/th><th>DataSet detalhe<\/th><\/tr><tr><td>FDMemTableMaster.Id<\/td><td>FDMemTableDetail.id_master<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Em outras palavras, o FireDAC mant\u00e9m vis\u00edveis no detalhe somente os registros em que <strong>id_master <\/strong>possui o mesmo valor do campo <strong>Id <\/strong>do registro mestre atual.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Como_o_vinculo_funciona_durante_a_navegacao\"><\/span>Como o v\u00ednculo funciona durante a navega\u00e7\u00e3o<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine que o registro atual de <strong>FDMemTableMaster <\/strong>possui <strong>Id = 5<\/strong>. O FireDAC utiliza esse valor para selecionar, em <strong>FDMemTableDetail<\/strong>, somente os registros cujo campo <strong>id_master <\/strong>tamb\u00e9m seja igual a <strong>5<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ao navegar para o mestre de <strong>Id = 6<\/strong>, o conte\u00fado apresentado no <strong>DBGrid2 <\/strong>\u00e9 atualizado automaticamente. N\u00e3o \u00e9 necess\u00e1rio percorrer os registros manualmente nem aplicar um novo filtro a cada altera\u00e7\u00e3o do registro mestre.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Inserindo_os_dados_de_demonstracao\"><\/span>Inserindo os dados de demonstra\u00e7\u00e3o<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O m\u00e9todo <strong>InserirDadosTemp <\/strong>cria os dois DataSets em mem\u00f3ria e adiciona os registros utilizados no exemplo:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>FDMemTableMaster.CreateDataSet;\nFDMemTableDetail.CreateDataSet;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">FDMemTableMaster.CreateDataSet;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">FDMemTableDetail.CreateDataSet;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Para cada registro mestre, o c\u00f3digo gera de tr\u00eas a dez registros de detalhe. O valor de <strong>LMasterId <\/strong>\u00e9 gravado no campo <strong>id_master<\/strong>, estabelecendo a rela\u00e7\u00e3o entre eles:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>FDMemTableDetail.AppendRecord(&#91;LDetailId, LMasterId, LQuantidade, LUnitario, LDetailTotal&#93;);<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">FDMemTableDetail.AppendRecord(&#91;LDetailId, LMasterId, LQuantidade, LUnitario, LDetailTotal&#93;);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Depois de inserir os detalhes, o registro mestre \u00e9 adicionado com seu identificador e valor total:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>FDMemTableMaster.AppendRecord(&#91;LMasterId, LMasterTotal&#93;);<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">FDMemTableMaster.AppendRecord(&#91;LMasterId, LMasterTotal&#93;);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Ordem_de_inicializacao\"><\/span>Ordem de inicializa\u00e7\u00e3o<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No evento <strong>OnCreate <\/strong>do formul\u00e1rio, os dados s\u00e3o criados antes da configura\u00e7\u00e3o do relacionamento:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>procedure TMasterDetailView.FormCreate(Sender: TObject);\nbegin\n  Self.InserirDadosTemp;\n  Self.ConfigurarVinculoMasterDetail;\nend;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">procedure<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">TMasterDetailView.FormCreate<\/span><span style=\"color: #F6F6F4\">(Sender: TObject);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  Self.InserirDadosTemp;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  Self.ConfigurarVinculoMasterDetail;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">end<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Essa ordem garante que os <strong>TFDMemTable <\/strong>j\u00e1 estejam criados e com seus campos dispon\u00edveis quando o v\u00ednculo for configurado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E2%AD%90_Relacionamentos_com_mais_de_um_campo\"><\/span>\u2b50 Relacionamentos com mais de um campo<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Caso o relacionamento utilize uma chave composta, os campos podem ser informados separados por ponto e v\u00edrgula e na mesma ordem:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>FDMemTableDetail.IndexFieldNames := 'id_empresa;id_pedido';\nFDMemTableDetail.MasterSource := DataSourceMaster;\nFDMemTableDetail.MasterFields := 'id_empresa;id';<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">FDMemTableDetail.IndexFieldNames := <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">id_empresa;id_pedido<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">FDMemTableDetail.MasterSource := DataSourceMaster;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">FDMemTableDetail.MasterFields := <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">id_empresa;id<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Nesse cen\u00e1rio, <strong>id_empresa <\/strong>do detalhe corresponde a <strong>id_empresa <\/strong>do mestre, enquanto <strong>id_pedido <\/strong>corresponde a <strong>id<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E2%AC%87%EF%B8%8F_Download_do_exemplo\"><\/span>\u2b07\ufe0f Download do exemplo<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Baixe o projeto, execute o exemplo e navegue pelos registros do primeiro grid para acompanhar a atualiza\u00e7\u00e3o autom\u00e1tica dos detalhes:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/Code4Delphi\/Master-Detail\" target=\"_blank\" rel=\"noopener\">Acessar o exemplo Master-Detail no GitHub<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/master-detalhe-delphi-1024x576.png\" alt=\"\" class=\"wp-image-2180\" srcset=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/master-detalhe-delphi-1024x576.png 1024w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/master-detalhe-delphi-300x169.png 300w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/master-detalhe-delphi-768x432.png 768w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/master-detalhe-delphi-919x517.png 919w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/master-detalhe-delphi-920x518.png 920w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/master-detalhe-delphi-1536x864.png 1536w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/08\/master-detalhe-delphi.png 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>O relacionamento Master-Detail \u00e9 muito utilizado em sistemas para apresentar dados que possuem uma rela\u00e7\u00e3o de&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"footnotes":""},"categories":[22,1],"tags":[60,178,177],"class_list":["post-2163","post","type-post","status-publish","format-standard","hentry","category-dicas","category-geral","tag-delphi","tag-master-detail-delphi","tag-master-detalhe"],"_links":{"self":[{"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/posts\/2163","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/comments?post=2163"}],"version-history":[{"count":15,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/posts\/2163\/revisions"}],"predecessor-version":[{"id":2182,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/posts\/2163\/revisions\/2182"}],"wp:attachment":[{"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/media?parent=2163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/categories?post=2163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/tags?post=2163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}