|
v7: 1С++ | ☑ | ||
---|---|---|---|---|
0
bananan
24.01.13
✎
13:33
|
Все-таки читаю я документацию...
Вот сегодн запары по работе нет - решил хорошо ознакомится с документацией по 1С++. Так во написал я код такой: ТекстЗапроса = " |SELECT Сотрудник.Descr AS Наименование | ,Сотрудник.Code AS Код |FROM | $Справочник.Сотрудники AS Сотрудник | WHERE Сотрудник.Code = 1241;"; RS = СоздатьОбъект("ODBCRecordset"); RS.Отладка(1); ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); //ТЗ.ВыбратьСтроку(); Сообщить("ТЗ.Наименование-"+ТЗ.Наименование); В таблице значений показывает одного сотрудника (его фамилию в поле НАименование и код в поле Код. Все нормально.. но, почему код Сообщить("ТЗ.Наименование-"+ТЗ.Наименование); не выдает (сообщает) фамилию сотрудника? Данный вопрос - это потому что я изучаю документацию, он не относится ни к какому конкретному запросу.. |
|||
1
GLazNik
24.01.13
✎
13:35
|
(0) а цикл по строкам где?
|
|||
2
Ёпрст
24.01.13
✎
13:44
|
рано, надо начинать с основ:
http://www.mista.ru/tutor_1c/tz.htm http://www.mista.ru/tutor_1c/index.htm |
|||
3
bananan
24.01.13
✎
13:57
|
(1) А зачем цикл по строкак при таком WHERE запрос вернет одну строку.
|
|||
4
bananan
24.01.13
✎
13:58
|
(2) Спасибо - значит берусь за это
|
|||
5
AlecoZAV
24.01.13
✎
13:59
|
ТЗ[1].Наименование
|
|||
6
ДенисЧ
24.01.13
✎
14:00
|
(2) ты не прав...
Начинать надо вот с этого: http://www.gramota.ru/class/coach/tbgramota/ |
|||
7
GLazNik
24.01.13
✎
14:04
|
(3) если одну строку... то можно использовать ВыполнитьСкалярный вместо ВыполнитьИнструкцию
(5) Не помню что б такое в 7.7 работало. |
|||
8
bananan
24.01.13
✎
14:05
|
(6) ДенисЧ, ну ты - крутой, вот и читай орфографию
|
|||
9
ЧеловекДуши
24.01.13
✎
14:05
|
(0)Попробуй познать для себя Отладчик, люди говорят его за дорого продают ;)
|
|||
10
bananan
24.01.13
✎
14:07
|
(7) В 7.7. ВыполнитьСкалярный работает нормально все, спасибо
|
|||
11
Ёпрст
24.01.13
✎
14:07
|
(3) ошибаешься. Твой код ни вернет ни одной строки - будет пустая ТЗ на выходе.
|
|||
12
bananan
24.01.13
✎
14:08
|
+(10) Упс, не то я написал; - пардон!
|
|||
13
Ganiev
24.01.13
✎
14:09
|
(9)))))+
К какой строке ТЗ ты обращаешься? |
|||
14
bananan
24.01.13
✎
14:09
|
(11) Код:
ТекстЗапроса = " |SELECT Сотрудник.Descr AS Наименование | ,Сотрудник.Code AS Код |FROM | $Справочник.Сотрудники AS Сотрудник | WHERE Сотрудник.Code = 1241;"; RS = СоздатьОбъект("ODBCRecordset"); RS.Отладка(1); ТЗ = RS.ВыполнитьСкалярный(ТекстЗапроса); Сообщить("ТЗ.Наименование-"+ТЗ.Наименование); В окне сообщений выдал: ТЗ.Наименование-Клімук |
|||
15
bananan
24.01.13
✎
14:10
|
(9) А отладчик разве работает с внешними формами?
|
|||
16
Ёпрст
24.01.13
✎
14:13
|
(14) враньё..
|
|||
17
Ёпрст
24.01.13
✎
14:13
|
1. Запрос всегда пустой
2. ВыполнитьСкалярный не возвращает Таблицу значений |
|||
18
Ёпрст
24.01.13
✎
14:15
|
+17 хотя, у тебя 2 поля, там вернёт структуру, только пустую - code ,это стока, сравнение её ч числом приведёт к пустому запросу
|
|||
19
GLazNik
24.01.13
✎
14:17
|
(17) а никто и не обещал ТЗ :)
(18) "code ,это стока" откуда такая уверенность? может кодировка числовая? |
|||
20
bananan
24.01.13
✎
14:17
|
Ёпрст4! Зачем мне врать кому-либо на этом форуме?
Выйди на меня по скайпу - покажу тебе свой экран! |
|||
21
Ёпрст
24.01.13
✎
14:18
|
(19) code всегда строка.
|
|||
22
bananan
24.01.13
✎
14:18
|
(19) Число это - посмотрел в конфигурации
|
|||
23
bananan
24.01.13
✎
14:19
|
(21) Вот это - как раз и есть вранье!
|
|||
24
Ёпрст
24.01.13
✎
14:20
|
(22,23) дурилка, CODE - это char(n), где n - длина кода, это всегда строка.
Смотри в SQL , а не в пофигураторе. |
|||
25
antoneus
24.01.13
✎
14:21
|
(24) select descr from $Справочник.ЕдиницыИзмерений where code = 881 вернул "банка"
|
|||
26
Ёпрст
24.01.13
✎
14:22
|
(25) а в отладке , какой код ? И в профайлер что летит ?..
и в QA выполни. |
|||
27
Mikeware
24.01.13
✎
14:27
|
ВыполнитьИнструкцию / ExecuteStatement
Синтаксис: ВыполнитьИнструкцию([ТекстЗапроса], [ОбъектРезультатов], [Очищать]) Параметры: ТекстЗапроса - тип: Строка. Текст запроса, если пустая строка - запрос считается параметризированным. Необязателен, по умолчанию - пустая строка. ОбъектРезультатов - тип: любой из ТаблицаЗначений, СписокЗначений, ИндексированнаяТаблица или наследник от любого из них. (Это должен быть объект какого-либо из перечисленных типов, а не объект, реализующий их интерфейс.) Если параметр передан, то он и будет возвращаемым значением. Необязателен, по умолчанию пустое значение, в этом случае будет возвращен объект типа ТаблицаЗначений. Очищать - тип: Число. 1 - очистить переданный ОбъектРезультатов и создать колонки если его тип ТаблицаЗначений или ИндексированнаяТаблица. 0 - не очищать. Необязателен, по умолчанию - 1. Возвращает: тип: ТаблицаЗначений, СписокЗначений, ИндексированнаяТаблица или наследник от любого из них, Число. Объект с результатом запроса, или число - количество обработанных строк. ВыполнитьСкалярный / ExecuteScalar Синтаксис: ВыполнитьСкалярный([ТекстЗапроса]) Параметры: ТекстЗапроса - тип: Строка. Текст запроса, если пустая строка-запрос считается параметризированным. Необязателен, по умолчанию - пустая строка. Возвращает: тип: Любой, Структура. Если значение поля результата запроса, или зачения полей результата запроса. Описание: Выполняет SQL запрос, при ошибке парсинга или при ошибке на ODBC драйвере формируется исключение. Запрос может возвращать количество обработанных строк: в этом случае возвращается это значение. Запрос может возвращать набор данных, состоящий из одной строки, при этом если в наборе данных одна колонка - возвращается значение из нее, если запрос возвращает несколько колонок - возвращается объект Структура, заполненный полями и именами ключей, соответствующими именам колонок и значениями из этих колонок. Если запрос возвращает набор данных, и в наборе данных нет ни одной строки - это не является ошибкой, в этом случае возвращается пустое значение типа, определенного в первой колонке, или объект Структура, заполненный соответствующим образом. Если запрос не параметризированный - метод гарантированно закрывает курсор. |
|||
28
antoneus
24.01.13
✎
14:29
|
В отладке - select descr from sc116 where code = 881
В профайлере - аналогично. QA вернул "банка". |
|||
29
Ёпрст
24.01.13
✎
14:30
|
(28) ну, значит скуль сам неявно приводит к строке, хотя это и моветон
|
|||
30
Mikeware
24.01.13
✎
14:32
|
(26)(28) неявное приведение типов.
импользовать можно, но плохой стиль - можно и нарваться. по закону подлости - в самый неподходящий момент |
|||
31
bananan
24.01.13
✎
14:46
|
На код:
|SELECT Сотрудник.Descr AS Наименование | ,Сотрудник.Code AS Код | ,Сотрудник.Фирма AS Фирма | ,Сотрудник.ДатаУвольнения AS ДатаУвольнения | ,Сотрудник.ДатаПриема AS ДатаПриема |FROM | $Справочник.Сотрудники AS Сотрудник | WHERE Сотрудник.Code < 1241;"; Выдает ошибку: Server]Invalid column name 'Фирма'. Делов в том что поле Фирма - имеет тип Справочник.Фирмы... Здеь надо делать подзапрос? |
|||
32
monsterZE
24.01.13
✎
14:47
|
посмотрел и числовой и строковый - везде чар(н)
|
|||
33
monsterZE
24.01.13
✎
14:47
|
*текстовый =)
|
|||
34
monsterZE
24.01.13
✎
14:49
|
(31) убери ее и скажет тоже самое на остальные строки =)
|
|||
35
monsterZE
24.01.13
✎
14:50
|
(31) ты хоть свои же темы пересматривай.. жовано пережовано
|
|||
36
Delorn
24.01.13
✎
14:59
|
(31) тебе все сказали в (1) зачем быть упорным таким?
",Сотрудник.Code" обрати внимание на "code". именно так называется поле в реальной таблице и теперь внимательно посмотри на ",Сотрудник.Фирма" где знак "$" ? поле "фирма" в реальной таблице отсутствует. |
|||
37
Wertual-s
24.01.13
✎
15:02
|
Фирма должна быть как [Фирма as $Справочник.Фирмы]
|
|||
38
Delorn
24.01.13
✎
15:03
|
+(36)для (0) http://www.1cpp.ru/forumfiles/Attachments/mod_002.zip читай до просветления. Обязательно посмотри что представляют из себя таблицы в базе данных. Мне очень помогло.
|
|||
39
Mikeware
24.01.13
✎
15:04
|
(37) ответ неверный.
|
|||
40
bananan
24.01.13
✎
15:14
|
(35) Перечитываю и НЕ понимаю, почему такой код:
Клиент [Клиент $Справочник.Клиенты] работает нормалььно, а код: Фирма AS [Фирма $Справочник.Фирмы] выдает ошибку: Invalid column name 'Фирма'. В чем разница??? |
|||
41
Delorn
24.01.13
✎
15:15
|
(40) не приводи такой мусор в пример ни когда. Приведи полный пример запроса.И уточни название конфигурации и есть ли в ней справочник ФИРМЫ?
|
|||
42
GLazNik
24.01.13
✎
15:16
|
(40) ответ в (36)
|
|||
43
Wobland
24.01.13
✎
15:22
|
(40) Клиент [Клиент $Справочник.Клиенты] не будет работать нормально, не ври
|
|||
44
bananan
24.01.13
✎
15:23
|
(41) Есть там Справочник.Фирмы. Конфигурация АБТ 3.5.5 ПРОФ для Украины
|
|||
45
rbserg
24.01.13
✎
15:24
|
(31) Выполни запрос:
SELECT * FROM $Справочник.Сотрудники AS Сотрудник WHERE Сотрудник.Code = '1241' и посмотри, есть ли в выборке поле "Фирма". Будешь приятно удивлен. Поля 'Code' и 'Descr' там соответственно будут. |
|||
46
Mikeware
24.01.13
✎
15:27
|
(45) ты думаешь, он сможет увидеть результаты запроса? :-)))
|
|||
47
bananan
24.01.13
✎
15:28
|
(45) Удивлен НЕПРИЯТНО, в выборке все поля на английском...
|
|||
48
bananan
24.01.13
✎
15:28
|
(46) Тебе показать результат?
|
|||
49
Delorn
24.01.13
✎
15:28
|
(44) полный пример запроса привести тяжело конечно... Ну тогда я тебе упрашивать не буду. Сравни три строчки если натолкнут тебя на мысль твое счастье :)
1) | ,Сотрудник.Фирма AS Фирма 2) | ,$Сотрудник.Фирма AS Фирма 3) | ,$Сотрудник.Фирма AS [Фирма $Справочник.Фирмы] обязательно попробуй их все. |
|||
50
bananan
24.01.13
✎
15:29
|
(49) Спасибо, - сейчас попробую
|
|||
51
bananan
24.01.13
✎
15:32
|
(49) Большое спасибо!!!
Работает код: $Сотрудник.Фирма AS [Фирма $Справочник.Фирмы] |
|||
52
КонецЦикла
24.01.13
✎
15:32
|
все нечетал
код числовой? |
|||
53
bananan
24.01.13
✎
15:32
|
(52) Да, код - числовой
|
|||
54
monsterZE
24.01.13
✎
15:34
|
=) прикольно, что тс заюзал пример из учебника, где черным по белому:
Вот и выполнился наш первый запрос. Это конечно хорошо, но справочников в конфигурации много, смотреть каждый раз в DDS ой как не хочется, да и читать такие запросы совсем не удобно. Если использовать ADO, а не 1С++, то так и придется делать. Но скажем спасибо разработчикам 1С++, что в ней есть метапарсер имен, который сам переведет все идентификаторы объектов в их реальные имена. А делается это так: ТекстЗапроса = " |SELECT | Спр.Code as Код, | Спр.Descr as Наименование |FROM | $Справочник.Номенклатура as Спр"; Заменяются следующие имена: $Справочник.ХХХ – справочник $Документ.ХХХ – документ $ДокументСтроки.ХХХ – табличная часть документа --- пади стебется просто =\ |
|||
55
bananan
24.01.13
✎
15:35
|
(54) Данный код - не из учебника, он мне позже (завтра) пригодиться....
|
|||
56
Wobland
24.01.13
✎
15:37
|
(54) он на самом деле такой ;)
|
|||
57
GLazNik
24.01.13
✎
15:39
|
(55) в добавок к (49) предлагаю еще такой код попробывать:
DELETE FROM $Справочник.Сотрудники |
|||
58
Mikeware
24.01.13
✎
15:41
|
(57) что уж мелочиться - тогда уж truncate
|
|||
59
GLazNik
24.01.13
✎
15:43
|
(58) ах уговорили... drop table
|
|||
60
bananan
24.01.13
✎
15:43
|
(57)(58)(59) Ваши бы старания да во благо Родины!
|
|||
61
Mikeware
24.01.13
✎
15:45
|
(60) ну так мы и стараемся во благо _своей_ родины :-)
|
|||
62
Ёпрст
24.01.13
✎
15:45
|
какие вы все мелочные
DROP DATABASE надоть |
|||
63
bananan
24.01.13
✎
15:59
|
Такой вопрос в справочнике поле - поле - перечисление, если там 0 - то женский пол иначе - мужской...
Как это для 1С++ написать? пробывал так: | CASE | WHEN $Сотрудник.Пол = 0 THEN Стать "Ж" | ELSE "Ч" Понятно ошибку выдает.. |
|||
64
Ёпрст
24.01.13
✎
16:01
|
(63) выкинуть case и типизировать к $Перечисление.Вид
|
|||
65
Mikeware
24.01.13
✎
16:01
|
(64)читай про $Перечисление
|
|||
66
bananan
24.01.13
✎
16:02
|
(64) Спасибо, попробую (о возвожности типизации - забыл)
|
|||
67
Mikeware
24.01.13
✎
16:02
|
(65) может, ему не перечисление надо, а именно строку в зависимости от пола?
|
|||
68
GLazNik
24.01.13
✎
16:03
|
(63) "Ч"? "женщина друг человека"?
|
|||
69
Ёпрст
24.01.13
✎
16:03
|
(67) раздвояищься ?..
:) пусть в начале с типизацией пробует. |
|||
70
Ёпрст
24.01.13
✎
16:04
|
(68) Червона дива..
|
|||
71
Mikeware
24.01.13
✎
16:08
|
(68) он хохол...
------ Девушка ночевала у парня. Утром выходит из ванной и спрашивает: - Дорогой, у тебя висит 2 полотенца с надписями «М» и «Ж». Я вытерлась полотенцем с надписью «Ж», потому что подумала, что М - это для мужчин? -Ну, вообще-то, «М» - это для морды… © |
|||
72
Delorn
24.01.13
✎
16:13
|
(63) еще раз перечитай ссылку
ТекстЗапроса = " |SELECT | Спр.ID as [Элемент $Справочник.Номенклатура] |FROM | $Справочник.Номенклатура as Спр |WHERE | $Спр.ТипНоменклатуры = :Товар"; RS.УстановитьТекстовыйПараметр("Товар", Перечисление.ТипыНоменклатуры.Товар); ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.ВыбратьСтроку(); Это от туда |
|||
73
Delorn
24.01.13
✎
16:15
|
+(72) Но тебя наверное интересует 6 пример по ссылке
| $Спр.ТипНоменклатуры as [ТипНоменклатуры $Перечисление.ТипНоменклатуры] |
|||
74
bananan
24.01.13
✎
16:24
|
Ж - жинка (женщина), Ч - чоловик (мужчина)
(72)(73) За ссылки спасибо, но у меня так работает: | ,$Сотрудник.Пол as [Стать $Перечисление.Пол] (кстати) "стать" - это пол на украинском языке... :) |
|||
75
monsterZE
24.01.13
✎
16:28
|
пиши запросы на украинском =) на родном..
|
|||
76
Wobland
24.01.13
✎
16:28
|
(74) гы. а я принял за бейсиковский атавизм LET
|
|||
77
bananan
24.01.13
✎
16:35
|
(75) При всем желании 1С украинскую букву "i" в упор не видит..
А русский я знаю где-то с 3-х лет... :) |
|||
78
Ёпрст
24.01.13
✎
16:46
|
ntnc @Ёпрст
|
|||
79
sapphire
24.01.13
✎
16:48
|
Блeaть, ну неужели непонятно как это работает? :(
Короче, весь сакральный смысл работы прямых запросов в 1С++ сводится к следующему: 1С++ транслирует "мета-SQL" в SQL/t-SQL. Даже объект есть такой в 1С++ МетаСКЛ.... Значит, нужно понимать следующее: 1. Как правильно использовать метаСКЛ в 1С++ 2. Как правильно писать запросы в SQL/t-SQL по п.1 ${Имя типа}.{Идентификатор} вернет имя таблицы $Справочник.Товары - SC11 к примеру, можно посмотреть как указано в файле 1cv7.dd/1cv7.dds ${Имя типа}.{Идентификатор}.{Поле} - вернет идентификатор поля таблицы. Что-то типа SP1321 в итоге, можно получить конструкцию [Имя таблицы].[Имя поля] Ликбез по 77: все "Периодический" & Константы храняться в _1SCONST, общие реквизиты и флаги проведения по регистрам - в _1SJOURN. по п.2: ищи на просторах интернета: Microsoft SQL Server 2008. Основы T-SQL. Ицик Бен-Ган |
|||
80
Ёпрст
24.01.13
✎
16:50
|
||||
81
bananan
24.01.13
✎
16:50
|
(79) Ицика нашел - при возможности - читаю
|
|||
82
bananan
24.01.13
✎
16:57
|
Процедуру ПриОткрытии надо после всех своих процедур определять или после?
Такой кусок кода //============================ Процедура ПриОткрытии() ДатаАктуальности = РабочаяДата(); Фирма = Константа.БазФирма.Получить(ДатаАктуальности); фОсновные = 1; фСовместители = 1; фУволенные = 0; КонецПроцедуры //******************************************* Процедура Сформировать() Сообщить("ДатаАктуальности = "+ДатаАктуальности); выдает ошибку: Переменная не определена (ДатаАктуальности) Что здесь не так?? |
|||
83
Wobland
24.01.13
✎
16:59
|
(82) даты актуальности нет, ты её спрятал
|
|||
84
Ёпрст
24.01.13
✎
17:00
|
(82) без разницы
|
|||
85
bananan
24.01.13
✎
17:01
|
(83) Не понял, - я ДАтуАктуальности назначаю ПриОткрытии()...
Где я ее спраятал и как? |
|||
86
Wobland
24.01.13
✎
17:02
|
(85) вот в при открытии и спрятал. видна только там. кури Перем
|
|||
87
Ёпрст
24.01.13
✎
17:02
|
+84
ДатаАктуальности должна быть или глобальной переменной модуля формы или глобальной (экспортной )переменной глобальника или реквизитом формы (или риквизитом объекта , если этот код не в обработке/отчете) |
|||
88
bananan
24.01.13
✎
17:05
|
С переменной разобрался с вашей помощью...
А вот такой код: ТекстЗапроса = " |SELECT Сотрудник.Descr AS Наименование | ,Сотрудник.Code AS Код | ,$Сотрудник.Фирма AS [Фирма $Справочник.Фирмы] | ,$Сотрудник.ДатаУвольнения AS ДатаУвольнения | ,$Сотрудник.ДатаПриема AS ДатаПриема | ,$Сотрудник.ДатаРождения AS ДатаРождения | ,$Сотрудник.ПропискаАдрес AS ПропискаАдрес | ,$Сотрудник.ФактАдрес AS ФактАдрес | ,$Сотрудник.Пол as [Стать $Перечисление.Пол] | ,$Сотрудник.Образование AS [Образование $Перечисление.Образование] | ,$Сотрудник.СемейноеПоложение AS [СемейноеПоложение $Перечисление.СемейноеПоложение] | ,$Сотрудник.ИНН AS ИНН | ,$Сотрудник.ДокВид AS [ДокВид $Перечисление.ВидыДокументов] | ,$Сотрудник.ДокСерия AS ДокСерия | ,$Сотрудник.ДокНомер AS ДокНомер | ,$Сотрудник.ДокКемВыдан AS ДокКемВыдан | ,$Сотрудник.ДокКогдаВыдан AS ДокКогдаВыдан | ,SUM(Внутренний.Став) as Ставка |FROM |( | SELECT | $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став | FROM | $Справочник.Сотрудники Сотр | WHERE | Сотр.ID IN (SELECT Val FROM #tmpSotr) | AND $Сотр.ДатаПриема> :Дат1 | AND $Сотр.ДатаПриема<= :ДатаАктуальности | AND ($Сотр.ДатаУвольнения = '01.01.1753' or $Сотр.ДатаУвольнения>= :ДатаАктуальности ) |) as Внутренний"; RS = СоздатьОбъект("ODBCRecordset"); RS.УстановитьТекстовыйПараметр("Дат1", Дата("01.01.1989")); RS.УстановитьТекстовыйПараметр("ДатаАктуальности", ДатаАктуальности+1); ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); Выдает ошибку: Meta name parser error: неизвестное метаимя или алиас "$Сотрудник" Что он здесь хочет?? Подзапрос вставил... Может в подзапросе что не так? |
|||
89
Wobland
24.01.13
✎
17:07
|
(88) перестань запятые где попало ставить. поубивать надо
на пальцах: выбрать сотрудник.что-то из (неважно что) как внутренний какой такой сотрудник? |
|||
90
bananan
24.01.13
✎
17:07
|
+(88) уже нашел... не надо с эотим разобрался
|
|||
91
Ёпрст
24.01.13
✎
17:08
|
(88) всё же книжку то почитай, про скулю..
щас тебе он в вежливой форме пока ошибки выдает, не помню уже, но с 10 или 13 раза уже будет чистый мат на русском! |
|||
92
bananan
24.01.13
✎
17:10
|
Сори, запрос с подзапросом по сотрудниках обсуждали вчера и вчера подобный код работал,
в этот код я просто добавил в селекте несколько полей а он выдает ошибку: Invalid object name '#tmpSotr'. |
|||
93
bananan
24.01.13
✎
17:11
|
(91) Книжку я почитываю периодически, а (88) - невнимательность
|
|||
94
Wobland
24.01.13
✎
17:11
|
(92) ну не знает оно тмпСотр. ты по-английски понимаешь вообще?
|
|||
95
Ёпрст
24.01.13
✎
17:12
|
(92) дык а сама временная табличка то есть ?
ты её параметром запроса установил ? |
|||
96
bananan
24.01.13
✎
17:13
|
(95) Понял, спасибо!
|
|||
97
sapphire
24.01.13
✎
17:16
|
Жуть. Прям обострение какое-то.
|
|||
98
bananan
24.01.13
✎
17:28
|
по поводу tmpSotr...
так вот это писалось под готовый код (и оно, в конце концов заработало) RS.УложитьСписокОбъектов(Запрос.Сотр.ТекущийЭлемент(), "#tmpSotr","Сотрудники"); Как видите здесь используется еще один запрос, а моя задача сейчас все сделать в одном запросе. Как быть?? |
|||
99
Ёпрст
24.01.13
✎
17:29
|
(98)
нам отсюда не видно твой код |
|||
100
Wobland
24.01.13
✎
17:30
|
(98) соединить
|
|||
101
bananan
24.01.13
✎
17:31
|
(99) показываю предыдущий код:
//============================ Процедура ПриОткрытии() ДатаАктуальности = РабочаяДата(); Фирма = Константа.БазФирма.Получить(ДатаАктуальности); фОсновные = 1; фСовместители = 1; фУволенные = 0; КонецПроцедуры //============================ Процедура ИзмРазрез() Если (фОсновные=0) и (фСовместители=0) Тогда фОсновные = 1; фСовместители = 1; КонецЕсли; КонецПроцедуры //============================ Функция ФорматПок(Чсл) Экспорт Возврат Формат(Чсл,"Ч012.2.,"); КонецФункции Процедура Сформировать(Пар) ТекстЗапроса = "//{{ЗАПРОС(СписокСотрудников) |Период с {ДатаАктуальности} по {ДатаАктуальности}; |Сотр = Справочник.Сотрудники.ТекущийЭлемент; |Фир = Справочник.Сотрудники.Фирма; |Оклад = Справочник.Сотрудники.Оклад; |КвоЛьгот = Справочник.Сотрудники.КвоЛьгот; |Тариф = Справочник.Сотрудники.Тариф; |Пенсионер = Справочник.Сотрудники.Пенсионер; |Инвалид = Справочник.Сотрудники.Инвалид; |Должность = Справочник.Сотрудники.МестоРаботы; |Ставка = Справочник.Сотрудники.Ставка; |Совместитель = Справочник.Сотрудники.ТипСотрудника; |ДатаПриема = Справочник.Сотрудники.ДатаПриема; |ДатаУвольнения = Справочник.Сотрудники.ДатаУвольнения; |//основные |ДатаРождения = Справочник.Сотрудники.ДатаРождения; |//координаты |ПропискаАдрес = Справочник.Сотрудники.ПропискаАдрес; |ФактАдрес = Справочник.Сотрудники.ФактАдрес; |//кадровые |Стать = Справочник.Сотрудники.Пол; |Образование = Справочник.Сотрудники.Образование; |СемейноеПоложение = Справочник.Сотрудники.СемейноеПоложение; |//идентификация |ИНН = Справочник.Сотрудники.ИНН; |ДокВид = Справочник.Сотрудники.ДокВид; |ДокСерия = Справочник.Сотрудники.ДокСерия; |ДокНомер = Справочник.Сотрудники.ДокНомер; |ДокКемВыдан = Справочник.Сотрудники.ДокКемВыдан; |ДокКогдаВыдан = Справочник.Сотрудники.ДокКогдаВыдан; |//условия запроса и т.д. |Условие(Фир=Фирма); |Условие (Число(Сотр.Родитель.Код) <> 0); |Условие(Сотр в ВыбСотрудник); |Условие(ДатаПриема<>Дата(0)); |Условие(ДатаПриема<=ДатаАктуальности);"; Если фОсновные=0 Тогда ТекстЗапроса=ТекстЗапроса+" |Условие(Совместитель=1);"; КонецЕсли; Если фСовместители=0 Тогда ТекстЗапроса=ТекстЗапроса+" |Условие(Совместитель=0);"; КонецЕсли; Если Пар=1 Тогда ТекстЗапроса=ТекстЗапроса+" |Группировка Сотр Упорядочить По Сотр.Наименование;"; Иначе ТекстЗапроса=ТекстЗапроса+" |Группировка Сотр Упорядочить По Сотр.Код;"; КонецЕсли; ТекстЗапроса=ТекстЗапроса+" |Функция Окл = Сумма(Оклад); |Функция Тар = Сумма(Тариф);"; Запрос = СоздатьОбъект("Запрос"); Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда Возврат; КонецЕсли; Таб = СоздатьОбъект("Таблица"); Таб.ВывестиСекцию("Шапка|Основная"); Если фУволенные=1 Тогда Таб.ПрисоединитьСекцию("Шапка|Увольнение"); КонецЕсли; Если (фОсновные=1) и (фСовместители=1) Тогда Таб.ПрисоединитьСекцию("Шапка|Совместитель"); КонецЕсли; Если Основные = 1 Тогда Таб.ПрисоединитьСекцию("Шапка|Основные"); КонецЕсли; Если Кадровые = 1 Тогда Таб.ПрисоединитьСекцию("Шапка|Кадровые"); КонецЕсли; Если Идентификация = 1 Тогда Таб.ПрисоединитьСекцию("Шапка|Идентификация"); КонецЕсли; Если Координаты = 1 Тогда Таб.ПрисоединитьСекцию("Шапка|Координаты"); КонецЕсли; Кво = 0; тЗанято = 0; Пока Запрос.Группировка("Сотр")=1 Цикл тЗанято = тЗанято + 1; Состояние( "Обработка " + Запрос.Сотр); Если Запрос.Сотр.ЭтоГруппа() = 1 Тогда Запрос_=СоздатьОбъект("ODBCRecordset"); ТекстЗапроса = " |SELECT | SUM(Внутренний.Став) as Ставка |From |( | SELECT | $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став | FROM | $Справочник.Сотрудники Сотр | WHERE | Сотр.ID IN (SELECT Val FROM #tmpSotr) | AND $Сотр.ДатаПриема> :Дат1 | AND $Сотр.ДатаПриема<= :ДатаАктуальности | AND ($Сотр.ДатаУвольнения = '01.01.1753' or $Сотр.ДатаУвольнения>= :ДатаАктуальности ) |) as Внутренний |"; Запрос_.УстановитьТекстовыйПараметр("Дат1", Дата("01.01.1989")); Запрос_.УстановитьТекстовыйПараметр("ДатаАктуальности", ДатаАктуальности+1); Запрос_.УложитьСписокОбъектов(Запрос.Сотр.ТекущийЭлемент(), "#tmpSotr","Сотрудники"); тЗанято = Запрос_.ВыполнитьСкалярный(ТекстЗапроса); ПоШтату = Запрос.Сотр.ПоШтату; тВакантно = Запрос.Сотр.ПоШтату-тЗанято; ФиксДан = Шаблон("Занято: [тЗанято] \ По штату: [Запрос.Сотр.ПоШтату] \ Вакантно: [тВакантно]"); Таб.ВывестиСекцию("Группа|Основная"); Если фУволенные=1 Тогда Таб.ПрисоединитьСекцию("Группа|Увольнение"); Конецесли; Если (фОсновные=1) и (фСовместители=1) Тогда Таб.ПрисоединитьСекцию("Группа|Совместитель"); КонецЕсли; Иначе Если (фУволенные=0) и (ДатаЧисло(Запрос.ДатаУвольнения)<>0) и (Запрос.ДатаУвольнения<=ДатаАктуальности) Тогда Продолжить; КонецЕсли; Кво = Кво + 1; ОснПенс = ?(Запрос.Пенсионер=1,"+",""); ОснИнв = ?(Запрос.Инвалид=1,"+",""); Таб.ВывестиСекцию("Сотрудник|Основная"); Если фУволенные=1 Тогда Если (ДатаЧисло(Запрос.ДатаУвольнения)<>0) и (Запрос.ДатаУвольнения<=ДатаАктуальности) Тогда ДатаУвольнения = Формат(Запрос.ДатаУвольнения,"ДДММГГ"); Иначе ДатаУвольнения = ""; КонецЕсли; Таб.ПрисоединитьСекцию("Сотрудник|Увольнение"); КонецЕсли; Если (фОсновные=1) и (фСовместители=1) Тогда ОснСовм = ?(Запрос.Совместитель=1,"+",""); Таб.ПрисоединитьСекцию("Сотрудник|Совместитель"); КонецЕсли; КонецЕсли; Если Основные = 1 Тогда Таб.ПрисоединитьСекцию("Сотрудник|Основные"); КонецЕсли; Если Кадровые = 1 Тогда Таб.ПрисоединитьСекцию("Сотрудник|Кадровые"); КонецЕсли; Если Идентификация = 1 Тогда Таб.ПрисоединитьСекцию("Сотрудник|Идентификация"); КонецЕсли; Если Координаты = 1 Тогда Таб.ПрисоединитьСекцию("Сотрудник|Координаты"); КонецЕсли; КонецЦикла; Таб.ВывестиСекцию("Дно|Основная"); Если фУволенные=1 Тогда Таб.ПрисоединитьСекцию("Дно|Увольнение"); КонецЕсли; Если (фОсновные=1) и (фСовместители=1) Тогда Таб.ПрисоединитьСекцию("Дно|Совместитель"); КонецЕсли; Таб.Опции(0,0,0,0); Таб.ТолькоПросмотр(0); Таб.Показать("Список сотрудников"); КонецПроцедуры Здесь нонсенс: запрос на 1С++ выполняется в цикле обработки запроса по 1С... (Код писал не я) |
|||
102
bananan
24.01.13
✎
17:31
|
(100) Что соеденить и как?
|
|||
103
Ёпрст
24.01.13
✎
17:34
|
(101) Дык он работает ?
Тогда забить. Если не устраивает скорость - переписать |
|||
104
Wobland
24.01.13
✎
17:34
|
(101) нене, чур меня
|
|||
105
bananan
24.01.13
✎
17:35
|
(103) Да он - работает; скорость - не устраивает, вот и пытаюсь переписать...
|
|||
106
bananan
24.01.13
✎
17:38
|
+(105) Т.е. я не понимаю чего мне делать вместо Запроса на 1С...
отсюда затык с: RS.УложитьСписокОбъектов(Запрос<<?>>.Сотр.ТекущийЭлемент(), "#tmpSotr","Сотрудники"); Что мне взять вместо того запроса? |
|||
107
bananan
24.01.13
✎
17:40
|
В принципе, если юзер выбирет Какого-то конкретного работика или какое -то подразделение фирмы, тогда, кажется что-то можно придумать.. А если надо по всей фирме - тогда как?
|
|||
108
bananan
24.01.13
✎
17:44
|
+(106) А вот текст первого запроса:
ТекстЗапроса = "//{{ЗАПРОС(СписокСотрудников) |Период с {ДатаАктуальности} по {ДатаАктуальности}; |Сотр = Справочник.Сотрудники.ТекущийЭлемент; |Фир = Справочник.Сотрудники.Фирма; |Оклад = Справочник.Сотрудники.Оклад; |КвоЛьгот = Справочник.Сотрудники.КвоЛьгот; |Тариф = Справочник.Сотрудники.Тариф; |Пенсионер = Справочник.Сотрудники.Пенсионер; |Инвалид = Справочник.Сотрудники.Инвалид; |Должность = Справочник.Сотрудники.МестоРаботы; |Ставка = Справочник.Сотрудники.Ставка; |Совместитель = Справочник.Сотрудники.ТипСотрудника; |ДатаПриема = Справочник.Сотрудники.ДатаПриема; |ДатаУвольнения = Справочник.Сотрудники.ДатаУвольнения; |//основные |ДатаРождения = Справочник.Сотрудники.ДатаРождения; |//координаты |ПропискаАдрес = Справочник.Сотрудники.ПропискаАдрес; |ФактАдрес = Справочник.Сотрудники.ФактАдрес; |//кадровые |Стать = Справочник.Сотрудники.Пол; |Образование = Справочник.Сотрудники.Образование; |СемейноеПоложение = Справочник.Сотрудники.СемейноеПоложение; |//идентификация |ИНН = Справочник.Сотрудники.ИНН; |ДокВид = Справочник.Сотрудники.ДокВид; |ДокСерия = Справочник.Сотрудники.ДокСерия; |ДокНомер = Справочник.Сотрудники.ДокНомер; |ДокКемВыдан = Справочник.Сотрудники.ДокКемВыдан; |ДокКогдаВыдан = Справочник.Сотрудники.ДокКогдаВыдан; |//условия запроса и т.д. |Условие(Фир=Фирма); |Условие (Число(Сотр.Родитель.Код) <> 0); |Условие(Сотр в ВыбСотрудник); |Условие(ДатаПриема<>Дата(0)); |Условие(ДатаПриема<=ДатаАктуальности);"; Если фОсновные=0 Тогда ТекстЗапроса=ТекстЗапроса+" |Условие(Совместитель=1);"; КонецЕсли; Если фСовместители=0 Тогда ТекстЗапроса=ТекстЗапроса+" |Условие(Совместитель=0);"; КонецЕсли; ну и при различных уловиях текст запроса дополняется... |
|||
109
Ёпрст
24.01.13
✎
17:45
|
сделать один запрос, далее сгруппировать с иерархией в индексированной табличке, или.. получить иерархию в самом запросе.
+ наложить фильтр на вычисление суммы по "уволенным" и "основным" сотрудникам в группе. |
|||
110
sapphire
24.01.13
✎
17:45
|
(103) Автора забить. Код переписать.
|
|||
111
bananan
24.01.13
✎
17:47
|
(109) Дык я и пытаюсь все сделать в одном запрое.. а по поводу иерархии - нифига не понял :(
|
|||
112
sapphire
24.01.13
✎
17:48
|
(106) Это уже совсем плохо, если такой простой код не понимаешь.
|
|||
113
Ёпрст
24.01.13
✎
17:49
|
(111) чтоб получить иерархию справочника, тебе нужно, либо делать это в самом запросе (прямом) или на выходе через индексированную таблицу.
|
|||
114
sapphire
24.01.13
✎
17:50
|
А кто тут у нас, кроме ТС, обладатель md этой чудо-конфы?
|
|||
115
sapphire
24.01.13
✎
17:51
|
(113) В самом он врядли сможет.
|
|||
116
sapphire
24.01.13
✎
17:53
|
(113) Какая у него там версия скуля?
|
|||
117
Ёпрст
24.01.13
✎
17:53
|
(114) у меня еть :)
|
|||
118
Ёпрст
24.01.13
✎
17:53
|
(116) скорее всего 2000
|
|||
119
sapphire
24.01.13
✎
17:54
|
(118) Мысль написать изврат с кучей параметров :)
|
|||
120
Ёпрст
24.01.13
✎
17:55
|
чорт, я прибил его мд-ник..
:( |
|||
121
sapphire
24.01.13
✎
17:56
|
(118) Можно получить данные сначала прямым запросом, а потом посчитать для групп.
|
|||
122
sapphire
24.01.13
✎
17:57
|
(118) просто в 2000 курсором только можно :(
|
|||
123
bananan
24.01.13
✎
17:59
|
кажется 2005 версия у нас
|
|||
124
bananan
24.01.13
✎
18:00
|
А где и как можно посмотреть версию?
|
|||
125
sapphire
24.01.13
✎
18:13
|
select @@VERSION Версия
|
|||
126
bananan
24.01.13
✎
18:26
|
Ла и здесь нужно выбрать ставку для конкретного сотрудника,
а вот как сделать иерархию, и вот что в данном случае означает слово иерархия - не понимаю, иерархия, ну скажем Фирма в фирме подразделения несколько подразделений имеют еще свои подразделения ну и практически в каждом подразделении есть один и больше сотрудников. Это подразумевается под иерархией? т.е. в корнре - фирма - от нее ветви подразделениия и т.д. а уже на ветках сотрудники. Так? |
|||
127
viktor_vv
24.01.13
✎
18:40
|
(126) А где ты Ицика нашел ?
А то че-то в столице как-то глухо с ним. |
|||
128
viktor_vv
24.01.13
✎
18:41
|
(127) Я имел ввиду в бумажном варианте. Или ты скачал ?
|
|||
129
bananan
24.01.13
✎
18:44
|
(128) Скачал
|
|||
130
bananan
24.01.13
✎
18:45
|
а в бумажном варианте- не искал
|
|||
131
bananan
24.01.13
✎
19:09
|
Опять же - не понимаю. В главном (внешнем) запросе я выбираю какого-то сотрудника в подзапросе по ИД искать ставку для этого суотрудника и т.д?
ТАк? Или, может кто что-то лучшее подскажет... |
|||
132
bananan
24.01.13
✎
19:12
|
То ли что с форумомо то ли что... я уже несколько сообщений написал. А они все "пропали"..
|
|||
133
bananan
24.01.13
✎
19:14
|
конструкцию Сотр.ID IN (SELECT Val FROM #tmpSotr) Чем можно заменить? Т.е. как создать временную таблицу или что еще??
|
|||
134
Wobland
24.01.13
✎
19:16
|
навскидку. Сотр.ID IN (SELECT нужные тебе сотрудники)
|
|||
135
bananan
24.01.13
✎
19:17
|
SELECT (*) Сойдет?
|
|||
136
Wobland
24.01.13
✎
19:18
|
(135) select "*" тогда уж ;)
|
|||
137
bananan
24.01.13
✎
19:21
|
Написал такой код:
|SELECT Сотрудник.Descr AS Наименование | ,Сотр.Code AS Код | ,$Сотр.Фирма AS [Фирма $Справочник.Фирмы] | ,$Сотр.ДатаУвольнения AS ДатаУвольнения | ,$Сотр.ДатаПриема AS ДатаПриема | ,$Сотр.ДатаРождения AS ДатаРождения | ,$Сотр.ПропискаАдрес AS ПропискаАдрес | ,$Сотр.ФактАдрес AS ФактАдрес | ,$Сотр.Пол as [Стать $Перечисление.Пол] | ,$Сотр.Образование AS [Образование $Перечисление.Образование] | ,$Сотр.СемейноеПоложение AS [СемейноеПоложение $Перечисление.СемейноеПоложение] | ,$Сотр.ИНН AS ИНН | ,$Сотр.ДокВид AS [ДокВид $Перечисление.ВидыДокументов] | ,$Сотр.ДокСерия AS ДокСерия | ,$Сотр.ДокНомер AS ДокНомер | ,$Сотр.ДокКемВыдан AS ДокКемВыдан | ,$Сотр.ДокКогдаВыдан AS ДокКогдаВыдан | ,SUM(Внутренний.Став) as Ставка |FROM |( | SELECT | $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став | FROM | $Справочник.Сотрудники Сотр | WHERE | Сотр.ID IN (SELECT Сотрв.Code AS КодВ FROM $Справочник.Сотрудники Сотрв)) | AND $Сотр.ДатаПриема> :Дат1 | AND $Сотр.ДатаПриема<= :ДатаАктуальности | AND ($Сотр.ДатаУвольнения = '01.01.1753' or $Сотр.ДатаУвольнения>= :ДатаАктуальности ) |) as Внутренний"; Выдает ошибку: Сформировать(<<?>>1) Слишком много фактических параметров... |
|||
138
Wobland
24.01.13
✎
19:22
|
(137) о чём тебе говорит сообщение об ошибке? ты же подумал прежде, чем спрашивать, правда?
|
|||
139
bananan
24.01.13
✎
19:22
|
И по ошибке кликаеш - никакой реакции... Что это может быть?
|
|||
140
Mikeware
24.01.13
✎
19:22
|
(137) естественно...
читай документацию |
|||
141
bananan
24.01.13
✎
19:23
|
(138) Где в Сформировать () у меня паремтры?
|
|||
142
Wobland
24.01.13
✎
19:23
|
(141) Сформировать(<<?>>1)
|
|||
143
bananan
24.01.13
✎
19:24
|
Вот код процедуры Сформировать() полностю:
//******************************************* Процедура Сформировать() Сообщить("ДатаАктуальности = "+ДатаАктуальности); ТекстЗапроса = " |SELECT Сотрудник.Descr AS Наименование | ,Сотр.Code AS Код | ,$Сотр.Фирма AS [Фирма $Справочник.Фирмы] | ,$Сотр.ДатаУвольнения AS ДатаУвольнения | ,$Сотр.ДатаПриема AS ДатаПриема | ,$Сотр.ДатаРождения AS ДатаРождения | ,$Сотр.ПропискаАдрес AS ПропискаАдрес | ,$Сотр.ФактАдрес AS ФактАдрес | ,$Сотр.Пол as [Стать $Перечисление.Пол] | ,$Сотр.Образование AS [Образование $Перечисление.Образование] | ,$Сотр.СемейноеПоложение AS [СемейноеПоложение $Перечисление.СемейноеПоложение] | ,$Сотр.ИНН AS ИНН | ,$Сотр.ДокВид AS [ДокВид $Перечисление.ВидыДокументов] | ,$Сотр.ДокСерия AS ДокСерия | ,$Сотр.ДокНомер AS ДокНомер | ,$Сотр.ДокКемВыдан AS ДокКемВыдан | ,$Сотр.ДокКогдаВыдан AS ДокКогдаВыдан | ,SUM(Внутренний.Став) as Ставка |FROM |( | SELECT | $ПоследнееЗначение.Сотрудники.Ставка(Сотр.ID, :ДатаАктуальности) Став | FROM | $Справочник.Сотрудники Сотр | WHERE | Сотр.ID IN (SELECT Сотрв.Code AS КодВ FROM $Справочник.Сотрудники Сотрв)) | AND $Сотр.ДатаПриема> :Дат1 | AND $Сотр.ДатаПриема<= :ДатаАктуальности | AND ($Сотр.ДатаУвольнения = '01.01.1753' or $Сотр.ДатаУвольнения>= :ДатаАктуальности ) |) as Внутренний"; RS = СоздатьОбъект("ODBCRecordset"); RS.УстановитьТекстовыйПараметр("Дат1", Дата("01.01.1989")); RS.УстановитьТекстовыйПараметр("ДатаАктуальности", ДатаАктуальности+1); ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.ВыбратьСтроку(); Пока ТЗ.ПолучитьСтроку()=1 цикл Чис = Чис + 1; Если Чис > 3 тогда Возврат; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
144
Wobland
24.01.13
✎
19:24
|
(143) сколько параметров в заголовке?
|
|||
145
bananan
24.01.13
✎
19:26
|
(142) В моем коде покажи такой вызов процедуры Сформировать..
В заголовке нет параметров ... Упс. Нашел я параметры они на кнопках формы... |
|||
146
bananan
24.01.13
✎
19:26
|
Сча с параметрамы - раздберусь
|
|||
147
Wobland
24.01.13
✎
19:28
|
(145) ты начни думать. и только после того, как не сможешь самостоятельно найти ответ, спрашивай сюда. это практический совет из личного опыта - лучший имхо способ роста в профессиональном плане
|
|||
148
Wobland
24.01.13
✎
19:33
|
Сотр.ID IN (SELECT Сотрв.Code
поправьте меня, всегда будет пусто |
|||
149
bananan
24.01.13
✎
19:35
|
Параметры убрал ошибка:
Incorrect syntax near the keyword 'AND'. Это уже легче (если запрос правильно работает) :) |
|||
150
Mikeware
24.01.13
✎
19:35
|
(148) случайные совпадения возможны, но маловероятны...
зы. он таки напоминает мне обезъяну за пишущей машинкой, пытающуюся напечатать даже не "войну и мир", а просто связное предложение... |
|||
151
Wobland
24.01.13
✎
19:36
|
и скоро ты придёшь к (89)...
|
|||
152
Wobland
24.01.13
✎
19:36
|
(149) какие мысли есть?
|
|||
153
Wobland
24.01.13
✎
19:38
|
(152) мда.. он долго будет лишнюю скобку искать
|
|||
154
Wobland
24.01.13
✎
19:39
|
(153) плин, ну я всё же верю, что человек ищет, а не сидит и ждёт доброго дядю
|
|||
155
Mikeware
24.01.13
✎
19:39
|
(153) если б только скобка. он вообще не понимает, и не пытается понять - что пишет...
|
|||
156
Wobland
24.01.13
✎
19:40
|
(155) ну, синтаксически же только скобка. а, ну и (89)
|
|||
157
Mikeware
24.01.13
✎
19:43
|
(156) а Сотр откуда возьмется?
|
|||
158
Wobland
24.01.13
✎
19:45
|
(157) вот и я о том же
|
|||
159
sapphire
25.01.13
✎
10:15
|
(127) В сети, в формате pdf есть
|
|||
160
Ёпрст
25.01.13
✎
10:15
|
да и так купить можно, в бумажном виде.
На полянке какой-нить или во всяких либру и озонах. |
|||
161
sapphire
25.01.13
✎
10:17
|
Кажись там есть еще и периодика, не?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |