20.10.2017
Эффективная Навигация М2М
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум (скрипты, вопросы...) » CyberFleet » Скрипты для CyberFleet, CrossPoint » Скрипт импорта ТС, АТ, Марок, Фирм из csv файла (Импортирует и обновляет данные)
Скрипт импорта ТС, АТ, Марок, Фирм из csv файла
logoffДата: Среда, 15.02.2012, 15:22 | Сообщение # 1
Тамбов
Группа: Администраторы
Сообщений: 649
Репутация: 19
Статус: Offline
Внимание! Данный скрипт так же существует в версии для Google Doc
проверен на среде SQL staandart
вероятнее всего будет работать и на MSDE

Code

use bn -- работа с таблицей BN
go
SET XACT_ABORT ON;
BEGIN TRAN T1; -- работа с транзакцией - если что пойдет не так, записи не будут произведены

if object_id('tempdb..#temp') is not null drop table #temp
create table #temp (code varchar(16),
type_AT varchar(16),
tel varchar(20),
opt_int1 int,
opt_int2 int,
InstallDate varchar(30),
RunByTrack varchar(10),
ObjectGarNum varchar(20),
ObjectGosNum varchar(20),
max_speed int,
org_name varchar(200),
mark_name varchar(50)        
) --создадим временную таблицу с тремя колонками
-- как в таблице FLEET_Object

---create table #temp (code varchar(16)) --создадим временную таблицу с одной колонкой

BULK INSERT #temp -- вставка из файла во временную таблицу
FROM 'c:\1\7.csv' -- из файла с указанным именем и путем
WITH        
(        
FIELDTERMINATOR=';', -- разделитель полей - exel именно с ним выгружает
FIRSTROW = 1, -- с номера строки строки
ROWTERMINATOR = '\n', -- разделитель строк enter
codepage = 'acp'
)

select * from #temp
-- 0. Добавление названий марок и организаций из temp
-- 1. апдейт приборов, что есть уже в БД
-- 2. создание приборов, что еще нет
-- 3. апдейт всех машин, что привязаны к приборам которых нет
-- 4. создание машин, которых нет
-- 5. радоваться жизни
-- приборы идентифицировать по полю code  и d.DeviceActive=1
-- марки по name, организации по name
-- type_AT числовой, проверяется по dbo.SYS_DEV_DeviceType.id - должна быть запись там

-- 0. добавление марок и организаций

-- 0.0 марки
print 'вставка марки'
insert into bn.dbo.FLEET_MarkCar (MarkCarName,MarkCarType)
select distinct mark_name,
2 -- грузовой        
from #temp as t
left  join bn.dbo.FLEET_MarkCar as m on m.MarkCarName=t.mark_name
where m.MarkCarID is null
-- 0.1 организации
print 'вставка орагнизации'
insert into bn.dbo.SYS_OrgRequisite (ShortName,name)
select org_name,
org_name -- грузовой        
from (select distinct org_name from #temp) as t
left  join bn.dbo.SYS_OrgRequisite as o on o.name=t.org_name
where o.id is null

declare @device_id int, @type_AT int,@code varchar(16),@opt_int1 int,@opt_int2 int,@tel char(50),@RunByTrack bit, @InstallDate datetime

-- 1. апдейт приборов, что уже есть
print 'обновление приборов'
-- обновим через курсор, ибо есть тригеры на обновление девайсов
declare cur cursor local for
select d.id, t.type_AT, t.opt_int1,t.opt_int2,t.tel,t.RunByTrack,cast(t.InstallDate as datetime)
from bn.dbo.SYS_DEV_Device as d
inner join #temp as t on t.code=d.code and d.DeviceActive=1

open cur
while 1=1 begin
        fetch next from cur into @device_id,@type_AT,@opt_int1,@opt_int2,@tel,@RunByTrack,@InstallDate
        if @@FETCH_STATUS!=0 break -- прервать цикл
        update bn.dbo.SYS_DEV_Device        
        set type_id=@type_AT,opt_int1=@opt_int1,opt_int2=@opt_int2,tel_number=@tel,RunByTrack=@RunByTrack,InstallDate=@InstallDate
        where @device_id=id        
end

close cur
deallocate cur

-- 2. создание приборов, что уже есть
print 'создание приборов'
-- сделаем через курсор, ибо тогда для приборов заполянтся данные о датчиках и командях

declare cur cursor local for
select type_AT,t.code,t.opt_int1,t.opt_int2,t.tel,t.RunByTrack,cast(t.InstallDate as datetime) from #temp as t
left join bn.dbo.SYS_DEV_Device as d on d.code=t.code and d.DeviceActive=1
where d.id is null
;

open cur
while 1=1 begin
        fetch next from cur into @type_AT,@code,@opt_int1,@opt_int2,@tel,@RunByTrack,@InstallDate
        if @@FETCH_STATUS!=0 break -- прервать цикл
        insert into         
        bn.dbo.SYS_DEV_Device (type_id,code,opt_int1,opt_int2,tel_number,RunByTrack,InstallDate,DeviceActive,opt_int3)
        values (@type_AT,@code,@opt_int1,@opt_int2,@tel,@RunByTrack,@InstallDate,1,0)
end

close cur
deallocate cur

-- 3. апдейт всех машин, что привязаны к приборам которых нет

print 'обновление ТС'
-- найдем ТС, которые прицеплены к приборам и их все обновим данными
update O
set MarkCarID=m.MarkCarID,
ObjectGarNum=t.ObjectGarNum,
ObjectGosNum=t.ObjectGosNum,
OrganizationId=org.id,
ObjectMaxSpeed=t.max_speed

from bn.dbo.FLEET_Object as O        
inner join bn.dbo.SYS_DEV_Device as d on d.id=o.Device_ID and d.DeviceActive=1
inner join #temp as t on t.code=d.code and d.DeviceActive=1
inner join bn.dbo.FLEET_MarkCar as M on m.MarkCarName=t.mark_name
inner join dbo.SYS_OrgRequisite as org on org.name=t.org_name
where o.ObjectActive=1

-- 4. создание машин, которых нет
print 'создание ТС, где не привязаны'

insert into bn.dbo.FLEET_Object (MarkCarID,
ObjectGarNum,
ObjectGosNum,
OrganizationId,
ObjectMaxSpeed,
Device_ID,
ObjectActive
)
select        
m.MarkCarID,
t.ObjectGarNum,
t.ObjectGosNum,
org.id,
t.max_speed,
d.id, 1        
from bn.dbo.SYS_DEV_Device as d
inner join #temp as t on t.code=d.code and d.DeviceActive=1
inner join bn.dbo.FLEET_MarkCar as M on m.MarkCarName=t.mark_name
inner join dbo.SYS_OrgRequisite as org on org.name=t.org_name
left join bn.dbo.FLEET_Object as o on o.device_id=d.id and o.ObjectActive=1        
where o.ObjectID is null and d.DeviceActive=1

drop table #temp -- удаление временной таблицы

insert into sys_dev_currentdata ([device_id],[device_code] ,[ObjectID])
select d.id, d.code, o.objectid from sys_dev_device as d
inner join fleet_object as o on o.device_id=d.id
left join sys_dev_currentdata as cd on cd.device_id=d.id
where o.objectactive=1 and d.deviceactive=1 and cd.id is null

commit tran t1 -- фиксации транзакции


пример файла для загрузки в приложении,
название колонок http://bnc.ucoz.net/_fr/0/format.csv
информация в колонке type_AT (вторая) должна соответствовать коду типа прибора (25 - M2M Cyber GLX)
список кодов можно посмотреть так:
Code

/****** Сценарий для команды SelectTopNRows среды SSMS  ******/
SELECT  [id]
           ,[name]
       FROM [BN].[dbo].[SYS_DEV_DeviceType]
Прикрепления: 4783777.csv(0Kb) · format.csv(0Kb)
 
Форум (скрипты, вопросы...) » CyberFleet » Скрипты для CyberFleet, CrossPoint » Скрипт импорта ТС, АТ, Марок, Фирм из csv файла (Импортирует и обновляет данные)
Страница 1 из 11
Поиск:

LogOff © 2017
Сайт создан в системе uCoz Рейтинг GPS Клуба. GPS навигаторы. GPS мониториг. GPS трекеры. ГЛОНАСС