Добрый день!
разбираюсь с веб-сервисами, реализовал простые сервисы, которые могут отдавать либо набор значений, либо скажем так некий созданный мой класс (например одну запись из справочника:
код учреждения, названия учреждения) - и оно работает.
но мне нужно чтобы сервис выдавал весь справочник.
Почитал статью -
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>
а списка элементов нет(
мне нужно вывод всех элементов запроса сюда