|
Помогите с выгрузкой данных из SQL-базы в 1С. | ☑ | ||
---|---|---|---|---|
0
_stay true_
30.10.13
✎
08:35
|
Здравствуйте. Нужно средствами 1С подрубиться к SQL-ной базе, прочитать пару таблиц и загрузить данные из них в 1С. Я разобрался как подрубиться к базе с помощью СОМ-объектов, как прочитать таблицы(прочитал одну пробную таблицу и методом "Сообщить" эска мне выводит в служебные сообщение результат). Вопрос в следующем: как теперь это всё загрузить в 1С(УПП)? ЗАранее спасибо.
Коды процедур и функций: Процедура ЗагрузитьДанные() Экспорт SQLСервер = "(local)"; ПользовательSQLСервера = ""; ПарольSQLСервера = ""; БазаДанныхSQLСервера = "RK7_SHOWROOM"; //Подключаемся к SQL серверу Попытка Connection = Новый COMОбъект("ADODB.Connection"); Исключение Возврат; КонецПопытки; Connection.ConnectionString = "driver={SQL Server}; server="+СокрЛП(SQLСервер)+ "; uid="+СокрЛП(ПользовательSQLСервера)+ "; pwd="+СокрЛП(ПарольSQLСервера)+ "; Database="+СокрЛП(БазаДанныхSQLСервера); Попытка Connection.Open(); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; //Выполним запрос МассивПолей = Новый ТаблицаЗначений; МассивПолей.Добавить("NAME"); МассивПолей.Добавить("ALTNAME"); СтруктураОтбор = Новый Структура; СтруктураОтбор.Вставить("Status","3"); ВыполнитьЗапросSQL(МассивПолей, СтруктураОтбор,"EMPLOYEES"); Попытка Connection.Close(); Исключение Возврат; КонецПопытки; КонецПроцедуры Функция ВыполнитьЗапросSQL(МассивПолей, СтруктураОтбор,ИдТаблицыSQL) //Объявляем таблицу значений ТЗ_SQL = Новый ТаблицаЗначений; //Создаем необходимые объекты для записи в базу ADO_CMD = Новый COMОбъект("ADODB.Command"); ADO_CMD.ActiveConnection = Connection; ADO_RS = Новый COMОбъект("ADODB.Recordset"); //Сформируем строку выбираемых полей ТекстSelect = ""; ВсегоПолей = МассивПолей.Количество(); н = 0; Для Каждого ТекПоле Из МассивПолей Цикл н = н + 1; ТекстSelect = ТекстSelect + ТекПоле + ?(н=ВсегоПолей,"",","); КонецЦикла; //Сформируем строку условия ТекстWhere = ""; ВсегоОтборов = СтруктураОтбор.Количество(); н = 0; Для Каждого ТекОтбор Из СтруктураОтбор Цикл н = н + 1; ТекстWhere = ТекОтбор.Ключ + " = " + ТекОтбор.Значение + ?(н=ВсегоОтборов,""," AND "); КонецЦикла; //ДЛЯ КАЖДОЙ ТАБЛИЦЫ ОТДЕЛЬНЫЙ ЗАПРОС И ЗАПИХИВАТЬ РЕЗУЛЬТАТ В ТАБЛИЦУ ЗНАЧЕНИЙ!!!! ADO_CMD.CommandText = " |SELECT "+ТекстSelect+" |FROM "+ИдТаблицыSQL+" |WHERE "+ТекстWhere; Попытка ADO_RS = ADO_CMD.Execute(); Исключение //ЗаписьЖурналаРегистрации("ЗагрузкаДанныхFrontol.SQLServer", // УровеньЖурналаРегистрации.Ошибка, , , // "Не удалось выполнить запрос по таблице """+ИдТаблицыSQL+""". Возможная причина :"+ИнформацияОбОшибке().Описание); Сообщить(ОписаниеОшибки()); КонецПопытки; Если ADO_RS.BOF() И ADO_RS.EOF() Тогда //пустой Иначе ADO_RS.MoveFirst(); Пока НЕ ADO_RS.EOF() do Для Каждого ТекПоле Из МассивПолей Цикл Возврат МассивПолей; Сообщить(СокрЛП(ТекПоле) + " равно " + СокрЛП(ADO_RS.Fields(ТекПоле).Value)); КонецЦикла; ADO_RS.MoveNext(); КонецЦикла; КонецЕсли; ADO_RS.Close(); КонецФункции |
|||
1
Wobland
30.10.13
✎
08:36
|
сферические данные в вакууме?
|
|||
2
_stay true_
30.10.13
✎
08:39
|
(1) я раньше слышал только "сферический конь в ваккуме")))
|
|||
3
Wobland
30.10.13
✎
08:44
|
>"EMPLOYEES"
это мы за тебя должны додумывать, что тебе требуется загрузить наименования сотрудников в базу 1С? |
|||
4
Infsams654
30.10.13
✎
08:45
|
(0) создаешь необходимые объекты, заполняешь их из полученных данных и записываешь
|
|||
5
Rovan
гуру
30.10.13
✎
08:46
|
(0) //ДЛЯ КАЖДОЙ ТАБЛИЦЫ ОТДЕЛЬНЫЙ ЗАПРОС И ЗАПИХИВАТЬ РЕЗУЛЬТАТ В ТАБЛИЦУ ЗНАЧЕНИЙ!!!!
ээээ...там вроде тоже можно пакетные запросы делать ! |
|||
6
_stay true_
30.10.13
✎
08:48
|
(5) (3) Извиняюсь, не проснулся ещё.
(5)Пойду пробовать. |
|||
7
_stay true_
30.10.13
✎
09:02
|
(5)Вот теперь не совсем понимаю как запихнуть результат в таблицу значений. Выдает "Слишком много фактических параметров"
|
|||
8
_stay true_
30.10.13
✎
09:04
|
Я днище, только запросы 1С-овские могу запихивать туда, а с SQL-ным как быть?)))
|
|||
9
Wobland
30.10.13
✎
09:15
|
можно внешний источник заюзать. будут 1Сные запросы
|
|||
10
_stay true_
30.10.13
✎
09:17
|
(9) Вот в этом то и проблема что нельзя внешние источники юзать. Как быть?
|
|||
11
Wobland
30.10.13
✎
09:17
|
(10) аллах запрещает?
|
|||
12
_stay true_
30.10.13
✎
09:19
|
(11) Типа того. Можно ведь как-то обойтись без внешнего источника?
|
|||
13
Wobland
30.10.13
✎
09:21
|
тупо перебрать результат и построчно добавлять в ТЗ уже было?
|
|||
14
ДенисЧ
30.10.13
✎
09:22
|
а сегодня точно не пятница?
|
|||
15
Серго62
30.10.13
✎
09:22
|
(8) Врукопашную создать ТЗ, что мешает?
|
|||
16
_stay true_
30.10.13
✎
09:24
|
(14)У меня каждый день пятница:)
(13) Дайте, пожалуйста, какой-нибудь пример кода чтобы я из ступора вышел и проснулся наконец((( |
|||
17
ДенисЧ
30.10.13
✎
09:25
|
Я не понял, в чёи проблема....
|
|||
18
Wobland
30.10.13
✎
09:25
|
(16) а пожалуйста, просыпайся
// Выводим результат в табличный документ ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); |
|||
19
Wobland
30.10.13
✎
09:26
|
(17) Рован углядел какую-то возможность оптимизации. а в целом, как я понял, нужно понасоздавать элементов справочника с воон теми наименованиями
|
|||
20
Серго62
30.10.13
✎
09:38
|
(16) Вот тебе пример:
Для НомКол = 0 По RS.Fields.Count-1 Цикл Выборка.Колонки.Добавить(RS.Fields(НомКол).Name); КонецЦикла; // RS.MoveFirst(); Пока НЕ RS.EOF Цикл //Сообщить(RS.Fields(1).Value); НовСтр = Выборка.Добавить(); Для НомКол = 0 По RS.Fields.Count-1 Цикл НовСтр[НомКол] = RS.Fields(НомКол).Value; КонецЦикла; //Сообщить(RS.Fields("nm2").Value); // RS.MoveNext(); КонецЦикла; RS - это твой рекордсет |
|||
21
_stay true_
30.10.13
✎
11:32
|
(20) Таки домучил, спасибо тебе огромное))
Теперь вопрос такой: у меня в примере указан запрос по двум полям, где легко распихиваем по колонкам ТЗ значения полей. Попробовал обкатать на выборке из четырех полей по другой таблице, выходит такое: Создается по 4 одинаковые строки в ТЗ для каждого элемента. Как бороться с этим? Код Функция ВыполнитьЗапросSQL(МассивПолей, ИдТаблицыSQL) //Создаем необходимые объекты для записи в базу ADO_CMD = Новый COMОбъект("ADODB.Command"); ADO_CMD.ActiveConnection = Connection; ADO_RS = Новый COMОбъект("ADODB.Recordset"); //Сформируем строку выбираемых полей ТекстSelect = ""; ВсегоПолей = МассивПолей.Количество(); н = 0; Для Каждого ТекПоле Из МассивПолей Цикл н = н + 1; ТекстSelect = ТекстSelect + ТекПоле + ?(н=ВсегоПолей,"",","); КонецЦикла; ADO_CMD.CommandText = " |SELECT "+ТекстSelect+" |FROM "+ИдТаблицыSQL; //Объявляем таблицу значений для сохранения результата Выборка = Новый ТаблицаЗначений; Выборка.Колонки.Добавить("CHECKNUM"); Выборка.Колонки.Добавить("STARTDATETIME"); Выборка.Колонки.Добавить("CLOSEDATETIME"); Выборка.Колонки.Добавить("BINDEDSUM"); Попытка ADO_RS = ADO_CMD.Execute(); Исключение //ЗаписьЖурналаРегистрации("ЗагрузкаДанныхFrontol.SQLServer", // УровеньЖурналаРегистрации.Ошибка, , , // "Не удалось выполнить запрос по таблице """+ИдТаблицыSQL+""". Возможная причина :"+ИнформацияОбОшибке().Описание); Сообщить(ОписаниеОшибки()); КонецПопытки; Если ADO_RS.BOF() И ADO_RS.EOF() Тогда //пустой Иначе ADO_RS.MoveFirst(); Пока НЕ ADO_RS.EOF() do //Заполняем таблицу значений Для Каждого ТекПоле Из МассивПолей Цикл НовСтр = Выборка.Добавить(); НовСтр.CHECKNUM = СокрЛП(ADO_RS.Fields("CHECKNUM").Value); НовСтр.STARTDATETIME = СокрЛП(ADO_RS.Fields("STARTDATETIME").Value); НовСтр.CLOSEDATETIME = СокрЛП(ADO_RS.Fields("CLOSEDATETIME").Value); НовСтр.BINDEDSUM = СокрЛП(ADO_RS.Fields("BINDEDSUM").Value); Сообщить(СокрЛП(ТекПоле) + " равно " + СокрЛП(ADO_RS.Fields(ТекПоле).Value)); КонецЦикла; ADO_RS.MoveNext(); КонецЦикла; Возврат Выборка; КонецЕсли; ADO_RS.Close(); КонецФункции |
|||
22
_stay true_
30.10.13
✎
11:41
|
(21) Решено..Господи, ну я и днище ;(
|
|||
23
_stay true_
30.10.13
✎
11:53
|
На этом история не заканчивается))Я к вам за помощью ещё не раз обращусь:) Благодарю всех, кто не остался равнодушным:)
|
|||
24
_stay true_
30.10.13
✎
15:56
|
Кто-нибудь шарит в SQL-запросах? Пытаюсь соединить 4 таблицы вот таким запросом:
ADO_CMD.CommandText = " |SELECT ORDERS.MIDSERVER, PRINTCHECKS.UNI, CASHGROUPS.SIFR, PRINTCHECKS.CHECKNUM, SHIFTS.MIDSERVER, PRINTHECKS.MIDSERVER, PRINTCHECKS.DRAWERDATETIME, PRINTCHECKS.BILLDATETIME, PRINTCHECKS.GUESTCNT, PRINTCHECKS.ICREATOR, PRINTCHECKS.IAUTHOR, PRINTCHECKS.BINDEDSUM, PRINTCHECKS.IVOID,ORDERS.OPENTIME,ORDERS.ENDSERVICE, ORDERS.LastCheckUNI, ORDERS.TABLEID, SHIFTS.ICLOSEMANAGER |FROM PRINTCHECKS LEFT OUTER JOIN ORDERS LEFT OUTER JOIN SHIFTS LEFT OUTER JOIN CASHGROUPS |ON PRINTCHECKS.MIDSERVER=ORDERS.MIDSERVER AND SHIFTS.MIDSERVER=CASHGROUPS.SIFR"; При выполнении запроса вылетает вот такая ошибка: ВнешняяОбработка.PRINTCHECKS.МодульОбъекта(105)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Неправильный синтаксис около конструкции "SIFR". Опытным путем установил, что ругается на последнее условие соединения. Никак не могу понять почему. |
|||
25
sda553
30.10.13
✎
16:13
|
(24) На каждый join должен быть свой on. У тебя 3 join и всего 1 On
|
|||
26
sda553
30.10.13
✎
16:14
|
join и on - это как скобки, одна открывает, другая закрывает
|
|||
27
_stay true_
30.10.13
✎
16:25
|
(26) Спасибо. Пойду попыхтю наж этим
|
|||
28
МихаилМ
30.10.13
✎
16:27
|
LEFT OUTER JOIN .. LEFT OUTER JOIN .. LEFT OUTER JOIN
может уволитесь за такое перемножение таблиц сами? |
|||
29
_stay true_
30.10.13
✎
16:33
|
(28)Я с SQL впервые столкнулся. Вот и туплю.
Немного поправил запрос. теперь функция выглядит вот так Функция ВыполнитьЗапросSQL_Acheck() //Создаем необходимые объекты для записи в базу ADO_CMD = Новый COMОбъект("ADODB.Command"); ADO_CMD.ActiveConnection = Connection; //|FROM PRINTCHECKS LEFT JOIN ORDERS LEFT JOIN SHIFTS LEFT JOIN CASHGROUPS ADO_RS = Новый COMОбъект("ADODB.Recordset"); ADO_CMD.CommandText = " |SELECT ORDERS.MIDSERVER, PRINTCHECKS.UNI, CASHGROUPS.SIFR, PRINTCHECKS.CHECKNUM, SHIFTS.MIDSERVER, PRINTHECKS.MIDSERVER, |PRINTCHECKS.DRAWERDATETIME, PRINTCHECKS.BILLDATETIME, PRINTCHECKS.GUESTCNT, PRINTCHECKS.ICREATOR, PRINTCHECKS.IAUTHOR, |PRINTCHECKS.BINDEDSUM, PRINTCHECKS.IVOID,ORDERS.OPENTIME,ORDERS.ENDSERVICE, ORDERS.LastCheckUNI, ORDERS.TABLEID, SHIFTS.IMANAGER |FROM PRINTCHECKS |LEFT JOIN ORDERS ON PRINTCHECKS.MIDSERVER=ORDERS.MIDSERVER, |LEFT JOIN SHIFTS ON PRINTCHECKS.MIDSERVER=SHIFTS.MIDSERVER, |LEFT JOIN CASHGROUPS ON PRINTCHECKS.MIDSERVER=CASHGROUPS.SIFR"; //Объявляем таблицу значений для сохранения результата Выборка = Новый ТаблицаЗначений; Выборка.Колонки.Добавить("UNI"); Выборка.Колонки.Добавить("CHECKNUM"); Выборка.Колонки.Добавить("DRAWERDATETIME"); Выборка.Колонки.Добавить("BILLDATETIME"); Выборка.Колонки.Добавить("GUESTCNT"); Выборка.Колонки.Добавить("ICREATOR"); Выборка.Колонки.Добавить("IAUTHOR"); Выборка.Колонки.Добавить("BINDEDSUM"); Выборка.Колонки.Добавить("IVOID"); Выборка.Колонки.Добавить("OPENTIME"); Выборка.Колонки.Добавить("ENDSERVICE"); Выборка.Колонки.Добавить("TableID"); Выборка.Колонки.Добавить("IMANAGER"); Выборка.Колонки.Добавить("OPENDATE"); //НУЛИ И ЕДИНИЦЫ Выборка.Колонки.Добавить("NACKURS"); Выборка.Колонки.Добавить("TAXSUM"); Выборка.Колонки.Добавить("TAXRATE"); Выборка.Колонки.Добавить("BASEKURS"); Попытка ADO_RS = ADO_CMD.Execute(); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Если ADO_RS.BOF() И ADO_RS.EOF() Тогда //пустой Иначе ADO_RS.MoveFirst(); Пока НЕ ADO_RS.EOF() do //Заполняем таблицу значений НовСтр = Выборка.Добавить(); //Для Каждого ТекПоле Из МассивПолей Цикл НовСтр.UNI = СокрЛП(ADO_RS.Fields("UNI").Value); НовСтр.CHECKNUM = СокрЛП(ADO_RS.Fields("CHECKNUM").Value); НовСтр.DRAWERDATETIME = СокрЛП(ADO_RS.Fields("DRAWERDATETIME").Value); НовСтр.BILLDATETIME = СокрЛП(ADO_RS.Fields("BILLDATETIME").Value); НовСтр.GUESTCNT = СокрЛП(ADO_RS.Fields("GUESTCNT").Value); НовСтр.ICREATOR = СокрЛП(ADO_RS.Fields("ICREATOR").Value); НовСтр.IAUTHOR = СокрЛП(ADO_RS.Fields("IAUTHOR").Value); НовСтр.BINDEDSUM = СокрЛП(ADO_RS.Fields("BINDEDSUM").Value); НовСтр.IVOID = СокрЛП(ADO_RS.Fields("IVOID").Value); НовСтр.OPENTIME = СокрЛП(ADO_RS.Fields("OPENTIME").Value); НовСтр.ENDSERVICE = СокрЛП(ADO_RS.Fields("ENDSERVICE").Value); НовСтр.TableID = СокрЛП(ADO_RS.Fields("TableID").Value); НовСтр.IMANAGER = СокрЛП(ADO_RS.Fields("IMANAGER").Value); НовСтр.OPENTIME = СокрЛП(ADO_RS.Fields("OPENDATE").Value); НовСтр.NACKURS = "1"; НовСтр.BASEKURS = "1"; НовСтр.TAXRATE = "0"; НовСтр.TAXRATE = "0"; //Сообщить(СокрЛП(ТекПоле) + " равно " + СокрЛП(ADO_RS.Fields(ТекПоле).Value)); //КонецЦикла; ADO_RS.MoveNext(); КонецЦикла; Возврат Выборка; КонецЕсли; ADO_RS.Close(); КонецФункции Эска ругается теперь вот на что: {ВнешняяОбработка.PRINTCHECKS.МодульОбъекта(107)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Неправильный синтаксис около ключевого слова "LEFT". Помогите... |
|||
30
Wobland
30.10.13
✎
16:34
|
лефты без запятой пишутся
|
|||
31
Infsams654
30.10.13
✎
16:36
|
(29) это не "Эска ругается", это запрос неправильно написан - см. (30)
|
|||
32
_stay true_
30.10.13
✎
16:37
|
убрал запятые. Теперь вот такое вижу:
{ВнешняяОбработка.PRINTCHECKS.МодульОбъекта(96)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Не удалось привязать составной идентификатор "PRINTHECKS.MIDSERVER". |
|||
33
Wobland
30.10.13
✎
16:39
|
диалог начинает напоминать о бананане...
http://www.forum.mista.ru/index.php?user_id=37701 |
|||
34
1dvd
30.10.13
✎
16:41
|
(32) "C" пропустил в слове PRINTCHECKS
|
|||
35
1dvd
30.10.13
✎
16:41
|
блин, вот чего я тут сижу и бесплатно отладчиком работаю?
|
|||
36
Aprobator
30.10.13
✎
16:44
|
(35) народ развлекаешь. Здесь уже стока с попкорном сидят )
|
|||
37
_stay true_
30.10.13
✎
16:45
|
(36)Рад стараться:)
|
|||
38
Infsams654
30.10.13
✎
16:46
|
(34) думаешь, найдет ?
|
|||
39
User_Agronom
30.10.13
✎
16:48
|
Один я заметил, что ветка ушла в сторону?
ТС же писал, что данные выцепил. Теперь же нужно всего то СоздатьОбъект, заполнить этими данными реквизиты и Записать объект. |
|||
40
UIV
30.10.13
✎
16:49
|
(35) Ну кто то же должен.
|
|||
41
Infsams654
30.10.13
✎
16:50
|
(39) см (4)
|
|||
42
Wobland
30.10.13
✎
16:53
|
интересно, для каких реквизитов какого объекта предназначен букет выбираемых полей?
|
|||
43
1dvd
30.10.13
✎
16:54
|
(42) судя по всему продажи в сторонней программе
|
|||
44
Wobland
30.10.13
✎
16:57
|
типа ОтчётККМ? почему бы и нет
|
|||
45
User_Agronom
30.10.13
✎
18:17
|
(41) Видел (4) Пятым бы сообщением не написал. Но ветка так увлечённо ушла в сторону, я попробовал скромно напомнить.
|
|||
46
_stay true_
01.11.13
✎
09:04
|
И снова всем доброе утро:) У меня возник вопрос по поводу SQL-запроса. Идея такая:вытащил на форму обработки 2 реквизита "ДатаНач" и "ДатаКон" с типом Дата, дабы сделать возможным выгрузку за определенный период, а не всех данных сразу. В 1С запросах мы устанавливаем параметры и всё работает. А как быть здесь? Пробовал так:
|declare @FirstDate datetime |set @FirstDate = '"+ДатаНач+"' |declare @LastDate datetime |set @LastDate = '"+ДатаКон+"' |SELECT PRINTCHECKS.UNI, PRINTCHECKS.CHECKNUM, PRINTCHECKS.CLOSEDATETIME, PRINTCHECKS.BILLDATETIME, ORDERS.STARTSERVICE, ORDERS.ENDSERVICE, |PRINTCHECKS.GUESTCNT, PRINTCHECKS.IDRAWERSHIFT,ORDERS.MAINWAITER, PRINTCHECKS.ICLOSESTATION, PRINTCHECKS.MIDSERVER, PRINTCHECKS.BINDEDSUM, |PRINTCHECKS.IVOID, PRINTCHECKS.ICREATOR, ORDERS.TABLEID, PRINTCHECKS.STARTDATETIME, PRINTCHECKS.TAXSUM, ORDERS.IBASICCURRENCY, ORDERS.INATIONALCURRENCY, |PRINTCHECKS.VISIT AS VISIT1, |ORDERS.VISIT AS VISIT2 |FROM PRINTCHECKS LEFT JOIN ORDERS |ON PRINTCHECKS.VISIT=ORDERS.VISIT"; Выскакивает ошибка "Неправильный синтаксис около конструкции .2013"(в скюле тип данных datetime имеет несколько иной формат). Пробовал так |SELECT PRINTCHECKS.UNI, PRINTCHECKS.CHECKNUM, PRINTCHECKS.CLOSEDATETIME, PRINTCHECKS.BILLDATETIME, ORDERS.STARTSERVICE, ORDERS.ENDSERVICE, |PRINTCHECKS.GUESTCNT, PRINTCHECKS.IDRAWERSHIFT,ORDERS.MAINWAITER, PRINTCHECKS.ICLOSESTATION, PRINTCHECKS.MIDSERVER, PRINTCHECKS.BINDEDSUM, |PRINTCHECKS.IVOID, PRINTCHECKS.ICREATOR, ORDERS.TABLEID, PRINTCHECKS.STARTDATETIME, PRINTCHECKS.TAXSUM, ORDERS.IBASICCURRENCY, ORDERS.INATIONALCURRENCY, |PRINTCHECKS.VISIT AS VISIT1, |ORDERS.VISIT AS VISIT2 |FROM PRINTCHECKS LEFT JOIN ORDERS |ON PRINTCHECKS.VISIT=ORDERS.VISIT |WHERE PRINTCHECKS.STARTSERVICE= '"+ДатаНач+" PRINTCHECKS.ENDSERVICE = '"+ДатаКон+"'; Дату так же пробовал вводить как строку(менял тип реквизита) в формате SQL datetime,и просто дату вида 20130931, и всё равно не работает. Кто сталкивался - как вы с этим справлялись?Заранее спасибо. |
|||
47
_stay true_
01.11.13
✎
09:05
|
Пропустил в последней строке "AND" в предыдущем посте. Там
|WHERE PRINTCHECKS.STARTSERVICE= '"+ДатаНач+" AND PRINTCHECKS.ENDSERVICE = '"+ДатаКон+"'; |
|||
48
Wobland
01.11.13
✎
09:15
|
Формат тебе в помощь
|
|||
49
Wobland
01.11.13
✎
09:16
|
(48) сторно
>просто дату вида 20130931 вот и играйся с литералами, пока не получишь результат. а потом формат |
|||
50
Coldboy
01.11.13
✎
09:19
|
(0) не знаю ответили тебе или нет, но я работа с SQL и загружал в 1С вот так:
Соединение = Новый COMОбъект("ADODB.Connection"); //заполнение текущих настроек подключения ТекСервер = "MY-PK\SQLEXPRESS"; ТекБаза = "store_temp"; //заполнение строки запроса к серверу СтрокаКоннекта ="driver={SQL Server};server="+ТекСервер+";Database="+ТекБаза; Соединение.ConnectionTimeOut = 6000; //попытка соединения Попытка Соединение.Open(СтрокаКоннекта); Исключение Сообщить("Невозможно установить соединение с базой данных MS SQL! " + ОписаниеОшибки()+"!!!"); ЗаписатьВФ("Невозможно установить соединение с базой данных MS SQL! "+ ОписаниеОшибки()); Возврат; КонецПопытки; // запрос к объекту ADO //ЗапросАДО = Новый COMОбъект("ADODB.Command"); //Попытка // ЗапросАДО.ActiveConnection = Соединение; //Исключение // Сообщить("Ошибка при инициализации соединения! " + ОписаниеОшибки()); // ЗаписатьВФ("Ошибка при инициализации соединения! " + ОписаниеОшибки()); // Возврат; //КонецПопытки; //запрос на вывод необходимых данных из таблицы //т.к. АДО не понимает тип данных decimal то на стороне сервера преобразуем данные //с помощью CAST(имя_поля AS новый_тип_данных) AS новое_имя_поля СтрокаЗапроса= "select |GUID, |To1C, |filial, |data, |CAST(Pr_Kom_Sr AS varchar(20)) AS Pr_Kom_Sr, |N_Pr_Kom_Sr, |CAST(Pr_Real AS varchar(20)) AS Pr_Real, |N_Pr_Real, |CAST(Pr_Real_Lombard AS varchar(20)) AS Pr_Real_Lombard, |N_Pr_Real_Lombard, |CAST(Pr_Real_Lombard_Percent AS varchar(20)) AS Pr_Real_Lombard_Percent, |N_Pr_Real_Lombard_Percent, |CAST(Pr_hr_kom AS varchar(20)) AS Pr_hr_kom, |CAST(Pr_Cash AS varchar(20)) AS Pr_Cash, |N_Pr_Cash, |CAST(Pr_Credit AS varchar(20)) AS Pr_Credit, |N_Pr_Credit, |CAST(R_Zad_Kom AS varchar(20)) AS R_Zad_Kom, |CAST(R_Skupka AS varchar(20)) AS R_Skupka, |N_R_Skupka, |CAST(R_Cash AS varchar(20)) AS R_Cash, |N_R_Cash, |CAST(R_Credit AS varchar(20)) AS R_Credit, |N_R_Credit, |CAST(R_Credit_Percent AS varchar(20)) AS R_Credit_Percent, |N_R_Credit_Percent, |CAST(R_Lombard AS varchar(20)) AS R_Lombard, |N_R_Lombard, |CAST(BeginCashRegister AS varchar(20)) AS BeginCashRegister, |CAST(EndCashRegister AS varchar(20)) AS EndCashRegister, |CAST(Pr_Total AS varchar(20)) AS Pr_Total |from dbo.CASH_REPORT |where To1C = 1 |order by data asc"; Попытка Выборка=Соединение.Execute(СтрокаЗапроса); Исключение Сообщить ("Ошибка выполнения запроса к БД: "+ОписаниеОшибки()+"!!!"); ЗаписатьВФ("Ошибка выполнения запроса к БД: "+ОписаниеОшибки()); Возврат; КонецПопытки; СчетчикКол = 0; //выборка из результата запроса Если Выборка.EOF()=-1 Тогда Иначе //установка указателя на первую строку Попытка Выборка.MoveFirst(); Исключение Выборка.Close(); Сообщить ("Ошибка установки указателя на первую строку или записей в базе данных до сегодняшнего дня нет или выгружены "+ОписаниеОшибки()); ЗаписатьВФ("Ошибка установки указателя на первую строку или записей в базе данных до сегодняшнего дня нет или выгружены "+ОписаниеОшибки()); Возврат; КонецПопытки; // Заполненяем данными нашу ТЗ из Выборки с SQL Сервера Пока Выборка.EOF()=0 Цикл Поле = Выборка.Fields; Если НайтиТорговуюТочку(Выборка.Fields("filial").Value) = -1 Тогда //установка указателя на следующую строку Попытка Выборка.MoveNext(); Исключение Выборка.Close(); Сообщить ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки(),"!!!"); ЗаписатьВФ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки()); Возврат; КонецПопытки; Продолжить; КонецЕсли; стрТЗ = ТЗ.Добавить(); стрТЗ.НомерИзВне = Выборка.Fields("GUID").Value; стрТЗ.КодФилиала = Выборка.Fields("filial").Value; стрТЗ.НазваниеФилиала = НайтиТорговуюТочку(стрТЗ.КодФилиала).Наименование; стрТЗ.ДатаДанных = Выборка.Fields("data").Value; стрТЗ.РеализацияКомиссия = Число(Выборка.Fields("Pr_Kom_Sr").Value); стрТЗ.РеализацияКомиссияНомер = Число(Выборка.Fields("N_Pr_Kom_Sr").Value); стрТЗ.РеализацияСкупка = Число(Выборка.Fields("Pr_Real").Value); стрТЗ.РеализацияСкупкаНомер = Число(Выборка.Fields("N_Pr_Real").Value); стрТЗ.ВозвратСсудыЛомбарду = Число(Выборка.Fields("Pr_Real_Lombard").Value); стрТЗ.ВозвратСсудыЛомбардуНомер = Число(Выборка.Fields("N_Pr_Real_Lombard").Value); стрТЗ.ПроцентыПоЛомбарду = Число(Выборка.Fields("Pr_Real_Lombard_Percent").Value); стрТЗ.ПроцентыПоЛомбардуНомер = Число(Выборка.Fields("N_Pr_Real_Lombard_Percent").Value); стрТЗ.ХранениеКомиссионногоТовара = Число(Выборка.Fields("Pr_hr_kom").Value); стрТЗ.ХранениеКомиссионногоТовараНомер = 0; стрТЗ.ПолученоИзКассыСобственник = Число(Выборка.Fields("Pr_Cash").Value); стрТЗ.ПолученоИзКассыСобственникНомер = Число(Выборка.Fields("N_Pr_Cash").Value);; стрТЗ.ПринятоЗаймов = Число(Выборка.Fields("Pr_Credit").Value); стрТЗ.ПринятоЗаймовНомер = Число(Выборка.Fields("N_Pr_Credit").Value); стрТЗ.ВыплатаЗадолженностиКомитентам = Число(Выборка.Fields("R_Zad_Kom").Value); стрТЗ.ВыплатаЗадолженностиКомитентамНомер = 0; стрТЗ.Скупка = Число(Выборка.Fields("R_Skupka").Value); стрТЗ.СкупкаНомер = Число(Выборка.Fields("N_R_Skupka").Value); стрТЗ.ПереданоВкассуСобственник = Число(Выборка.Fields("R_Cash").Value); стрТЗ.ПереданоВкассуСобственникНомер = Число(Выборка.Fields("N_R_Cash").Value); стрТЗ.ВыданоЗаймов = Число(Выборка.Fields("R_Credit").Value); стрТЗ.ВыданоЗаймовНомер = Число(Выборка.Fields("N_R_Credit").Value); стрТЗ.ВыданоПроцентовПоЗаймам = Число(Выборка.Fields("R_Credit_Percent").Value); стрТЗ.ВыданоПроцентовПоЗаймамНомер = Число(Выборка.Fields("N_R_Credit_Percent").Value); стрТЗ.ВыданоСсуд = Число(Выборка.Fields("R_Lombard").Value); стрТЗ.ВыданоСсудНомер = Число(Выборка.Fields("N_R_Lombard").Value); стрТЗ.ОстатокН = Число(Выборка.Fields("BeginCashRegister").Value); стрТЗ.ОстатокК = Число(Выборка.Fields("EndCashRegister").Value); стрТЗ.Возврат = стрТЗ.ОстатокК - стрТЗ.ОстатокН - Число(Выборка.Fields("Pr_Total").Value); //запрос изменения в таблице cash_report параметра To1C на 1 СтрокаЗапроса1="update dbo.CASH_REPORT set To1C = 0 where GUID = '" + стрТЗ.НомерИзВне+ "'"; //выполнение запроса Попытка Выборка1 = Соединение.Execute(СтрокаЗапроса1); Исключение Сообщить ("Ошибка обновления данных на сервере БД: "+ОписаниеОшибки(),"!!!"); ЗаписатьВФ("Ошибка обновления данных на сервере БД: "+ОписаниеОшибки()); Возврат; КонецПопытки; //установка указателя на следующую строку Попытка Выборка.MoveNext(); Исключение Выборка.Close(); Сообщить ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки()+"!!!"); ЗаписатьВФ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки()); Возврат; КонецПопытки; КонецЦикла; КонецЕсли; //Закрытие выборки Выборка.Close(); //Закрытие соединения Соединение.Close(); |
|||
51
hhhh
01.11.13
✎
09:23
|
(6) попробуй просто, по-пацански
#"+Формат(ДатаКон, + "ДФ=yyyy-MM-dd") + "# или религия не позволяет? |
|||
52
Infsams654
01.11.13
✎
09:24
|
(50) - да, пятница видать (во накатал)
(47) что это PRINTCHECKS.STARTSERVICE= '"+ДатаНач+" ? Надо PRINTCHECKS.STARTSERVICE= "'" + ДатаНач + "'" где ДатаНач должно быть строкой в удобоваримом SQL виде |
|||
53
sda553
01.11.13
✎
09:24
|
Открой для себя это знание http://linesofcode.net/snippets/45
|
|||
54
_stay true_
01.11.13
✎
09:36
|
Спасибо вам огромное! Пойду пыхтеть над этим:)
|
|||
55
Sorm
01.11.13
✎
09:47
|
//Заполняем форму данными с запроса
СоединениеSQL = ConnectToSQL("SQLNCLI10","serv_name","database_name","user_name","1"); Сообщить ("Выполнение запроса SQL..."); ЗаписиSQL = Новый ComObject("ADODB.RecordSet"); //Стартуем процедуру ТекстSQL = "exec aspu_Get_Sum_Prem_For_1C '"+Формат(НачалоПериода,"ДФ=ггггММдд")+"','"+Формат(КонецПериода,"ДФ=ггггММдд")+"'"; ЗаписиSQL = ExecuteSQLDirect(СоединениеSQL,ТекстSQL); //Колонку определим КС = Новый КвалификаторыСтроки(255); Массив = Новый Массив; Массив.Добавить(Тип("Строка")); ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС); Таблица = Новый ТаблицаЗначений; Сообщить ("Заполнение временной таблицы..."); Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл //Создание и добавление колонок во временную таблицу ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; Таблица.Колонки.Добавить(ИмяСтолбца,ОписаниеТиповС); КонецЦикла; Пока ЗаписиSQL.EOF=0 Цикл // Заполнение созданной таблицы НоваяСтрока = Таблица.Добавить(); Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value); КонецЦикла; ЗаписиSQL.MoveNext(); КонецЦикла; Сообщить ("Закрываем соединение с SQL..."); ЗаписиSQL.Close(); СоединениеSQL.Close(); //Заполняем таблицу обработки Для каждого СтрокаТЗ из Таблица цикл |
|||
56
Sorm
01.11.13
✎
09:49
|
(55)+ Ну вот как-то так... Здесь показан сам механизм заполнения данными ТЗ.
|
|||
57
_stay true_
01.11.13
✎
10:11
|
Заработал "пацанский" вариант (51)! Спасибо большое!!!
|
|||
58
Mihenius
01.11.13
✎
14:23
|
(0) А что мешало вначале запрос проверить в самом SQL?
Там же есть инструменты для отладки и прочих полезностей? Или конструктором сделать ) А уже готовый взять в 1С. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |