1. Всем спасибо, отдельно большое спасибо - Татьяне Точилкиной. 2. Всех росиян - с победой наших в кубке UEFA! 3. Задачу я решил, правда, не совсем средствами ErWin.
В общем - я использовал оператор Execute Statement сервера FireBird, который позволяет в процедурах использовать DDL.
Порядок работы: 1. Для атрибутов добавляем UDP: Name = multy_col Type = Int DafaultValue = 0
2. В сущности, для которых хотим получить несколько онотипных полей, добаляем такое поле, например: f varchar(22) Указываем multy_col = 10 (например)
3. Определяем процендуру уровня модели: CREATE PROCEDURE ALTERTABLE ( TABLENAME VARCHAR(50), FIELDNAME VARCHAR(50), FIELDTYPE VARCHAR(50), TIMES INTEGER) AS DECLARE VARIABLE TMPSTR VARCHAR(100); DECLARE VARIABLE I INTEGER; begin i = 0; while (i<Times) do begin tmpStr = 'ALTER TABLE ' // TableName // ' ADD ' // FieldName // case when i<10 then '0'// i else i end // ' ' // FieldType; execute statement tmpStr; i = i + 1; end tmpStr = 'ALTER TABLE ' // TableName // ' DROP ' // FieldName; execute statement tmpStr;
Он развернется в след вида предложения: execute procedure AlterTable('Colleague', 'S', 'VARCHAR(75)', 3); execute procedure AlterTable('MyTable', 'f', 'VARCHAR(22)', 10);
В результате выполнения таких предложений в таблице Colleague будут созданы поля S00, S01, S02, а в таблице MyTable - поля f00...f09 соотв. типа (Varchar(22)) (а поля S и f будут уничтожены).
Предостережение: Следует соблюдать некоторую осторожность при использовании DDL совместно с Exceute statement; например - всегда после изменения метаданных следует выполнять Commit еред использованием новой структуры.
Таким образом, сгенерированный скрипт снова позволяет полностью обойтись средствами ErWin без привлечения чего-либо еще.
1. Всем спасибо, отдельно большое спасибо - Татьяне Точилкиной. 2. Всех росиян - с победой наших в кубке UEFA! 3. Задачу я решил, правда, не совсем средствами ErWin.
В общем - я использовал оператор Execute Statement сервера FireBird, который позволяет в процедурах использовать DDL.
Порядок работы: 1. Для атрибутов добавляем UDP: Name = multy_col Type = Int DafaultValue = 0
2. В сущности, для которых хотим получить несколько онотипных полей, добаляем такое поле, например: f varchar(22) Указываем multy_col = 10 (например)
3. Определяем процендуру уровня модели: CREATE PROCEDURE ALTERTABLE ( TABLENAME VARCHAR(50), FIELDNAME VARCHAR(50), FIELDTYPE VARCHAR(50), TIMES INTEGER) AS DECLARE VARIABLE TMPSTR VARCHAR(100); DECLARE VARIABLE I INTEGER; begin i = 0; while (i<Times) do begin tmpStr = 'ALTER TABLE ' // TableName // ' ADD ' // FieldName // case when i<10 then '0'// i else i end // ' ' // FieldType; execute statement tmpStr; i = i + 1; end tmpStr = 'ALTER TABLE ' // TableName // ' DROP ' // FieldName; execute statement tmpStr;
Он развернется в след вида предложения: execute procedure AlterTable('Colleague', 'S', 'VARCHAR(75)', 3); execute procedure AlterTable('MyTable', 'f', 'VARCHAR(22)', 10);
В результате выполнения таких предложений в таблице Colleague будут созданы поля S00, S01, S02, а в таблице MyTable - поля f00...f09 соотв. типа (Varchar(22)) (а поля S и f будут уничтожены).
Предостережение: Следует соблюдать некоторую осторожность при использовании DDL совместно с Exceute statement; например - всегда после изменения метаданных следует выполнять Commit еред использованием новой структуры.
Таким образом, сгенерированный скрипт снова позволяет полностью обойтись средствами ErWin без привлечения чего-либо еще.
1. Всем спасибо, отдельно большое спасибо - Татьяне Точилкиной. 2. Всех росиян - с победой наших в кубке UEFA! 3. Задачу я решил, правда, не совсем средствами ErWin.
В общем - я использовал оператор Execute Statement сервера FireBird, который позволяет в процедурах использовать DDL.
Порядок работы: 1. Для атрибутов добавляем UDP: Name = multy_col Type = Int DafaultValue = 0
2. В сущности, для которых хотим получить несколько онотипных полей, добаляем такое поле, например: f varchar(22) Указываем multy_col = 10 (например)
3. Определяем процендуру уровня модели: CREATE PROCEDURE ALTERTABLE ( TABLENAME VARCHAR(50), FIELDNAME VARCHAR(50), FIELDTYPE VARCHAR(50), TIMES INTEGER) AS DECLARE VARIABLE TMPSTR VARCHAR(100); DECLARE VARIABLE I INTEGER; begin i = 0; while (i<Times) do begin tmpStr = 'ALTER TABLE ' // TableName // ' ADD ' // FieldName // case when i<10 then '0'// i else i end // ' ' // FieldType; execute statement tmpStr; i = i + 1; end tmpStr = 'ALTER TABLE ' // TableName // ' DROP ' // FieldName; execute statement tmpStr;
Он развернется в след вида предложения: execute procedure AlterTable('Colleague', 'S', 'VARCHAR(75)', 3); execute procedure AlterTable('MyTable', 'f', 'VARCHAR(22)', 10);
В результате выполнения таких предложений в таблице Colleague будут созданы поля S00, S01, S02, а в таблице MyTable - поля f00...f09 соотв. типа (Varchar(22)) (а поля S и f будут уничтожены).
Предостережение: Следует соблюдать некоторую осторожность при использовании DDL совместно с Exceute statement; например - всегда после изменения метаданных следует выполнять Commit еред использованием новой структуры.
Таким образом, сгенерированный скрипт снова позволяет полностью обойтись средствами ErWin без привлечения чего-либо еще.
Подскажите, пожалуйста, как при генерации кода вставить Post-Script, cодержащий повторяющийся код n раз, например:
ALTER TABLE MyTable ADD F_01 INTEGER; ALTER TABLE MyTable ADD F_02 INTEGER; ... ALTER TABLE MyTable ADD F_99 INTEGER;
Выяснилось, что я не умею в макросах ErWin генерировать повторяющиеся n раз конструкции. Нужно в макросах ErWin (4.*) организовать цикл, подобный %ForEachAtt(%TableName), только мне нужен цикл самый простой - от 1 до 10, к примеру.