05.03.2010, 20:02 | #181 |
Участник
|
|
|
05.03.2010, 20:43 | #182 |
Участник
|
Точно! И они тоже, если включены, и если хочется чтобы в них были хоть какие-то значения.
И DataAreaID. Хотя с DataAreaID обычно никаких проблем не возникает. |
|
05.03.2010, 22:38 | #183 |
Участник
|
RecVersion
|
|
05.03.2010, 22:53 | #184 |
Участник
|
|
|
09.03.2010, 13:42 | #185 |
Участник
|
Не уверен, что этот вопрос по платформе, но, возможно, с платформой есть какая-то связь.
С очень большими системами не работоал, но в DAX меня поразило очень большое количество полей в таблицах. И в базовой поставке есть нехилые таблицы, а то, что принесли нам партнеры MS меня вообще привело в замешательство: в одной таблице более 400 полей! С чем это связано? По первым ощущениям таблицы DAX скорее напоминают шиты в ексельной книге, чем таблицы в реляционной БД среднего уровня нормализации. |
|
09.03.2010, 14:02 | #186 |
Гость
|
Такое большое количество полей, скорее всего, связано как раз с тем, что решение приобреталось у партнера.
Наверняка целые группы полей связаны определенными конфигурационными ключами. Каждый ключ должен был быть включен на определенном клиенте. Почему у вас они включены - либо вы купили все решения, либо концепция продаж решений у партнера поменялась |
|
|
За это сообщение автора поблагодарили: asinus (1). |
09.03.2010, 14:10 | #187 |
Administrator
|
Цитата:
Сообщение от asinus
Не уверен, что этот вопрос по платформе, но, возможно, с платформой есть какая-то связь.
С очень большими системами не работоал, но в DAX меня поразило очень большое количество полей в таблицах. И в базовой поставке есть нехилые таблицы, а то, что принесли нам партнеры MS меня вообще привело в замешательство: в одной таблице более 400 полей! С чем это связано? По первым ощущениям таблицы DAX скорее напоминают шиты в ексельной книге, чем таблицы в реляционной БД среднего уровня нормализации. С другой стороны - есть правило сохранения всех данных, выводящихся на печать в официальные документы. Т.е. к примеру - в таблице накладных будет храниться вся информация (кроме данных о нашей компании), которая выводится на печать. Это необходимо для сохранения истории данных в случае возможного изменения справочников. Также разработчики учитывают производительность. Если какая-то связка таблиц используется часто в запросах, то поля из одной таблицы добавляют в другую, чтобы выборка осуществлялась из одной таблицы для повышения производительности. Например вся информация о банке копируется в банковский счет (фактически дублируются данные), чтобы при дальнейшей выборке не использовать таблицу банков. UPD: Кстати верно подмечено - часть полей может просто не использоваться в готовом решении (будет удалено при отключении соотв. конфиг ключа) - и тогда в реальной БД будет гораздо меньше полей.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: asinus (1). |
07.04.2010, 11:35 | #188 |
Участник
|
Цитата:
Суть для тех, кто не знаком с 1С: предыстория: = в 1С нет объекта запрос, есть только текстовая строка (типа строки для работы с произвольными запросами Statement.executeQuery в Аксапте) = 1Сники привыкли составлять запрос, складывая строки (как в ax3.0 \Classes\SysDataImport\recIdSimpleSqlSelect) = в результате для генерации более-менее сложных запросов в 1С делаются многостраничные портянки кода, которые очень тяжело поддерживать. что предлагается в типовой конфигурации: = конструктором создавать непрерывный текст-болванку, который содержит "какие-нибудь" документы/объекты = а потом заменять подстроки в получившейся строке, чтобы получить правильное название документа/объекта = ...без статического синтаксического контроля. = ...без учета наличия кавычек-апострофов внутри строки запроса Цитата:
Такую методологию во всю пропагандируют приближённые к 1С. Скоро сама 1С в стандарт это запишет.
Технология! Угу, приблизилась... А как же ============== Привычный 1Сникам стиль создания запросов на примере \Classes\SysDataImport\recIdSimpleSqlSelect (так реально делается почти по всему коду во всех конфигурациях 1С. в ax3.0 всего 115 методов в которых используется класс Statement для работы с произвольным текстом запроса. В основном это системные классы) X++: void recIdSimpleSqlSelect( Connection con, Common common, SysDictTable dictTable, recId recId ) { str sql; int i, conLength; fieldId tmpFieldId; Statement stmt; SqlSystem sqlSystem = new SqlSystem(); ResultSet set; sql = 'SELECT '; conlength = conLen(recordRefs[dictTable.id()]); for (i=1; i<=conlength; i++) { tmpFieldId = conPeek(recordRefs[dictTable.id()], i); if (i>1) sql += ', '; sql += dictTable.fieldName(tmpFieldId,DbBackend::Sql,0,FieldNameGenerationMode::FieldList); } sql+=' FROM ' + dictTable.name(DbBackend::Sql); sql+=' WHERE '; if (dictTable.dataPrCompany()) sql += SysDictTable::dataareaIdNameSQL(FieldNameGenerationMode::WhereClause)+' = '+sqlSystem.sqlLiteral(curExt())+' AND '; sql += SysDictTable::recIdNameSQL()+' = '+int2str(recId); try { stmt = con.createStatement(); set = stmt.executeQuery(sql); ... (даже не могу найти аналогов в Аксапте) X++: sqlString = strfmt(@"SELECT TABLE_NAME FROM SomeRealObjectName WHERE ...."); sqlString = strReplace('SomeRealObjectName','RealObjectName'); X++: sqlString = strfmt(@"SELECT TABLE_NAME FROM %1 WHERE ..."); sqlSystem.sqlLiteral(strfmt('%1',RealObjectName), false, true)); |
|
|
За это сообщение автора поблагодарили: Сисой (4). |
07.04.2010, 16:51 | #189 |
Участник
|
Спасибо за ссылку. И впрямь бред от 1С.
|
|
13.04.2010, 11:22 | #190 |
Участник
|
Цитата:
Такую методологию во всю пропагандируют приближённые к 1С. Скоро сама 1С в стандарт это запишет.
Действительно в 1С визуально можно увидеть только "статические запросы", которые пишутся конструктором и не меняются в процессе выполнения программы, а те, запросы, которые содержат программные вставки конструктором открыть нельзя! А как в аксапте можно визуально открыть такой запрос? ИменаКолонок = "ф1,ф2,ф6"; ИмяТаблицы = "Таб1" select ИменаКолонок from ИмяТаблицы; Последний раз редактировалось ibc; 13.04.2010 в 11:35. |
|
13.04.2010, 12:43 | #191 |
северный Будда
|
Что значит "открыть визуально"?
Если в форме вывести - то достаточно на датасоурсной таблице сделать нужный FieldGroup и поставить его в свойства грида |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
13.04.2010, 13:04 | #192 |
Участник
|
Цитата:
сортировка в запросе сортировка в запросе сортировка в запросе вот еще Отображение AOT_Query на форме часть 2 и так далее по ключевым словам querystr и findOrCreateRange* |
|
13.04.2010, 15:00 | #193 |
Участник
|
Цитата:
Что значит "открыть визуально"?
А вот если часть запроса переменная величина, то как быть? Например, состав полей, названия таблиц, структура соединений! Цитата:
и задать, и открыть, и настроить, и использовать потом его в коде, и менять из кода.
Цитата:
ИменаКолонок = "ф1,ф2,ф6";
ИмяТаблицы = "Таб1" select ИменаКолонок from ИмяТаблицы; По ссылке совершенно другой пример с сортировкой и джойном! В 1С можно Последний раз редактировалось ibc; 13.04.2010 в 15:03. |
|
13.04.2010, 15:15 | #194 |
Ищущий знания...
|
Цитата:
X++: Query query; QueryRun queryRun; QueryBuildDataSource qbds; TableId tableIdQuery = 175; FieldId fieldId1 = 1; FieldId fieldId2 = 2; FieldId fieldId3 = 3; ; query = new Query(); qbds = query.addDataSource(tableIdQuery); qbds.addSelectionField(fieldId1, SelectionField::Database); qbds.addSelectionField(fieldId2, SelectionField::Database); qbds.addSelectionField(fieldId3, SelectionField::Database); queryRun = new QueryRun(query);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
13.04.2010, 15:22 | #195 |
Участник
|
X++: query = new Query(); Или только из кода поменять что-то можно? |
|
13.04.2010, 15:22 | #196 |
Ищущий знания...
|
если ИД-шники не известны, а известны названия, то вот так:
X++: Query query; QueryRun queryRun; QueryBuildDataSource qbds; TableId tableIdSelect; FieldId fieldId1; FieldId fieldId2; FieldId fieldId3; #define.TableName('InventTable') #define.ItemId('ItemId') #define.ItemName('ItemName') #define.ItemGroupId('ItemGroupId') tableIdSelect = tablename2id(#TableName); fieldId1 = fieldname2id(tableIdSelect, #ItemId); fieldId2 = fieldname2id(tableIdSelect, #ItemName); fieldId3 = fieldname2id(tableIdSelect, #ItemGroupId); query = new Query(); qbds = query.addDataSource(tableIdSelect); qbds.addSelectionField(fieldId1, SelectionField::Database); qbds.addSelectionField(fieldId2, SelectionField::Database); qbds.addSelectionField(fieldId3, SelectionField::Database); queryRun = new QueryRun(query);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
13.04.2010, 15:23 | #197 |
Ищущий знания...
|
Цитата:
X++: queryRun.prompt();
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 13.04.2010 в 15:28. |
|
13.04.2010, 15:31 | #198 |
Участник
|
А любые запросы в т. ч. вложенные запросы таким же образом можно сделать?
(select b1,b2 from (select * from Tab1)) |
|
13.04.2010, 15:33 | #199 |
Ищущий знания...
|
любые запросы, любой сложности
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: ibc (1). |
14.04.2010, 10:41 | #200 |
Участник
|
Не утерпел господа, зарегистрировался. Больно жарко у вас тут, чуть-чуть ясности: аналог класса Query() в 1С - это пресловутый УниверсальныйОтчет из типовых конфигураций (прикладных решений) 1С: передаем ему объект - источник данных и описываем структуру выбираемых полей, условий и прочих радостей. Правда исполнение этого отчета конечно-же куда как топорнее представленного примера.
А в 195-м посте вопрос был о средствах визуального конструирования запроса. Т.е. написания запроса в DAX при помощи мыши, без использования клавиатуры . И ответ непосвщенному 1Снику интересен весьма. |
|
Теги |
1c, платформа, сравнение систем |
|
|