Воскресенье, 05.05.2024
В помощь 1С программисту
Меню сайта
Статистика




Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа

Работа 1С:Предприрятие с базой данных на MS SQL.

Выборку данных из БД MSSQL будем осуществлять при помощи внешней компонены ADODB, т.к. для не нее не требуется устанавливать какие-либо дополнительные программы, библиотеки и т.п.

Создаем объект

Соединение=СоздатьОбъект("ADODB.Connection");

Указываем параметры подключения

СтрокаКоннекта="driver={SQL Server}; server="+СокрЛП(Сервер)+";uid=sa;pwd=;Database="+СокрЛП(База);

, где Сервер - адрес (сетевое имя или IP-адрес) сервера ,
База - название БД, как оно указано в MS SQL,
uid - логин пользователя (пользователь по умолчанию sa),
pwd - пароль пользователя (пароль по умолчанию для пользователя sa пустой, т.е. отсутствует)

Соединение.ConnectionTimeOut=20;
Соединение.CursorLocation=3;


Само подключение к базе данных заключим в попытку, дабы обезопасить исключительные ситуации

Попытка
Соединение.Open(СтрокаКоннекта);
Исключение
Предупреждение("Невозможно установить соединение с базой данных!");
КонецПопытки;


Создаем объект запрос

ЗапросАДО=СоздатьОбъект("ADODB.Command");
ЗапросАДО.ActiveConnection=Соединение;


Следует заметить, что даты необходимо писать в формате ГГГГММДД, заключенные в одинарные кавычки '. Поэтому преобразуем их к соответствующему ввиду

ДатаКон=КонМесяца(ДатаДок)+1;
НачДата="'"+Строка(ДатаГод(ДатаДок))+Прав("0"+ДатаМесяц(ДатаДок),2)+Прав("0"+Лев(НачМесяца(ДатаДок),2),2)+"'";
КонДата="'"+Строка(ДатаГод(ДатаКон))+Прав("0"+ДатаМесяц(ДатаКон),2)+Прав("0"+Лев(НачМесяца(ДатаКон),2),2)+"'";


Ну и далее самое сложное - текст запроса. Советую обратиться к соответствующей литературе этого языка программирования

ТекстЗапроса="SELECT CONVERT(nvarchar(10), colRegistrationTime, 108) AS EXPR1, * FROM tblAllRegistrations WHERE (tblAllRegistrations.colRegistrationTime BETWEEN "+НачДата+" AND "+КонДата+") AND (tblAllRegistrations.colPointNumber=1)";

CONVERT - преобразовать колонку colRegistrationTime в выбранный формат (время, длина 10 символов) и именовать его EXPR1
* - все значения
FROM - из таблиц
tblAllRegistrations - название таблицы
WHERE - где значения колонки colRegistrationTime таблицы tblAllRegistrations находятся между НачДата и КонДата и значение tblAllRegistrations.colPointNumber=1

ЗапросАДО.CommandText=ТекстЗапроса;
Выборка=ЗапросАДО.Execute();
Если Выборка.EOF()=-1 Тогда
Сообщить("Запрос не выполнился!");
Иначе
Выборка.MoveFirst();
Пока Выборка.EOF()=0 Цикл

Обрабатываем данные запроса.

Переменная=Выборка.Fields(["ИмяПоля"/илиНомер]).Value);
Табл.НоваяСтрока();
Табл.ИД=Выборка.Fields("colAccountNumber").Value;
Табл.Дата=СокрЛП(Выборка.Fields("colRegistrationtime").Value);
Табл.Время=СокрЛП(Выборка.Fields("EXPR1").Value);
Табл.Статус=?(Выборка.Fields("colDirection").Value=1,1,0);
Выборка.MoveNext();

КонецЦикла;
КонецЕсли;

Не забываем закрыть БД и очистить переменные

Выборка.Close();
Соединение.Close();
Выборка="";
ЗапросАДО="";
Соединение="";



Также данные в MS SQL можно не только получать но и изменять

Делается это так же как и примером выше, меняем только строку запроса (вместо SELECT используем UPDATE)

