Pessoal,

Estou escrevendo uma aplicação que faz a conclusão da venda via WebService 
(este é o servidor de aplicação). Para este caso eu não usei os 
DataSetProviders, escrivi uma procedure que recebe os .Data dos CDS no 
cliente e faz a atualização internamente.

No servidor acontece o seguinte: Eu já tenho os mesmos CDS criados (no 
DataModule) e com os TField adicionados no FieldEditor com o ProviderFlags 
também configurado. Tenho também procedure que, de acordo com o provider 
flags, montam o SQL de alteração (Insert/Update). Como podem perceber, estes 
CDS no lado do servidor são apenas moldes para atualizar os dados.

O meu problema é o seguinte:
Durante a atualização, em um deles eu dou um .CreateDataSet e dá o erro 
"Name is not unique on this context". Eu não sei do que se trata!!! Alguém 
poderia me ajudar com este erro? O projeto já está atrasado a duas semanas e 
falta praticamente isso para concluir.

Obrigado

Francisco Thiago de Almeida
Enter&Plug Informática
Divisão: Desenvolvimento e Banco de dados
MSN: [EMAIL PROTECTED]
Skype: enterplug_thiago

Segue as procedure envolvidas:

//Procedure que efetua o pedido
procedure TDmPedidoRules.EfetuaPedidoProducao(const Cad_Producao,
  Cad_ProducaoItem, Cad_Composicao: OleVariant; var Deletados: OleVariant);
var
  lt_Transaction    :TTransactionDesc;
  lt_Cad_Etapas     :TClientDataSet;
  li_IPDC_Codigo    :Shortint; //Para refletir a chave primária
  li_TempIPDC       :Integer;
  le_Estoque        :Double;
