こんにちは 数年前、私はインターネット上のフォーラムを読み、1C:Trade Managementバージョン11データベースのすべての企業顧客の配送先住所からGPS座標を受け取るT-SQL言語で直接クエリを作成しました。 座標による仕事への移行は、部門(営業部門と配達部門)のさまざまなプログラムで住所分類子を頻繁に変更するケースが原因で発生しました。 説得部門は、これまでのところ成功せずに1つのプログラムで作業する。
ステップ1:
-配信アドレスから1つのクライアントの座標を取得します(テンプレートのデバッグ用):
Declare @URI1 nvarchar(4000)='107113, , , № 1-' DECLARE @count int, @i1 int, @urlReturn nvarchar(4000) Declare @s1 char SET @count = LEN(@URI1) SET @i1 = 1 SET @urlReturn = '' while (@i1 <= @count) begin select @s1 = SUBSTRING(@URI1, @i1, 1) if (ASCII(@s1) > 191 AND ASCII(@s1) <= 256) begin select @urlReturn = @urlReturn + sys.fn_varbintohexstr(CAST(@s1 AS VARBINARY(MAX))) select @urlReturn = replace(@urlReturn, '0x', '%') end else select @urlReturn = @urlReturn + @s1 set @i1 = @i1 +1 end DECLARE @URI varchar(2000)='https://geocode-maps.yandex.ru/1.x/?geocode='+@urlReturn, @methodName varchar(50)='GET' DECLARE @objectID int, @hResult int EXEC @hResult = sp_OACreate 'WinHttp.WinHttpRequest.5.1', @objectID OUT IF @hResult <> 0 goto destroy EXEC @hResult = sp_OAMethod @objectID, 'open', null, @methodName, @URI, 'false' IF @hResult <> 0 goto destroy EXEC @hResult = sp_OAMethod @objectID, 'send', null IF @hResult <> 0 goto destroy DECLARE @t TABLE(s nvarchar(max)) INSERT @t EXEC sp_OAGetProperty @objectID, 'responseText' IF @hResult <> 0 goto destroy DECLARE @n int DECLARE @STRLEN int SELECT @STRLEN=LEN(SUBSTRING(s,CHARINDEX('<pos>',s)+5,(CHARINDEX('</pos>',s)-CHARINDEX('<pos>',s))-5))+1 FROM @t SELECT @n=CHARINDEX(' ',SUBSTRING(s,CHARINDEX('<pos>',s)+5,(CHARINDEX('</pos>',s)-CHARINDEX('<pos>',s))-5)) FROM @t SELECT SUBSTRING(s,CHARINDEX('<pos>',s)+5,@n) AS LON, SUBSTRING(SUBSTRING(s,CHARINDEX('<pos>',s)+5,(CHARINDEX('</pos>',s)-CHARINDEX('<pos>',s))-5),@n,@STRLEN-@n) AS LAT, SUBSTRING(s,CHARINDEX('<pos>',s)+5,(CHARINDEX('</pos>',s)-CHARINDEX('<pos>',s))-5) AS MAP FROM @t destroy: exec sp_OADestroy @objectID
ステップ2:
-すべての顧客配送先住所の列挙とGPS座標の取得:
DECLARE @URI1 AS nvarchar(4000) DECLARE @ID1 AS nvarchar(11) DECLARE curMarks CURSOR LOCAL SCROLL STATIC FOR SELECT [ki]._Fld2260 AS [Adress], [p].[_CODE] FROM [UT_TEST_COPY].[dbo].[_Reference107] as [p] LEFT OUTER JOIN [UT_TEST_COPY].[dbo].[_Reference107_VT2256] as [ki] WITH (NOLOCK) ON ([p].[_IDRRef]=[ki].[_Reference107_IDRRef]) WHERE [ki]._Fld2259RRef=0x8757A30F90F658984F74B3E6BDCE0041 AND [p]._Fld11004RRef=0xA576BCAEC54B2C9E11E23ACC96E85A13 AND [p]._Fld11721RRef=0xB54E694250E409A6463884A95998E32A OPEN curMarks FETCH NEXT FROM curMarks INTO @URI1,@ID1; WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @count int, @i1 int, @urlReturn nvarchar(4000) Declare @s1 char SET @count = LEN(@URI1) SET @i1 = 1 SET @urlReturn = '' while (@i1 <= @count) begin select @s1 = SUBSTRING(@URI1, @i1, 1) if (ASCII(@s1) > 191 AND ASCII(@s1) <= 256) begin select @urlReturn = @urlReturn + sys.fn_varbintohexstr(CAST(@s1 AS VARBINARY(MAX))) select @urlReturn = replace(@urlReturn, '0x', '%') end else select @urlReturn = @urlReturn + @s1 set @i1 = @i1 +1 end DECLARE @URI varchar(2000)='https://geocode-maps.yandex.ru/1.x/?geocode='+@urlReturn, @methodName varchar(50)='GET' DECLARE @objectID int, @hResult int EXEC @hResult = sp_OACreate 'WinHttp.WinHttpRequest.5.1', @objectID OUT IF @hResult <> 0 goto destroy EXEC @hResult = sp_OAMethod @objectID, 'open', null, @methodName, @URI, 'false' IF @hResult <> 0 goto destroy EXEC @hResult = sp_OAMethod @objectID, 'send', null IF @hResult <> 0 goto destroy DECLARE @t TABLE(s nvarchar(max)) INSERT @t EXEC sp_OAGetProperty @objectID, 'responseText' IF @hResult <> 0 goto destroy DECLARE @LAT nvarchar(20) DECLARE @LON nvarchar(20) DECLARE @n int DECLARE @STRLEN int SELECT @STRLEN=LEN(SUBSTRING(s,CHARINDEX('<pos>',s)+5,(CHARINDEX('</pos>',s)-CHARINDEX('<pos>',s))-5))+1 FROM @t SELECT @n=CHARINDEX(' ',SUBSTRING(s,CHARINDEX('<pos>',s)+5,(CHARINDEX('</pos>',s)-CHARINDEX('<pos>',s))-5)) FROM @t SELECT @LON=SUBSTRING(s,CHARINDEX('<pos>',s)+5,@n), @LAT=SUBSTRING(SUBSTRING(s,CHARINDEX('<pos>',s)+5,(CHARINDEX('</pos>',s)-CHARINDEX('<pos>',s))-5),@n,@STRLEN-@n) FROM @t DECLARE @UpdateSQL AS VARCHAR(MAX) SET @UpdateSQL = ' UPDATE [UT_TEST_COPY].[dbo].[_Reference107] ' + ' SET _Fld11002 = ' + RTRIM(LTRIM(@LAT)) + ',' + ' _Fld11003 = ' + RTRIM(LTRIM(@LON)) + ' WHERE _CODE = '+CHAR(39)+ @ID1 + CHAR(39) EXECUTE(@UpdateSQL) destroy: exec sp_OADestroy @objectID DELETE FROM @t FETCH NEXT FROM curMarks INTO @URI1,@ID1; END CLOSE curMarks DEALLOCATE curMarks
ステップ3:
-ANTOR LogisticsMasterルート構築プログラムでの旅行リクエストのインポートテーブルのクリア:
DELETE FROM [LMaster].[dbo].[D__IMPORT0]
ステップ4:
-ANTOR LogisticsMasterルート構築プログラムへの出発のためのアプリケーションのアップロード:
INSERT INTO [LMaster].[dbo].[D__IMPORT0] ([EXT_ID] ,[EXT_STRID] ,[OPER_ID] ,[ORD_TYP] ,[DELIV_DATE] ,[ROUTE_ID] ,[ROUTE_NUM] ,[NUM_INROUTE] ,[CUST_ID] ,[CUST_STRID] ,[RENTED] ,[UNLOAD_TYP] ,[CATEGORY_ID] ,[TIME_BEG] ,[TIME_END] ,[TIME_UNLOAD] ,[ACTIVE] ,[ZONE_ID] ,[ACCESS_ID] ,[OGRSUM1] ,[OGRSUM2] ,[SUM3] ,[SUM4] ,[ADDR] ,[DISTR] ,[TOWN] ,[STREET] ,[HOUS] ,[CORP] ,[LINKED] ,[X] ,[Y] ,[DISTANC] ,[TIME_ARR] ,[VIRT] ,[SOST] ,[STR1] ,[STR2] ,[STR3] ,[STR4] ,[STR5] ,[STR6] ,[INT1] ,[INT2] ,[INT3] ,[MIN_CAR] ,[MAX_CAR] ,[EXP1] ,[EXP2] ,[EXP3] ,[MACROZONE_ID] ,[PICT] ,[WIDTH] ,[HEIGHT] ,[LENGTH] ,[STORE1] ,[STORE2] ,[STORE3] ,[STORE4] ,[STORE5] ,[LATITUDE] ,[LONGITUDE]) VALUES (NULL ,'"+_SQL+"' ,0 ,0 ,(Convert(datetime,'"+_SQL+"',104)) ,NULL ,NULL ,NULL ,NULL ,'"+_SQL+"' ,NULL ,0 ,0 ,'"+_SQL+"' ,'"+_SQL+"' ,(Convert(datetime,'19000101',104)) ,NULL ,"+_SQL+" ,NULL ,"+_SQL+" ,"+_SQL+" ,0 ,0 ,'"+_SQL+"' ,"+_SQL+" ,"+_SQL+" ,"+_SQL+" ,"+_SQL+" ,"+_SQL+" ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,'"+_SQL+"' ,'"+_SQL+"' ,'"+_SQL+"' ,'"+_SQL+"' ,'' ,'"+_SQL+"' ,0 ,0 ,0 ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,"+_SQL+" ,"+_SQL+" )
ステップ5:
-プログラム「1C:Trade Management、バージョン11」での退出のためのアプリケーションのステータスの更新:
SELECT D.EXT_STRID AS _CRM, D.NAME AS , O.TIME_ARR AS , O.EXT_STRID AS , O.DISTANC AS , R.LEN-(SELECT sum(O1.DISTANC) FROM dbo.D__ORDERS0 AS O1 WHERE O1.ROUTE_ID=R.ID) AS , O.LATITUDE AS LATITUDE, O.LONGITUDE AS LONGITUDE, O.ZONE_ID AS _ FROM dbo.D__ZONE0 AS Z WITH(NOLOCK) INNER JOIN dbo.D__DRIVERS AS D WITH(NOLOCK) INNER JOIN dbo.D__CARS AS C WITH(NOLOCK) ON D.ID = C.DRIVER_ID INNER JOIN dbo.D__ROUTE0 AS R WITH(NOLOCK) ON C.ID = R.CAR_ID ON Z.ID = R.ZONE_ID RIGHT OUTER JOIN dbo.D__ORDERS0 AS O WITH(NOLOCK) ON R.ID = O.ROUTE_ID WHERE (O.SOST >= 0) AND (O.ROUTE_ID <> 0) ORDER BY D.NAME, O.ROUTE_NUM, O.NUM_INROUTE
どうやって「これ」に来たの?
答えは次のとおりです(心理学者と一緒に記憶を少し掘り下げた場合)。
-20年前、私はUAZで技術者として自動制御システム部門のフレンドリーなチームで「働いていました」。
私はそれを全然働かせることができません(緑のティーンエイジャーは常にすべてを間違っています)。
私はすべての人を覚えており、私が彼らを恋しく思うことを涙で覚えています。 残念ながら、Ivan Ivanovich Davidenkoの座標を見つけることができません(彼は落胆した人でした)
T-SQL言語を学ぶことは禁じられた果物です)、彼はAviastarに行ったと聞きました。