Ir para conteúdo
Fórum Script Brasil

fulvio

Moderadores
  • Total de itens

    1.218
  • Registro em

  • Última visita

Tudo que fulvio postou

  1. Tópico movido para Tutoriais & Dicas - SQL Server .
  2. Sim, deve rodar direto no Banco de Dados. Mas antes faça os testes para ver se está ok... :.)
  3. Bom dia Mauricio, Utilize a sintaxe: update NomeTabela set datafim=(dateadd(year, 1, datainicio))
  4. Bom dia Fritox, A modelagem deverá ser de acordo com as suas regras de negócios. A princípio vejo três tabelas: Materia Prima, Produto e Cliente. Agora o que deve fazer é identificar os relacionamentos entre elas. A maioria das respostas quem lhe dará será a própria pessoa (empresa) que solicitou a implementação. Ex.: O produto pode ter 1 ou N matérias primas? A matéria prima pode pertencer a 0 ou N produtos? Caso as respostas sejam positivas nas duas perguntas, você terá que realizar a normalização das tabelas (criação de outra tabela, contendo as chaves primárias das duas tabelas relacionadas, com o intuito de retirar o relacionamento de N para N existente).
  5. Boa tarde Amigo, Espero que ajude... - Inteiro: Int(Valor) -positivo: Há a função Sgn(Valor). Se retornar 1, é positivo. Se retornar -1, é negativo. Se retornar 0, o número é zero. Prefiro testar: If Valor > 0 Then -numerico: isnumeric(Valor)
  6. Bom dia Leandro, Com o VB6 você consegue ler, manipular e criar arquivos XML. Acrescente a referência msxml3.dll ao seu programa. Há várias versões da dll. Na minha máquina possuo a msxml2.dll, 3, 4, 5 e 6. Particularmente utilizo a versão 3. Dá uma olhada neste documento também, muito interessante para o entendimento. http://www.macoratti.net/xml_vb.htm
  7. Bom dia Fernando, O exemplo que postou é o resultado que deseja? Data | Cheques | Banco | Total 01/04/2010 | 100,00 | 100,00 | 200,00 02/04/2010 | 0,00 | 20,00 | 20,00 Como os dados estão sendo visualizados? Como é a estrutura da tabela de origem em que os dados serão manipulados para obter o resultado acima? Ex.: DataPagamento | DataVencimento | ChequesReceber XXXX | XXX | XX,XX XXXX | XXX | XX,XX
  8. Boa tarde Benzela, - abra o Management Studio. - entre como administrador. - vá até o Banco criado e clique com o botão direito do mouse. - vá em Propriedades / Pemissões. - adicione o usuário.
  9. Só não entendi a coluna LTS. Seria interessante você referenciar qual coluna está contando. Mas vamos lá. Como tenho a base de dados, não deu pra rodar o script. Acrescentei a coluna ColunaPossuiLTS no script para ser substituido (creio que seja o U.T01004_S_SIGLA). Ele também deve estar no order by. Altera e vê se roda: SELECT U.T01004_S_SIGLA AS Secretaria ,COUNT (ColunaPossuiLTS) AS QUANTIDADE_LTS ,S.T01001_I_MATRICULA AS MATRICULA , COUNT (T01004_S_SIGLA) AS QUANTIDADE_Matricula FROM RH.T01135_LTS LTS LEFT JOIN RH.T01101_LAUDO LAUDO ON LAUDO.T01135_I_CDLTS = LTS.T01135_I_CDLTS AND LAUDO.T01135_I_ANO = LTS.T01135_I_ANO AND LAUDO.T01135_I_SEQUENCIA = LTS.T01135_I_SEQUENCIA AND LAUDO.T01135_I_TPDOC = LTS.T01135_I_TPDOC LEFT JOIN RH.T01260_REVISAOAPO APOS ON APOS.T01135_I_CDLTS = LTS.T01135_I_CDLTS AND APOS.T01135_I_ANO = LTS.T01135_I_ANO AND APOS.T01135_I_SEQUENCIA = LTS.T01135_I_SEQUENCIA AND APOS.T01135_I_TPDOC = LTS.T01135_I_TPDOC INNER JOIN RH.T01001_SERVIDOR S ON S.T01002_I_CDENT = LTS.T01002_I_CDENT AND S.T01001_I_MATRICULA = LTS.T01001_I_MATRICULA INNER JOIN RH.T01000_PESFISICA P ON P.T01000_I_CDPESFIS = S.T01000_I_CDPESFIS INNER JOIN RH.T01004_UNIDFUNC U ON U.T01002_I_CDENT = S.T01002_I_CDENT AND U.T01004_I_CDUNIDFUN = S.T01001_I_CDORGLOT AND U.T01004_I_VERSAO = S.T01001_I_VORGLOT LEFT JOIN RH.T01265_FUNCPERICIA PERITO ON PERITO.T01265_I_CDFUNCIONARIO = LTS.T01135_I_CDMEDPERITO LEFT JOIN RH.T01001_SERVIDOR SP ON SP.T01002_I_CDENT = PERITO.T01002_I_CDENT AND SP.T01001_I_MATRICULA = PERITO.T01001_I_MATRICULA LEFT JOIN RH.T01000_PESFISICA PP ON PP.T01000_I_CDPESFIS = SP.T01000_I_CDPESFIS GROUP BY U.T01004_S_SIGLA ,S.T01001_I_MATRICULA, ColunaPossuiLTS ORDER BY U.T01004_S_SIGLA
  10. fulvio

    Diversas Transações

    Bom dia Oysk, Tem como fazer sim, desde que o tratamento do erro seja administrado pelo sql. você inicia a transação via aplicativo e depois chama uma procedure. porque não chamar a procedure e iniciar a transação dentro dela mesmo? O Try/Cath estão corretos. O controle das transações cabem ao Banco, e não ao aplicativo. Pense comigo: se o aplicativo abre uma transação, e no meio da execução da procedure o PC é desligado.... quem fechará a transação? A probabilidade de ocorrer isto é baixa, mas existe. Na procedure, você abre uma transação (TRAN_02) apenas para fazer um insert. A transação é utilizada quando se deseja fazer mais de uma manipulação em uma única transação. Se você fizer dois inserts desta forma: insert into .... insert into .... Está implicito nos comandos, depois de cada insert, um commit. Sendo assim, o sql faz um a um e "commita" um a um. Se você fizer dois inserts assim: BEGIN TRANSACTION insert into .... insert into .... COMMIT TRANSACTION O sql irá efetivar (gravar) os dois insert´s em uma única transação. Voltando ao seu exemplo... por ser apenas um insert, faria desta forma: DECLARE @P_DT_PGTO datetime DECLARE @P_COD_USUARIO int SET @P_DT_PGTO = '20100515' SET @P_COD_USUARIO = 152 EXECUTE [SIP].[SP_GERA_SIP_PGTO] @P_DT_PGTO, @P_COD_USUARIO CREATE PROCEDURE [SIP].[SP_GERA_SIP_PGTO]( @P_DT_PGTO DATETIME, @P_COD_USUARIO INT ) AS IF (@P_DT_PGTO IS NULL) OR (@P_COD_USUARIO IS NULL) BEGIN INSERT INTO SIP.LOG_SIP values('DATA DE PAGAMENTO OU USUÁRIO NÃO INFORMADO(S)') IF @@ERROR>0 BEGIN -- Aqui você coloca o seu tratamento de erro. Inserção na tabela de erro, etc. RETURN END END Mas se você tiver uma estrutura maior, com várias manipulações, você pode implementar na procedure como fez o Try/Cath. Só lembrando que você dá o ROLLBACK e depois grava as informações: BEGIN CATCH ROLLBACK TRANSACTION -- Aqui você coloca o seu tratamento de erro. Inserção na tabela de erro, etc. END CATCH
  11. Bom dia Diego, Tente fazer assim: select count(distinct T01001_I_MATRICULA) from rh.T01135_LTS
  12. Bom dia Diego, A listagem que postou é a tabela origem? Secretaria MATRICULA NOME QT de LAUDOS CGM 132160 DEUSIMAR LEITE 1 CGM 525032 LUIZ FELIPE DE SOUZA 2 CGM 529086 ULISSES DE MATTOS 1 CGM 529642 ELAINE ALVARENGA OLIVEIRA 1 Com um subselect seria uma alternativa. Ficaria mais ou menos assim: SELECT U.T01004_S_SIGLA AS Secretaria , COUNT (*), (select count(*) from TabelaPostada where ...) as QT_SERVIDORES FROM .... Na cláusula WHERE do subselect, você pode referenciar colunas de tabelas que já estão identificadas no corpo do select normal, ex.: SELECT U.T01004_S_SIGLA AS Secretaria , COUNT (*), (select count(*) from TabelaPostada where TabelaPostada.Coluna = S.T01002_I_CDENT ...) as QT_SERVIDORES FROM .... Uma dica: Quando tenho que fazer selects muito grandes, utilizando muitas tabelas, prefiro fazer passo a passo: - Crio uma temporária com todos os campos que necessito; - Insiro a chave de referência (a maioria das vezes a PK); - "Updato" os demais campos. Com relação à performance: se você referenciar várias tabelas em apenas um select, os resultados de um relacionamento terão impacto direto nos outros. A probabilidade de referenciar uma tabela locada aumenta (pois há referência de muitas tabelas no script). O mapa de execução será grande. Consumo de memória também. Fazendo passo a passo, as pesquisas/inserções serão direcionadas e pontuais (mais curtas). Mapa de execução menor, com menos consumo de memória. Mesmo tendo mais comandos, as vezes o custo/benefício das recuperações de dados em etapas são mais vantajosas. As vezes o processamento fica até mais rápido. O entendimento também fica melhor.
  13. Bom dia Marco, Se tirar o SUM, você estará tentando atribuir mais de um valor para uma variável. O mesmo erro dará se fizer isto (onde a tabela NomeTabela tenha mais de uma coluna): Declare @Valor int Set @Valor = (select * from NomeTabela) Faça o seguinte: desmembre os selects, vá rodando um a um e incorporando novamente na estrutura que montou. No caso abaixo: SELECT SUM( SELECT ( SELECT SUM( ( (CADIR.percentual/100) * CADCTR2.valor_parcela) ) /* end sum.. */ FROM CADIR WHERE CADIR.IrCod = 1 ) FROM CADCTR4 WHERE CADCTR4.CtrCod = CADCTR2.CtrCod AND CADCTR4.CtrParc = CADCTR2.CtrParc ) FROM CADCTR2 WHERE CADCTR2.CtrCod = 10 AND CADCTR2.CtrParc = 2 Rode em separado o select que está em negrito. Ele te retornará um valor. Pegue o valor e rode o outro select, utilizando agora o valor de retorno (vamos supor que o valor de retorno seja 1500). Ficará assim: SELECT SUM( SELECT ( 1500 ) FROM CADCTR4 WHERE CADCTR4.CtrCod = CADCTR2.CtrCod AND CADCTR4.CtrParc = CADCTR2.CtrParc ) FROM CADCTR2 WHERE CADCTR2.CtrCod = 10 AND CADCTR2.CtrParc = 2 O próximo select ficará montado desta forma (em negrito): SELECT SUM( SELECT (1500) FROM CADCTR4 WHERE CADCTR4.CtrCod = CADCTR2.CtrCod AND CADCTR4.CtrParc = CADCTR2.CtrParc ) FROM CADCTR2 WHERE CADCTR2.CtrCod = 10 AND CADCTR2.CtrParc = 2 O que o sql está entendo neste select: retorne a soma do valor 1500 (que será ele mesmo) caso o resultado for alguma coisa. Independente do que o resultado trouxer, o valor sempre será 1500. Rode somente este select e faça os testes alterando a cláusula "where", para trazer novos valores de retorno.
  14. Bom dia Marco, Não estou com o sql nesta máquina aqui para testar, mas vamos lá: - Qual a mensagem de erro? - A função SUM retorna um valor, correto? Então no subselect que faz: SELECT SUM((CADIR.percentual/100) * CADCTR2.valor_parcela) FROM CADIR WHERE CADIR.IrCod = 1 você terá um valor de resultado. Ex.: 1500 Então o outro subselect será montado desta forma: SELECT SUM(SELECT 1500 FROM CADCTR4 WHERE CADCTR4.CtrCod = CADCTR2.CtrCod AND CADCTR4.CtrParc = CADCTR2.CtrParc) FROM ... O problema pode estar ai. O que estava querendo fazer? você pode utilizar, ao invés de subselect´s, o sum de um valor "+" o sum do outro.
  15. fulvio

    Incremento em String IP

    Boa tarde Amigo, select substring('10.20.30.40', 1, 9) + cast(substring('10.20.30.40', 10, 2) + 1 as varchar(3)) Lembrando que isto é apenas um exemplo. Implemente sua função, verificandos os IP´s que tenham 1, 2, ou 3 algarismos no final.
  16. Boa tarde Diego, Teoricamente não há o que tirar do script (se os relacionamentos são realmente necessários). Para utilizar o count, você terá que utilizar o group by. No final (antes do order by) você coloca o group by dos campos de retorno. Confira para que o resultado não seja alterado. Depois você dá o count nos dois campos que necessita. No caso da função ISNULL que utiliza, você terá que referenciar os dois campos no agrupamento. Dê uma olhada no retorno da função fnDadosCarreiraCargo também. Outra solução será criar uma temporária (pode ser até em tempo de execução), jogar o resultado nesta temporária e dar o count nos dados.
  17. Bom dia Viperino, Colocando um identificador, fica mais fácil realmente. Fica aí mais uma forma de implementação. :.) Caso precise de alguma ajuda, pode postar!!
  18. Bom dia Viperino, Com certeza. O que vale é aparecer!!! :.) Neste exemplo então você terá que utilizar um ALIAS. Como já expliquei, agora você terá que fazer!!! rs. Se um utente (U_Id) pode ser tanto "normal" como médico, você terá que referenciar a tabela Historico_Analises duas vezes. Uma vinculando ao "normal" e outra ao médico. Ex.: select hn.HA_U_Id_Utente UtenteNormal , hm.HA_U_Id_Medico UtenteMemdico, count(distinct hn.HA_Z_Id) as [Numero de Mudancas Normal], count(distinct hm.HA_Z_Id) as [Numero de Mudancas Medico], u.U_Nome from Utente u left join Historico_Analises hn on u.U_Id = hn.HA_U_Id_Utente left join Historico_Analises hm on u.U_Id = hm.HA_U_Id_Medico Ficaria mais ou menos assim. Testa e vê se dá certo.
  19. Tópico divido. Continuação: http://scriptbrasil.com.br/forum/index.php?showtopic=148835
  20. Faz pouco tempo que tive seu contato para estagiar... vi pelos foruns que sua administração foi marcante, com posicionamentos respeitados por todos. Estes pontos são de pessoas boas no que fazem!! Obrigado por ter me ajudado a chegar até aqui. Que a vida lhe dê em dobro tudo o que dedicou!! Muito sucesso!!
  21. Tópico inicial: http://scriptbrasil.com.br/forum/index.php?showtopic=148768 Bom dia Viperino, rs... sem problemas. O problema está no relacionamento entre as tabelas Historico_Analises e Utente. Perceba que você está relacionando duas colunas da tabela Historico_Analises para uma coluna da tabela Utente. HA_U_IT_Utente=U_Id HA_U_IT_Medico=U_Id Qual é o relacionamento correto? Vamos às explicações: - Na 1ª imagem que postou, os relacionamentos entre as tabelas estavam na ordem: T_Ana_Ind, Historico_Analises e Tipo_Analise. Quando fez o select, a ordem dos joins estavam invertidos. Neste caso o resultado não interfere (pois estavam relacionadas com INNER JOIN), mas o entendimento fica mais dificil. - Quanto aos há, h, t.... Isto se chama ALIAS. É apenas um apelido para a tabela. A sintaxe ...from dbo.Tipo_Analise ta... é a mesma coisa de ...from dbo.Tipo_Analise AS ta.... você dá um apelido à tabela. Após isto, quando desejar referenciar algum campo ou fazer os join´s, você não precisará digitar todo o nome dela, apenas referenciá-la pelo apelido. você pode fazer desta forma: select Pessoa_Fisica.Nome, Pessoa_Fisica.Idade, Pessoa_Fisica.Endereco from Pessoa_Fisica, .... Ou então, dar um apelido à tabela Pessoa_Fisica. O mesmo select de cima: select p.Nome, p.Idade, p.Endereco from Pessoa_Fisica as p, .... O AS pode ser suprimido, ficando: select p.Nome, p.Idade, p.Endereco from Pessoa_Fisica p, .... O select continua a mesma coisa, só que mais "limpo". :.)
  22. Tópico dividido. Continuação: http://scriptbrasil.com.br/forum/index.php?showtopic=148768
  23. fulvio

    Documentar Banco

    São muitas funções do SQL. Aconselho ir olhando o que o pessoal solicitou e ir fazendo os scripts. Pegue um tópico, tipo tamanho da Base: pesquise na rede como se consegue extrair esta informação via script no SQL. Um script completo com o que quer não irá encontrar.
×
×
  • Criar Novo...