UPDATE abonents // таблица в которой производим замену
SET fdel = 1 // указываем в какую колонку какое значение нужно записать
WHERE (FName = 'Abonent601ex') OR // искомые значения для замены
(FName = 'Abonent602ex') OR (FName = 'Abonent603ex')

Условие, в данном случае, звучит примерно так - если в колонке "FName" встречаются значения "Abonent601ex" или "Abonent602ex" или "Abonent603ex", тогда в колонку "fdel" записать значение 1!


Для добавления новой строки в таблицу MS SQL используем INSERT INTO

Так, строка

НомТел="'+380800600060'";НомСценария=10;
ТекстЗапроса="insert into Robot (phone,scenario,priority) VALUES ("+НомТел+","+НомСценария+",0)";

добавит новую строку в таблицу Robot, в колонку phone будет добавлено значение переменной НомТел, а именно +380800600060, в колонку scenario значение переменной НомСценария (10) и в колонку priority запишется 0 после выполнения комманд:

ЗапросАДО.CommandText=ТекстЗапроса;
ЗапросАДО.Execute();

Важно помнить, что в поля, имеющие строковое значение необходимо писать данные, заключенные в одинарную ковычку (')


Для удаления строк имеется DELETE FROM

ТекстЗапроса="DELETE FROM Robot where phone="+НомТел;

удалятся все строки в таблице Robot, в которых в колонке phone значение равно значению переменной НомТел
Если нужно очистить всю таблицу, т.е. удалить все строки:

ТекстЗапроса="DELETE * FROM Robot ";


BACKUP базы данных MS SQL.

Изменим только строку соединения, т.к. базу укажем далее
СтрокаКоннекта="driver={SQL Server};server=(local);uid=sa;pwd=;";

И текст запроса
ТекстЗапроса="BACKUP DATABASE [namebase] TO DISK = N'd:\backup' WITH INIT , NAME = N'full backup', NOSKIP , NOFORMAT";

Результаты запроса нам не важны, потому выполняем запрос и отключаемся от SQL
ЗапросАДО.Execute();
Соединение.Close();


namebase - название базы данных
d:\backup - путь и имя архива
full backup - имя резервного набора данных

Использование компоненты 1c++ для получения данных MS SQL.

Рез=СоздатьОбъект("ТаблицаЗначений");
Рез.НоваяКолонка("Док");
Рез.НоваяКолонка("Адрес");
Рез.НоваяКолонка("Клиент");

Запрос = СоздатьОбъект("ODBCRecordSet");

Запрос.УстановитьТекстовыйПараметр("ДатаДокС",Число("20140101"));
Запрос.УстановитьТекстовыйПараметр("ДатаДокПо",Число("20140201"));

Т=" SELECT distinct
| TabJ.IDDOC as Doc
| , Tab2.SP5075 as Adr
| , Tab1.SP5070 as Kli
|FROM
| [dbo].[DH5083] As Tab1 (NoLock)
| INNER JOIN
| [dbo].[_1SJOURN] As TabJ ON (Tab1.IDDOC = TabJ.IDDOC)
| INNER JOIN
| [dbo].[DT5083] As Tab2 ON (Tab1.IDDOC = Tab2.IDDOC)
| INNER JOIN
| [dbo].[SC2760] As SprAdr ON (Tab2.SP5075 = SprAdr.ID)
| INNER JOIN
| [dbo].[SC46] As SprKli ON (Tab1.SP5070 = SprKli.ID)
|
|WHERE
| (LEFT(TabJ.DATE_TIME_IDDOC,8) >= :ДатаДокС)
| and (LEFT(TabJ.DATE_TIME_IDDOC,8) <= :ДатаДокПо)
| and (Tab2.SP5405>0)
|";

Если Запрос.Открыть(Т) = 1 Тогда
Запрос.УстТипыКолонок1С("Документ.Смета, Справочник.Адрес, Справочник.Клиенты");
Запрос.ПолучитьРезультатыВ_ТЗ(Рез,0);
Иначе
Сообщить(Запрос.ПолучитьОписаниеОшибки());
КонецЕсли;

если необходимо что-то изменить в результирующей таблице (например пустая дата должна иметь какое-то максимальне/минимальное значение) - применяем Case
select DISTINCT
| DocOM.IDDOC as Doc
| ,SprTov.ID as Tov
| ,SprKli.ID as Vlad
| ,SprVal.ID as Val
| ,Spr.ID as SpecCena
| ,Spr.SP3673 as dtFrom
| ,(Case Spr.SP3674
| When '1753-01-01' Then '2021-01-01' else Spr.SP3674 End)
| as dtTo
| ,DocOM.DATE_TIME_IDDOC
|FROM dbo.SC3336 as Spr (NoLock)
| INNER JOIN
| dbo.SC92 As SprTov (NoLock) ON (Spr.SP3338 = SprTov.ID)
| INNER JOIN
| dbo.SC72 As SprKli (NoLock) ON (Spr.PARENTEXT = SprKli.ID)
| INNER JOIN
| dbo._1SJOURN As DocOM (NoLock) ON (Spr.SP15208 = DocOM.IDDOC)
| INNER JOIN
| dbo.SC14 As SprVal (NoLock) ON (Spr.SP3340 = SprVal.ID)
|WHERE (Spr.ISMARK=0)
| And (Ltrim(Rtrim(SprKli.CODE))='"+СокрЛП(Клиент.Код)+"') And (Ltrim(Rtrim(SprTov.CODE))='"+СокрЛП(Товар.Код)+"')
| And (Ltrim(Rtrim(SprVal.CODE))='"+СокрЛП(Валюта.Код)+"')
| And (Spr.SP3673<='"+ДатСкл+"') And
| ((Spr.SP3674>='"+ДатСкл+"') or (Spr.SP3674='1753-01-01'))
|order by tov,dtFrom DESC,dtTo DESC,DocOM.DATE_TIME_IDDOC DESC


Узнать Размер таблиц в базе данных SQL

DECLARE @pagesizeKB int
SELECT @pagesizeKB = low / 1024 FROM master.dbo.spt_values
WHERE number = 1 AND type = 'E'

SELECT
table_name = OBJECT_NAME(o.id),
rows = i1.rowcnt,
reservedKB = (ISNULL(SUM(i1.reserved), 0) + ISNULL(SUM(i2.reserved), 0)) * @pagesizeKB,
dataKB = (ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0)) * @pagesizeKB,
index_sizeKB = ((ISNULL(SUM(i1.used), 0) + ISNULL(SUM(i2.used), 0))
- (ISNULL(SUM(i1.dpages), 0) + ISNULL(SUM(i2.used), 0))) * @pagesizeKB,
unusedKB = ((ISNULL(SUM(i1.reserved), 0) + ISNULL(SUM(i2.reserved), 0))
- (ISNULL(SUM(i1.used), 0) + ISNULL(SUM(i2.used), 0))) * @pagesizeKB
FROM sysobjects o
LEFT OUTER JOIN sysindexes i1 ON i1.id = o.id AND i1.indid < 2
LEFT OUTER JOIN sysindexes i2 ON i2.id = o.id AND i2.indid = 255
WHERE OBJECTPROPERTY(o.id, N'IsUserTable') = 1 --same as: o.xtype = 'IsView'
OR (OBJECTPROPERTY(o.id, N'IsView') = 1 AND OBJECTPROPERTY(o.id, N'IsIndexed') = 1)
GROUP BY o.id, i1.rowcnt
ORDER BY 3 DESC



DELETE FROM `oc_product_description` WHERE `product_id` in (select `product_id` from `oc_product` where `status`=0)
Поиск
Друзья сайта
  • Доска бесплатных объявлений
  • Как я отдохнул в Крыму
  • Официальный блог
  • Программы для всех
  • FAQ по системе
  • Инструкции для uCoz
  • Спортклуб киокушинкай карате
  • Copyright MyCorp © 2024
    Сделать бесплатный сайт с uCoz