powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / ErWin 4 ... использование макроса %ForEachColumn
8 сообщений из 8, страница 1 из 1
ErWin 4 ... использование макроса %ForEachColumn
    #34042369
prokhorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток всем !
Огромная просьба помочь разобраться с одной небольшой проблемой.

В ErWin есть очень удачный макрос для работы с колонками таблицы, полный синтаксис которого %ForEachColumn(<table>,<separator>,<sort order>) {<macro code>}, назначение параметров <table> и <separator> вполне прозрачно и снабжено массой примеров как в самом описании, так и вообще в интернете, хотелось бы использовать <sort order> - по логике параметр, регулирующий сортировку колонок, но никаких примеров или ссылок его использования я не нашел, решить задачу путем "мозгового штурма" :) - тоже не удалось.

Может быть кто-нибудь пользовался данной опцией и сможет привести простенький пример, как, например, упорядочить наименования колонок по имени : %ForEachColumn(%TableName,",", ??? ) {%ColName}.

Заранее огромное спасибо !
...
Рейтинг: 0 / 0
ErWin 4 ... использование макроса %ForEachColumn
    #34043193
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гораздо проще описать непосредственно на языке SQL все свои таблицы, связи, процедуры и триггеры. Минус - нужно знать SQL, но его знание и в будушем вам не помещает. Имхо.
...
Рейтинг: 0 / 0
ErWin 4 ... использование макроса %ForEachColumn
    #34043275
prokhorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Programmer_OrtodoxГораздо проще описать непосредственно на языке SQL все свои таблицы, связи, процедуры и триггеры. Минус - нужно знать SQL, но его знание и в будушем вам не помещает. Имхо.

Может быть нескромно, но с SQL и сейчас нерешаемых проблем нет. :) Как раз к CASE средствам шел от программирования влоб на SQL - обратный путь боюсь не осилю в силу преклонного возраста, да и смысла особого не вижу. Можно, наверно, поспорить о плюсах-минусах отдельных программ (ErWin или PowerDesigner, например), но говорить о их бесполезности я бы не стал.
...
Рейтинг: 0 / 0
ErWin 4 ... использование макроса %ForEachColumn
    #34043426
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
prokhorovВ ErWin есть очень удачный макрос для работы с колонками таблицы, полный синтаксис которого %ForEachColumn(<table>,<separator>,<sort order>) {<macro code>}, назначение параметров <table> и <separator> вполне прозрачно и снабжено массой примеров как в самом описании, так и вообще в интернете, хотелось бы использовать <sort order> - по логике параметр, регулирующий сортировку колонок, но никаких примеров или ссылок его использования я не нашел, решить задачу путем "мозгового штурма" :) - тоже не удалось.

Может быть кто-нибудь пользовался данной опцией и сможет привести простенький пример, как, например, упорядочить наименования колонок по имени : %ForEachColumn(%TableName,",", ??? ) {%ColName}.

Заранее огромное спасибо ! В примерах действительно в этот параметр всегда передается пустая строка. Я и сам его никогда не использовал, т.к. не очень понимаю какой смысл в сортировке колонок. Тем не менее,
так
Код: plaintext
1.
%ForEachColumn(%TableName,",",  'asc' ) {%ColName} 
%ForEachColumn(%TableName,",",  'desc' ) {%ColName}
или так
Код: plaintext
1.
%ForEachColumn(%TableName,",",  asc ) {%ColName} 
%ForEachColumn(%TableName,",",  desc ) {%ColName}
вы конечно пробовали ? Другие варианты (0,1, true/false ...)?
...
Рейтинг: 0 / 0
ErWin 4 ... использование макроса %ForEachColumn
    #34043504
prokhorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Kudinov В примерах действительно в этот параметр всегда передается пустая строка. Я и сам его никогда не использовал, т.к. не очень понимаю какой смысл в сортировке колонок. Тем не менее,
так
Код: plaintext
1.
%ForEachColumn(%TableName,",",  'asc' ) {%ColName} 
%ForEachColumn(%TableName,",",  'desc' ) {%ColName}
или так
Код: plaintext
1.
%ForEachColumn(%TableName,",",  asc ) {%ColName} 
%ForEachColumn(%TableName,",",  desc ) {%ColName}
вы конечно пробовали ? Другие варианты (0,1, true/false ...)?

С этого я как раз и начал - asc/desc, 0/1 ... пока безрезультатно. :(

Предложенный вопрос про сортировку - это только простейший вариант, так сказать для затравки. :) На самом деле хотелось бы отсортировать, используя не столько имена колонок, а например, какие-нибудь UDP данных колонок. Предполагается, что есть некоторое количество таблиц - идентичничных, к ним хочется написать простейшие однотипные процедуры, извлекащие данные только из части колонок и в определенном порядке, для чего использовать UDP колонок : извлекать колонку (0/1), порядковый номер в запросе.
...
Рейтинг: 0 / 0
ErWin 4 ... использование макроса %ForEachColumn
    #34062066
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.А можно узнать - для чего Вам нужен порядок создания колонок?
ForEach*** для колонок стреляют в порядке описания сущностей в ErWin.

2. По поводу создания процедур.
Пример: создание процедуры, извлекающей "дерево" из таблички.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create procedure get_tree_%Lower(%TableName) (
  MASTER_%TableName_ID INTEGER)
