Лоцман API + Плагин + Delphi

Автор Dim, 30.04.08, 10:05:17

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

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

YorikER

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
  var AllowExpansion: Boolean);
var
  ver1: TVersion;
  data1:Tclientdataset;
  cnode: TTreeNode;
begin
  if Node.Data<>nil then
  begin
    ver1:=TVersion(Node.Data);
    dara1:=TClientDataSet.Create(nil);
// Далее как в головном примере цикл по списку
    data1.data:=ver1.gettree(sel,'Состоит из ...'+#1+'Документы',false);
    data1.first;
    while not data1.eof do
    begin
      cnode:=treeview1.items.addChildNode(Node,data1.fields.fieldbyname('_PRODUCT').asstring); // единственное отличие от цикла в головном примере
      // это использование функции addChildNode - она добавляет узел в список дочерних узлов для указанного Node

  // поместим в свойство node.data указатель на вновь созданный объект типа TVersion
  // с идентификатором взятым из поля _ID_VERSION
      cnode.data:=Pointer(Tversion.fromidversion(fieldbyname('_ID_VERSION')));

  //в следующей строчке просто нет необходимости, т.к. в node.data мы
  // храним всю структуру TVersion
  //node.overlayindex:=data1.fields.fieldbyname('_ID_VERSION').asinteger;

      cnode.stateindex:=data1.fields.fieldbyname('_ID_LINK').asinteger;

  // вместо следующей строчки рекомендую написать процедуру чтения необходимых вам атрибутов
  // (даже в зависимости от типа объекта) с помощью сформированного и зафиксированного в node.data объекта TVersion
  // и заполнения свойства node.text
  //node.Text:=node.Text+'_'+inttostr(node.overlayindex)+'_'+inttostr(node.stateindex);
      ReadNodeAttributes(cnode);

  // Далее необходимо написать функциюпроверки наличия дочерних компонентов у текущей вершины
  // и заполнить свойство node.haschildren - если оно равно True, то вершина появится с крестиком (вы ее сможете раскрыть),
  // если False вершина раскрываться не будет, используйте для этого метод TVersion.GetLinkedFast...
      cnode.haschildren:=CheckNodeChildren(cnode);
  // ВНИМАНИЕ!!! Чтобы список раскрывался его надо первначально заполнить, для этого опишите процедуру для события OnExpanding,
  // эта процедура будет вызываться перед раскрытием поддерева (при нажатии на крестик), если крестик есть (haschildren=True),
  // а node.count=0 (дочерних объектов не зарегистрировано) , то необходимо поддерево заполнить, аналогично основной процедуре.

      data1.Next;
    end;
    data1.free;
    ver1.free;
  end;
end;

Вроде должно работать...

Dim

Для YorikER:  :)  :o:
Спасибо суперогромное!!! Я пробовал, вроде получается, но не всё, т.к. допустим функцию я поменял, например, Вы написали что AddChildNode - это добавляет узел, посмотрел и оказывается что нет таких функций и я поменял на AddChild, и получилось...
А ещё почему так инд.объекта Sel. Должно быть Ver1.inID, то есть связаны с верхними:

