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