
fulvio
Moderadores-
Total de itens
1.218 -
Registro em
-
Última visita
Tudo que fulvio postou
-
Tente então o mapa de execução q o sql está utilizando. Faça a comparação entre os mapas. É o mesmo servidor, os máquinas diferentes?
-
Boa tarde Vinicius, Este erro é porque sua subquery retorna mais de 1 valor. Para fazer o teste, coloque na subquery o TOP 1... apenas para teste, e rode novamente o script...
-
rs... mas ai você tem instalado o 2005 ou superior.... :.) porque no pacote do 2000 não tem. Mas se tiver uma versão superior, rola também!! :.)
-
Gostei da implementação, mas a segunda procedure q passou estava um pouco grande e com muitas variáveis e loops. Como as casas são fixas (por se tratarem de números), seria mais interessante fazer uma implementação mais estática, ao invés de dinâmica como os Whiles.... Tentei pegar a mesma estrutura e implementar novamente. Retirei os loops e algumas variáveis... acho q agora tá ok. Com os números no formato 54, 4 ou 54,4 . Coloque os números sem ponto. Apenas o delimitador vírgula para os casas decimais. Dê uma olhada: create PROCEDURE [Monetario_RetornoValorPorExtenso] @valor_numerico as varchar(100), @valor_porextenso_completo as varchar(500) out AS DECLARE @valor_porextenso as varchar(500) DECLARE @Centena VARCHAR(3) DECLARE @Mil VARCHAR(3) DECLARE @Milhao VARCHAR(3) DECLARE @CentenaDecimal VARCHAR(3) DECLARE @MilDecimal VARCHAR(3) DECLARE @numero as varchar(100) DECLARE @CasasDecimais as varchar(100) --declare @valor_numerico as varchar(100) --SET @valor_numerico = '32354, 32' IF CHARINDEX(' ', @valor_numerico)=0 BEGIN SET @CasasDecimais = len(SUBSTRING (@valor_numerico, CHARINDEX(',', @valor_numerico)+1, LEN(@valor_numerico))) IF @CasasDecimais = 1 SET @valor_numerico = @valor_numerico + '000' IF @CasasDecimais = 2 SET @valor_numerico = @valor_numerico + '00' IF @CasasDecimais = 3 SET @valor_numerico = @valor_numerico + '0' END ELSE BEGIN SET @CasasDecimais = len(SUBSTRING (@valor_numerico, CHARINDEX(',', @valor_numerico)+1, LEN(@valor_numerico)))-1 IF @CasasDecimais = 1 set @valor_numerico = REPLACE(@valor_numerico, ' ' , '000') IF @CasasDecimais = 2 set @valor_numerico = REPLACE(@valor_numerico, ' ' , '00') IF @CasasDecimais = 3 set @valor_numerico = REPLACE(@valor_numerico, ' ' , '0') END --PRINT @valor_numerico set @numero = (LEFT(@valor_numerico, CHARINDEX(',', @valor_numerico)-1)) set @valor_porextenso_completo = '' -- Identifica os milhões SET @Milhao = (SUBSTRING(@numero, len(@numero)-8, 3)) IF isnumeric(@Milhao)=1 BEGIN exec Monetario_Nivel1_RetornoValorPorExtenso @Milhao, @valor_porextenso OUT IF CAST (@Milhao AS INT) = 1 set @valor_porextenso_completo = @valor_porextenso + ' Milhão, ' ELSE set @valor_porextenso_completo = @valor_porextenso + ' Milhões, ' END -- Identifica os mils SET @Mil = (SUBSTRING(@numero, len(@numero)-5, 3)) IF isnumeric(@Mil)=1 BEGIN exec Monetario_Nivel1_RetornoValorPorExtenso @Mil, @valor_porextenso OUT set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' Mil, ' END -- Identifica as centenas SET @Centena = (SUBSTRING(@numero, len(@numero)-2, 3)) IF isnumeric(@Centena)=1 BEGIN exec Monetario_Nivel1_RetornoValorPorExtenso @Centena, @valor_porextenso OUT set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' hectares, ' END set @numero = CAST((right(@valor_numerico, CHARINDEX(',', @valor_numerico)-2)) AS INT) -- Identifica os mils decimais IF len(@numero)> 3 BEGIN SET @MilDecimal = (left(@numero, 1)) IF isnumeric(@MilDecimal)=1 BEGIN exec Monetario_Nivel1_RetornoValorPorExtenso @MilDecimal, @valor_porextenso OUT set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' Mil ' END END -- Identifica as centenas decimais SET @CentenaDecimal = (right(@numero, 3)) IF isnumeric(@CentenaDecimal)=1 BEGIN exec Monetario_Nivel1_RetornoValorPorExtenso @CentenaDecimal, @valor_porextenso OUT set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' metros quadrados.' END declare @valor_numerico as varchar(100) declare @valor_porextenso as varchar(500) set @valor_numerico = '32354,332' exec Monetario_RetornoValorPorExtenso @valor_numerico, @valor_porextenso out print @valor_porextenso
-
O formato do número é: 6.054.540,4935 A procedure lê esta forma de número. Quer dizer: as centenas separadas por PONTO e as casas decimais separadas por VIRGULA. O número passado tem q estar neste formato. Teste com o número 6.054.540,4935 que veio de exemplo na procedure que funcionará. A tarde vou testar o número que passou: 54,1234
-
Ok Roberto, entendido. você fez um projeto pelo Integration e salvou, ok? você pode "schedular" a sua execução no sql. Crie um JOB e faça seu agendamento. Lá você conseguirá apontar para o projeto que criou e realizar sua execução automaticamente.
-
é.... acho q vou começar a cobrar!!! hehehehehe... brincadeira. Seguinte: a 1ª procedure [Monetario_Nivel1_RetornoValorPorExtenso] continuará da mesma forma. A 2ª procedure teve uma alteração. O problema foi a formatação do número. O cara colocou a formatação de 2 casas decimais após a virgula (que era especificado na própria procedure). Sendo assim, ele fazia um teste simples apenas. Como agora terá 4 casas, é necessário o loop para identificar os MIL e o resto do número. Alterei a estrutura. Ela está agora para 4 casas decimais fixas. Se rolar mais 1 casa decimal? Terá que alterar a estrutura novamente, ok? Fiz aqui rápido. Faça bastante testes para ver se está ok. Segue o script. Se tiver tudo ok, depois passo a conta pra depósito!!! rs... create PROCEDURE [Monetario_RetornoValorPorExtenso] @valor_numerico as varchar(100), @valor_porextenso_completo as varchar(500) out AS if @valor_numerico is null return 1 if @valor_numerico = '' return 2 declare @valor_numerico_tmp as varchar(100) declare @valor_numerico_spt as varchar(100) declare @valor_num_inter as varchar(100) declare @valor_num_cent as varchar(100) declare @valor_porextenso as varchar(500) declare @index as int declare @final as int declare @x as int -- separa valor inteiro e centavo. set @valor_num_inter = replace( left(@valor_numerico,len(@valor_numerico)), ',' , '.' ) set @valor_num_cent = right( @valor_numerico, 4 ) set @valor_numerico_tmp = @valor_num_inter set @x = 0 set @index = 0 while( 0 = 0 ) begin set @valor_numerico_tmp = right( @valor_numerico_tmp, len( @valor_numerico_tmp ) - @index ) set @index = charindex( '.', @valor_numerico_tmp ) if( @index < 1 ) break set @final = charindex( '.', @valor_numerico_tmp ) - 1 set @valor_numerico_spt = substring( @valor_numerico_tmp, 1, @final ) exec Monetario_Nivel1_RetornoValorPorExtenso @valor_numerico_spt, @valor_porextenso out set @x = @x + 1 if( len(@valor_num_inter) < 5 ) begin if( @x = 1 ) set @valor_porextenso_completo = @valor_porextenso end if( len(@valor_num_inter) between 5 and 9 ) begin if( @x = 1 ) set @valor_porextenso_completo = @valor_porextenso + ' Mil' if( @x = 2 ) set @valor_porextenso_completo = @valor_porextenso_completo + ' ' + @valor_porextenso end if( len(@valor_num_inter) > 9 ) begin if( @x = 1 ) begin if( cast(@valor_numerico_spt as int) > 1 ) set @valor_porextenso_completo = @valor_porextenso + ' Milhões ' else set @valor_porextenso_completo = @valor_porextenso + ' Milhão ' end if( @x = 2 ) set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' Mil' if( @x = 3 ) set @valor_porextenso_completo = @valor_porextenso_completo + ' ' + @valor_porextenso end end set @valor_porextenso_completo = @valor_porextenso_completo + ' Hectares' if( @valor_num_cent > 0 ) begin while( 0 = 0 ) begin set @valor_numerico_tmp = substring(@valor_num_cent, 1, 1) IF cast(@valor_numerico_tmp AS INT) = 0 BREAK exec Monetario_Nivel1_RetornoValorPorExtenso @valor_numerico_tmp, @valor_porextenso out set @valor_porextenso_completo = @valor_porextenso_completo + ' e ' + @valor_porextenso + ' Mil' set @valor_numerico_tmp = (substring(@valor_num_cent, 2, 3)) IF cast(@valor_numerico_tmp AS INT) = 0 BREAK exec Monetario_Nivel1_RetornoValorPorExtenso @valor_numerico_tmp, @valor_porextenso OUT set @valor_porextenso_completo = @valor_porextenso_completo + ' e ' + @valor_porextenso IF cast(@valor_numerico_tmp AS INT) < 999 BREAK END set @valor_porextenso_completo = @valor_porextenso_completo + ' Metros Quadrados' end declare @valor_numerico as varchar(100) declare @valor_porextenso as varchar(500) set @valor_numerico = '6.054.540,4935' exec Monetario_RetornoValorPorExtenso @valor_numerico, @valor_porextenso out print @valor_porextenso
-
Bom dia Ronni, A cláusula on m1.[From] = tudo.[From] está incorreta, pois o tudo é um alias (apenas um apelido). Da forma que fez, o tudo teria q ser uma variável q conteria o resultado do count.
-
Bom dia EMSO, Pesquise na base se o objeto existe: SELECT * FROM sysobjects s WHERE NAME = 'PF_HISTORICOVENDA' Caso queira, poderá utilizar o IF EXISTS para identicar a sua criação ou não na base.
-
O SQL Lite é bem legal mesmo!! Mas o Management Studio é a partir do 2005...
-
Bom dia ROMANVPP, O problema pode estar realmente no subselect utilizado. Verifique nos dois bancos de dados se os índices na tabela tmov estão iguais. Tente não utilizar subselects, pois a performance cai consideravelmente....
-
Bom dia Abelha, Dei uma olhada rápida em sua procedure, mas não identifiquei nenhuma variável criada como DECIMAL. Quando precisar de manipular informações depois da vírgula, o melhor tipo para se utilizar seria este. Se utilizar int, terá um problema com as casas decimais. Da mesma forma se utilizar varchar, onde os cálculos ficarão difíceis de fazer... tente fazer a implementação utlizando o DECIMAL. Ex.: DECLARE @teste DECIMAL (5,4) SET @teste = 5 SELECT @teste
-
Bom dia Roberto, A maneira mais simples de importar os arquivos será pelo Wizard do Sql Server. Studio Management / clicar com o botão direito do mouse no nome do banco / opção Tasks / Import Data.
-
Bom dia fantasma, você pode criar uma procedure que faça isto. Poderá agendar a execução para cada 2 horas disparar. Utilize a funcionalidade xp_sendmail para enviar os emails. Link: http://msdn.microsoft.com/pt-br/library/ms189505.aspx OBS.: algumas configurações devem ser realizadas para que o sql possa utilizar a funcionalidade.
-
Boa tarde malemida, Segue link: http://msdn.microsoft.com/pt-br/library/ms189828.aspx
-
Boa tarde Fernando, Segue link abaixo: http://msdn.microsoft.com/pt-br/library/ms177410.aspx
-
Bom dia Leo, Tem como ver sim. Para acessar o log, você poderá utilizar: dbcc log (NomeBancoDados, 0 a 4) --> 0 é menos detalhado e 4 mais detalhado. ou SELECT * FROM ::fn_dblog(null, null)
-
update tabela set TextoNoBanco = (t.TextoNoBanco+t1.TextoNovo) from tabela t, tabela1 t1 where t.id=t1.id and...
-
Mas para que você quer fazer o select? você poderá utilizar o update com todas as cláusulas q utilizaria no select...
-
Bom dia Vinicius, Faça o update da forma que postou, dá certo: TextoNoBanco = (TextoNoBanco+TextoNovo)
-
Tira todos os campos do gorup by, deixando apenas as tabelas Clientes e tblAtendimento. Faça os testes. Se der certo, vai completando com as demais tabelas. Bem provável que seja o agrupamento...
-
Pode ser então o agrupamento q está fazendo. Não mexa no seu script. Faça outro mais simples para testes, retirando os agrupamentos realizados.
-
Boa tarde Leo, você teria q identificar as datas. Sendo assim teria que dar um select distinct nas datas de vencimentos. Pegaria as datas que retornasse e colocaria no seu select, dando o TOP XXX que quisesse. Utilizaria o UNION para cada data de vencimento.... Para fazer desta forma seria muito complicado e além disto a sua performance não ficaria boa. O que poderia fazer é implementar a idéia q dei no post acima: filtrar o recordset no fonte. você o carregaria por inteiro. Depois disto iria fazendo um filtro para cada data, com um contador para identificar quantos resultados deseja.
-
Boa tarde Vinicius, Não tenho as tabelas para fazer os testes, mas tente fazer desta forma: SELECT dbo.tblClientes_grupos.NM As Grupo, dbo.tblAtendimento.CD_Cliente, dbo.Clientes.NomeDoCliente As Cliente, dbo.tblAtendimento.ID As Att, Month(dbo.tblAtendimento.DT_Atendimento) As Mes_Att, dbo.tblAtendimento.DT_Atendimento, NM_Att = Case Month(dbo.tblAtendimento.DT_Atendimento) When '1' Then 'JANEIRO' When '2' Then 'FEVEREIRO' When '3' Then 'MARÇO' When '4' Then 'ABRIL' When '5' Then 'MAIO' When '6' Then 'JUNHO' When '7' Then 'JULHO' When '8' Then 'AGOSTO' When '9' Then 'SETEMBRO' When '10' Then 'OUTUBRO' When '11' Then 'NOVEMBRO' When '12' Then 'DEZEMBRO' End, dbo.tblOrdens_servico.ID As OS, Month(dbo.tblOrdens_servico.DT_Os) As Mes_OS, dbo.tblOrdens_servico.DT_Os, NM_OS = Case Month(dbo.tblOrdens_servico.DT_Os) When '1' Then 'JANEIRO' When '2' Then 'FEVEREIRO' When '3' Then 'MARÇO' When '4' Then 'ABRIL' When '5' Then 'MAIO' When '6' Then 'JUNHO' When '7' Then 'JULHO' When '8' Then 'AGOSTO' When '9' Then 'SETEMBRO' When '10' Then 'OUTUBRO' When '11' Then 'NOVEMBRO' When '12' Then 'DEZEMBRO' End, Externo = Case (dbo.tblOrdens_servico.TP_Externo) When '1' Then 'X' End, Interno = Case (dbo.tblOrdens_servico.TP_Interno) When '1' Then 'X' End, ATT_Status = Case (dbo.tblAtendimento.TP_Status) When '1' Then 'ABE' When '2' Then 'AND' When '3' Then 'FEC' End, OS_Status = Case When (dbo.tblOrdens_Servico.TP_Aberta = 1) Then 'ABE' When (dbo.tblOrdens_Servico.TP_Andamento = 1) Then 'AND' When (dbo.tblOrdens_Servico.TP_Concluida = 1) Then 'FEC' End, ATT_AbertoTotal = Case When (dbo.tblAtendimento.TP_Status = 1 Or dbo.tblAtendimento.TP_Status = 2) Then Count(dbo.tblAtendimento.CD_Cliente) End, ATT_FechadoTotal = Case When (dbo.tblAtendimento.TP_Status = 3) Then Count(dbo.tblAtendimento.CD_Cliente) End, OS_AbertoTotal = Case When (dbo.tblOrdens_Servico.TP_Aberta = 1 Or dbo.tblOrdens_Servico.TP_Andamento = 1) Then Count(dbo.tblAtendimento.CD_Cliente) End, OS_FechadoTotal = Case When (dbo.tblOrdens_Servico.TP_Concluida = 1) Then Count(dbo.tblAtendimento.CD_Cliente) End, GETDATE() As DT_Imp FROM dbo.Clientes LEFT JOIN dbo.tblAtendimento On dbo.tblAtendimento.CD_Cliente = dbo.Clientes.CódigoDoCliente LEFT JOIN dbo.tblClientes_grupos On dbo.Clientes.ID_Grupo = dbo.tblClientes_grupos.ID INNER JOIN dbo.Funcionários On dbo.tblAtendimento.CD_Tecnico = dbo.Funcionários.CódigoDoFuncionário LEFT JOIN dbo.tblOrdens_servico On dbo.tblAtendimento.ID = dbo.tblOrdens_servico.ID_Atendimento WHERE (dbo.tblAtendimento.CD_Cliente Is Not Null) And (dbo.Funcionários.NomeDoFuncionário Is Not Null) GROUP BY dbo.tblClientes_grupos.NM, dbo.tblAtendimento.CD_Cliente, dbo.Clientes.NomeDoCliente, dbo.tblAtendimento.ID, Month(dbo.tblAtendimento.DT_Atendimento), Month(dbo.tblOrdens_servico.DT_Os), dbo.tblOrdens_servico.ID, dbo.tblAtendimento.CD_Tecnico, dbo.tblOrdens_servico.TP_Externo, dbo.tblOrdens_servico.TP_Interno, dbo.tblAtendimento.DT_Atendimento, dbo.tblOrdens_servico.DT_Os, dbo.Funcionários.NomeDoFuncionário, dbo.tblAtendimento.TP_Status, dbo.tblOrdens_Servico.TP_Aberta, dbo.tblOrdens_Servico.TP_Andamento, dbo.tblOrdens_Servico.TP_concluida ORDER BY dbo.Clientes.NomeDoCliente asc, dbo.tblAtendimento.DT_Atendimento asc
-
Gerando Chave Primária considerando duas tabelas
pergunta respondeu ao rodoflho de fulvio em SQL Server
Boa tarde Rodoflho, As duas tabelas possuem o campo ID auto incremental? Se for, poderá identificar o máximo das duas tabelas - max(ID). Após esta identificação, você criará uma coluna ID nova, como chave. Mas se fizer somente isto, a numeração da PK (quse será auto incremental) começará no 1. Antes de inserir os dados, altere a PK para que começe com um número maior que o max dos ID´s pesquisados. Ou então se quiser manipular as PK´s das tabelas, poderá desativá-las, realizar a manutenção e reativá-las novamente.