Einzelnen Beitrag anzeigen

moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Webservice : Datenstruktur zurückgeben

  Alt 14. Apr 2010, 11:04
Moin !

Zitat:
Mit welcher Delphi Version hast Du das ganze umgesetzt ?
D2010 Prof.
Funzt super wenn man vorher Indy updated aus dem SVN ...

Zitat:
und in dieser Methode
dann Deine "XML-Struktur" als String zurück liefern.
Nö. Das is ma ment genau der falsche Ansatz.
Damit kann ein Webservice Client nichts anfangen / nicht auswerten.
Zudem wird das XML nicht sauber in der SOAP Message dargestellt.


Ich weiss aber nun wie es geht

Hier ist es beschrieben: http://exposureroom.com/members/skumar/tutorials/post/3

Zunächst muss das Interface erweitert werden:
Delphi-Quellcode:
unit DatasetXMLIntf;

interface

uses
  Types, XSBuiltIns, uFieldInfo;

type
  IDatasetXML = interface(IInvokable)
    ['{C7785514-F56F-40AD-B943-950A162296BE}']
    function GetDatasetAsXML(const SelectSQL: WideString): WideString; stdcall;
    function GetSchemaInfo(const TableName: WideString): TFieldInfoArray; stdcall;
  end;

implementation

uses
  InvokeRegistry;

initialization
  InvRegistry.RegisterInterface(TypeInfo(IDatasetXML), '', '');

end.
Und dann muss man natürlich die Struktur definieren:

Delphi-Quellcode:
unit uFieldInfo;

interface

uses
  InvokeRegistry, XSBuiltIns;

type
  TFieldInfo = class(TRemotable)
  private
    FIsKeyField: Boolean;
    FFieldSize: Integer;
    FFieldName: string;
    FFieldType: string;
  published
    property FieldName: string read FFieldName write FFieldName;
    property FieldType: string read FFieldType write FFieldType;
    property FieldSize: Integer read FFieldSize write FFieldSize;
    property IsKeyField: Boolean read FIsKeyField write FIsKeyField;
  end;

  TFieldInfoArray = array of TFieldInfo;


implementation

initialization
  RemClassRegistry.RegisterXSClass(TFieldInfo, '', 'TFieldInfo', '');
  RemTypeRegistry.RegisterXSInfo(TypeInfo(TFieldInfoArray), '', 'TFieldInfoArray');

finalization
  RemClassRegistry.UnRegisterXSClass(TFieldInfo);
  RemTypeRegistry.UnRegisterXSInfo(TypeInfo(TFieldInfoArray));
end.

So und dann muss man das natürlich noch implementieren. Das geht dann in etwa so:
Delphi-Quellcode:
  function TMyAppServerSoapDataModule.GetSchemaInfo(const TableName: WideString): TFieldInfoArray; stdcall;
  var i: Integer;
  begin
      SetLength(Result, 1);
      for i := 0 to 1 -1 do
      begin
        Result[i] := TFieldInfo.Create;
        Result[i].FieldName := 'Hallo Feld';
        Result[i].FieldType := 'GetEnumName';
        Result[i].FieldSize := 1234;
        Result[i].IsKeyField := False;
      end; { for i := 0 to Dataset.FieldCount -1 do }
  end;

Hoffe geholfen zu haben
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat