Ir para conteúdo
Fórum Script Brasil

fulvio

Moderadores
  • Total de itens

    1.218
  • Registro em

  • Última visita

Tudo que fulvio postou

  1. Bom dia Hellyson... ok, agora entendi!!! :.) É.... essa ai ficou mais difícil mesmo. Seguinte: criei a estrutura no mesmo esquema da outra. Inserido os filhos diretos, e depois fui inserindo os filhos dos filhos. Fiz duas colunas de controle, onde os filhos são inseridos para serem testados também. Coloquei umas explicações no script. Pelos dados que me passou, rodou legal. Agora você terá q fazer os testes na base com mais registros, pra ver se está ok. Testa aí e depois você me fala, beleza? -- Criação das tabelas em instância create table #asset (Pai varchar(30), Filho varchar(30)) create table #Resultado (Pai varchar(30), Filho varchar(30), Controle int, Sequencial int identity) -- inserção dos dados da tabela insert into #asset (Pai, Filho) values ('HelpDesk', 'Reset de Senha') insert into #asset (Pai, Filho) values ('HelpDesk', 'Suporte Remoto') insert into #asset (Pai, Filho) values ('HelpDesk', 'Liberação de Acesso') insert into #asset (Pai, Filho) values ('Liberação de Acesso', 'Portaria') insert into #asset (Pai, Filho) values ('Liberação de Acesso', 'CPD') insert into #asset (Pai, Filho) values ('CPD', 'Criação de Logins') -- select * from #asset Declare @Pai varchar(30) Declare @Filho varchar(30) Declare @Sequencial int -- Aqui você passa o pai que deseja pesquisar set @Pai='HelpDesk' -- carga dos filhos diretos insert into #Resultado (Pai, Filho) select Pai, Filho from #asset where pai=@Pai -- setando variaveis de controle set @Sequencial = (select top 1 Sequencial from #Resultado where controle is null) set @Filho = (select Filho from #Resultado where Sequencial=@Sequencial) While @Filho <> '' Begin -- aqui você insere os filhos dos filhos com status de controle null, para nova verificação -- na tabela de resultado, coloquei o nome do pai fixo. Caso queira alterar, trocar a variavel @Pai do select insert into #Resultado (Pai, Filho) select @Pai, Filho from #asset where pai=@Filho update #Resultado set Controle=1 where Sequencial=@Sequencial set @Sequencial = (select top 1 Sequencial from #Resultado where controle is null) set @Filho = (select Filho from #Resultado where Sequencial=@Sequencial) End select * from #Resultado
  2. Outra coisa q esqueci de falar: a soma do campo "vlrprest" nunca retornará nulo. Então, você poderá retirar a verificação isnull e deixar apenas o case. Faz um teste e depois me fala....
  3. Putz... foi mal Amigo. Se a tabela "prestacoes" tivesse a coluna "cod" o sql dava erro de ambiguidade. Seguinte... caso o "sum(vlrprest)" seja zero, o retorno será zero e não 1. Acrescentei um case pra saber se a soma dá zero. Testa aí e me fala se dá certo.... :.) select cod, (select isnull(case (sum(vlrprest)) when 0 then 1 end,1) from prestacoes p where p.codloja=l.cod and MONTH(dtvenc)=@m10 and year(dtvenc)=@a10)tot from lojas l where cod = 0
  4. Boa tarde Amigo. Não sei se entendi direito. Mas vamos lá... Fiz um script com os dados que passou no exemplo acima: - HelpDesk - Reset de Senha - Suporte Remoto - Liberação de Acesso - Portaria - CPD Fiz um loop, inserindo as correlações entre os campos (pelo q entendi, é isso q quer). Peguei um pai e inseri todos os filhos, e assim por diante. Roda o script abaixo e me fala se era isso q estava querendo, ok? Espero ter ajudado. -- criação da temporária em instância. Roda apenas 1 vez. create table #Tabela (Descricao varchar(30), controlePai tinyint identity) create table #Relacionamentos (Pai varchar(30), Filho varchar(30)) -- inserção dos dados na tabela insert into #Tabela (Descricao) values ('HelpDesk') insert into #Tabela (Descricao) values ('Reset de Senha') insert into #Tabela (Descricao) values ('Suporte Remoto') insert into #Tabela (Descricao) values ('Liberação de Acesso') insert into #Tabela (Descricao) values ('Portaria') insert into #Tabela (Descricao) values ('CPD') -- select * from #Tabela -- roda o script por completo... declare @Cont int declare @Descricao varchar(30) Set @Cont = 1 Set @Descricao = (select top 1 Descricao from #Tabela where controlePai=@Cont) while @Cont < (select max(controlePai) from #Tabela) Begin insert into #Relacionamentos (Pai, Filho) select @Descricao, descricao from #Tabela where controlePai<>@Cont Set @Cont = @Cont + 1 Set @Descricao = (select top 1 Descricao from #Tabela where controlePai=@Cont) End -- até aqui. -- ver o resultado select * from #Relacionamentos
  5. Boa tarde Amigo... Esse aí ta estranho mesmo!!! :.) Mas o q pude perceber é q tá faltando o alias na clausula "where cod = 0". Não dá pra executar aqui, mas tenta identificar qual cod você está referenciado, para descartar erros. Se o cod for da loja, coloca "where l.cod = 0". Não vejo mais nada de errado, pelo menos na sintaxe.... Testa aí depois você me fala, ok? Até mais.
  6. Bom dia Roberto.... se quiser, pode me adicionar no MSN ou me passar um email com a estrutura. daasabh@hotmail.com Até mais...
  7. O sql ficou um pouco grande mesmo, mas pra retirar a duplicidade você teria q remodelar a base.... :.( A remodelagem é bem desgastante, pois necessita de alterações em várias partes do fonte. Mas vai ai uma idéia... Os relacionamentos irão depender das regras de negócio. No exemplo abaixo, modelei para que tenha Executor sem Serviço. De acordo com o exemplo que passou, isso pode ocorrer... mantive a mesma idéia. Neste caso em específico, o resultado é o mesmo. Abaixo está um exemplo dos scripts. Espero ter ajudado. :.) -- executa uma vez, pra criar a tabela na instância. create table #Ordem (CodOrd int, Texto varchar(30)) create table #Servico (CodOrd int, CodSer int, Valor float) create table #Executor (CodSer int, CodExe int, Valor float) -- inserção dos dados q passou no exemplo. insert into #Ordem (CodOrd, Texto) values (1234, 'Teste') insert into #Servico (CodOrd, CodSer, Valor) values (1234, 147, 154) insert into #Servico (CodOrd, CodSer, Valor) values (1234, 258, 657) insert into #Servico (CodOrd, CodSer, Valor) values (1234, 369, 369) insert into #Executor (CodSer, CodExe, Valor) values (258, 987, 5) insert into #Executor (CodSer, CodExe, Valor) values (369, 654, 7.5) select sum(e.valor), sum(s.valor) from #Ordem o left join #Servico s on o.CodOrd=s.CodOrd left join #Executor e on s.CodSer=e.CodSer where o.CodOrd=1234
  8. Bom dia Alecsandro. Ok. Esta query possui a mesma lógica q te passei. A diferença que crio a tabela temporária com as tabelas da base e "updato" com a quantidade de registros. Nesta que postou, são realizadas as duas coisas em uma única execução. UMA DICA: prefira utilizar loops (while) ao invés de cursores, pois estes são mais "pesados" no processamento. Até mais.
  9. Boa tarde Roberto. Não sei se entendi o problema ao certo, mas vamos lá!! De acordo com os dados que passou no exemplo, se você fizer o join entre as 3 tabelas, irá exponencializar o resultado. você terá q fazer o select em separado, fazendo o join entre Ordem x Executor e Ordem x Servico. Fiz uns testes no Sql, q estão abaixo. Roda ai e depois me fala se é isso mesmo q estava querendo.... Criei as temporárias de acordo com o exemplo, inseri os dados e fiz o select. No script tem alguns comentários. Espero que ajude, ok? -- executa uma vez, pra criar a tabela na instância. create table #Ordem (CodOrd int, Texto varchar(30)) create table #Executor (CodOrd int, CodExe int, Valor float) create table #Servico (CodOrd int, CodSer int, Valor float) -- inserção dos dados q passou no exemplo. insert into #Ordem (CodOrd, Texto) values (1234, 'Teste') insert into #Executor (CodOrd, CodExe, Valor) values (1234, 987, 5) insert into #Executor (CodOrd, CodExe, Valor) values (1234, 654, 7.5) insert into #Servico (CodOrd, CodSer, Valor) values (1234, 147, 154) insert into #Servico (CodOrd, CodSer, Valor) values (1234, 258, 657) insert into #Servico (CodOrd, CodSer, Valor) values (1234, 369, 369) -- duplicidade das informações select sum(e.valor), sum(s.valor) from #Executor e, #Servico s, #Ordem o where o.CodOrd=1234 and o.CodOrd=e.CodOrd and o.CodOrd=s.CodOrd -- select separado, utilizando subselect select o.Texto, o.CodOrd, (select sum(valor) FROM #Executor where CodOrd=o.CodOrd) as TotalExecutor, (select sum(valor) FROM #Servico where CodOrd=o.CodOrd) as TotalServico, ((select sum(valor) FROM #Executor where CodOrd=o.CodOrd)+(select sum(valor) FROM #Servico where CodOrd=o.CodOrd)) as SomaExecutorServico from #Ordem o where o.CodOrd=1234 -- and o.Status='F' - ai você coloca as clausulas, de acordo com a estrutura
  10. Boa tarde Jorge... Como o campo não tem tamanho fixo e pode ter letras, você terá q ler cada posição do string e ir somando. Outra coisa: você não conseguirá executar lendo diretamente da tabela: "select XXX from product". você pode fazer uma temporária com duas colunas, tendo a 1ª coluna o campo a ser somado e o 2º campo o Total. Preencha a variável @Campo (abaixo) dando um "select top 1 XXXX from TEMPORARIA where Total is null". Executa o script (abaixo) e "updata" o campo Total. Faz um loop até preencher toda a coluna Total. Coloquei um exemplo logo abaixo. Espero q ajude. Se tiver dificuldade pra fazer, me fala... -- Seleciona o script todo e roda declare @Campo as varchar(10) declare @Cont as int declare @Total as int -- Coloca aqui o campo que deseja somar set @Campo='ae1234' set @Cont = 1 set @Total = 0 While (select len(@Campo)) >= @Cont Begin if isnumeric(substring(@Campo, @Cont, 1)) = 1 set @Total = (@Total + (convert(NUMERIC(6,0), (substring(@Campo, @Cont, 1))))) set @Cont = @Cont + 1 End select @Total
  11. Boa tarde Amigo... No sql tem como fazer sim, mas.... qual é a real necessidade? :.) Pergunto porque quanto mais enxuto for o Sql, melhor!! você economiza processamento, armazenamento e transferência das informações. você pode retornar estes valores para o aplicativo, e nele implementar a função q está querendo. Não deixe este processo para o banco executar... Mas se quiser fazer no Sql, pode fazer uma temporária, que lê a quantidade de casas na coluna QUANTIDADE, entra em um loop q insere a descrição CASA para cada linha. Da mesma forma que faria no aplicativo, dá para fazer no Sql. Se realmente necessitar de fazer via Sql e não conseguir com a explicação acima, me fala que crio o script, ok!!! ;.)
  12. Bom dia Amigo... respondi uma segunda vez no seu outro post... Como você está utilizando DTS, deve-se declarar as variáveis dentro do Main. Caso estas variáveis sejam globais, você deverá utilizar DTSTaskGlobalVariables. Sintaxe: DTSTaskGlobalVariables(<<NOME_VARIAVEL>>).value No seu outro post, coloquei um exemplo.... Provavelmente o script roda fora da DTS por este motivo. Faz o teste e depois me fala... :.)
  13. Meu amigo... não sei se o sql tem uma função/campo pronta pra isto. Pesquisei na net e não encontrei nada.... :.( Resolvi fazer um script que retornar o resultado que deseja, ok? Seguinte: criei uma temporária de instância, inseri os nomes de tabelas criadas no Banco de Dados. Declarei algumas variáveis e monto dinamicamente o script dentro de uma variável destas. Faço a execução do string, gravando na temporária. Após execução, você dá um select na temporária. Vai encontrar as tabelas do Banco, com a quantidade de inserção de cada uma delas. Quando fechar a instância, a tabela será eliminada da memória. Espero que ajude. Roda aí depois me fala se deu certo!!! :.) -- cria a tabela. Roda 1 vez só. Se tiver q rodar de novo, tem que dropar. create table #Tabelas (NomeTabela varchar(100), QtdaInsercoes int) -- insere as tabelas do BD na temporaria insert into #Tabelas (NomeTabela) select name from sysobjects where xtype='U' and uid=1 -- carga da quantidade de inserções nas tabelas. -- rodar o bloco todo declare @Script as varchar(1000) declare @NomeTabela as varchar(100) set @NomeTabela = (select top 1 NomeTabela from #Tabelas where QtdaInsercoes is null) while @NomeTabela is not null Begin set @Script = ('update #Tabelas set QtdaInsercoes=(select count(*) from ' + @NomeTabela + ') where NomeTabela = ''' + @NomeTabela + '''') exec (@Script) set @NomeTabela = (select top 1 NomeTabela from #Tabelas where QtdaInsercoes is null) End -- até aqui. -- Verificar a carga da tabela select * from #Tabelas
  14. Ok Bianca, fico feliz por ter ajudado!!
  15. Olá, tudo bem? Dei uma olhada no código e fiz algumas alterações... :.) Seguinte: ao invés de fazer union, preferi criar uma temporária em tempo de execução. Retirei o UNION e coloquei as informações em apenas 1 linha. Ai vai ficar Reclamação, Solicitação e total. Como está fazendo count, caso a query não resgate nenhuma informação, coloca-se 0 (zero). Postei o script alterado logo abaixo. Como não tenho como rodá-lo, não deu pra testar... rs. Copia e dá uma olhada. Outra coisa: Uma dica: vi que utiliza a sintaxe =*. No sql 2000 é tranquilo, mas no sql 2005 esta sintaxe é descontinuada. você terá que usar o left ou right, ou forçar o 2005 utilizar esta sintaxe (que perde em performance). Copia todo o script e roda. Depois me fala se funcionou... espero ter ajudado. --------------------------------------------------------------------------------------- declare @tmp table (Reclamacao int, Solicitacao int, total int) insert into @tmp (Reclamacao) select count(recl.id_CHAM_CD_Chamado) from dbo.CS_NGTB_Chamado_CHAM cham ,dbo.CS_NGTB_Reclamacao_RECL recl where cham.id_CHAM_CD_Chamado = recl.id_CHAM_CD_Chamado and (recl.RECL_DH_Encerramento is null or recl.RECL_DH_Encerramento = '1900/01/01') and cham.CHAM_DH_Inicial >= '2009/08/01' and cham.CHAM_DH_Inicial <= '2009/08/15' update @tmp set Solicitacao=(select count(soli.id_CHAM_CD_Chamado) from dbo.CS_NGTB_Chamado_CHAM cham ,dbo.CS_NGTB_Solicitacao_SOLI soli where cham.id_CHAM_CD_Chamado =* soli.id_CHAM_CD_Chamado and (soli.SOLI_DH_Encerramento is null or soli.SOLI_DH_Encerramento = '1900/01/01') and cham.CHAM_DH_Inicial >= '2009/08/01' and cham.CHAM_DH_Inicial <= '2009/08/15') update @tmp set total=((select Reclamacao from @tmp) + (select Solicitacao from @tmp)) select * from @tmp ---------------------------------------------------------------------------------------
  16. Ok, desculpa. Entendi outra coisa :D Seguinte: copiei e rodei a DTS, e deu o mesmo erro. Só sai no control + alt + del. rs... Vi que define umas variaveis globais.... As variáveis devem ser armazenadas em DTSTaskGlobalVariables. Sintaxe: DTSTaskGlobalVariables(<<NOME_VARIAVEL>>).value Ai você pode chamar as variváveis globais em qualquer parte da DTS. Fiz uma alteração no script, mas apenas pra teste (não tem nada a ver com as variáveis q você cria). Mas é apenas pra ter uma ideia... espero q ajude. '********************************************************************** ' Visual Basic ActiveX Script '************************************************************************ Function Main() DTSGlobalVariables("Data").Value = getData() objXmlHttp.Open "POST", "http://scriptbrasil.com.br", False objXmlHttp.onreadystatechange = GetRef("HandleStateChange") objXmlHttp.Send Main = DTSTaskExecResult_Success End Function Sub HandleStateChange() If (ObjXmlHttp.readyState = 4) Then MsgBox objXmlHttp.responseText End If End Sub Function getData() 'As Long Dim dt 'As Date dt = Now() getData = dt End Function
  17. Olá Amigo... o problema de DTS é debugar. Sempre q estou com problemas, coloco identificadores nos pontos principais, informando q a execução foi realizada. Tenta colocar identificadores no script, para saber onde exatamente trava. Fica mais fácil de corrigir o erro. Já fiz identificadores de várias formas, dependendo do script montado: pode ser apenas um print na tela, pode ser gravação de número sequencial em tabela no banco ou txt, ou chamada de uma função pra fazer o controle. Espero q ajude... Ex.: Function Main() ' Passei por aqui - 0 objXmlHttp.Open "POST", URLSource, False ' Passei por aqui - 1 objXmlHttp.onreadystatechange = GetRef("HandleStateChange") ' Passei por aqui - 2 objXmlHttp.Send ' Passei por aqui - 3 Main = DTSTaskExecResult_Success End Function Sub HandleStateChange() ' Passei por aqui - 1.0 If (ObjXmlHttp.readyState = 4) Then ... faz alguma coisa End If ' Passei por aqui - 1.1 End Sub
  18. Olá meu amigo!! Pelo q entendi, você está querendo concatenar os dados de PAGO e data, ok? A gravação continuará sendo na mesma coluna. Verifique se não vai “truncar” os dados.... Segue abaixo o script. Não consegui testar no sql, por motivos óbvios... rs. Concatenei o PAGO com a data, utilizando o + . Pra isso, você tem que converter pra caracter, porque senão o sql pensa q é soma e não concatenação. O erro que mencionou no final da msg é porque você tem q pegar o resultado do subselect e comparar com alguma coisa, ok? Tipo: WHEN (SELECT TOP 1 ....) > 10 THEN 'PAGO' + (convert(varchar(2),@DATA)) ELSE 'NÃO' Então você completa aí.... Espero ter ajudado. Testa ai e me fala. O script alterado: -- DECLARANDO VARIAVEIS DECLARE @CODIGO INTEGER DECLARE @DATAT DATETIME DECLARE @DATA INTEGER DECLARE @OBS INTEGER DECLARE @TOTAL INTEGER -- COMANDO DECLARE TMP_CURSOR CURSOR FOR SELECT DISTINCT CÓDIGO FROM TMP_KARLA OPEN TMP_CURSOR FETCH NEXT FROM TMP_CURSOR INTO @CODIGO WHILE @@FETCH_STATUS = 0 BEGIN -- DAR VALOR A VARIAVEIS SET @CODIGO = (SELECT TOP 1 CÓDIGO FROM TMP_KARLA) SET @DATAT = (SELECT TOP 1 DATA FROM RECIBO WHERE TMP_KARLA.CÓDIGO = RECIBO.CÓDIGO) SET @DATA = CONVERT(INTEGER,SUBSTRING(@DATAT,1,10)) SET @OBS = CASE WHEN (SELECT TOP 1 CÓDIGO FROM ACORDOS AC INNER JOIN TMP_KARLA TK ON TK.CÓDIGO = AC.CÓDIGO WHERE TK.RECIBO IS NOT NULL) -- AQUI você COMPLETA A CLAUSULA, TIPO "> 1 " THEN 'PAGO' + (convert(varchar(2),@DATA)) ELSE 'NÃO' END UPDATE TMP_KARLA SET PAGAMENTO = @OBS SET @TOTAL = @TOTAL+'1' FETCH NEXT FROM TMP_CURSOR INTO @CODIGO END CLOSE TMP_CURSOR DEALLOCATE TMP_CURSOR PRINT @TOTAL PRINT @DATA GO -- -- UPDATE TMP_KARLA SET PAGAMENTO = '' SELECT * FROM TMP_KARLA
  19. fulvio

    Importar arquivo txt

    O erro provavelmente está sendo ocasionado pelo "Ç". É MySql, não entendo muito. Mas tenta retirar o caraceter "ç" e colocar o "c".
  20. Ola Jose.... Se os dados gerados são muitos, você trava o TXT quando tentar a substituição... Vê se funciona: quando tiver montando a query, dá um replace na coluna q possui o ponto. Tipo: select replace(524.35, '.', ',') Ai depois você gera o TXT. Espero ter ajudado....
  21. Olá Flavia. Quando você não tem a vírgula como marcador, fica meio dificil mesmo... O q você pode fazer é testar se o string possui vírgula, tipo: if charindex (',','rua coralia wandeck, 05')>0 Ai você entra na rotina de endereço com virgula. No else, você coloca o endereço na 1ª coluna e null na 2ª. Espero ter ajudado...
  22. Cara... pelo q explicou, acho q não vai conseguir fazer isso com apenas 1 select não... Pegando a ideia da Andreia.... :.) Faz um Select q retorna o nome_tarefa, numero_tarefa, nome_duv, numero_duv e a data. Tipo: select t.nome_tarefa, t.numero_tarefa, d.nome_duv, d.numero_duv, (t ou d).data from tarefas t left join duvidas d on (chave_tabela_tarefas=chave_tabela_duvidas) where t.data_tarefa between '2009-01-01' and '2009-12-31' Seu recordset vai retornar todas as tarefas, cotendo ou não dúvidas. Ai, no aplicativo você agrupa os dados por data, utilizando filtro no recordser de retorno. Espero ter ajudado.
  23. Procura-se analista-programador com conhecimento em Visual Basic 6.0 e SQL Server 2005, para trabalhar na manutenção e evolução de sistema desenvolvido para área de saúde, na cidade de Belo Horizonte. As atividades serão de 40 horas semanais (de segunda a sexta), em local central de Belo Horizonte. Os interessados devem enviar Curriculo para o endereço: curriculovb@yahoo.com.br Favor citar pretenção salarial.
×
×
  • Criar Novo...