Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
ВнизНепонятки в 3-хзвенке Найти похожие ветки
← →
Megabyte © (2006-07-17 14:42) [0]Дано: Ком-сервер в виде удаленного модуля данных: ADO(ADOQuery) + MSSQL + DataSetProvider.
Тонкий клиент: DCOMConnection + ClientDataSet.
Вот код метода на Ком-сервере:
Qry_item - ADOQuery.
procedure TEntprSP.Admin_item(const RusKind: WideString; out aKind,
aId: WideString);
begin
try //except
begin
Qry_item.Close;
Qry_item.SQL.Clear;
if Ruskind = "Кассы" then
begin
Qry_item.SQL.Add("select S.Description from Subdividings S ");
Qry_item.SQL.Add("where S.IsRemoved = 0 ");
Qry_item.SQL.Add("order by S.Description");
aKind := "Subdividings";
aId := "50";
end
else if Ruskind = "Расчетные счета" then
begin
Qry_item.SQL.Add("select S.Description from SettlementAccounts S ");
Qry_item.SQL.Add("where S.IsRemoved = 0 ");
Qry_item.SQL.Add("order by S.Description");
aKind := "SettlementAccounts";
aId := "51";
end
else
begin
Qry_item.SQL.Add("select S.Description from Employees S ");
Qry_item.SQL.Add("where (S.Parent <> 0) and (S.IsRemoved = 0)");
Qry_item.SQL.Add("order by S.Description");
aKind := "Employees";
aId := "71";
end;
Qry_item.Open;
end; //with
except
showmessage("Невозможно сделать запрос");
end; //except
showmessage(Qry_item.SQL.Text); //проверил, меняется ли текст запроса
end;
Вот код в методе клиентского модуля данных:
cds_Item - ClientDataSet
Spisok_item - переменная типа ISpisok - одного из интерфейсов сом-объектаprocedure Tdm_Otchet.kind_Item(acbox : TComboBox);
begin
cds_Item.Active := false;
Spisok_item.Admin_item(acbox.Text, kind, id);
cds_Item.Active := true;
showmessage(kind + ", " + id);
end;
Суть: В Qry_item.SQL в дизайн-тайме записан какой-либо запрос(не важно).
Вызов метода Spisok_item.Admin_item, как видно, меняет свойство Qry_item.SQL.
При вызове этого метода DBGrid(связка ClientDataSet+DataSource+DBGrid) почему-то показывает данные, полученные запросом, записанным в дизайн-тайме???
Проверял, свойство Qry_item.SQL на ком-сервере меняется, метод Spisok_item.Admin_item вызывается и обрабатывается, выходные параметры aKind и aId - возвращают корректрые данные...
Клиентский набор данных открываю уже после выполнения метода Spisok_item.Admin_item.
Это глюк? Или я что не так делаю, м.б. забыл про какое-то свойство(у ClientDataSet, у DataSetProvider)?
← →
Ega23 © (2006-07-17 14:49) [1]EmptyDataSet делал?
← →
Megabyte © (2006-07-17 15:49) [2]
> Ega23 © (17.07.06 14:49) [1]
> EmptyDataSet делал?
Неа. Я не понимаю, в каком порядке применять данный метод(можно применять только при открытом ClientDataSet)?
Если так:procedure Tdm_Otchet.kind_Item(acbox : TComboBox);
begin
cds_Item.Open;
cds_Item.EmptyDataSet;
cds_Item.Active := false;
Spisok_item.Admin_item(acbox.Text, kind, id);
cds_Item.Active := true;
showmessage(kind + ", " + id);
end;
То почему-то опять выдает данные по запросу, введенному в дизайн-тайме.
Если так, не закрывая ClientDataSet:
procedure Tdm_Otchet.kind_Item(acbox : TComboBox);
begin
cds_Item.Open;
cds_Item.EmptyDataSet;
//cds_Item.Active := false;
Spisok_item.Admin_item(acbox.Text, kind, id);
//cds_Item.Active := true;
showmessage(kind + ", " + id);
end;
То выдает пустую выборку... :(
← →
Megabyte © (2006-07-18 13:06) [3]Просто не обновляется clientDataSet. Уже все свойства потыкал, все равно clientDataSet не хочет видеть изменения в Qry_item.SQL.Text :(
← →
Ega23 © (2006-07-18 13:12) [4]А запрос-то сам открылся?
Query.Open;
CDS.Close;
CDS.Open;
Query.Close;
← →
Megabyte © (2006-07-18 14:11) [5]На сервере приложений.
procedure TEntprSP.Admin_item(const RusKind: WideString; out aKind,
aId: WideString);
begin
try //except
begin
Qry_item.Close;
...
Qry_item.Open;
...
end;
В датамодуле на клиенте:procedure Tdm_Otchet.kind_Item(acbox : TComboBox);
begin
cds_Item.Close;
Spisok_item.Admin_item(acbox.Text); //изменяется Qry_item.SQL.Text
cds_Item.Open;
end;
Сейчас изначально Qry_item.SQL.Text пустой, поэтому пишет: Qry_item: Missing SQL property.
Отлаживаю сервер приложений из под процесса клиента, там через showmessage вывожу Qry_item.SQL.Text, не пустое!!!
:(
← →
Megabyte © (2006-07-18 14:14) [6]Делаю вывод в DBGrid на форму, включенную в сервер приложений - выводятся нужные данные.
← →
Vlad © (2006-07-18 15:20) [7]
> Megabyte © (18.07.06 14:14) [6]
COM-сервер установлен под MTS или COM+ ?
Если да, то есть подозрение, что это последствия включенного пулинга или Just-in-time activation. Попробуй отключи и то и другое дабы убедиться.
к слову,
> Spisok_item.Admin_item(acbox.Text, kind, id);
это делать совсем не надо. Текст запроса и другие параметры можно передать непосредственно при открытии ClientDataSet , по событию BeforeGetRecords (параметр OwnerData)
на стороне сервера у DataSetProvider-а по тому же событию считываешь OwnerData, и подменяешь в Query все что надо.
← →
Megabyte © (2006-07-18 15:27) [8]
> Vlad © (18.07.06 15:20) [7]
1) Нет, у меня DCOM.
2) Ну все может быть. Я пока изучаю, мне только один параметр надо передавать. 2 других были чисто выходными, а после их убрал, т.к. дальше Ком-сервера им уходить и не надо.
← →
Vlad © (2006-07-18 15:30) [9]
> Megabyte © (18.07.06 15:27) [8]
> 1) Нет, у меня DCOM.
DCOM это способ коннекции твоего клиента. А я про сервер говорю.
Сервер может просто dll зарегистрированный с помощью regsvr32, или зарегистрирован под COM+ или MTS
← →
Vlad © (2006-07-18 15:33) [10]в любом случае, похоже на то, что у тебя создаются разные экземпляры com объекта
Spisok_item.Admin_item(acbox.Text, kind, id);// - тут один
cds_Item.Active := true; // а здесь уже другой
← →
Megabyte © (2006-07-18 15:42) [11]
> Vlad © (18.07.06 15:30) [9]
> Сервер может просто dll зарегистрированный с помощью regsvr32,
Именно так.
> Vlad © (18.07.06 15:33) [10]
> в любом случае, похоже на то, что у тебя создаются разные
> экземпляры com объекта Spisok_item.Admin_item(acbox.Text,
> kind, id);// - тут один cds_Item.Active := true; // а здесь
> уже другой
м.б. другую модель создания объекта СОМ надо было выбрать?
У меня: ciMultiInstancet.
← →
Vlad © (2006-07-18 16:20) [12]
> Megabyte © (18.07.06 15:42) [11]
Все, теперь понял! Невнимательно прочитал:
Spisok_item - переменная типа ISpisok - одного из интерфейсов сом-объекта
Spisok_item.Admin_item(acbox.Text, kind, id); // тут ты создаешь объект "напрямую" через интерфейс
cds_Item.Active := true; // а тут создаешь через DCOM
и что, ты думаешь что в данном случае работаешь с одним и тем же экземпляром объекта? :-)
← →
Megabyte © (2006-07-18 16:43) [13]
> и что, ты думаешь что в данном случае работаешь с одним
> и тем же экземпляром объекта? :-)
Я нерюх пока в COM, только теорию читал. :)
Подскажи, как мне все оформить правильно?
Мне надо произвести некоторые манипуляции на Сервере, а только потом с помощью клиентского набора считать с сервера приложений данные.
← →
Vlad © (2006-07-18 16:49) [14]
> Megabyte © (18.07.06 16:43) [13]
берешь DCOMConnection, подключаешь его к твоему com-серверу (ты наверное это уже сделал).
далее
DCOMConnection.AppServer.Admin_item(acbox.Text, kind, id);
cds_Item.Active := true;
при условии что cds подключен через тот же DCOMConnection
← →
Megabyte © (2006-07-18 16:58) [15]СOM_Con - DCOMConnection
СOM_Con.AppServer.Admin_item(acbox.Text);
ошибка: метод "Admin_item" not supported by automation object.
Какие мне еще манипуляции надо сделать с ком-сервером?
У меня в книжке был пример по COM c вызовом методов ком-класса, и пример по DCОМ c БД, но без вызовов всяких методов(простейшее связывание всех компонентов и выдача данных с одной таблицы). Вот сам пытался объединить 2 примера в один.
← →
Vlad © (2006-07-18 17:07) [16]
> Megabyte © (18.07.06 16:58) [15]
> ошибка: метод "Admin_item" not supported by automation object.
>
погоди, тогда надо разобраться в твоем com-объекте
По идее у тебя должен быть некий объект, скажем наследник TRemoteDataModule
Что-то типа этого:TMyClass = class(TRemoteDataModule, IMyClass)
...
Qry_item : TADOQuery;
...
private
{ Private declarations }
protected
...
procedure Admin_item(acbox.Text); safecall;
public
{ Public declarations }
end;
так? Или расскажи как сделано у тебя
← →
Megabyte © (2006-07-18 17:15) [17]Ну да. Вот раздел interface главного модуля ком-сервера.
unit rmod;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, rserv_TLB, StdVcl, Provider, DB, ADODB, Dialogs;
type
TEntprSP = class(TRemoteDataModule, IQry_otchet, IManage, ISpisok)
ADOCon: TADOConnection;
Qry_item: TADOQuery;
Qry_otchet: TADOQuery;
Qry_rules: TADOQuery;
dsp_item: TDataSetProvider;
dsp_otchet: TDataSetProvider;
dsp_rules: TDataSetProvider;
com_rule: TADOCommand;
com_login: TADOCommand;
private
{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean; const ClassID,
ProgID: string); override;
procedure All_qry(const TableName, Nach_date, End_date, TableId,
ItemName: WideString); safecall;
procedure Admin_item(const RusKind: WideString); safecall;
procedure User_item(const RusKind: WideString); safecall;
function Get_Login: WideString; safecall;
function Get_Connected: WordBool; safecall;
procedure Set_Connected(Value: WordBool); safecall;
procedure Add_Login(const aLogin, aPass: WideString); safecall;
procedure Add_Rule(const aLogin, aKind: WideString; aType: Integer;
const aItem: WideString); safecall;
procedure User_Items; safecall;
procedure View_Rules(const aLogin: WideString); safecall;
public
{ Public declarations }
end;
Думаю, реализация методов не важна для вас.
А СOM_Con.AppServer.*любой метод из ком-сервера* ругается одинаково.
← →
Vlad © (2006-07-18 17:33) [18]понял.
(СOM_Con.GetServer as ISpisok).*любой метод интерфейса ISpisok*
← →
Megabyte © (2006-07-18 18:03) [19]
> Vlad © (18.07.06 17:33) [18]
Спасибо, научил. :)
В книжке про это ни слова, негодяи...
← →
Vlad © (2006-07-18 18:45) [20]
> Megabyte © (18.07.06 18:03) [19]
да не за что.
Так данные то в итоге в ClientDataSet "правильные" появились? :-)
← →
Megabyte © (2006-07-20 11:42) [21]
> Vlad © (18.07.06 18:45) [20]
> > Megabyte © (18.07.06 18:03) [19] да не за что. Так данные
> то в итоге в ClientDataSet "правильные" появились? :-)
Ага. %)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c