Mudanças entre as edições de "Novo sincronismo"

De GeoSales
Ir para navegação Ir para pesquisar
Linha 156: Linha 156:
 
RETURNS VARCHAR(MAX)
 
RETURNS VARCHAR(MAX)
 
BEGIN
 
BEGIN
--DECLARE @ID_VENDEDOR int = 99
 
--DECLARE @DT_LAST_SINC datetime = NULL
 
--DECLARE @FN varchar(256) = 'fn_REGISTRO_SYNC_VALIDADE_TJ'
 
 
 
DECLARE @LIN INT = 0
 
DECLARE @LIN INT = 0
 
DECLARE @I INT
 
DECLARE @I INT
 
DECLARE @NAME VARCHAR(256)
 
DECLARE @NAME VARCHAR(256)
 
DECLARE @system_type_id tinyint
 
DECLARE @system_type_id tinyint
 +
DECLARE @scale tinyint
 
DECLARE @CMD VARCHAR(MAX) = ' SELECT ''{'''
 
DECLARE @CMD VARCHAR(MAX) = ' SELECT ''{'''
 
DECLARE @AUX TABLE (
 
DECLARE @AUX TABLE (
 
NAME VARCHAR(256),
 
NAME VARCHAR(256),
 
LIN SMALLINT,
 
LIN SMALLINT,
system_type_id tinyint
+
system_type_id tinyint,
 +
scale tinyint
 
)
 
)
  
Linha 174: Linha 172:
 
SELECT C.NAME,
 
SELECT C.NAME,
 
  ROW_NUMBER() OVER(ORDER BY C.column_id) LIN,
 
  ROW_NUMBER() OVER(ORDER BY C.column_id) LIN,
  C.system_type_id
+
  C.system_type_id,
 +
  C.scale
 
FROM SYS.objects O
 
FROM SYS.objects O
 
INNER JOIN SYS.COLUMNS C ON C.OBJECT_ID = O.OBJECT_ID
 
INNER JOIN SYS.COLUMNS C ON C.OBJECT_ID = O.OBJECT_ID
Linha 186: Linha 185:
 
SET @LIN = @LIN + 1
 
SET @LIN = @LIN + 1
  
SELECT @NAME = NAME, @system_type_id = system_type_id
+
SELECT @NAME = NAME, @system_type_id = system_type_id, @scale = scale
 
FROM @AUX
 
FROM @AUX
 
WHERE LIN = @LIN
 
WHERE LIN = @LIN
  
 
SET @CMD = @CMD + ' +  
 
SET @CMD = @CMD + ' +  
CASE WHEN '+ @NAME +' IS NOT NULL THEN
+
CASE WHEN '+ @NAME +' IS NOT NULL THEN
 
  ''"'+lower(@NAME)+'"'' + '':"'' + ' +
 
  ''"'+lower(@NAME)+'"'' + '':"'' + ' +
  case when @system_type_id = 61 then  
+
  case  
  'convert(varchar, ' + @NAME + ', 126)'
+
when @system_type_id = 61 then  
 +
'convert(varchar, ' + @NAME + ', 126)'
 +
when @scale > 0 then
 +
'case when ' + @NAME + ' = 0 then ''0'' when abs(' + @NAME + ') - floor(abs(' + @NAME + '))  = 0 and ' + @NAME + ' >= -2147483648 AND ' + @NAME + ' <= 2147483647 then cast(cast(' + @NAME + ' as integer) as varchar(max)) else cast(' + @NAME + ' as varchar(max)) end'
 
  else
 
  else
  'replace(cast('+@NAME+' as varchar) collate SQL_Latin1_General_CP1_CI_AI, ''"'', ''\"'')'
+
'replace(rtrim(cast('+@NAME+' as varchar(max)) collate SQL_Latin1_General_CP1_CI_AI), ''"'', ''\"'')'
 
  end
 
  end
  + ' + ''",''
+
  + ' + ''"' + (case when @LIN = @I  then '' else ',' end) +
