|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
DELPHI Soap Server передача с массивами (справочниками)
Добрый день!
разбираюсь с веб-сервисами, реализовал простые сервисы, которые могут отдавать либо набор значений, либо скажем так некий созданный мой класс (например одну запись из справочника: код учреждения, названия учреждения) - и оно работает. но мне нужно чтобы сервис выдавал весь справочник. Почитал статью - http://www.realcoding.net/article/view/691 все вроде ок, но про именно массив объектов подробно не расписано как реализовать, по логике я все сделал, но он выдает ошибку. мой класс: Код:
{ Invokable interface Iemc } unit emcIntf; interface uses InvokeRegistry, Types, XSBuiltIns,ora,sysutils,windows; type Torg = class(TRemotable) PRIVATE forg:string; forg_id:integer; public constructor orgcreate(ID:INTEGER;NAME:STRING); published property org: string read forg write forg; property org_ID: INTEGER read forg_ID write forg_id; end; TorgROW = array of Torg; { Invokable interfaces must derive from IInvokable } Iemc = interface(IInvokable) ['{96AEC788-AC68-41C6-B904-4036B4262EBD}'] function get_org(id:string): torgrow; stdcall; { Methods of Invokable interface must not use the default } { calling convention; stdcall is recommended } end; implementation CONSTRUCTOR Torg.orgCREATE(ID:INTEGER;NAME:string); var ind:boolean; oracod:torasession; codqry:toraquery; systime:systemtime; begin Forg:=NAME; Forg_ID:=ID; end; initialization { Invokable interfaces must be registered } InvRegistry.RegisterInterface(TypeInfo(Iemc)); RemClassRegistry.RegisterXSClass(temcdat, 'temcdat'); RemClassRegistry.RegisterXSClass(TORG,'tORG'); RemClassRegistry.RegisterXSInfo(TypeInfo(TORGROW)); end. { Invokable implementation File for Temc which implements Iemc } unit emcImpl; interface uses InvokeRegistry, Types, XSBuiltIns, emcIntf,ora,sysutils,windows; type { Temc } Temc = class(TInvokableClass, Iemc) function get_org(id:string): Torgrow; stdcall; public end; implementation function temc.get_org(id:string): torgrow; var ind:boolean; i:integer; oracod:torasession; codqry:toraquery; systime:systemtime; orgROWOK:TorgROW; begin oracod:=torasession.Create(nil); //подключаемся oracod.Options.Direct:=true; oracod.Options.DateFormat:='dd.mm.yyyy'; ORACOD.server:='xxx:oracle'; ORACOD.Username:='login'; ORACOD.Password:='pass'; ind:=false; try ORACOD.Connected:=true; ind:=true; except end; if ind then begin codqry:=toraquery.Create(nil); codqry.Session:=oracod; //адрес codqry.SQL.Clear; codqry.SQL.Add('select * from org ); codqry.Active:=true; setlength(lorgrowok,codrqy.recordcount) I:=0; while codqry.Eof=false do begin I:=I+1; orgROWOK[i]:=torg.orgcreate(codqry.Fieldbyname('org_id').AsINTEGER,codqry.Fieldbyname('org_name').AsString); codqry.Next; end; result:=orgROWOK; end; end; initialization { Invokable classes must be registered } InvRegistry.RegisterInvokableClass(Temc); end. если поменять результат функции на TORG, то будет выводится ровно 1 значение, прошу подсказки. результат он выдает вот такой : Код:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <NS1:get_orgResponse xmlns:NS1="urn:emcIntf-Iemc"> <return xsi:nil="true"/> </NS1:get_orgResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> а списка элементов нет( мне нужно вывод всех элементов запроса сюда |