none
Inserindo dados do arquivo txt no sql server RRS feed

  • Pergunta

  • Ola pessoal,

    Preciso incluir dados das batidas de ponto do arquivo .txt na tabela do SQL.

    Os dados estão nesta estrutura. 

    0000024183111120191415000000000006167

    Eu só preciso das informações em negritos, que seria: Data, hora e CPF.

    0000024183111120191415000000000006167 -  DATA

    0000024183111120191415000000000006167  -  HORA

    0000024183111120191415000000000006167  - CPF

    No caso, preciso comparar o CPF do arquivo com o da tabela de funcionário, pra pegar o id do funcionario e inserir junto com DATA e HORA na tabela de batidas.

    Serão 4 horarios:  Entrada1, Saida1, Entrada2, Saida2.




    • Editado larosas quarta-feira, 13 de novembro de 2019 14:27
    quarta-feira, 13 de novembro de 2019 14:25

Todas as Respostas

  • Deleted
    quarta-feira, 13 de novembro de 2019 14:52
  • Como se sabe se o registro contém horário de saída ou de entrada e qual é o turno?

    é um arquivo gerado pelo relógio de ponto.

    É garantido que sempre haverão quatro registros para cada CPF/data?

    Não é garantido. Tem os casos de entrada tardia ou saída  antecipada, nesses casos, as vezes o funcionário deixa de almoçar.

    Qual é a estrutura da tabela de batidas? Isto é, nome das colunas, como estão declaradas, etc.

    CREATE TABLE [dbo].[batidas](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[data] [smalldatetime] NOT NULL,
    	[idfuncionario] [int] NOT NULL,
    	[entrada1] [varchar](10) NULL,
    	[saida1] [varchar](10) NULL,
    	[entrada2] [varchar](10) NULL,
    	[saida2] [varchar](10) NULL,
    	[entrada3] [varchar](10) NULL,
    	[saida3] [varchar](10) NULL,
    	[entrada4] [varchar](10) NULL,
    	[saida4] [varchar](10) NULL,
    	[entrada5] [varchar](10) NULL,
    	[saida5] [varchar](10) NULL,
    	[ajuste] [varchar](6) NULL,
    	[abono2] [varchar](5) NULL,
    	[abono3] [varchar](5) NULL,
    	[abono4] [varchar](5) NULL,
    	[reserva_refeicao] [bit] NOT NULL,
    	[obs] [varchar](50) NULL,
    	[mem_entrada1] [varchar](5) NULL,
    	[mem_saida1] [varchar](5) NULL,
    	[mem_entrada2] [varchar](5) NULL,
    	[mem_saida2] [varchar](5) NULL,
    	[mem_entrada3] [varchar](5) NULL,
    	[mem_saida3] [varchar](5) NULL,
    	[mem_entrada4] [varchar](5) NULL,
    	[mem_saida4] [varchar](5) NULL,
    	[mem_entrada5] [varchar](5) NULL,
    	[mem_saida5] [varchar](5) NULL,
    	[auto_entrada1] [bit] NOT NULL,
    	[auto_saida1] [bit] NOT NULL,
    	[auto_entrada2] [bit] NOT NULL,
    	[auto_saida2] [bit] NOT NULL,
    	[auto_entrada3] [bit] NOT NULL,
    	[auto_saida3] [bit] NOT NULL,
    	[auto_entrada4] [bit] NOT NULL,
    	[auto_saida4] [bit] NOT NULL,
    	[auto_entrada5] [bit] NOT NULL,
    	[auto_saida5] [bit] NOT NULL,
    	[compensado] [bit] NOT NULL,
    	[almoco_livre] [bit] NOT NULL,
    	[neutro] [bit] NOT NULL,
    	[nbanco] [bit] NOT NULL,
    	[t_extra] [tinyint] NULL,
    	[t_falta] [tinyint] NULL,
    	[bac_entrada1] [varchar](5) NULL,
    	[bac_saida1] [varchar](5) NULL,
    	[bac_entrada2] [varchar](5) NULL,
    	[bac_saida2] [varchar](5) NULL,
    	[bac_entrada3] [varchar](5) NULL,
    	[bac_saida3] [varchar](5) NULL,
    	[bac_entrada4] [varchar](5) NULL,
    	[bac_saida4] [varchar](5) NULL,
    	[bac_entrada5] [varchar](5) NULL,
    	[bac_saida5] [varchar](5) NULL,
    	[acrescimo] [varchar](6) NULL,
    	[somar_t] [bit] NOT NULL,
    	[horario_num] [int] NULL,
    	[equip_entrada1] [int] NULL,
    	[equip_saida1] [int] NULL,
    	[equip_entrada2] [int] NULL,
    	[equip_saida2] [int] NULL,
    	[equip_entrada3] [int] NULL,
    	[equip_saida3] [int] NULL,
    	[equip_entrada4] [int] NULL,
    	[equip_saida4] [int] NULL,
    	[equip_entrada5] [int] NULL,
    	[equip_saida5] [int] NULL,
    	[extra_especial_id] [int] NULL,
    	[folga] [bit] NOT NULL,
    	[fdados_entrada1] [int] NULL,
    	[fdados_saida1] [int] NULL,
    	[fdados_entrada2] [int] NULL,
    	[fdados_saida2] [int] NULL,
    	[fdados_entrada3] [int] NULL,
    	[fdados_saida3] [int] NULL,
    	[fdados_entrada4] [int] NULL,
    	[fdados_saida4] [int] NULL,
    	[fdados_entrada5] [int] NULL,
    	[fdados_saida5] [int] NULL,
    	[dsr_especial] [bit] NOT NULL,
     CONSTRAINT [PK_batidas] PRIMARY KEY CLUSTERED 
    (
    	[data] ASC,
    	[idfuncionario] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO

    Como estão declaradas as colunas CPF e ID do funcionário na tabela de funcionários?

    CREATE TABLE [dbo].[funcionarios](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[n_folha] [varchar](22) NULL,
    	[nome] [varchar](100) NULL,
    	[n_identificador] [varchar](20) NULL,
    	[carteira] [varchar](50) NULL,
    	[empresa_id] [int] NULL,
    	[horario_num] [int] NULL,
    	[estado] [int] NULL,
    	[funcao_id] [int] NULL,
    	[departamento_id] [int] NULL,
    	[admissao] [smalldatetime] NULL,
    	[demissao] [smalldatetime] NULL,
    	[nao_digital] [bit] NOT NULL,
    	[afast_data_ini] [smalldatetime] NULL,
    	[afast_data_fim] [smalldatetime] NULL,
    	[afast_motivo] [varchar](100) NULL,
    	[afast_justificativa_id] [int] NULL,
    	[invisivel] [bit] NOT NULL,
    	[escala_id] [int] NULL,
    	[escala_mensal] [bit] NOT NULL,
    	[t_horario] [varchar](50) NULL,
    	[senha_equipamento] [int] NULL,
    	[filtro1_id] [int] NULL,
    	[filtro2_id] [int] NULL,
    	[obs] [varchar](255) NULL,
    	[xcampo1] [varchar](50) NULL,
    	[alt2_horario_num] [int] NULL,
    	[alt3_horario_num] [int] NULL,
    	[alt4_horario_num] [int] NULL,
    	[endereco] [varchar](100) NULL,
    	[bairro] [varchar](30) NULL,
    	[cidade] [varchar](50) NULL,
    	[uf] [varchar](2) NULL,
    	[cep] [varchar](9) NULL,
    	[telefone] [varchar](20) NULL,
    	[celular] [varchar](20) NULL,
    	[email] [varchar](255) NULL,
    	[rg] [varchar](255) NULL,
    	[expedicao] [smalldatetime] NULL,
    	[ssp] [varchar](2) NULL,
    	[cpf] [varchar](20) NULL,
    	[mae] [varchar](100) NULL,
    	[pai] [varchar](100) NULL,
    	[nascimento] [smalldatetime] NULL,
    	[sexo_masculino] [bit] NOT NULL,
    	[estado_civil_id] [int] NULL,
    	[nacionalidade] [varchar](50) NULL,
    	[naturalidade] [varchar](50) NULL,
    	[web_senha] [varchar](10) NULL,
    	[web_nao_altera] [bit] NOT NULL,
    	[web_bloqueado] [bit] NOT NULL,
    	[alt_usuario_id] [int] NULL,
    	[alt_data] [smalldatetime] NULL,
    	[master] [bit] NOT NULL,
    	[n_provisorio] [varchar](20) NULL,
    	[provisorio_data_ini] [smalldatetime] NULL,
    	[provisorio_data_fim] [smalldatetime] NULL,
    	[cidade_empresa_id] [int] NULL,
    	[estrutura_id] [int] NULL,
    	[assinatura_eletronica] [varchar](50) NULL,
    	[integracao_id] [int] NULL,
    	[bh_inicio] [smalldatetime] NULL,
    	[centro_custos] [varchar](255) NULL,
    	[nivel_id] [int] NULL,
    	[web_auto_aceitar] [bit] NOT NULL,
    	[n_pis] [varchar](20) NULL,
    	[web_solicitacoes] [bit] NOT NULL,
    	[data_alteracao_portaria] [smalldatetime] NULL,
    	[web_data_fechamento] [smalldatetime] NULL,
    	[especial_insight_sinha] [smallint] NULL,
    	[motivo_demissao_id] [int] NULL,
    	[web_somente_visto] [bit] NOT NULL,
    	[web_nao_incluir_manual] [bit] NOT NULL,
     CONSTRAINT [PK_funcionarios] PRIMARY KEY CLUSTERED 
    (
    	[id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]


    No arquivo, tem alguns casos, que o nome do funcionário está vindo no lugar do CPF.

    • Editado larosas quarta-feira, 13 de novembro de 2019 15:12
    quarta-feira, 13 de novembro de 2019 15:10
  • Deleted
    quarta-feira, 13 de novembro de 2019 16:00
  • Oi José, deu esse erro.

    Msg 4863, Level 16, State 1, Line 9
    Bulk load data conversion error (truncation) for row 323, column 1 (Registro).
    Msg 4863, Level 16, State 1, Line 9
    Bulk load data conversion error (truncation) for row 324, column 1 (Registro).
    Msg 4863, Level 16, State 1, Line 9
    Bulk load data conversion error (truncation) for row 327, column 1 (Registro).
    Msg 4863, Level 16, State 1, Line 9
    Bulk load data conversion error (truncation) for row 329, column 1 (Registro).
    Msg 4863, Level 16, State 1, Line 9
    Bulk load data conversion error (truncation) for row 331, column 1 (Registro).
    Msg 4863, Level 16, State 1, Line 9
    Bulk load data conversion error (truncation) for row 333, column 1 (Registro).
    Msg 4863, Level 16, State 1, Line 9
    Bulk load data conversion error (truncation) for row 522, column 1 (Registro).
    Msg 4863, Level 16, State 1, Line 9
    Bulk load data conversion error (truncation) for row 524, column 1 (Registro).
    Msg 4863, Level 16, State 1, Line 9
    Bulk load data conversion error (truncation) for row 671, column 1 (Registro).


    Meu arquivo esta + OU - assim:

    0000000001110000000000198            NOMEDAEMPRESA                                                    0000000000005680000
    000000540314102019122000000000089663
    0000005413141020191530000000000050F0

    000000872501112019104000000000000NOMEFUNCIONARIO                                         00000000000856AFA

    99999999900000000000000000000000000000000000000000000387
    ANNOD2JF5FIA2IJFHQE5VN3BXAF6AFMVG4AHXZPC4DTZP76EBOUIAATL55K6LHMO   



    • Editado larosas quarta-feira, 13 de novembro de 2019 17:39
    quarta-feira, 13 de novembro de 2019 17:30
  • Deleted
    quarta-feira, 13 de novembro de 2019 20:20
  • Sim, porém mexi no arquivo (por ser urgente) e deletei essas informações a mais, mas mesmo assim não inseri os dados na tabela batidas.
    quarta-feira, 13 de novembro de 2019 20:24
  • Deleted
    quarta-feira, 13 de novembro de 2019 20:49
  • Iarosas,

    Por acaso o relógio de ponto é um Madis? O Software de acesso aos dados é um Toutatis?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 13 de novembro de 2019 22:32
  • -- importação para a tabela temporária
    BULK INSERT dbo.Importado
      from 'C:\arquivo.txt';
    
    with 
    Importado_2 as (
    SELECT substring (Registro, 24, 11) as CPF, 
              (substring (Registro, 11, 2) + '-' + substring (Registro, 13, 2) + '-' + substring (Registro, 15, 4)) --,103) 
    	as DATA,
           (substring (Registro, 19, 2) + ':' + substring (Registro, 21, 2)) as HORA
      from  [PontoSecullum4].dbo.Importado
    ),
    Importado_3 as (
    SELECT *, seq= row_number() over (partition by CPF, DATA order by HORA)
      from Importado_2
    )
    
      SELECT F.nome, f.CPF , I.DATA,
             max (case when seq = 1 then HORA end) as E1,
             max (case when seq = 2 then HORA end) as S1,
             max (case when seq = 3 then HORA end) as E2,
             max (case when seq = 4 then HORA end) as S2
        from Importado_3 as I
             inner join FUNCIONARIOS as F on F.CPF = I.CPF
        group by F.nome, f.CPF,I.DATA;

    Consegui com essa query, porem fazendo ajuste no arquivo como falei. Como faço pra ignorar a parte que não usarei.


    0000000000000000000000100            NOME  DA EMPRESA                                                                                        000010044500013411410201914112012000000019135008DF
    00000055431410201914230132200080003A75
    000000555314102019162601307034951952F3
    00000055631410201917220000000000000097
    00000055731410201917300106900000000028
    00000055831410201917470134000000000000
    00000055931410201918100000000000000091
    00000312231411201913490000000000000D68

    0000007735311020191706A0134900000006NOME DO FUNCIONARIO                

    0021145749977024EF8000000000014112019134902
    9999999990000000000000025200000000000000000000000000009
    00000000I3WAMCVL6NRPX4AENDHRZ4BFWGT5JO2POVUGUPTTWLANF5UPW3GZIOYA

    quinta-feira, 14 de novembro de 2019 18:25
  • Deleted
    quinta-feira, 14 de novembro de 2019 21:13
  • -- importação para a tabela temporária
    BULK INSERT dbo.Importado
      from 'C:\arquivo.txt';
    
    with 
    Importado_2 as (
    SELECT substring (Registro, 24, 11) as CPF, 
              (substring (Registro, 11, 2) + '-' + substring (Registro, 13, 2) + '-' + substring (Registro, 15, 4)) --,103) 
    	as DATA,
           (substring (Registro, 19, 2) + ':' + substring (Registro, 21, 2)) as HORA
      from  [PontoSecullum4].dbo.Importado
    ),
    Importado_3 as (
    SELECT *, seq= row_number() over (partition by CPF, DATA order by HORA)
      from Importado_2
    )
    
      SELECT F.nome, f.CPF , I.DATA,
             max (case when seq = 1 then HORA end) as E1,
             max (case when seq = 2 then HORA end) as S1,
             max (case when seq = 3 then HORA end) as E2,
             max (case when seq = 4 then HORA end) as S2
        from Importado_3 as I
             inner join FUNCIONARIOS as F on F.CPF = I.CPF
        group by F.nome, f.CPF,I.DATA;

    Consegui com essa query, porem fazendo ajuste no arquivo como falei. Como faço pra ignorar a parte que não usarei.


    0000000000000000000000100            NOME  DA EMPRESA                                                                                        000010044500013411410201914112012000000019135008DF
    00000055431410201914230132200080003A75
    000000555314102019162601307034951952F3
    00000055631410201917220000000000000097
    00000055731410201917300106900000000028
    00000055831410201917470134000000000000
    00000055931410201918100000000000000091
    00000312231411201913490000000000000D68

    0000007735311020191706A0134900000006NOME DO FUNCIONARIO                

    0021145749977024EF8000000000014112019134902
    9999999990000000000000025200000000000000000000000000009
    00000000I3WAMCVL6NRPX4AENDHRZ4BFWGT5JO2POVUGUPTTWLANF5UPW3GZIOYA

    SS_DBAJr,

    Você quer ignorar no momento da carga ou após esta importado excluir o conteúdo?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 14 de novembro de 2019 23:24
  • -- importação para a tabela temporária
    BULK INSERT dbo.Importado
      from 'C:\arquivo.txt';
    
    with 
    Importado_2 as (
    SELECT substring (Registro, 24, 11) as CPF, 
              (substring (Registro, 11, 2) + '-' + substring (Registro, 13, 2) + '-' + substring (Registro, 15, 4)) --,103) 
    	as DATA,
           (substring (Registro, 19, 2) + ':' + substring (Registro, 21, 2)) as HORA
      from  [PontoSecullum4].dbo.Importado
    ),
    Importado_3 as (
    SELECT *, seq= row_number() over (partition by CPF, DATA order by HORA)
      from Importado_2
    )
    
      SELECT F.nome, f.CPF , I.DATA,
             max (case when seq = 1 then HORA end) as E1,
             max (case when seq = 2 then HORA end) as S1,
             max (case when seq = 3 then HORA end) as E2,
             max (case when seq = 4 then HORA end) as S2
        from Importado_3 as I
             inner join FUNCIONARIOS as F on F.CPF = I.CPF
        group by F.nome, f.CPF,I.DATA;

    Consegui com essa query, porem fazendo ajuste no arquivo como falei. Como faço pra ignorar a parte que não usarei.


    0000000000000000000000100            NOME  DA EMPRESA                                                                                        000010044500013411410201914112012000000019135008DF
    00000055431410201914230132200080003A75
    000000555314102019162601307034951952F3
    00000055631410201917220000000000000097
    00000055731410201917300106900000000028
    00000055831410201917470134000000000000
    00000055931410201918100000000000000091
    00000312231411201913490000000000000D68

    0000007735311020191706A0134900000006NOME DO FUNCIONARIO                

    0021145749977024EF8000000000014112019134902
    9999999990000000000000025200000000000000000000000000009
    00000000I3WAMCVL6NRPX4AENDHRZ4BFWGT5JO2POVUGUPTTWLANF5UPW3GZIOYA

    SS_DBAJr,

    Você quer ignorar no momento da carga ou após esta importado excluir o conteúdo?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    Acredito que após a importação seria melhor. A query que tenho hoje da erro na importação.

    segunda-feira, 18 de novembro de 2019 15:35
  • Consegui com essa query, porem fazendo ajuste no arquivo como falei. Como faço pra ignorar a parte que não usarei.

    E como é possível identificar quais linhas deverão ser rejeitadas? Você possui documentação que informe o que contém cada campo do arquivo texto?

    Conhecendo-se o formato do arquivo texto, é possível rejeitá-las no código #2 ou mesmo no código #3. Preferencialmente no código #2, que é justamente a etapa de tratamento do arquivo importado para uma tabela intermediária.

    Acrescentei um comando DELETE no código #2, para apagar duas das linhas que foi possível deduzir a função delas.

    ---

    Você fez a atualização recomendada em acesso ao Reporting Services?


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Sim, fiz a atualização no Reporting, mas ainda sim, o erro continua.
    segunda-feira, 18 de novembro de 2019 15:36
  • SS_DBAJr,

    Atualmente a tabela que você esta utilizando para receber os dados esta definida com quais tipos de dados?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 18 de novembro de 2019 16:43
  • SS_DBAJr,

    Atualmente a tabela que você esta utilizando para receber os dados esta definida com quais tipos de dados?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    CPF, DATA e HORA.

    0000000001110000000000198            NOMEDAEMPRESA                                                 0000000000005680000
    000000540314102019122000000000089663
    0000005413141020191530000000000050F0
    000000872501112019104000000000000NOMEFUNCIONARIO                                         00000000000856AFA
    0000024183111120191415000000000006167 -  DATA
    0000024183111120191415000000000006167  -  HORA
    0000024183111120191415000000000006167  - CPF
    99999999900000000000000000000000000000000000000000000387
    ANNOD2JF5FIA2IJFHQE5VN3BXAF6AFMVG4AHXZPC4DTZP76EBOUIAATL55K6LHMO

    segunda-feira, 18 de novembro de 2019 18:06
  • SS_DBAJr,

    Encontrei a estrutura nos posts acima!

    O que você poderia fazer, é justamente definir inicialmente todas as colunas como NVarchar(), realizar a importação, e depois reestruturar cada coluna com seu respectivo tipo de dados, e por último excluir os dados desnecessário.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    segunda-feira, 18 de novembro de 2019 18:11
  • Deleted
    segunda-feira, 18 de novembro de 2019 18:55
  • Registros aproveitados são: DATA, HORA E CPF, um total de 23 caracteres.

    terça-feira, 19 de novembro de 2019 16:02
  • SS_DBAJr,

    Neste caso, sabendo do tamanho de cada campo, você poderia fazer uso da função SubString() para copiar as partes desejadas da sua estrutura, tendo como base as posições e tamanho específicos de cada parte de dados.

    Veja se este exemplo te ajuda, elaborado com base na estrutura apresentada anteriormente:

    CPF, DATA e HORA.

    0000000001110000000000198            NOMEDAEMPRESA                                                 0000000000005680000
    000000540314102019122000000000089663
    0000005413141020191530000000000050F0
    000000872501112019104000000000000NOMEFUNCIONARIO                                         00000000000856AFA
    0000024183111120191415000000000006167 -  DATA
    0000024183111120191415000000000006167  -  HORA
    0000024183111120191415000000000006167  - CPF
    99999999900000000000000000000000000000000000000000000387
    ANNOD2JF5FIA2IJFHQE5VN3BXAF6AFMVG4AHXZPC4DTZP76EBOUIAATL55K6LHMO

    Select SubString(Registro,178,10) As Data,
           SubString(Registro,215,4) As Hora,
           SubString(Registro,255,11) As CPF
    From Importado
    Não sei se as posições iniciais estão certas, além disso, se repararmos na mesma linha: 0000024183111120191415000000000006167, podemos identificar as três partes que você deseja reaproveitar.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Sugerido como Resposta IgorFKModerator sexta-feira, 6 de dezembro de 2019 19:00
    quarta-feira, 20 de novembro de 2019 11:05