ELSE ''''
+
'''ELSE ''''
 
END '   
 
END '   
 
 
Linha 206: Linha 208:
  
  
SET @CMD = @CMD + '+''}'' as json  FROM ' + @FN + '('+CONVERT(VARCHAR(30),@ID_VENDEDOR)+','+ ISNULL(quotename(convert(varchar, @DT_LAST_SINC, 126),char(39)),'NULL')+')'
+
SET @CMD = @CMD + '+''},'' as json  FROM ' + @FN + '('+CONVERT(VARCHAR(30),@ID_VENDEDOR)+','+ ISNULL(quotename(convert(varchar, @DT_LAST_SINC, 126),char(39)),'NULL')+')'
  
  

Edição das 19h30min de 25 de janeiro de 2017

O novo sincronismo é uma estratégia de marcação horizontal de dados, envio flexível e otimizado para compactação.

O nome do projeto do novo sincronismo é TamoJunto.

Ambiente de teste/beta

O host do TamoJunto é o host do beta. Na versão 4.0.1 4.0.2 4.0.3 4.0.6, o mesmo host usado para o SyncServer será usado para o TamoJunto, de tal sorte que o usuário não precisará entrar com dados novos no momento do sincronismo, e a porta está fixada como 8015 sempre.

No ambiente beta, existe um SyncServer e um TamoJunto configurado. O endereço do host é beta.softsitemobile.com, a porta do SyncServer é 8016.

A base HugoCini2 está configurada devidamente para o novo sincronismo.

Teste comparativo

A versão básica para comparação é a 3.22.9. Ela é a base para ver se tem algum dado faltoso ou se tem algum comportamento distinto.

Por hora, a única tabela que está no novo esquema é ORG_VENDA_CLIENTE

Criando novos ambientes

O primeiro passo no novo sincronismo é subir o servidor do TamoJunto na porta 8015. O TamoJunto roda sobre o Java 7, homologado no container Tomcat 8.

Cadastro de novas empresas

Dado um ambiente conhecido (no caso, Ares), vamos colocar uma empresa para esse novo sincronismo.

O primeiro ponto é travar totalmente a base. Importação, Claudus, Portal e qualquer outro serviço precisa ser parado para essa base, TOTALMENTE.

Aplique o script de migração na base. Então faça as verificações de que tudo está no canto.

Depois dessa migração, religue TODOS os sistemas.

Cadastre a versão 4.0.3 para sincronizar (ou a última versão 4.x.y) para a empresa. Coloque para sincronizar as tabelas desejadas. As tabelas disponíveis são:

  • ORG_VENDA_CLIENTE

Códigos de erro

Ao terminar um sincronismo mal sucedido, o sincronismo do TamoJunto lança um código na tela do usuário. O código tem o seguinte formato: IXHHH. A parte I se refere ao instante, a parte X se refere ao erro lançado, e a parte HHH se refere ao retorno HTTP.

Os possíveis valores pra I são:

  • 1 : autenticação /auth
  • 2 : sincronismo /sync
  • 3 : truncagem /truncate
  • 8 : desconhecido
  • 9 : não relacionado ainda

Os possíveis valores pra X são:

  • 0 : erro de IO
  • 1 : erro de HTTP; o código HTTP de erro segue na parte HHH
  • 2 : erro de host
  • 3 : erro de SQL
  • 9 : erro desconhecido

Os códigos de erro HTTP podem ser encontrados na página da Wikipedia, ou então tem ainda uma lista rápida com gatos.

Caso alguma chamada do TamoJunto retorne um código HTTP diferente de 200, o protocolo reconhece como erro.

Os erros HTTP mais comuns (e seus respectivos significados comuns) retornados pelo TamoJunto são:

  • 000 : possivelmente não se conectou num servidor HTTP?
  • 400 : o dispositivo falhou ao montar a requisição; deve-se contatar imediatamente o Anderson e reportar essa problema; também pode ser um sinal de que o usuário esqueceu de preencher o ID palm ou a senha
  • 401 : erro de usuário e senha; o ID palm não confere com a senha para aquela empresa, ou o usuário colocou um ID palm errado
  • 404 : empresa não cadastrada
  • 500 : internal server error; deve-se contatar imediatamente o Anderson e reportar essa problema

Passo a passo migração para o novo Sincronismo

  • Passo 1
 * Executar os seguintes scripts
CREATE TABLE [dbo].[TAMOJUNTO_TABELA_FUNCAO](
	[ID] [int] IDENTITY(-2147483648,1) PRIMARY KEY NOT NULL,
	[NM_TABLE] [varchar](256) NOT NULL,
	[NM_FN] [varchar](256) NOT NULL,
	[FL_ATIVA] [bit] NULL
)
CREATE TABLE [dbo].[tamojunto_auth](
	[cd_vendedor] [int] NOT NULL,
	[token] [varchar](255) NULL,
	[dt_criacao] [datetime] NULL,
	[dt_validade] [datetime] NULL
)
CREATE TABLE [dbo].[tamojunto_data_geracao_registro](
	[id] [int] IDENTITY(-2147483648,1) PRIMARY KEY NOT NULL,
	[dt_geracao] [datetime] NOT NULL,
	[cd_vendedor] [int] NOT NULL
)
USE [bd_ssm_hugocini]
GO

/****** Object:  StoredProcedure [dbo].[sp_get_auth_token]    Script Date: 10/11/2016 17:15:21 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

if exists (select top 1 1 from sys.sysobjects where name = 'sp_get_auth_token')
begin
drop proc [sp_get_auth_token]
end
go
CREATE PROCEDURE [dbo].[sp_get_auth_token] (@id_palm  CHAR(10),
                                    @ds_senha VARCHAR(20))
AS
  BEGIN
      ;WITH mysource
           AS (SELECT dv.cd_vendedor,
                      substring(convert(varchar, hashbytes('SHA1', Cast(dv.cd_vendedor AS VARCHAR)
                                        + CONVERT(VARCHAR, Getdate(), 126)), 1), 3, 128) AS token,
                      Getdate()                                             AS dt_criacao,
                      Dateadd(hh, 1, Getdate())                             AS dt_validade
               FROM   dados_vendedor dv
                      LEFT JOIN tamojunto_auth tau
                             ON ( dv.cd_vendedor = tau.cd_vendedor )
               WHERE  dv.id_palm = @id_palm
                      AND dv.ds_senha = @ds_senha)
      MERGE tamojunto_auth AS mytarget
      using mysource
      ON mysource.cd_vendedor = myTarget.cd_vendedor
      WHEN matched THEN
        UPDATE SET token = mysource.token,
                   dt_criacao = mysource.dt_criacao,
                   dt_validade = mysource.dt_validade
      WHEN NOT matched THEN
        INSERT ( cd_vendedor,
                 token,
                 dt_criacao,
                 dt_validade )
        VALUES ( mysource.cd_vendedor,
                 mysource.token,
                 mysource.dt_criacao,
                 mysource.dt_validade )
      output mysource.token;
  END 
GO

USE [bd_ssm_hugocini]
GO

/****** Object:  UserDefinedFunction [dbo].[fn_STRING_JSON]    Script Date: 10/11/2016 17:11:51 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[fn_STRING_JSON](@ID_VENDEDOR int, @DT_LAST_SINC datetime, @FN VARCHAR(256) )
RETURNS VARCHAR(MAX)
BEGIN
	DECLARE @LIN INT = 0
	DECLARE @I INT
	DECLARE @NAME VARCHAR(256)
	DECLARE @system_type_id tinyint
	DECLARE @scale tinyint
	DECLARE @CMD VARCHAR(MAX) = ' SELECT ''{'''
	DECLARE @AUX TABLE (
		NAME VARCHAR(256),
		LIN SMALLINT,
		system_type_id tinyint,
		scale tinyint
	)

	INSERT INTO @AUX
	SELECT C.NAME,
		   ROW_NUMBER() OVER(ORDER BY C.column_id) LIN,
		   C.system_type_id,
		   C.scale
	FROM SYS.objects O
	INNER JOIN SYS.COLUMNS C ON C.OBJECT_ID = O.OBJECT_ID
	WHERE O.NAME = @FN

	SET @I = ISNULL((SELECT MAX(LIN) FROM @AUX),0)

	WHILE @I > @LIN
	BEGIN 
	
		SET @LIN = @LIN + 1

		SELECT @NAME = NAME, @system_type_id = system_type_id, @scale = scale
		FROM @AUX
		WHERE LIN = @LIN

		SET @CMD = @CMD + ' + 
							CASE WHEN '+ @NAME +' IS NOT NULL  THEN
								  ''"'+lower(@NAME)+'"'' + '':"'' + ' +
								  case 
									when @system_type_id = 61 then 
									'convert(varchar, ' + @NAME + ', 126)'
									when @scale > 0 then
									'case when ' + @NAME + ' = 0 then ''0'' when abs(' + @NAME + ') - floor(abs(' + @NAME + '))  = 0 and ' + @NAME + ' >= -2147483648 AND ' + @NAME + ' <= 2147483647 then cast(cast(' + @NAME + ' as integer) as varchar(max)) else cast(' + @NAME + ' as varchar(max)) end'
								  else
									'replace(rtrim(cast('+@NAME+' as varchar(max)) collate SQL_Latin1_General_CP1_CI_AI), ''"'', ''\"'')'
								  end
								  + ' + ''"' + (case when @LIN = @I  then '' else ',' end) + 
							'''ELSE ''''
							END '  
						
	END



	SET @CMD = @CMD + '+''},'' as json  FROM ' + @FN + '('+CONVERT(VARCHAR(30),@ID_VENDEDOR)+','+ ISNULL(quotename(convert(varchar, @DT_LAST_SINC, 126),char(39)),'NULL')+')'


	RETURN @CMD