begin
  CheckDm;
  OleVariantToCDS(Cad_Producao,cdsCad_Producao);
  OleVariantToCDS(Cad_ProducaoItem,cdsCad_Producao_Item);
  OleVariantToCDS(Cad_Composicao,cdsProducao_Composicao);

  lt_Cad_Etapas := TClientDataSet.Create(Nil);

  cdsDeletados.CreateDataSet;
  OleVariantToCDS(Deletados,cdsDeletados);

  try //Finally
    Randomize;
    lt_Transaction.TransactionID := Random(65535);
    lt_Transaction.IsolationLevel := xilREADCOMMITTED;
    FDmCadastro.DBXConnection.StartTransaction(lt_Transaction);
    try //Excetp
      if cdsCad_ProducaoAction.AsInteger  = ACT_INSERT then
        ExecuteSQL(GeraInsert(cdsCad_Producao,'CAD_PRODUCAO',False))
      else
        ExecuteSQL(GeraEdit(cdsCad_Producao,'CAD_PRODUCAO'));
      // Apagar os que foram excluidos na tela
      with cdsDeletados do
      begin
        Filter := 'TABLE_NAME = ''CAD_PRODUCAO_ITEM''';
        Filtered := True;
        First;
        while Not EOF do
        begin
          try
            ExecuteSQL(Format('delete from PRODUCAO_COMPOSICAO where 
IPDC_CODIGO = %d',[cdsDeletadosPRIMARY_KEY.AsInteger]));
            ExecuteSQL(Format('delete from PRODUCAO_ETAPAS where IPDC_CODIGO 
= %d',[cdsDeletadosPRIMARY_KEY.AsInteger]));
            ExecuteSQL(Format('delete from CAD_PRODUCAO_ITEM where 
IPDC_CODIGO = %d',[cdsDeletadosPRIMARY_KEY.AsInteger]));
            Delete;
          except
            on E: Exception do
            begin
              Edit;
              cdsDeletadosMensagem.AsString := E.Message;
              Post;
              Next;
            end;
          end;
        end;
        Filter := '';
        Filtered := False;
      end;
      { Show Time!!! }
      with cdsCad_Producao_Item do
      begin
        First;
        while Not EOF do
        begin
          if cdsCad_Producao_ItemAction.AsInteger = ACT_INSERT then
          begin
            Edit;
            {Atribui um codigo real ao IPDC_CODIGO}
            li_IPDC_Codigo := FDmCadastro.getId('GEN_IPDC_CODIGO');
            {Grava o valor antigo para filtro}
            li_TempIPDC := cdsCad_Producao_ItemIPDC_CODIGO.AsInteger;
            cdsCad_Producao_ItemIPDC_CODIGO.AsInteger := li_IPDC_Codigo;
            Post;
            
ExecuteSQL(GeraInsert(cdsCad_Producao_Item,'CAD_PRODUCAO_ITEM',False));

            
LinkTable(cdsProducao_Composicao,li_IPDC_Codigo,li_TempIPDC,'IPDC_CODIGO');
            GravaComposicao(li_IPDC_Codigo);
            //Se algum produto for produzido
            if cdsCad_Producao_ItemIPDC_QTD.AsFloat > 0 then
              GravaEtapa(
                cdsCad_Producao_ItemESTO_CODIGO.AsInteger,
                cdsCad_Producao_ItemIPDC_CODIGO.AsInteger,
                cdsCad_Producao_ItemEMPR_CODIGO.AsInteger,
                cdsCad_Producao_ItemCUSU_CODIGO.AsInteger);
            if Not cdsCad_Producao_ItemReservado.AsInteger = 1 then
              FDmCadastro.ManipulaEstoque(
                cdsCad_Producao_ItemESTO_CODIGO.AsInteger,
                cdsCad_Producao_ItemIPDC_QTD_PRODUZIDA.AsFloat,
                cdsCad_Producao_ItemEMPR_CODIGO.AsInteger);
          end
          else if cdsCad_Producao_ItemAction.AsInteger = ACT_EDIT then
          begin
            //Deletar a composicao original
            //Gravar nova composicao?
            le_Estoque := 0.0;
            if Not cdsCad_Producao_ItemReservado.AsInteger = 1 then
            begin
              try
                FDmCadastro.cdsExec.CommandText :=
                  'select IPDC_QTD from CAD_PRODUCAO_ITEM where IPDC_CODIGO 
= '+
                  cdsCad_Producao_ItemIPDC_CODIGO.AsString;
                FDmCadastro.cdsExec.Open;
                le_Estoque := FDmCadastro.cdsExec.Fields[0].AsFloat;
              finally
                FDmCadastro.cdsExec.Close;
              end;
            end;
            li_IPDC_CODIGO := cdsCad_Producao_ItemIPDC_CODIGO.AsInteger;
            ExecuteSQL(GeraEdit(cdsCad_Producao_Item,'CAD_PRODUCAO_ITEM'));
            GravaComposicao(li_IPDC_CODIGO);
            if Not cdsCad_Producao_ItemReservado.AsInteger = 1 then
              FDmCadastro.ManipulaEstoque(
                cdsCad_Producao_ItemESTO_CODIGO.AsInteger,
                le_Estoque + (le_Estoque - 
cdsCad_Producao_ItemIPDC_QTD.AsFloat),
                cdsCad_Producao_ItemEMPR_CODIGO.AsInteger);
          end;
          Next;
        end;//While
        FDmCadastro.DBXConnection.Commit(lt_Transaction);
      end; // with shotime
    except
      FDmCadastro.DBXConnection.Rollback(lt_Transaction);
      raise;
    end;
  finally
    lt_Cad_Etapas.Free;
    cdsCad_Producao.Close;
    cdsCad_Producao_Item.Close;
    cdsProducao_Composicao.Close;
    cdsProducao_Etapas.Close;
    cdsDeletados.Close;

    cdsDeletados.Data := Null;
    cdsCad_Producao.Data := Null;
    cdsCad_Producao_Item.Data := Null;
    cdsProducao_Composicao.Data := Null;
    cdsProducao_Etapas.Data := Null;
    cdsDeletados.Data := Null;

  end;
end;

//Procedure que dá erro
procedure OleVariantToCDS(Data: OleVariant; DataSet: TDataSet);
var
  CDS       :TClientDataSet;
  i         :Integer;
  lt_Field  :TField;
begin
  try
    if Data <> Null then
    begin
      CDS := TClientDataSet.Create(Nil);
      CDS.Data := Data;
      if DataSet.State in [dsInsert,dsEdit] then
        DataSet.Cancel;
      //      raise EConversionError.Create('Existe uma operação em 
aberto!'+ #$D#$A +'Cancele antes de sair');
      if Not DataSet.Active then
        if (DataSet is TClientDataSet) then
          TClientDataSet(DataSet).CreateDataSet
        else
          DataSet.Active := True;
      DataSet.Last;
      CDS.First;
      while Not CDS.EOF do
      begin
        DataSet.Insert;
        for i := 0 to DataSet.FieldCount - 1 do
        begin
          lt_Field := CDS.FindField(DataSet.Fields[i].FieldName);
          if lt_Field <> Nil then
            DataSet.Fields[i].Value := lt_Field.Value;
        end;
        DataSet.Post;
        CDS.Next;
      end;
    end;
  finally
    FreeAndNil(CDS);
  end;
end;





-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

Para ver as mensagens antigas, acesse:
 http://br.groups.yahoo.com/group/delphi-br/messages

Para falar com o moderador, envie um e-mail para:
 [EMAIL PROTECTED] ou [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 



Responder a