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