END

GO
  • Passo 2
 * Deve ser executado o programa ScriptGenerator do projeto TamoJunto. Na classe main devem ser especificado para quais tabelas devem ser gerados os scripts de migração.
private final String[] tabelas = {
     		"org_venda_cliente",
    		"lista_produto",
    		"lista_produto_lote",
    		"faixa_preco_produto",
    		"valor_original_produto",
    		"produto_custo",
    		"produto_estoque",
    		"cliente_rota",
    		"rota",
    		"produto",
    		"tributacao",
    		"tributacao_produto",
    		"tributacao_cliente",
    		"cliente"
};
  • Nessa etapa pode acontecer uma exceção na hora da geração dos scripts devido a alguma trigger fora do padrão na tabela a ser migrada que pode gerar algum erro. Nessa situação será mostrada uma mensagem no console e o script não será gerado. Exemplos de mensagens:
cliente_rota possui triggers que podem afetar a conversão: TR_DELETE_CLIENTE_ROTA, TR_INSERT_CLIENTE_ROTA
tributacao possui triggers que podem afetar a conversão: TRATAR_INSERT_TRIBUTACAO
 Nesses casos você deve analisar as triggers e verificar se isso pode ser corrigido ou se a triggers pode ser modificada por uma ação da integração.
 Após efetuar os ajustes foi possível efetuar a geração de scripts para as tabelas solicitadas.
  • Passo 3
 Nesta etapa, deve-se aplicar os scripts gerados no passo anterior.