returns (%ForEachAtt(%TableName, ',')
 {
  %AttFieldName %AttDataType})
AS
begin
  for select %ForEachAtt(%TableName, ',')
    { %AttFieldName}
  from %TableName T
  where Base_%TableName_id =:MASTER_%TableName_id
  order by T.Location, T.FName_Short
  into %ForEachAtt(%TableName, ',')
  { :%AttFieldName}
   do begin
     suspend;
     if (Child_Count >  0 ) then
       for  select %ForEachAtt(%TableName, ',')
         { %AttFieldName}
       from get_tree_%Lower(%TableName)(:%TableName_id)
       into %ForEachAtt(%TableName, ',')
        { :%AttFieldName}
     do suspend;
   end
end
Если скрипт прикреплен табличке:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE PART_CATEGORY (
    PART_CATEGORY_ID       T_PART_CATEGORY_ID NOT NULL /* T_PART_CATEGORY_ID 
= INTEGER */,
    BASE_PART_CATEGORY_ID  T_BASE_PART_CATEGORY_ID NOT NULL /* 
T_BASE_PART_CATEGORY_ID = INTEGER */,
    FNAME_SHORT            T_FNAME_SHORT NOT NULL /* T_FNAME_SHORT = 
VARCHAR(84) */,
    LOCATION               T_LOCATION /* T_LOCATION = INTEGER DEFAULT 0 */,
    CHILD_COUNT            T_CHILD_COUNT /* T_CHILD_COUNT = INTEGER DEFAULT 
0 NOT NULL */
);


.... то он развернется в след. вида DDL - скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create procedure get_tree_part_category (
  MASTER_Part_Category_ID INTEGER)
returns (part_category_id INTEGER,
  base_part_category_id INTEGER,
  fname_short VARCHAR( 84 ),
  location INTEGER,
  child_count INTEGER)
AS
begin
  for select part_category_id, base_part_category_id, fname_short, location, 
child_count
  from Part_Category T
  where Base_Part_Category_id =:MASTER_Part_Category_id
  order by T.Location, T.FName_Short
  into :part_category_id, :base_part_category_id, :fname_short, :location, 
:child_count
   do begin
     suspend;
     if (Child_Count >  0 ) then
       for  select part_category_id, base_part_category_id, fname_short, 
location, child_count
       from get_tree_part_category(:Part_Category_id)
       into :part_category_id, :base_part_category_id, :fname_short, 
:location, :child_count
     do suspend;
   end
end
"Прикрепление" при этом выполняется с помощью UDP типа "список": "yes,~no".
Т.е. no по умолчанию.
Если значение установлено в "yes" - то табличка обрабатывается как дерево.
Т.е. генерятся всяческие триггеры, процедурки и проверки.


3. По поводу UDP свойств. Те же деревья. Создаем UDP для свойства сущности,
которое говорит, что это свойство - master - поле для древовидных струтур.

4. Еще вариант. Помечаем сущность с пом. UDP generate_id, чтобы выолнять для
него генерацию спец. триггеров:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
%if(%==(%EntityProp(generate_id),yes))
  {create trigger %TableName_gen_id for %TableName before insert position  0 
/* Триггер для  заполнения ключевого поля */
as
begin
    IF (new.%TableName_id IS NULL) THEN
       new.%TableName_id = GEN_ID(%TableName_id_gen,  1 );
end ;
}
}
Это развернется в:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create trigger Part_Category_gen_id for Part_Category before insert position 
 0 
/* Триггер для  заполнения ключевого поля */
as
begin
    IF (new.Part_Category_id IS NULL) THEN
       new.Part_Category_id = GEN_ID(Part_Category_id_gen,  1 );
end ;

И везде ForEach** для полей/свойств обрабатываются в порядке их описания...
....так зачем все-таки порядок сортировки?


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ErWin 4 ... использование макроса %ForEachColumn
    #34062402
prokhorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mv
1.А можно узнать - для чего Вам нужен порядок создания колонок?
ForEach*** для колонок стреляют в порядке описания сущностей в ErWin.


Огромное спасибо за ответ - очень интересный подход и шикарные примеры !

Для чего нужен порядок колонок (в двух словах, без детальной конкретики) : есть некоторое количество однотипных таблиц, из них осуществляются выборки данных, причем предварительно над частью данных производятся небольшие преобразования - для TSQL это удобнее сделать на мой взгляд в виде хранимых процедур, желательно на выходе получить порядок полей, совпадающий с визуальным представлением в отчете (порядок колонок в отчете не всегда совпадает с порядком в сущности) - пользователь частенько желает проэкспортировать данные из доморощенной системы в программы а-ля Excel с выражением бурного негодования, почему порядок выгруженного не всегда совпадает с первоначальным отчетом. :) Учитывая, что таблиц несколько и действия по созданию процедур легко программируемые, захотелось использовать макрос и сортировать выходные данные на основании UDP колонок. В принципе, обходные пути есть - в частности, с использованием %Include макроса.

Ну, а в основном, это спортивный интерес - что это за недокументированная опция <sort order>. :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ErWin 4 ... использование макроса %ForEachColumn
    #34998013
gress
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В макросе

%ForEachAtt(<table>,<separator>,<sort order> { <macro code> }

Какие значения может принимать параметр <sort order>.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / ErWin 4 ... использование макроса %ForEachColumn
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]