Подключение к базе и получение выборки

Автор Stich, 06.03.13, 20:47:05

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Stich

Здравствуйте, уважаемые коллеги. Совсем недавно я вступил на новую должность, в рамках которой мне пришлось столкнуться с таким зверем, как Лоцман:ПЛМ. Ну сам то по себе он не страшный, так обычная БД. Но проблема в том, что с меня уже довольно скоро требуют результатов, хотя с системой я ознакомился минимально. Ну я и решил пойти к первоисточнику за знаниями. В общем передо мной стоит задача разработать (на Delphi) какое-нибудь приложение (не модуль, но в  принципе в любом формате) которое делает следующее:
1. подключается к базе данных Лоцмана (название БД, адрес сервера, логин и пароль заранее известны)
2. найти в ней все документы, которые были распечатаны за определенный период (у документов есть такой атрибут "распечатан", который принимает значения ДА и НЕТ, а так же есть у документов атрибут, содержащий дату печати)
Вот собственно, имея при себе только знания языка Delphi (ну и языка запросов SQL, если это как то поможет) и не владея внутренне структурой базы лоцмана (то есть я в глаза ее даже не видел) мне нужно выполнить задачи в максимально краткие сроки. Может ли кто-нибудь наставить на путь истинный? Написать алгоритм последовательности для такого приложения, или расписать как подключиться к базе (каким методом) и как внутри нее прошерстить объекты или сделать sql запрос и как-то его использовать. Так же буду благодарен за любые ссылки на источники информации, т.к. стандартной документации по Лоцману мне показалось маловато.
Заранее спасибо. Напоминаю, что сроки очень маленькие.

Maxxx

+ Благодарностей: 1

Chaa

Вам нужна функция FindObjects. Задайте условия поиска по атрибутам вроде такого:
AttrCondition := 'Распечатан'#2'Распечатан LIKE ' + QuotedStr('ДА');
В прикрепленном файле пример плагина, который я выкладывал раньше, с добавленной функцией FindObjects. Попробуйте добавить там нужные условия.
+ Благодарностей: 2

Stich

В прикрепленном файле пример плагина, который я выкладывал раньше, с добавленной функцией FindObjects. Попробуйте добавить там нужные условия.
Я так понял, эта функция используется IPlaginCall, чтобы собрать данные о всех проектах в открытом окне БД в Лоцмане,а как быть,если нужно создать подключение к БД? ну то есть из того, что я прочитал, нужно:
1. создать COM-объект на удаленной машине (на сервере)
2. Подключиться к Базе Данных.
3. что делать дальше? как в этом случае использовать Find Objects?

Stich

Цитата: Chaa от 07.03.13, 08:07:41
Вам нужна функция FindObjects. Задайте условия поиска по атрибутам вроде такого:
AttrCondition := 'Распечатан'#2'Распечатан LIKE ' + QuotedStr('ДА');
В прикрепленном файле пример плагина, который я выкладывал раньше, с добавленной функцией FindObjects. Попробуйте добавить там нужные условия.

Я так понял, эта функция используется IPlaginCall, чтобы собрать данные о всех проектах в открытом окне БД в Лоцмане,а как быть,если нужно создать подключение к БД? ну то есть из того, что я прочитал, нужно:
1. создать COM-объект на удаленной машине (на сервере)
2. Подключиться к Базе Данных.
3. что делать дальше? как в этом случае использовать Find Objects?

Chaa

Если использовать IRemoteConnection, то все останется так же, там есть те же функции RunMethod и GetDataSet. Только CurrentBase нужно установить в нужное значение.

Если вы создаете COM-объект на удаленной машине, то использование будет примерно таким:
var
    LAppServer: Variant;
    LRetCode, LErrMsg: Variant;
    LData: Variant;
    LDataSet: TClientDataSet;
begin
    LAppServer := CreateRemoteComObject('AS',
        StringToGUID('{392BA982-A82F-44AB-BA8A-69BE25199F73}'));

    LAppServer.ConnectToDB('ДемоМашиностроение', LRetCode, LErrMsg);
    if LRetCode <> 0 then ;// Ошибка

    LData := LAppServer.FindObjects(... {Параметры как и раньше плюс еще два: }, LRetCode, LErrMsg);
    if LRetCode <> 0 then ;// Ошибка

    LDataSet := TClientDataSet.Create(nil);
    try
        LDataSet.Data := LData;
        while not LDataSet.Eof do
        begin
            // ...
        end;
    finally
        LDataSet.Free;
    end;
end;
+ Благодарностей: 1

Stich

Пишет, что у LDataSet нет поля Data.
Исправил, была ошибка в имени типа LDataSet.

Stich

#7
Цитата: Chaa от 07.03.13, 11:52:55
Если использовать IRemoteConnection, то все останется так же, там есть те же функции RunMethod и GetDataSet. Только CurrentBase нужно установить в нужное значение.

Если вы создаете COM-объект на удаленной машине, то использование будет примерно таким:
var
    LAppServer: Variant;
    LRetCode, LErrMsg: Variant;
    LData: Variant;
    LDataSet: TClientDataSet;
begin
    LAppServer := CreateRemoteComObject('AS',
        StringToGUID('{392BA982-A82F-44AB-BA8A-69BE25199F73}'));

    LAppServer.ConnectToDB('ДемоМашиностроение', LRetCode, LErrMsg);
    if LRetCode <> 0 then ;// Ошибка

    LData := LAppServer.FindObjects(... {Параметры как и раньше плюс еще два: }, LRetCode, LErrMsg);
    if LRetCode <> 0 then ;// Ошибка

    LDataSet := TClientDataSet.Create(nil);
    try
        LDataSet.Data := LData;
        while not LDataSet.Eof do
        begin
            // ...
        end;
    finally
        LDataSet.Free;
    end;
end;

Все получилось, спасибо большое. Хотя по большей части это какое то везение, т.к. я все еще до конца не допонимаю что и как работает. Еще возник вопрос, как прочитать атрибуты найденных объектов? В лоцман API есть функция GetAttributesValues2, но не пойму кто ее вызывать должен. COM-объект? Еще для этого метода требуются ID атрибутов, как их можно получить?

Maxxx

смотри метод GetInfoAboutVersion. в mode - 2 он возвращает атрибуты объекта
+ Благодарностей: 1