Fórum Mais dúvidas com Insert usando MestreDetalhe (DatasetField) #397508

18/03/2011

0

Seguinte outro probleminha foi identificado usando a estrutura mestre detalhe... quando fazemos uma inserção de um detalhe que já tenha um mestre criado e persistido no banco de dados ele funciona perfeitamente. Porém como os ID's são campos auto-incremento, quando inserimos o mestre e o detalhe juntos e enviamos o pacote para o servidor para ser persistido evidentemente ele não persiste o detalhe porque o mestre ainda não possui um identificador. Sabemos que teremos de fazer isso na mão mas alguém sabe se a embarcadeiro pensou em algo?
Desde já agradeço as colaborações!
Samuel Silva

Samuel Silva

Responder

Posts

18/03/2011

André Silveira

Para esse caso em específico não.

Pois segundo a Embarcadero, deve-se usar o mínimo de recursos do banco de dados, por isso você deverá implementar uma forma de retornar o código, pode ser por uma procedure no banco que incremente o código e atualize um tabela de códigos por exemplo.

Atenciosamente,

André Luis da Silveira.

Responder

Gostei + 0

18/03/2011

Marco Salles

Um modo elegante de contornar este problema é vc definir uma constante tipada que sera sempre decrementada a medida que for dando o insert na Tabela Mestre .. Assim , vc define na mão mesmo este valores . O valor negativo é para não ter duplicidade. Na hora que vc for de fato commitar . Os valores corretos da chave serão atulizados geralmente em uma consulta e é utilizado o UpdateRecord do TDataSetProvider   Um exemplo disso é este codigo   procedure TDm_Dados.dtsfornecedorBeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
  var Applied: Boolean);
{$J+}
const
  Id: Integer = -1;
{$J-}
begin   if (UpdateKind = ukInsert) then
  begin
    if (SourceDS = sqlfornecedor)  then
      begin
        if (DeltaDS.FieldByName('CHAVE_FORNECEDOR').Value < 0)  then
         begin
           Id := GenID('FORNECEDOR');
           DeltaDS.FieldByName('CHAVE_FORNECEDOR').NewValue := Id;
        end;
      end
    else
        if (SourceDS = sqlcontato)  then
          if (DeltaDS.FieldByName('CHAVE_CONTATO').Value < 0)  then
            begin
              if DeltaDS.FieldByName('CHAVE_FORNECEDOR').Value < 0 then
                  DeltaDS.FieldByName('CHAVE_FORNECEDOR').NewValue := Id;
              DeltaDS.FieldByName('CHAVE_CONTATO').NewValue := GenID('CONTATO');
           end;
  end;
end;   Tirado do Link   https://www.devmedia.com.br/forum/delphi/395811-Master-Detail-com-incremento-negativo.html
Responder

Gostei + 0

18/03/2011

Samuel Silva


Um modo elegante de contornar este problema é vc definir uma constante tipada que sera sempre decrementada a medida que for dando o insert na Tabela Mestre .. Assim , vc define na mão mesmo este valores . O valor negativo é para não ter duplicidade. Na hora que vc for de fato commitar .
Os valores corretos da chave serão atulizados geralmente em uma consulta e é utilizado o UpdateRecord do TDataSetProvider
 
Um exemplo disso é este codigo
 

procedure TDm_Dados.dtsfornecedorBeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
  var Applied: Boolean);
{$J+}
const
  Id: Integer = -1;
{$J-}
begin
  if (UpdateKind = ukInsert) then
  begin
    if (SourceDS = sqlfornecedor)  then
      begin
        if (DeltaDS.FieldByName('CHAVE_FORNECEDOR').Value < 0)  then
         begin
           Id := GenID('FORNECEDOR');
           DeltaDS.FieldByName('CHAVE_FORNECEDOR').NewValue := Id;
        end;
      end
    else
        if (SourceDS = sqlcontato)  then
          if (DeltaDS.FieldByName('CHAVE_CONTATO').Value < 0)  then
            begin
              if DeltaDS.FieldByName('CHAVE_FORNECEDOR').Value < 0 then
                  DeltaDS.FieldByName('CHAVE_FORNECEDOR').NewValue := Id;
              DeltaDS.FieldByName('CHAVE_CONTATO').NewValue := GenID('CONTATO');
           end;
  end;
end;
 
Tirado do Link
 
https://www.devmedia.com.br/forum/delphi/395811-Master-Detail-com-incremento-negativo.html
 

Valeu...
Responder

Gostei + 0

18/03/2011

Samuel Silva


Para esse caso em específico não.

Pois segundo a Embarcadero, deve-se usar o mínimo de recursos do banco de dados, por isso você deverá implementar uma forma de retornar o código, pode ser por uma procedure no banco que incremente o código e atualize um tabela de códigos por exemplo.

Atenciosamente,

André Luis da Silveira.


 
 



 Valeu....
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar