Fórum Servidor de Aplicações, Indy/ClientDataSet #350202
06/12/2007
0
Estou usando Delphi 7 e Indy9 e desenvolvendo uma solução para envio de dados XML entre aplicações e banco de dados de matriz para filiais.
A aplicação servidora após receber o comando do cliente carrega o parametro em um ClientDataSet, chamo outra procedure que deve fazer a consulta no banco de dados e gravar os dados em outro ClientDataSet. Ambos os ClientDataSets estão em um DataModule (DM).
Funciona rápido e bem, mas ao ter 2 consultas simultaneas uma sequencia enorme de erros são apresentadas (EDatabaseError... Duplicate Field, EDatabaseError.... Closed dataset, EOraError..., EOleException..., etc).
Terei em torno de 200 clientes e necessito resolver estes conflitos de sincronia devido a conexões simultaneas...
Alguem tem alguma sugestão?
Obs: Esta é uma rotina de exemplo é pequena, porém tenho outras rotinas enormes construidas da mesma maneira ficando impossível de incluir no evento onCommand do CommandHandlers.
[list:0b2a260b6a]procedure TfrmMain.IdTCPServercVerificaPackCommand(ASender: TIdCommand);
var Loja : Integer;
ParametroEntrada : String;
begin
Loja := StrToInt(ASender.Params[0]);
ParametroEntrada := TRIM(ASender.Params[1]);
if NOT dm.cdRetProduto.IsEmpty then
dm.cdRetPack.EmptyDataSet;
if NOT dm.cdRetPack.IsEmpty then
dm.cdRetPack.EmptyDataSet;
dm.cdProcuraPack.XMLData := ParametroEntrada;
ProcurarPack(Loja);
ASender.Reply.Text.Text := dm.cdRetPack.XMLData;
end;
procedure TfrmMain.ProcurarPack(Loja: integer);
var MecanicaPack : String;
begin
dm.cdProcuraPack.First;
while NOT dm.cdProcuraPack.Eof do
begin
//PROCURA QUAL O Nº DO PACK Q O PRODUTO ESTA
dm.cdPackCab.Close;
dm.cdPackCab.Params.ParamByName(´MT_ID´).asInteger := dm.cdProcuraPack.FieldByName(´INCPRODUTO´).AsInteger;
dm.cdPackCab.Params.ParamByName(´FIL_ID´).asInteger := loja;
dm.cdPackCab.Open;
if NOT dm.cdPackCab.IsEmpty then
if NOT dm.cdRetPack.Locate(´IDPACKCAB´, dm.cdPackCabPACK_ID.AsInteger, [loCaseInsensitive]) then
//SE o IDPACKCAB ainda não esta incluso em RETPACK
begin
//SE EXISTE PACK, GRAVA NO cdRetPack
MecanicaPack := dm.cdPackCabMECANICA.AsString;
dm.cdPackDet.Close;
dm.cdPackDet.Params.ParamByName(´PACK_ID´).AsInteger := dm.cdPackCabPACK_ID.AsInteger;
dm.cdPackDet.Open;
while NOT dm.cdPackDet.Eof do
begin
begin
dm.cdRetPack.Insert;
dm.cdRetPackIDPACKCAB.AsInteger := dm.cdPackDetPACK_ID.AsInteger;
dm.cdRetPackIDTIPO.AsInteger := dm.cdPackDetTIPO_ID.AsInteger;
dm.cdRetPack.Post;
end;
dm.cdPackDet.Next;
end;
end;
dm.cdProcuraPack.Next;
end;
end;[/list:u:0b2a260b6a]
Obrigado
A aplicação servidora após receber o comando do cliente carrega o parametro em um ClientDataSet, chamo outra procedure que deve fazer a consulta no banco de dados e gravar os dados em outro ClientDataSet. Ambos os ClientDataSets estão em um DataModule (DM).
Funciona rápido e bem, mas ao ter 2 consultas simultaneas uma sequencia enorme de erros são apresentadas (EDatabaseError... Duplicate Field, EDatabaseError.... Closed dataset, EOraError..., EOleException..., etc).
Terei em torno de 200 clientes e necessito resolver estes conflitos de sincronia devido a conexões simultaneas...
Alguem tem alguma sugestão?
Obs: Esta é uma rotina de exemplo é pequena, porém tenho outras rotinas enormes construidas da mesma maneira ficando impossível de incluir no evento onCommand do CommandHandlers.
[list:0b2a260b6a]procedure TfrmMain.IdTCPServercVerificaPackCommand(ASender: TIdCommand);
var Loja : Integer;
ParametroEntrada : String;
begin
Loja := StrToInt(ASender.Params[0]);
ParametroEntrada := TRIM(ASender.Params[1]);
if NOT dm.cdRetProduto.IsEmpty then
dm.cdRetPack.EmptyDataSet;
if NOT dm.cdRetPack.IsEmpty then
dm.cdRetPack.EmptyDataSet;
dm.cdProcuraPack.XMLData := ParametroEntrada;
ProcurarPack(Loja);
ASender.Reply.Text.Text := dm.cdRetPack.XMLData;
end;
procedure TfrmMain.ProcurarPack(Loja: integer);
var MecanicaPack : String;
begin
dm.cdProcuraPack.First;
while NOT dm.cdProcuraPack.Eof do
begin
//PROCURA QUAL O Nº DO PACK Q O PRODUTO ESTA
dm.cdPackCab.Close;
dm.cdPackCab.Params.ParamByName(´MT_ID´).asInteger := dm.cdProcuraPack.FieldByName(´INCPRODUTO´).AsInteger;
dm.cdPackCab.Params.ParamByName(´FIL_ID´).asInteger := loja;
dm.cdPackCab.Open;
if NOT dm.cdPackCab.IsEmpty then
if NOT dm.cdRetPack.Locate(´IDPACKCAB´, dm.cdPackCabPACK_ID.AsInteger, [loCaseInsensitive]) then
//SE o IDPACKCAB ainda não esta incluso em RETPACK
begin
//SE EXISTE PACK, GRAVA NO cdRetPack
MecanicaPack := dm.cdPackCabMECANICA.AsString;
dm.cdPackDet.Close;
dm.cdPackDet.Params.ParamByName(´PACK_ID´).AsInteger := dm.cdPackCabPACK_ID.AsInteger;
dm.cdPackDet.Open;
while NOT dm.cdPackDet.Eof do
begin
begin
dm.cdRetPack.Insert;
dm.cdRetPackIDPACKCAB.AsInteger := dm.cdPackDetPACK_ID.AsInteger;
dm.cdRetPackIDTIPO.AsInteger := dm.cdPackDetTIPO_ID.AsInteger;
dm.cdRetPack.Post;
end;
dm.cdPackDet.Next;
end;
end;
dm.cdProcuraPack.Next;
end;
end;[/list:u:0b2a260b6a]
Obrigado
Douglasmmm
Curtir tópico
+ 0
Responder
Posts
09/01/2008
Douglasmmm
niguem tem uma sugestão???
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)