[QUOTE]Сергей Викторович написал:
if ((OpType AND 1) <> 0) then soper := 'СОЗДАНИЕ ОБЪЕКТА';
if ((OpType AND 2) <> 0) then soper := 'УДАЛЕНИЕ ОБЪЕКТА';
if ((OpType AND [B]4[/B]) <> 0) then soper := 'ОБНОВЛЕНИЕ ОБЪЕКТА';
if ((OpType AND 8) <> 0) then soper := 'ВОССТАНОВЛЕНИЕ ОБЪЕКТА';[/QUOTE]
Прошу прощения, тут была ошибочка
Коды операций:
[QUOTE]// ТИПЫ ОПЕРАЦИЙ НАД ОБ'ЕКТОМ
enum OBJECT_OPERATION
{
OO_APPEND = 1, // СОЗДАНИЕ ОБ' ЕКТА
OO_DELETE = 2, // УДАЛЕНИЕ ОБ'ЕКТА
OO_UPDATE = 4, // ОБНОВЛЕНИЕ ОБ'ЕКТА
OO_UNDO = 8, // ВОССТАНОВЛЕНИЕ ОБ'ЕКТА
};[/QUOTE]
[QUOTE]Сергей Викторович написал:
Как посмотреть Журнал транзакций?
Как вывести Журнал транзакций на экран?[/QUOTE]
1. Программно - с помощью MAPAPI (функции для Delphi описаны в logapi.inc)
2. С помощью штатных средств ГИС Панорама:
а) в редакторе карты есть диалог отмены транзакции;
б) в перечне прикладных задачи (F12) есть задача "Просмотр журнала транзакций" (в разделе "Контроль и исправление данных")
3. Компонент диалога отмены внесенных изменений в GIS ToolKit: TUndoDialog
Прикладная задача "Просмотр журнала транзакций" в открытых исходных текстах доступна [URL=https://gisinfo.ru/download/?id=310]в составе SDK[/URL].
[QUOTE]Сергей Викторович написал:
Где физически располагается Журнал отмены транзакций?[/QUOTE]
[QUOTE]Сергей Викторович написал:
файлы \Log\name.log и \Log\name.tac – протокол работы и журнал транзакций[/QUOTE]
[QUOTE]Сергей Викторович написал:
Зачем так много накопировали одну и туже фразу?[/QUOTE]
Параметр mode (GENERIC_WRITE / GENERIC_READ) управляет режимом доступа к данным и используется в функция открытия данных.
Сколько функций открытия данных - столько раз и написаны пояснения по этому параметру.
Если Вы открываете карту со значением параметра mode равном GENERIC_READ, то карта открывается только на чтение и журнал транзакций при этом не ведется.
Собственно, как и указано в комментарии, который Вы привели выше.
Для карты, открытой на запись, можно принудительно выключить ведение журнала транзакций (см. mapLogAccess).
Журнал ведется автоматически. Каждая операция создания, изменения или удаления объекта карты автоматически попадет в журнал.
Если Вы не открывали свою транзакцию, то на каждую такую операцию стартует отдельная транзакция и автоматически подтверждается.
Если Вы открыли свою транзакцию, то операции создания, изменения или удаления объектов будут регистрироваться внутри Вашей транзакции, пока Вы ее не закроете.
Отрытую транзакцию надо закрыть:
[QUOTE] // Закрыть запись транзакции
// hMap - идентификатор открытой карты
// hSite - идентификатор открытой пользовательской карты
// number - поле для записи номера выполненной транзакции в журнале транзакций
// Возвращает число выполненных операций в транзакции для карты
// Если число транзакций не может быть определено возвращает -1
// При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapLogCommitActionEx(HMAP hMap, HSITE hSite, long int * number);
_MAPIMP long int _MAPAPI mapLogCommitAction(HMAP hMap, HSITE hSite);
_MAPIMP long int _MAPAPI mapLogCommitActionObject(HOBJ info);[/QUOTE]
Цитата из документа ПАРБ.00046-06 98 08. Разработка новых модулей
[QUOTE]На каждую группу операций может формироваться своя транзакция, что позволит в
дальнейшем отменить всю операцию при необходимости.
ПАРБ.00046-06 98 08
Изм. Лист № докум. Подп. Дата
142
logapi.mapLogCreateAction(hmap, hmap, logapi.TAC_MED_MOVE)
...
logapi.mapLogCommitAction(hmap, hmap)
[/QUOTE]
Вы также можете сохранять свои записи об операциях внутрь транзакции, но для этого надо корректно заполнить структуру TACTIONRECORD.
Я выше Вам указывал, на то, что Вы не заполнили эту структуру:
[CODE]// Чтобы сохранить корректную запись, надо заполнить ActionRecord !!!
mapLogPutRecord(MapView1.MapHandle, hSiteb, @ActionRecord);[/CODE]
В результате Вы получаете вырожденную транзакцию.
Без особой необходимости я бы не рекомендовал подменять автоматическую регистрацию операций на свой вызов mapLogPutRecord.
А в Вашем случае такой необходимости нет.
if ((OpType AND 1) <> 0) then soper := 'СОЗДАНИЕ ОБЪЕКТА';
if ((OpType AND 2) <> 0) then soper := 'УДАЛЕНИЕ ОБЪЕКТА';
if ((OpType AND [B]4[/B]) <> 0) then soper := 'ОБНОВЛЕНИЕ ОБЪЕКТА';
if ((OpType AND 8) <> 0) then soper := 'ВОССТАНОВЛЕНИЕ ОБЪЕКТА';[/QUOTE]
Прошу прощения, тут была ошибочка
Коды операций:
[QUOTE]// ТИПЫ ОПЕРАЦИЙ НАД ОБ'ЕКТОМ
enum OBJECT_OPERATION
{
OO_APPEND = 1, // СОЗДАНИЕ ОБ' ЕКТА
OO_DELETE = 2, // УДАЛЕНИЕ ОБ'ЕКТА
OO_UPDATE = 4, // ОБНОВЛЕНИЕ ОБ'ЕКТА
OO_UNDO = 8, // ВОССТАНОВЛЕНИЕ ОБ'ЕКТА
};[/QUOTE]
[QUOTE]Сергей Викторович написал:
Как посмотреть Журнал транзакций?
Как вывести Журнал транзакций на экран?[/QUOTE]
1. Программно - с помощью MAPAPI (функции для Delphi описаны в logapi.inc)
2. С помощью штатных средств ГИС Панорама:
а) в редакторе карты есть диалог отмены транзакции;
б) в перечне прикладных задачи (F12) есть задача "Просмотр журнала транзакций" (в разделе "Контроль и исправление данных")
3. Компонент диалога отмены внесенных изменений в GIS ToolKit: TUndoDialog
Прикладная задача "Просмотр журнала транзакций" в открытых исходных текстах доступна [URL=https://gisinfo.ru/download/?id=310]в составе SDK[/URL].
[QUOTE]Сергей Викторович написал:
Где физически располагается Журнал отмены транзакций?[/QUOTE]
[QUOTE]Сергей Викторович написал:
файлы \Log\name.log и \Log\name.tac – протокол работы и журнал транзакций[/QUOTE]
[QUOTE]Сергей Викторович написал:
Зачем так много накопировали одну и туже фразу?[/QUOTE]
Параметр mode (GENERIC_WRITE / GENERIC_READ) управляет режимом доступа к данным и используется в функция открытия данных.
Сколько функций открытия данных - столько раз и написаны пояснения по этому параметру.
Если Вы открываете карту со значением параметра mode равном GENERIC_READ, то карта открывается только на чтение и журнал транзакций при этом не ведется.
Собственно, как и указано в комментарии, который Вы привели выше.
Для карты, открытой на запись, можно принудительно выключить ведение журнала транзакций (см. mapLogAccess).
Журнал ведется автоматически. Каждая операция создания, изменения или удаления объекта карты автоматически попадет в журнал.
Если Вы не открывали свою транзакцию, то на каждую такую операцию стартует отдельная транзакция и автоматически подтверждается.
Если Вы открыли свою транзакцию, то операции создания, изменения или удаления объектов будут регистрироваться внутри Вашей транзакции, пока Вы ее не закроете.
Отрытую транзакцию надо закрыть:
[QUOTE] // Закрыть запись транзакции
// hMap - идентификатор открытой карты
// hSite - идентификатор открытой пользовательской карты
// number - поле для записи номера выполненной транзакции в журнале транзакций
// Возвращает число выполненных операций в транзакции для карты
// Если число транзакций не может быть определено возвращает -1
// При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapLogCommitActionEx(HMAP hMap, HSITE hSite, long int * number);
_MAPIMP long int _MAPAPI mapLogCommitAction(HMAP hMap, HSITE hSite);
_MAPIMP long int _MAPAPI mapLogCommitActionObject(HOBJ info);[/QUOTE]
Цитата из документа ПАРБ.00046-06 98 08. Разработка новых модулей
[QUOTE]На каждую группу операций может формироваться своя транзакция, что позволит в
дальнейшем отменить всю операцию при необходимости.
ПАРБ.00046-06 98 08
Изм. Лист № докум. Подп. Дата
142
logapi.mapLogCreateAction(hmap, hmap, logapi.TAC_MED_MOVE)
...
logapi.mapLogCommitAction(hmap, hmap)
[/QUOTE]
Вы также можете сохранять свои записи об операциях внутрь транзакции, но для этого надо корректно заполнить структуру TACTIONRECORD.
Я выше Вам указывал, на то, что Вы не заполнили эту структуру:
[CODE]// Чтобы сохранить корректную запись, надо заполнить ActionRecord !!!
mapLogPutRecord(MapView1.MapHandle, hSiteb, @ActionRecord);[/CODE]
В результате Вы получаете вырожденную транзакцию.
Без особой необходимости я бы не рекомендовал подменять автоматическую регистрацию операций на свой вызов mapLogPutRecord.
А в Вашем случае такой необходимости нет.