ver1:=TVersion(Node.Data);
Data1.Data:=ver1.GetTree(Sel,'Состоит из ...'+#1+'Документы',false) -> Data1.Data:=ver1.GetTree(Ver1.inID,'Состоит из ...'+#1+'Документы',false).

А ещё есть проблема, допустим:
у меня хорошо получается
- а
-- а1 Например:  Индетификатор а1=14258  ('_ID_VERSION') - это верный, все проверил...
  + аа1
  -- аа2
-- а2
б (Например: Индетификатор б=14679 - верно)
+ в

А если я обратно с минусик на плюсик и получилось другой индетификатор, почему, допустим
- а
-+ а1 Например:  Индетификатор а1=2056 - это неверный и выводит ошибка, и так и остается, затем снова с плюсик на минусик и то же самое а1=2056? и т.д.
-- а2
б (Например: Индетификатор б=3068 - неверно) и т.д...
+ в
... и все остальные...  :(((

Понимаете, ли Вы о чем я написал Вам... Не знаю как Вам объяснить...
С уважением Dim...  88))

YorikER

По поводу Sel - молодец, исправил как надо...
По поводу переходов с плюсика на минус... Давай включим логику всего процесса...
Когда ты строишь дерево в самом начале, ты строишь только верхний уровень дерева, внутренности не заполняются (для экономии времени - так как все ветки деревьев заполнить - это будет стоить очень дорого, да и незачем)... Единственное только проверяется наличие дочерних объектов, чтобы на ветки с дочками поставить +... Для возможности дальнейшего открытия... При первом нажатии на + включается событие OnExpanding и ветка заполняется текущим уровнем... При повторном нажатии происходит тоже самое, а делать это не нужно, если ветку уже открывали - то заполнять ее не надо. Для этого перед заполнением (в событии OnExpanding) надо проверить была ли она заполнена или нет. Это мы с тобой забыли... У нас есть свойство HasChildren=True если у вершины есть дочки и False - если нет. Это свойство мы заполняем принудительно. Кроме этого у вершины дерева Node есть свойство, которое указывает количество дочек - Count. Оно заполняется автоматически при создании дочерних веток... Так вот, если HasChildren=True а Count=0 значит ветка не заполнялась (только проверялась на наличие дочек), т.е. ее надо заполнить, если HasChildren=True а Count<>0 , значит ветка уже заполнена и операцию заполнения производить не надо, ветка просто откроется... Скорее глюк из-за этого... Успехов...

Dim

Для YorikER:  :)  :o:
Привет!!! По поводу переходов с плюсика на минус... Все таки не получается (часто ошибки) и пробовал вставить конструкцию try ... except ... end, чтоб игнонировать ошибки и получилось ок.  8-)

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
  var AllowExpansion: Boolean);
begin

  try
    .................. Это Вы написали кодик...
  except
   я специально не писал кодик, просто пусто
  end;

end;

Вот такой исходник и получилось ок. Если что то не прав, то объясните пожалуйста где ошибка... или вообще по-другому...

А ещё второй вопросик.
TreeView связаны с ImageList (уже добавлен 2 примерного рисунка(Image)), но надо чтоб выводил в дереве свои типы: Сборочные единицы и Чертёж, я не знаю что написать программно...Я хочу чтоб в дереве было красиво и каждый свой рисунок по типу... Как объяснить...  :(((
Допустим:
- а (рисунок: Сборочные единицы )
---а1 (рисунок: Чертёж )
- в (рисунок: Сборочные единицы )
---в1 (рисунок: Сборочные единицы )
---в2 (рисунок: Чертёж )
и т.д...

Заранее благодарю Вас!!!
С уважением Dim  :)

YorikER

По поводу каких либо ошибок внутри кода, я думаю скоро ты сам разберешься и у тебя все получится, изучай Delphi, включай логику мышления и все будет в порядке...
По поводу иконок: два варианта...
Первый простой... В TImageList закачать иконки всех необходимых тебе типов. В структуре TVersion есть свойство sType, по нему можно определить тип вершины, и подставить номер иконки в структуру TNode. Кроме этого в TClientDataSet, после того как прочел список подчиненных объектов конструкция FieldByName('_TYPE').asString также возвращает тип объекта (строка - 'Сборочная единица')
Второй способ - универсальный, подчитать в TClientDataSet.Data список типов базы данных, и по прочитанному типу загонять необходимую иконку в TImageList если ее там нет динамически. Только вот как прочитать список типов в плагинах, честно говоря, я не знаю. Обратись в службу поддержки...

Dim

Здравствуй YorikER!
Спасибо, я разберусь(по поводу каких либо ошибок внутри кода)...
Понятно, что второй способ надо обратить в службу поддержки, но как связаться со службой поддержки...
А первый способ Вы сможете привести мне примерчик-кодик в TImageList...

Второй вопросчик:
Какая функция, которая бы добавилась связь, вот у меня есть примерчик-рисунок, надеюсь что Вы поняли.

Функция UpLink,

или InsertObject, но не подходит,

или ...

как бы сказать: копировать текущее обозначение со связью, затем вставить в нужного обозначения

Maxxx

А чем не подходят методы UPLINK или INSERTOBJECT?

Dim

Наверно Вы не поняли, я имею в виду: какая из них функций, чтобы создала связь между объектами т.е. добавить объект в нужный объект (похожая как вырезать-копировать-вставить), а может Вы знаете какая функция Вы знаете...  88))

Maxxx

