Hola, chicos,
¡Buenas tardes!

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 - Rastreamento de Objetos Encomendas dos Correios
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

servidor sql tsql transacciones sql seguimiento de consultas pedidos objetos correo

servidor sql tsql transacciones sql seguimiento de consultas pedidos objetos correo