Erro ao gravar registro Mestre-detalhe com autoinc.

Delphi

20/06/2008

Boa tarde pessoal..
não estou conseguindo atualizar um campo mestre detalhe no qual os dois campos são autoincremento :

[b]Atendimento[/b]
CodAtendimento (int(4)) - autoinc
Operador
data
hora


[b]Ocorrencia[/b]
CodOcorrencia (int(4)) - autoinc
Local
Descricao
CodAtendimento


estou tentando gravar mas não consigo gravar a o CodAtendimento da tabela Atendimento no campo CodAtendimento da tabela Ocorrencia..

tá aí meu código

procedure TfrmOcorrencias.btngravarClick(Sender: TObject);
  var codigo : integer;
      flag,tipoOcorrencia,msg,nivelUrgencia: string;
      erro : string;
begin
   Try
      tipoOcorrencia := ´´;

      If verificacampos > 0 then
         begin
            Application.MessageBox(´Não foram preenchidos todos os campos obrigatórios!´,´Campos obrigatórios´,MB_OK+MB_ICONERROR);
            frmOcorrencias.SetFocus;
            exit;
         end;

      If flagacompanhamento = ´N´ then
         begin
            If DM.dsOcorrencia.State in [dsInsert] then
               begin
                  try
                     //Atualiza o sequenciador
                     DM.QExecutaContratante.Close;
                     DM.QExecutaContratante.SQL.Clear;
                     DM.QExecutaContratante.SQL.Add(´UPDATE CONTRATANTE SET SEQUENCIA =(SELECT SEQUENCIA + 1 FROM CONTRATANTE WHERE CODCONTRATANTE = :PCODCONTRATANTE ) WHERE CODCONTRATANTE = :PCODCONTRATANTE´);
                     DM.QExecutaContratante.Parameters[0].DataType := ftInteger;
                     DM.QExecutaContratante.Parameters[1].DataType := ftInteger;
                     DM.QExecutaContratante.Parameters[0].Value    := dbContratante.KeyValue;
                     DM.QExecutaContratante.Parameters[1].Value    := dbContratante.KeyValue;
                     DM.QExecutaContratante.ExecSQL;
                     //Fim do Atualiza sequenciador

                     //Obtem os dados para exibição
                     DM.QExecutaContratante.Close;
                     DM.QExecutaContratante.SQL.Clear;
                     DM.QExecutaContratante.SQL.Add(´SELECT FLAG, SEQUENCIA FROM CONTRATANTE WHERE CODCONTRATANTE = :PCODCONTRATANTE´);
                     DM.QExecutaContratante.Parameters[0].DataType := ftInteger;
                     DM.QExecutaContratante.Parameters[0].Value    := dbContratante.KeyValue;
                     DM.QExecutaContratante.Open;

                     flag           := DM.QExecutaContratante.FieldbyName(´FLAG´).Value;
                     codigo         := DM.QExecutaContratante.FieldbyName(´SEQUENCIA´).Value;
                     //Fim do obtem os dados para exibição
                  except
                     on E: Exception do
                        begin
                           Application.MessageBox(´Erro ao atualizar Contratante´,´Gravação´,MB_OK+MB_ICONERROR);
                           close;
                           exit;
                        end;
                  end;
                  DM.OcorrenciaProtocolo.Value             := RetCodigo(codigo,flag);
                  DM.OcorrenciaDescricaoOcorrencia.Value   := Trim (edDescOcorrencia.Text);
                  DM.OcorrenciaFinalizada.Value            := ´0´;
                  DM.OcorrenciaAcompanhamento_valido.Value := ´0´;
                  DM.OcorrenciaResolvendo.Value            := ´0´;
                  DM.OcorrenciaCodAtendimento.Value        := CodAtendimento;
                  DM.Ocorrencia.Post;
                  nivelUrgencia  := InttoStr(DM.OcorrenciaCodNivelUrgencia.Value);
                  tipoOcorrencia := DM.OcorrenciaProtocolo.Value;
               end;

            DM.Atendimento.Post;
            If DM.dsOcorrencia.State in [dsEdit] then
               begin
                  DM.Ocorrencia.Post;
               end;

            DM.Conexao.CommitTrans;
            //Atualiza o sequenciador
            DM.QExecutaContratante.Close;
            DM.QExecutaContratante.SQL.Clear;
            DM.QExecutaContratante.SQL.Add(´UPDATE OCORRENCIA SET CODATENDIMENTO = :PCODATENDIMENTO WHERE CODOCORRENCIA = :PCODOCORRENCIA´);
            DM.QExecutaContratante.Parameters[0].DataType := ftInteger;
            DM.QExecutaContratante.Parameters[1].DataType := ftInteger;
            DM.QExecutaContratante.Parameters[0].Value    := DM.AtendimentoCodAtendimento.Value;
            DM.QExecutaContratante.Parameters[1].Value    := DM.OcorrenciaCodOcorrencia.Value;
            DM.QExecutaContratante.ExecSQL;
            //Fim do Atualiza sequenciador

            Habilita;
            Application.MessageBox(´Registro cadastrado com sucesso!´,´Inclusão - Ocorrências´,mb_ok+MB_ICONEXCLAMATION);

            If Trim(tipoOcorrencia) <> ´´ then
              begin
                 msg := ´Protocolo gerado número - ´ + tipoOcorrencia;
                 Application.MessageBox(Pchar(msg) ,´Protocolo´,MB_OK+MB_ICONINFORMATION);
                 msg := ´´;
                 EnviaMSG(nivelUrgencia); // Envia mensagem para os Resolvedores
              end;
            close;
         end

      Else If flagacompanhamento = ´S´ then
         begin
            PCOcorrencias.TabIndex := 1;
            DM.Conexao.CommitTrans;
            Habilita;
            close;
         end;

   except
      on E: Exception do
            begin
               erro := ´Erro ao gravar registro!´+#13+E.Message;
               Application.MessageBox(Pchar(erro),´Cadastro´,MB_OK+MB_ICONERROR);
               Habilita;
               If DM.Conexao.InTransaction then
                  DM.Conexao.RollbackTrans;
            end;
   end;
end;



valeu galera


Eric.miranda

Eric.miranda

Curtidas 0

Respostas

Paulo

Paulo

20/06/2008

Sempe aprendi que em um Master/Detail, deve-se primeiro validar o mestre e depois o cliente. Então grava primeiro o Master, comita e depois o Detail. Eu faço assim e não tenho problemas.


GOSTEI 0
Mazzi

Mazzi

20/06/2008

e ai deu certo, validando e salvando primeiramente o cabeçalho (MASTER) // (parafraseando o PAULO)
?

qq coisa post ai..

Abracos++


GOSTEI 0
POSTAR