Можно использовать обе. Просто UPLINK - более универсальная. Позволяет задать еще и количество, ед.измерения. И не только позволяет создавать новую связь, а также удалять или обновлять уже существующую. Но чтобы пользоваться UPLINK необходимо чтобы и объект-родитель и объект-потомок уже существовали в базе. а вот метод InsertObject можно использовать как при существующем объекте-потомке, так и для создания-вставки нового в объект-родитель.
В Вашем случае подойдет UPLINK;
Например (для плагина):

LINK_ID:=RunMethod('UPLINK',[ParentVersion.stType, ParentVersion.stProduct,ParentVersion.stVersion,
              ChildVersion.stType, ChildVersion.stProduct, ChildVersion.stVersion,0,
              1,1,'',false, 'Состоит из ...']);

Dim

Спасибо Маххх :)  :o: . Получается...

А ещё вопросик... Какая функция, чтобы обновилась("Обновить") и сохранилась("Сохранить") после добавления или редактирования? Не могу найти функцию, помогите...  :`(
А ещё функция - "Вернуться" и "Отказаться"?
Заранее спасибо!!!
С уважением Dim  88))

Maxxx

Для сохранения изменений в базе - функция SaveChanges
Для отказа от изменений - CancelCheckOut
Для возврата измененного объекта в базу - CheckIn
Параметры функций см. SDK.
Для обновления объекта в дереве лоцмана - функция PostMessage(ClientHandle,WM_REFRESHVERSION,0,0);
Перейти на объект в дереве - PostMessage(ClientHandle, WM_GOTOOBJECT, ID_объекта, 0);


Dim

Цитата: Maxxx от 06.08.08, 10:21:46
Для сохранения изменений в базе - функция SaveChanges
Для отказа от изменений - CancelCheckOut
Для возврата измененного объекта в базу - CheckIn
Параметры функций см. SDK.
Для обновления объекта в дереве лоцмана - функция PostMessage(ClientHandle,WM_REFRESHVERSION,0,0);
Перейти на объект в дереве - PostMessage(ClientHandle, WM_GOTOOBJECT, ID_объекта, 0);

У мя не получается, можешь привести мне примерчик-кодик, как "обновить", "сохранить", "отказаться" и "вернуть", а ещё я не понимаю что означает SDK и  понятие не имею функции PostMessage, откуда вязлись - REFRESHVERSION и GOTOOBJECT...
Заранее благодарю...

Maxxx

SDK - это описание функций лоцмана(хэлп).
Насчет примерчика:
//Сохранение в базе
RUNMETHOD('SaveChanges',[CheckOutName, DBName]);//имя чекаута, имя базы

//Вернуть в базу с сохранением
RunMethod('CheckIn',[CheckOutName, DBName]);

//отказаться от изменений
RunMethod('CancelCheckOUT',[CheckOutName, DBName]);

Чтобы получить CheckOutName и DbName можно использовать переменные - stCheckOUT И DataBaseName объявленные в процедуре плагина, или же методы -  GetInfoAboutCurrentBase,  GetInfoAboutVersion(режим 12).

Насчет PostMesage - это функция Windows. Посылает сообщение объектам.
В данном случае - чтобы обновить объект в дереве лоцмана
PostMessage(ClientHandle,WM_REFRESHVERSION,0,0);
//ClientHandle - Клиентское окно, WM_REFRESHVersion - сообщение обновить версию, 0,0 - параметры.

подробнее о PostMessage можешь посмотреть здесь - http://forum.ascon.ru/index.php/topic,3416.msg18438.html#msg18438



Dim

Спасибо, Маххх!!!  :)
У мя есть две вопросы:
1). Как выполнить экспорт данных в файл XML? Как создать документ(отчет), например, FastReport или Word и т.д....
Надо ли изучать в XML, или есть готовая прога для экспорта в XML?

2). Как выводить чтоб в DBgrid-е было так полностью выводило, как тебе сказать, вот например, каждый раз в "Состоит из ..."
- а
-- а1
  -- аа1
   --- ааа1
   --- ааа2

Не так - только:
- а
-- а1

Мне нужен выводил все полностью

Maxxx

В лоцмане есть по-моему модуль иморта-экспорта из/в XML.
А насчет отчета - лучше всего создать SQL - запрос который будет возвращать необходимые данные. Его нужно зарегестрировать в ЛОЦМАН-конфигураторе. А затем можно в FastReport  создать форму этого отчета и  использовать данный SQL запрос. Получается большой выигрыш по времени по сравнению с тем, если полностью создавать отчет в FastReport.
По поводу второго вопроса - ты не ошибся  - тебе нужно именно в ДБгриде, или в дереве(TreeView или подобном)?

Dim

По поводу второго вопроса - нужен признак полной разусловки, то есть функция "GetLinkedObjects", но к сожалению не выводит до полной, например, тип связи "Состоит из ... " полностью выводит, а вот "Документы" - нет, только связь с предыдущимим и всё.

А по поводу XML - мне нужен экспортировать с помощью Delphi, а может Вы правы, что нужен с помощью FastReport, но я не в курсе, у Вас есть примеры-исходники по FastReport-у... А ещё где взять дистрибутив FastReport чтоб связался с Delphi, т.е. компонент и как подключиться к Лоцману.
Заранее спасибо!!!  :shu:

Maxxx

#96
Функция GetLinkedObjects получает связанные элементы по одному типу связи.
Для построения дерева по  всем связям можно использовать функцию

GetLObjs(
long inIdVersion, // идентификатор версии 
WordBool boInverse,        // направление
Variant inReturnCode,        // код возврата
Variant stErrorMessage,        // сообщение об ошибке
)  - лоцман 8   и позднее.
.
Например - RunMethod('GetLObjs',[Version.inId, true]);
или
GetTree(или GetTree2 - если версия лоцмана позднее 8).

Синтаксис - Variant GetTree(
BSTR stTypeName,        // название типа
BSTR stProductName,        // ключевой атрибут
BSTR stVersionNumber,        // версия объекта
long inIdVersion, // идентификатор версии 
BSTR stLinkType,        // список связей
WordBool boWithAttrs,        // возвращать\не возвращать атрибуты
Variant inReturnCode,        // код возврата
Variant stErrorMessage,        // сообщение об ошибке
);
пример Gettree - RunMethod('GetTree',[Version.StType, Version.stProduct, Version.stVersion,0,'Состоит из ...#1Документы#1Исполнения', true ]);
или RunMethod('GetTree',['','','',Version.inID,'Состоит из ...#1Документы#1Исполнения', true]);

Если хочешь чтобы в зависимости от типа объекта выводились объекты по всем связям, присущим данному типу то :
Список связей, которые могут быть у какого либо типа можно получить функцией GetInfoAboutType(режим 4);


FastReport можно скачать с сайта разработчика. Бесплатную версию. FreeReport. Ее возможностей должно хватить (хотя смотря что тебе нужно). А связать с делфи - нужно будет установить компоненты FreeReport.
А затем с отчетом FastReport можешь связывать наборы данных делфи (например TClientDataSet).

Dim

Здравствуй Маххх!!!
Я разобрался впервый раз FastReport - получается что я новичок... Разобрался. Жаль, что версия третья платно для компонента в Delphi, тама есть сохранить в файл *.pdf, мне это именно нужен. Конечно что есть в Лоцмане с FastReport сохранить в файл *.pdf, но мне нужен в Delphi...

У мя есть вопрос:
В процедуре SQL "dbo.[rep_VEDOMOST_SPECIFIKACIY]" - мне нужен - выводить узлы в том числе "Детали", "Сборочные чертежи", "Материалы" и т.д... А эта процедура только выводит все узлы "Сборочные единицы", мне эта не нравится, и не могу разобраться уже два дня, надеюсь Вы поможете чтоб вставлять дополнительно кодик SQL, в процедуру rep_VEDOMOST_SPECIFIKACIY.
Вот код процедуры rep_VEDOMOST_SPECIFIKACIY, я не могу где "Сборочные единицы"... где нходится... понятие не имею...
Заранее спасибо...

Цитировать
CREATE PROCEDURE dbo.[rep_VEDOMOST_SPECIFIKACIY]
  (
    @objects varchar(8000),
    @params  varchar(8000) = null
  )
AS
/******************************************
--- Отчёт Ведомость спецификаций

*******************************************/

  set nocount on

  declare @id          int,
          @lnkCompose  varchar(255),
          @lnkDoc      varchar(255),
          @typeSpec    varchar(255),
          @typeDoc     varchar(255),
          @attrVedSpec varchar(255),
          @valVedSpec  varchar(255)

  -- Извлечение кода объекта
  SELECT top 1 @id = id FROM dbo.ExtractObjectsIds(@objects)
  -- Инициализация параметров
  Set @lnkCompose  = 'Состоит из ...'
  Set @lnkDoc      = 'Документы'
  Set @typeSpec    = 'Спецификация'
  Set @typeDoc     = 'Документ'
  Set @attrVedSpec = 'Наименование'
  Set @valVedSpec  = 'Ведомость спецификаций'

  -- Таблица - хранилище спецификаций
  declare @Spec table (
                        idspec    int,             -- Код спецификации
                        idver     int,             -- Код СЕ
                        idparent  int,             -- Код объекта, в который входит СЕ
                        quant     float,           -- Количество, с учетом предыдущего уровня
                        selfquant float,           -- Просто количество
                        note      varchar(255),    -- Примечание (от связи idparent - idver)
                        lev       int              -- Уровень в "дереве"
                      )
  -- Таблица - хранилище ведомостей спецификаций
  declare @VedSpec table (idvedspec int,           -- Код ведомости
                          idse      int,           -- Код СЕ, к которой ведомость привязана
                          primary key (idse, idvedspec))
  -- Промежуточная таблица - текущий слой
  -- та же структура, что и @Spec + doctype (тип документа)
  declare @Layer table (idspec    int,
                        doctype   varchar(255),
                        idver     int,
                        idparent  int,
                        quant     float,
                        selfquant float,
                        note varchar(255),
                        lev int)

  declare @iCounter int,    -- Счетчик уровней
          @rows     int     -- Количество добавленных спецификаций за уровень

  Set @iCounter = 0

  -- Обработка головного объекта
  -- Получаем все связанные документы, в промежуточный слой
  INSERT INTO @Layer
    SELECT c.idchild, s.type, @id, null, 1, 1, '', @iCounter
    FROM (SELECT * FROM dbo.rvwRelations WHERE idparent = @id AND relationname = @lnkDoc) c
          INNER JOIN dbo.rvwVersions s on c.idchild =  s.id

  -- Извлекаем из полученного слоя ведомости спецификаций
  INSERT INTO @VedSpec
    SELECT distinct idspec, idver
    FROM @Layer l
         LEFT JOIN dbo.rvwVersions s on l.idspec = s.id
         LEFT JOIN dbo.rvwAttributes a on a.idversion = l.idspec AND
                                          (name = @attrVedSpec AND value = @valVedSpec)
    WHERE  -- Тип документа "Ведомость спецификаций" или
           -- Тип "Документ" и "Наименование = Ведомость спецификаций"
           s.type = @valVedSpec OR
          (s.type = @typeDoc AND a.idversion IS not null)

  -- В таблицу спецификаций скинуть спецификации и объекты, для которых нет
  -- ведомости спецификаций (для первого уровня объект один)
  INSERT INTO @Spec
    SELECT idspec, idver, idparent, quant, selfquant, note, lev
    FROM @Layer l
         LEFT JOIN @VedSpec v on l.idver = v.idse
    WHERE l.doctype = @typeSpec AND   -- Тип документа "Спецификация"
          v.idvedspec IS null         -- У объекта нет "Ведомости спецификаций"

  -- Количество вставленных спецификаций
  Set @rows = @@rowcount

  -- Цикл выполняется до тех пор пока последняя операция
  -- добавила хотя бы одну спецификацию
  while @rows <> 0
  begin
    -- Очистить слой-буфер
    DELETE FROM @Layer
    -- Увеличить счетчик
    Set @iCounter = @iCounter + 1
   
    -- Действия аналогичные тем, которые выполнялись для головного объекта
    INSERT INTO @Layer
      SELECT d.idchild,                   -- Код документа
             s.type,                      -- Тип документа
             c.idchild,                   -- Код объекта
             c.idparent,                  -- Код "узла"
             spec.quant*c.minquantity,    -- Количество с учетом предидущего уровня
             c.minquantity,               -- Просто количество
             a.value,                     -- Примечание
             @iCounter                    -- Номер слоя
      FROM  @Spec spec    -- Объекты предыдущего слоя (spec.lev = @iCounter - 1)
            -- Состав вниз
            INNER JOIN dbo.rvwRelations c on spec.lev = @iCounter - 1   AND
                                             c.idparent = spec.idver AND
                                             c.relationname = @lnkCompose
            -- Документы, связанные с элементами состава
            INNER JOIN dbo.rvwRelations d on c.idchild = d.idparent AND
                                             d.relationname = @lnkDoc
            INNER JOIN dbo.rvwVersions s on d.idchild =  s.id
            -- Примечание (атрибут связи между узлом и элементом состава)
                 LEFT JOIN dbo.rvwRelationAttributes a on c.id = a.idrelation AND a.name= 'Примечание'
   
    -- Ведомости спецификаций
    INSERT INTO @VedSpec
      SELECT distinct
          l.idspec, l.idver
      FROM @Layer l
           LEFT JOIN dbo.rvwAttributes a on idversion = l.idspec AND
                                            (name = @attrVedSpec AND value = @valVedSpec)
      WHERE l.doctype = @valVedSpec OR
            (l.doctype = @typeDoc AND a.idversion IS not null)
            AND
            -- Не включать те которые уже есть в таблице
            not exists (SELECT top 1 1 FROM @VedSpec WHERE idse = l.idver AND idvedspec = l.idspec)   
   
    -- Спецификации   
    INSERT INTO @Spec
      SELECT idspec, idver, idparent, quant, selfquant, note, lev
      FROM @Layer l
           LEFT JOIN @VedSpec v on l.idver = v.idse
      WHERE l.doctype = @typeSpec AND
            v.idvedspec IS null
   
    -- Количество спецификаций на последнем обработанном уровне
    Set @rows = @@rowcount
  end;
 
  ------------------------------------------------------------------------------------
  -- Результат
  SELECT res.mark      [Обозначение],
    res.objname   [Наименование],
         ce.product    [Куда входит обозначение],
         res.selfquant [Кол-во на СЕ],
         res.quant     [Кол-во сквозное],
        -- res.summa     [Итог],
    res.note      [Примечание],
    res.dop       [Признак ВС]
              
  FROM
    -- Спецификации
    (
   SELECT   s.product      AS mark,
      a.value        AS objname,
      spec.idparent  AS obj_id,
      spec.quant,     
      spec.selfquant,
      itogi.summa,
      note,
      0              AS dop
      FROM @Spec spec
           LEFT JOIN (SELECT idspec, sum(quant) AS summa FROM @Spec GROUP BY idspec) itogi
            on spec.idspec = itogi.idspec
           LEFT JOIN dbo.rvwVersions s on spec.idver   = s.id
      LEFT JOIN dbo.rvwAttributes a on spec.idver = a.idversion AND a.name = 'Наименование'
      union all     
      SELECT   s.product AS mark,
      ''        AS objname,
      spec.idse AS obj_id,
      null      AS quant,
      null      AS selfquant,
      null      AS summa,
      ''        AS note,
      1         AS dop
      FROM   @VedSpec spec
      LEFT JOIN dbo.rvwVersions s on spec.idvedspec = s.id
    ) res
    LEFT JOIN dbo.rvwVersions ce on res.obj_id = ce.id
  ORDER BY
    -- Сортировка: Сначала спецификации,
    -- которые внутри сортируются по типу "узла",
    -- затем ведомости спецификаций.
    -- Внутри каждой группы сортировка по бозначению и наимнованию
    100*dop +
    (case 
          when ce.id IS null then 0
          when ce.type = 'Сборочная единица' then 1
          when ce.type = 'Комплекты' then 2
          else 10
     end),
    [Обозначение],
    [Наименование],
    [Куда входит обозначение]
GO

Maxxx

Из названия отчета видно что это ведомость спецификаций... Т.е. в рез-тат попадают только те элементы у которых есть спецификация... А вот запрос rep_SPECIFIKACIJA - это отчет спецификация - т.е. состав...
Отчет с полной разузловской - Ведомость ДСЕ сводная с входимостью(rep_SVDSE)...
Хотя скорее всего тебе придется писать свой запрос в зависимости от того какой результат необходимо получить...

Dim

Здравствуй Маххх!!!  :)
У мя нет такой отчет с полной разузловской - Ведомость ДСЕ сводная с входимостью(rep_SVDSE), если у тя есть то скинь мне и я сам разберу.
я не могу самому написать свой запрос, т.к. нет примера, если бы есть пример то я мог бы разбирать...
Заранее спасибо...  88))