Имя: Пароль:
1C
1С v8
Помогите с запросом SQL
, ,
0 Longdimm
 
19.12.12
11:20
Помогите пожалуйста с примером запроса из 1с 8 к SQL Базе.
Подключить подключился, а вот как записать в базу - непонятно.
Буду примного благодарен!
1 Азат
 
19.12.12
11:21
insert into table (col1, ..., colN) values (val1, ..., valN)
2 Нуф-Нуф
 
19.12.12
11:21
(1) откуда ты это знаешь? о_0
3 shuhard
 
19.12.12
11:22
(0) сложно придумать более невнятную формулировку задачи
4 mikecool
 
19.12.12
11:27
(3) это же форум телепатов
5 Griffin
 
19.12.12
11:30
(0) ТекстЗапроса="INSERT INTO [Какая-то база].[dbo].[Какак-то таблица]
       |([Идентификатор]
       |,[МоментВремени]
       |,[ФлагВыполнения])
       | VALUES
       |      ('"+Формат(Счетчик,"ЧГ=0")+"'
       |      ,'"+Формат(ТекущаяДата(),"ДФ=""гггг-ММ-дд Ч:мм:сс""")+".000'
       |     , '0' )";
               
       ЗапросАДО.CommandText=ТекстЗапроса;
              Попытка
               ЗапросАДО.Execute();
           Исключение
               ОшибкаФиксацииЗапуска = Истина;
               Сообщить("Ошибка: " + ОписаниеОшибки());
           КонецПопытки;
6 ДенисЧ
 
19.12.12
11:30
(1) Ты не прав...
скорее
update table
set col1 = val1
where pk_table = val_pk
7 Undefined vs NULL
 
19.12.12
11:34
(6) возможно также UPDATE OR INSERT...
8 Азат
 
19.12.12
11:51
(6) мне кажется, все-таки правильнее будет delete from Table
9 Ёпрст
 
19.12.12
11:55
лучше truncate table  или drop
10 Longdimm
 
19.12.12
12:15
А подключение какое использовать? Connection ?
11 МихаилМ
 
19.12.12
12:17
(10)
откудаже нам знать
какой механизм для подключения Вы используете
и какая субд
12 Serginio1
 
19.12.12
12:33
13 Longdimm
 
19.12.12
14:27
Мне надо из 1с 8.2 подключиться с MS SQL в таблицу и заполнить ее.
Вот такой код получился.

objConn = Новый COMОбъект("ADODB.Connection");
 //Определяем параметры подключения к базе данных
 ServerName = "sql2"; //имя или IP-адрес сервера
 DSN = "testdb"; //имя базы данных
 UID = "test"; //логин пользователя SQL-сервера
 PWD = "123"; //пароль пользователя SQL-сервера
 ConnectString = "Provider=SQLOLEDB;" + "Data Source=" + ServerName + ";Initial Catalog=" + DSN + ";UID=" + UID + ";PWD=" + PWD;
 objConn.ConnectionString = ConnectString;
 objConn.ConnectionTimeOut = 15;
 objConn.CommandTimeout = 30;    

 //Подключаемся к базе данных
 objConn.Open();  

 //Выполняем запрос
       Табзнач = ПолучитьСписокРаботников();
 
 Для Каждого ТекСтр из ТабЗнач цикл
  objRecordset = objConn.Execute("SELECT * FROM PersonalPosition a where a.TabNumber = '"+СокрЛП(ТекСтр.Сотрудник.Организация.Префикс)+СокрЛП(ТекСтр.ТабельныйНомер)+"'");
  Пока objRecordset.EOF <> 1 Цикл
   
   БылаЗапись=Истина;
   //i = 0;
   //Пока i <= objRecordset.Fields.Count-1 Цикл
   // Сообщить(Строка(objRecordset.Fields(i).Value));
   // i = i + 1;
   //КонецЦикла;
   //objRecordset.MoveNext();                            ,TabNumber,Surname,Name,MiddleName,MiddleName,PositionName
  КонецЦикла;
 
  Если БылаЗапись<>Истина тогда
   //objConn.Execute("SELECT * FROM PersonalPosition a where a.TabNumber = "+СокрЛП(ТекСтр.Сотрудник.Организация.Префикс)+СокрЛП(ТекСтр.ТабельныйНомер));
   ТекстЗапроса = "INSERT INTO PersonalPosition(Depnumber) VALUES('qweqwe')";
   Сообщить(ТекстЗапроса);
   objConn.Execute(ТекстЗапроса);
   
  КонецЕсли;
  Прервать;
 КонецЦикла;

При этом запрос на селект выполняется. А на вставить пишет ошибка запроса.
14 shuhard
 
19.12.12
14:30
(13) копрокод
правильный через рекордсет и ADDNew
15 pessok
 
19.12.12
14:31
(14) нормальный код, чо. сервак наглотается итераций после 2000 и пошлет наболт, все ок
16 Longdimm
 
19.12.12
14:38
Да надо заполнить 1 раз.
17 МихаилМ
 
19.12.12
14:39
(0)
какой тип поля Depnumber таблицы
PersonalPosition
18 Longdimm
 
19.12.12
15:08
Depnumber  Строка.
19 МихаилМ
 
19.12.12
15:17
текст ошибки в студию
20 Longdimm
 
20.12.12
14:09
Просто пишет не верный запрос. Текст запроса в коде есть. И понять не могу - в чем же ошибка!
21 olegves
 
20.12.12
14:20
(14) +100
а еще для рекордсета надо тип его явно указать (на запись). Имя параметра к сожал-ю не помню, погугли. А то по умолчанию рекордсет создается только на чтение
22 Longdimm
 
21.12.12
09:37
Вот такой код нашел!


Command = Новый COMОбъект("ADODB.Recordset");
Command.CursorLocation=3;
Connection.DefaultDatabase = "test";
Command.Open(NameTable,Connection,3,4,2);
СчетчикЛ = 1;
Вр = Таблица.Количество();
Состояние("Загр. "+NameTable+" " + Строка(Счетчик));
Для i=0 По Таблица.Количество() -1 Цикл
Command.AddNew();
Для j=0 По Таблица.Колонки.Количество() -1 Цикл
Value = Таблица[i][j];
Если не обЗначениеНеЗаполнено(Value) Тогда
//Сообщить(""+Таблица.Колонки[j].Имя+" ["+Value+"]");
Если (ТипЗнч(Value) = Тип("Число")) или (ТипЗнч(Value) = Тип("Дата")) тогда
Command.Fields(Таблица.Колонки[j].Имя).Value=Value;
Иначе
// Сообщить(Таблица.Колонки[j].Имя);
Попытка
Command.Fields(Таблица.Колонки[j].Имя).Value=Строка(Value);
Исключение
Сообщить(Таблица.Колонки[j].Имя+ " "+Строка(Value));
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если СчетчикЛ = 3000 Тогда
СчетчикЛ = 0;
Command.UpdateBatch();
Счетчик = Счетчик + 1;
Иначе
СчетчикЛ = СчетчикЛ + 1;
КонецЕсли;
КонецЦикла;
Попытка
Command.UpdateBatch();
Command.Close();
Исключение
Сообщить(NameTable);
КонецПопытки;

Вопрос теперь следующий: Connection - какая строка будет для SQL соединений?
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший