Создать документ нового типа

ПНР и сопровождение

Модераторы: m0p3e, edward_K, Модераторы

galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Создать документ нового типа

Сообщение galover »

edward_K
Где я писал что юзаю alter dictionary? Дядя Федя писал что это вредно, я в курсе. Так что контрольная сумма словаря не меняется - дело не в этом. Добавлял таблицы lot-ом, получается нельзя так делать? В support попробую. БД Oracle.
Документ мне нужен не для бух. учета, исключительно для опер контура.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Создать документ нового типа

Сообщение galover »

вот такой код для создания таблицы юзал

Код: Выделить всё

create table s_Module "Программные модули"
with table_Code = 31600
with replace
with tableOptions branched
(
   nRec        : comp        "Номер записи",
   Code        : word        "Системный код модуля",
   Name        : string[200] "Наименование модуля",
   Description : string      "Описание назначения",
   Params      : longint     "Дополнительные параметры",
   LevelCode   : string[20]  "Код на уровне", // Только для сортировки   
   cModule     : comp        "Ссылка на вышестоящий модуль" // ToDo-> переделать на ref(s_Module)
)
with index
(
   index1 = nRec(unique, surrogate, journal),
   index2 = Code(unique),
   index3 = Name,
   index4 = LevelCode,
   index5 = cModule + Name,
   index6 = cModule + LevelCode
);
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Создать документ нового типа

Сообщение edward_K »

Попробуйте создать как у меня.
а какая разница? бухучет или оперативный. Настраиваете забалансовый счет с нужным разрезом хранения - то есть 6 аналитик в вашем распоряжении + подразделение. А если еще и по кредиту цеплять то 12. - получаете готовый фейс за 5 сек с прописанным выбором, отчетами и т.д. Еще и к до можно привязать и сф сделать.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Создать документ нового типа

Сообщение galover »

Покрутил и так и сяк. Вывод - на простейших таблах (как у Edward_K) создается. У меня же есть restrict на поле - он мне нужен. Без этого параметра таблица создается нормально, с restrict - валится ошибка (это если через support, если vip-ом то ошибки нет, но тогда компилятор кричит что нужно чистить журнал и рубить протект). Но журнализация не работает все равно (хоть с restrict, хоть без). Т.е. таблица помечается как журнализируемая, но реально не журнализируется.
Vitaliy
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 27 апр 2005, 09:52
Откуда: Сибирь

Re: Создать документ нового типа

Сообщение Vitaliy »

Добавление и удаление таблиц не требует чистки журнала, отключения журнализации, протекта и прочих манипуляций.
Поэтому модификация своих таблиц на "горячую" может производиться по следующему алгоритму:
1. Выгрузил из таблицы данные в бдф
2. Удалил таблицу
3. Создал таблицу с новой структурой
4. Загрузил данные в таблицу из дбф

Все это прекрасно делается VIP-ом, написав один раз батник.
Vitaliy
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 27 апр 2005, 09:52
Откуда: Сибирь

Re: Создать документ нового типа

Сообщение Vitaliy »

galover писал(а):Т.е. таблица помечается как журнализируемая, но реально не журнализируется.
Делай, как написал galover, т.е. не отходи от принятого стандарта в самой Гал-ку.
Заводи поле типа Comp, как нумератор записей (в галке- nRec)
Добавляй по этому полую индекс, где и указывай, что данное поле уникально, журнализируемо и заполняемо автоматом, например:

Код: Выделить всё

index1 = nRec(unique, surrogate, journal)
Если говорить басяцким языком, то:
unique - уникальное
surrogate - заполняется автоматом уникальным значением, содержит в себе номер офиса
journal - используется при журнализации, заносится как номер записи в журнале, кстати

На счет restrict : данный ключик нужен для описания признака ограничивающего ссылочную целостность, т.е. при его использовании накладываются ограничения на модификации связанных таблиц, т.е. уже не банальное добавление таблиц в словарь, а фактически его изменение, что и заставляет отрубать службы протекта, журнализации со всеми вытекающими последствиями

Если я где-то ошибся, поправьте :)
Vitaliy
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 27 апр 2005, 09:52
Откуда: Сибирь

Re: Создать документ нового типа

Сообщение Vitaliy »

galover писал(а):Да, еще вспомнил главное ограничение на добавление своих таблиц. Помимо тормозов при обращении, созданные таблицы не журнализируются, хотя и стоят как журнализируемые. Такое поведение, если не чистить журнал и не отрубать протект. А поскольку чистить журнал никак нельзя, то остается одно - юзать стандартные таблицы Галактики
Ну на счет тормозов - какая-то мистика, нагрузку на систему твоя новая таблица не дает, единственно - это если она журнализируема и прописана в журнале, то именно при модификации записей в ней (ну понятно, что и при вставке с удалением) создается доп запись в журнале - не более.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Создать документ нового типа

Сообщение galover »

Vitaliy
Спасибо КЭП. Все это я прекрасно знаю (и про journal и про restrict), хэлп есть, читать умею. Кроме того смотрел как в исходниках Галактики создаются таблицы. Попробуй сам, ради эксперимента, создать вот такую таблицу:

Код: Выделить всё

create table s_Module "Программные модули"
with table_Code = 31600
with replace
with tableOptions branched
(
   nRec        : comp        "Номер записи",
   Code        : word        "Системный код модуля",
   Name        : string[200] "Наименование модуля",
   Description : string      "Описание назначения",
   Params      : longint     "Дополнительные параметры",
   LevelCode   : string[20]  "Код на уровне", // Только для сортировки
   cModule     : ref(s_Module)  "Ссылка на вышестоящий модуль"
)
with index
(
   index1 = nRec(unique, surrogate, journal),
   index2 = Code(unique),
   index3 = Name,
   index4 = LevelCode,
   index5 = cModule + Name,
   index6 = cModule + LevelCode
);
Если bat-ком, то я получаю такую ошибку (при том что таблица создается)
c:\GalProjects\Release\Tools\11\create.prj(23) Ошибка: Перед изменением структур
ы таблиц нужно выключить протект, журнализацию и почистить журнал (стр.23, поз.1
в c:\GalProjects\Release\Tools\11\create.prj)
<eof>
^
если в Support, то без ошибки. Однако и так, и так результат один - таблица есть, журнализации нет.
Как видно restrict нет, journal указан. Но таблица все равно не журнализируется (в настройках офиса таблица в списке журнализируемых стоит). Чтобы убедиться, достаточно завести про F7 новую запись прямо в Support и посмотреть что будет в журнале.
на счет тормозов - какая-то мистика, нагрузку на систему твоя новая таблица не дает, единственно - это если она журнализируема и прописана в журнале, то именно при модификации записей в ней (ну понятно, что и при вставке с удалением) создается доп запись в журнале - не более.
Мистика, не мистика, но тормоза наличествуют.
И да, на патчах Галактики, где требовалась докомпиляция словаря, также нужно было чистить журнал и рубить протект. Так что думаю без этого никак не обойтись.
Vitaliy
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 27 апр 2005, 09:52
Откуда: Сибирь

Re: Создать документ нового типа

Сообщение Vitaliy »

Спасибо КЭП. Все это я прекрасно знаю (и про journal и про restrict), хэлп есть, читать умею. Кроме того смотрел как в исходниках Галактики создаются таблицы. Попробуй сам, ради эксперимента, создать вот такую таблицу:
попробовал сам :)
Создал файл test.lot

Код: Выделить всё

create table s_Module "Программные модули"
with table_Code = 31600
with replace
with tableOptions branched
(
   nRec        : comp        "Номер записи",
   Code        : word        "Системный код модуля",
   Name        : string[200] "Наименование модуля",
   Description : string      "Описание назначения",
   Params      : longint     "Дополнительные параметры",
   LevelCode   : string[20]  "Код на уровне", // Только для сортировки
   cModule     : ref(s_Module)  "Ссылка на вышестоящий модуль"
)
with index
(
   index1 = nRec(unique, surrogate, journal),
   index2 = Code(unique),
   index3 = Name,
   index4 = LevelCode,
   index5 = cModule + Name,
   index6 = cModule + LevelCode
);
Скомпилировал
Проверил, таблица создана, добавил в журнализацию.
Создал файл :

Код: Выделить всё

interface ttttest 'tttttest' escclose, cyan;
create view;

handleevent
	cmInit:
		{
		  if getlast s_Module (index2)=tsOk
		  insert in s_Module set s_Module.Code:=s_Module.Code+1;
		}
end;
end.
Скомпилировал. Запустил фейс ttttest , посмотрел журнал, операция вставки со всеми вытекающими зарегистрирована.
Протект был отключен на тестовой базе, но журнализация включена, журнал не вычищен. Все так и осталось после компиляции. Компилил Vip 5.4.28.

Код: Выделить всё

Чтобы убедиться, достаточно завести про F7 новую запись прямо в Support и посмотреть что будет в журнале.
Попробуйте тоже самое с любой таблицей, к примеру с KatMC, тоже изменений в журнале не будет зарегистрировано. Журнализация ведется по действиям через пользовательский интерфейс.

п.с.: компилил не проектный файл, а подсовывал компилятору именно lot-файл, не вижу смысла в проектный файл втыкать создание таблицы, так как часто перекомпиливать фейс при отладке - логично, но с каждой перекомпиляцией фейса пересобирать табличку - не совсем правильно.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Создать документ нового типа

Сообщение galover »

Протект был отключен на тестовой базе, но журнализация включена, журнал не вычищен. Все так и осталось после компиляции. Компилил Vip 5.4.28.
У меня протект включен как раз. БД Oracle. vip 5.4.35
Попробуйте тоже самое с любой таблицей, к примеру с KatMC, тоже изменений в журнале не будет зарегистрировано.
Попробовал с KatMC, запись в журнал заносится! Потому как срабатывает триггер (БД Oracle). Даже если делать вставку сторонними средствами через ODBC, то все равно будет вставка в журнал. Да и через интерфейс пробовал, не работает журнал, хоть тресни.
Журнализация ведется по действиям через пользовательский интерфейс.
Не только
п.с.: компилил не проектный файл, а подсовывал компилятору именно lot-файл
Какая разница, как назвать файл хоть lot, хоть vip. Обрабатывается по #make не расширение, а содержимое.
не вижу смысла в проектный файл втыкать создание таблицы, так как часто перекомпиливать фейс при отладке - логично, но с каждой перекомпиляцией фейса пересобирать табличку - не совсем правильно.
я тоже не вижу смысла, тем более что я не пересобираю проект каждый раз (у меня там и интерфейсов то нет, только create table), и делаю это ровно один раз.
Vitaliy
Постоянный обитатель
Сообщения: 101
Зарегистрирован: 27 апр 2005, 09:52
Откуда: Сибирь

Re: Создать документ нового типа

Сообщение Vitaliy »

У меня протект включен как раз. БД Oracle. vip 5.4.35
На оракле утверждать не берусь, не проверял. Но все же мне кажется дело не в протекте, а в реализации докомпиляции словаря под оракл.
Может кто-нить попробует под оракл скомпилить прилагаемые файлы?
Какая разница, как назвать файл хоть lot, хоть vip. Обрабатывается по #make не расширение, а содержимое.
Разницы нет, просто по вашей ошибке не понятно на что ругается

Код: Выделить всё

c:\GalProjects\Release\Tools\11\create.prj(23) Ошибка: Перед изменением структур
ы таблиц нужно выключить протект, журнализацию и почистить журнал (стр.23, поз.1
в c:\GalProjects\Release\Tools\11\create.prj)
<eof>
^
Подумалось, что там набор мейков, признаюсь, не верно сделал выводы
Попробовал с KatMC, запись в журнал заносится! Потому как срабатывает триггер (БД Oracle). Даже если делать вставку сторонними средствами через ODBC, то все равно будет вставка в журнал.
На первасиве не прокатывает.

С другой стороны интересно, почему у вас из суппорта создается, через строчник с ошибкой валится.

Блин, развернуть себе оракл, потестировать, а то как-то думалось, что отличий особо не должно быть, а тут вон оно что получается.
LaaLaa

Re: Создать документ нового типа

Сообщение LaaLaa »

galover

Тоже попробовал создать таблицу S_MODULE по вашему примеру. Добавить ее в список журналируемых в настройках Саппорта. А затем вставить пару записей. С помощью asql.exe выполнить запросы:

Код: Выделить всё

insert s_Module set Code:=1, Name:='Hello';
insert s_Module set Code:=2, Name:='World';
Результат на Первасиве все сработало сразу - записи в журнале появились.

Результат на MS SQL - журнал сразу не заработал. После чего я прогнал БД утилитой chkmssql.exe. С параметрами:

Код: Выделить всё

[ChkBase]
  Out=out
  StoredProcs=on
  UsersAndRights=on
  Compile=on
  Journal=on
  Fields=on
  Indexes=on
  Triggers=on

[DataBase]
  DataBaseName=test

[SQLDriver]
  SQLServer=ncacn_np:ORPS-SERVER642[\pipe\naps\query]

[Login]
  UserName=larin

[DictVersion]
  Version=52
  Sum=-1601339646
После этого удалил эти записи и вставил повторно. Все отлично журнал работает.

На Oracle тест лениво прогонять.

Попробуйте проверить свою БД утилитой ChkOra9.exe. За вставку в журнал на оракле отвечают триггеры и функции на сервере БД. Может их надо пересоздать. Для вновь добавленных таблиц после изменения настроек Саппорта.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Создать документ нового типа

Сообщение galover »

Сдается мне что это все же ошибка, раз после создания таблиц нужно еще бубном стучать. Попробую в ТП написать. У кого есть Oracle, проверьте если не влом, подтверждается ли диагноз бага.
Polimer
Местный житель
Сообщения: 489
Зарегистрирован: 27 янв 2006, 12:46
Откуда: Москва

Re: Создать документ нового типа

Сообщение Polimer »

Скорее всего, не создаются автоматом триггеры журнализации, как сказал LaaLaa. Чек с проверкой триггеров правит их.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Создать документ нового типа

Сообщение galover »

Ну что сказать, прогнал chkora9.exe с ChkBase.Triggers=on журнализация зафурычила. Посмотрим какие еще косяки вылезут. Всем спасибо за участие.
Ответить