RUS  ENG 

получить набор значений

Страницы: 1
RSS
получить набор значений
 
Код
procedure TTest.Timer1Timer(Sender: TObject);
var
    Document: IDocument;
    Map: IMapDoc;
    Layer: ILayer;
    Coord1, Coord2 : crs;
    Pt: IZPoint;
    db: IZbDatabase;
    Result: IZSqlResult;
    BaseName, S, V: string;
    ds: IZbDataset;
    dd: IZbQueries;
    i: integer;
    Index,sysid :integer;
    speed, name : string;
    IndexVar : OleVariant;
    DBCoordX, DBCoordY : double;
    Result1 :wordbool;

begin
Document := FConnector.Zulu.ActiveDocument;
Map := IMapDoc(Document.NativeDoc);
Index := Map.Layers.GetIndexByName('zulu://srv5:6473/***/Auto/auto.zl');
IndexVar := Index;

Map.Layers.Activate(IndexVar);
Layer := Map.Layers.Active;

Coord1 := Layer.GetCRS;
Coord2 := CoCRS.Create;

Coord2.InitByCode('EPSG:4326');

BaseName := Layer.BaseName;

db := CoZbDatabase.Create;
//db.Open(BaseName);


ADOQuery1.Close;
ADOQuery1.Sql.Clear;
ADOQuery1.Sql.Add('SEL ECT * FR OM poisk ORDER BY ID DESC LIMIT 15');
ADOQuery1.Active := true;
ADOQuery1.First;

    DBCoordX := ADOQuery1.Fields[3].Value;
    DBCoordY := ADOQuery1.Fields[4].Value;
    speed:=ADOQuery1.Fields[5].Value;
    name:=ADOQuery1.Fields[2].Value;
    ShowMessage(name);

    sysid:=0;

    //Result := Layer.ExecSQL('sel ect sys fr om auto wh ere name='+name,'');
    //ds:=db.OpenSQL(BaseName,'sel ect sys fr om auto wh ere name='+name);
    ds:=db.OpenSQL(db.SelectAll,'select sys fr om auto');

    ShowMessage('1');
    ShowMessage('Строк '+ inttostr(ds.FieldCount));


Пытаюсь вернуть набор записей, но не текущего активного запроса, а выполнив OpenSQL, но не пойму что "скормить" в первый параметр, который согласно описания хоть и не является обязательным но Delphi ругается, если его не указать.
ds:=db.OpenSQL(db.SelectAll,'select sys fr om auto');
 
Александр, первый параметр в db.OpenSQL - источник данных или соединение СУБД, к которому собственно будет адресован SQL запрос (см. https://www.politerm.com/zuludoc/zuluax/index.html#ZbDatabase_OpenSQL.html). В отличие от Layer.ExecSQL, который выполняет оператор у конкретного слоя, метод db.OpenSQL делает выборку табличных данных из заданного СУБД.
 
Цитата
Дмитрий Озеров написал:
ExecSQL
пишу так SQL := Layer.ExecSQL('select sys fr om auto where name='+name,''); result:=SQL.Dataset; и выдает ошибку, что я делаю не правильно?
Изменено: Александр - 27.02.2019 08:44:01
 
Цитата
Александр написал:
выдает ошибку, что я делаю не правильно?
А какую ошибку конкретно выдает ? Без этого ничего нельзя сказать, что Вы делаете не так.
 
Ошибка несоответствия типов [dcc32 Error] Unit1.pas(747): E2010 Incompatible types: 'IZbDataset' and 'IDispatch'
в строке ds:=Result.DataSet;

Не понимаю, почему типы разные, ведь и то и то по идее набор записей DataSet.
Код
var
    Document: IDocument;
    Map: IMapDoc;
    Layer: ILayer;
    db: IZbDatabase;
    Result: IZSqlResult;
    ds: IZbDataset;

begin

BaseName := Layer.BaseName;

db := CoZbDatabase.Create;
db.Open(BaseName);

Result := Layer.ExecSQL('sel ect sys fr om auto where name='+name,'');

ds:=Result.DataSet;
 
Цитата
Александр написал:
Не понимаю, почему типы разные
Потому что и то и то - интерфейсы, одни из множества, которые поддерживает объект DataSet.
Надо просто запросить нужный интерфейс и пользоваться. В Delphi наверное достаточно выполнить оператор приведения к нужному типу (не уверен, проверьте в документации).
Страницы: 1