Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.52 MB
Время: 0.016 c
1-1150816843
Klopan
2006-06-20 19:20
2006.08.06
strip_tags


4-1145215733
cerber
2006-04-16 23:28
2006.08.06
Открыть порт "DOT4_001"


15-1150462592
blackcrazzy
2006-06-16 16:56
2006.08.06
Сайт Delphimaster.ru


2-1153168935
GanibalLector
2006-07-18 00:42
2006.08.06
OLE Automation


2-1152937177
Matrimax
2006-07-15 08:19
2006.08.06
Начинающим





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский