Warning: preg_match(): Unknown modifier 'b' in /mnt/datadisk/www/src/Controllers/PostController.php on line 206 Consultando el rastreo de objetos de Correios por SQL Server — Dirceu ResendeSaltar al contenido
En el post de hoy voy a traer algo realmente interesante, que es un procedimiento almacenado Transact-SQL donde es posible consultar y rastrear información sobre pedidos y objetos utilizando datos del propio sitio web de Correios en SQL Server. Para hacer esto, usaré el objeto MSXML2.ServerXMLHTTP y los procedimientos de automatización OLE.
Esto es muy útil para empresas de comercio electrónico que pueden utilizar este SP para integrar el seguimiento de Correios en sus sistemas y mostrar el progreso de entrega de sus productos en la pantalla.
ACTUALIZAR: A partir del 10/06/2017, esta característica dejó de funcionar, ya que Correios decidió desactivar el servicio WEBSRO, que todos utilizaban para verificar rápidamente el seguimiento de objetos. Sin embargo, hice la publicación. SQL Server: cómo rastrear paquetes y objetos postales (después de desactivar WEBSRO) que soluciona este problema. 🙂
Antes de comenzar, veamos algunos requisitos previos para utilizar este procedimiento.:
– Habilite la función OLE Automation en su servidor SQL Server (vea cómo en esta publicación)
– Función fncRemove_HTML para eliminar etiquetas HTML de una cadena varchar (ver más en esta publicación)
– Función fncSplit_Texto para dividir una cadena en subcadenas usando un delimitador (ver más en esta publicación)
Un detalle importante que observé en el desarrollo de este SP es que si el número de caracteres en el XML que devuelve el procedimiento sp_OAGetProperty es mayor a 4000 caracteres, el retorno del SP será NULL, ya que el procedimiento sp_OAGetProperty tiene esta limitación de 4000 caracteres. Para solucionar este problema, en lugar de utilizar una variable de SALIDA para capturar los datos, la inserto en una tabla temporal y luego trabajo con los datos. 🙂
Ejemplos de uso de SP
SQL Server: seguimiento de objetos de paquetes postales
Implementando el procedimiento almacenado en su base de datos
Ver código fuente
CREATE PROCEDURE [dbo].[stpBusca_Rastreamento_Correios] (
@Ds_Rastreamento VARCHAR(13)
)
AS BEGIN
SET NOCOUNT ON
------------------------------------------------------------------------
-- RECUPERAÇÃO DAS INFORMAÇÕES
------------------------------------------------------------------------
DECLARE
@obj INT,
@Url VARCHAR(8000),
@xml VARCHAR(MAX),
@resposta VARCHAR(MAX)
IF (OBJECT_ID('tempdb..#xml') IS NOT NULL) DROP TABLE #xml
CREATE TABLE #xml (
Ds_Dados VARCHAR(MAX)
)
SET @Url = 'http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=' + @Ds_Rastreamento
EXEC sys.sp_OACreate @progid = 'MSXML2.ServerXMLHTTP', @objecttoken = @obj OUT, @context = 1
EXEC sys.sp_OAMethod @obj, 'open', NULL, 'GET', @Url, false
EXEC sys.sp_OAMethod @obj, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'
EXEC sys.sp_OAMethod @obj, 'send'
INSERT INTO #xml(Ds_Dados)
EXEC sys.sp_OAGetProperty @obj, 'responseText' --, @resposta OUT
EXEC sys.sp_OADestroy @obj
SELECT TOP 1 @resposta = Ds_Dados FROM #xml
SET @xml = @resposta COLLATE SQL_Latin1_General_CP1251_CS_AS
------------------------------------------------------------------------
-- TRATAMENTO DOS DADOS
------------------------------------------------------------------------
SET @xml = REPLACE(@xml, '</td><td>', ' | ')
IF (OBJECT_ID('tempdb..#Dados') IS NOT NULL) DROP TABLE #Dados
SELECT
ROW_NUMBER() OVER(ORDER BY Id) AS Linha,
LTRIM(RTRIM(REPLACE(Palavra, CHAR(13), ''))) AS Palavra
INTO
#Dados
FROM
dbo.fncSplitTexto(dbo.fncRemove_HTML(@xml), CHAR(10))
WHERE
NULLIF(REPLACE(Palavra, CHAR(13), ''), '') IS NOT NULL
SELECT * FROM #Dados
------------------------------------------------------------------------
-- RESULTADO FINAL
------------------------------------------------------------------------
DECLARE @Qt_Linhas INT = (SELECT COUNT(*) FROM #Dados)
IF ((SELECT COUNT(*) FROM #Dados WHERE Palavra LIKE '%nao possui dados sobre o objeto%') > 0)
BEGIN
SELECT Palavra AS Rastreamento
FROM #Dados
WHERE Palavra LIKE '%nao possui dados sobre o objeto%'
END
ELSE BEGIN
SELECT Palavra AS Rastreamento
FROM #Dados
WHERE Linha > 7
AND Linha < @Qt_Linhas
END
END
¡Eso es todo!
¿Te gustó este procedimiento? Ahora puedes crear un seguimiento para tus pedidos... jajaja
Comentários (0)
Carregando comentários…