Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Michel__

Usar 2 dbo em uma soh job

Recommended Posts

Eu mexo com servidores de MuOnline, e estou com o seguinte problema:

Existe 1 dbo chamada Character, que onde armazena as informaçoes de um "boneco" que o usuario possui na conta, cada conta pode possuir 5 bonecos.Para cada boneco cria - se uma linha nessa dbo

Em outra dbo, a MEMB_INFO, estao as informaçoes da conta desse usuario, como login, senha, nome dos bonecos e etc.

 

O problema é o seguinte, preciso qe uma job veja as informaçoes da dbo Character e salve na MEMB_INFO. Exemplo:

 

Cada boneco possui o valor 5 na table Pontos ( isso na dbo.Character )

Preciso de algo qe faça a soma desses pontos em todas as tables de uma mesma conta ( pois na dbo Character exste a info da conta como o login ) e salve na dbo.MEMB_INFO, e depois apague esses valores nas tables somadas.

 

 

Nao sei se isso eh possivel, mas foi o que eu conseguir imaginar aqui.

 

Resumindo:

 

Preciso dos valores desses pontos de forma unica na conta ( na MEMB_INFO ) e nao separadamente como ocorre na dbo.Character

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não entendi muito bem...

dbo chamada Character. você cita -> Cada boneco possui o valor 5 na table Pontos ( isso na dbo.Character ) para mim Character é uma tabela com um username (dbo)

 

Para que a sua tabela MEMB_INFO receba as informações da tabela Character, ela precisa ter os mesmos campos ou um campo identificado.

 

Não entendi muito bem...Pode mandar estruturas das tabelas...Só para ficar mais claro?

 

No book online tem varias funcoes

exemplo:

 

SELECT type, price, advance

FROM titles

WHERE type LIKE '%cook'

ORDER BY type

COMPUTE SUM(price), SUM(advance) BY type

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Michel__,

Bem vindo ao fórum Imasters.

 

Bom tentei "criar" essas dbo e tabelas na cabeça, mas ficou meio confuso, se você puder postar a estrutura da table que está os pontos e a estrutura da tabela em que você deseja colocar a soma dos pontos, acredito que poderemos lhe auxiliar melhor.

 

Para referenciar uma tabela de outra base de dados, você deve por exemplo:

 

select * from [bASE_DE_DADOS].dbo.[TABELA]

 

De qualquer forma, vou por um exemplo aqui que irá te ajudar na soma:

 

create table #soma
(usuario varchar(50) null, 
valor int null)

insert into #soma (usuario, valor) values ('Michel','5')
insert into #soma (usuario, valor) values ('Michel','35')
insert into #soma (usuario, valor) values ('Michel','25')
insert into #soma (usuario, valor) values ('Michel','15')
insert into #soma (usuario, valor) values ('Michel','10')

insert into #soma (usuario, valor) values ('Bruno','5')
insert into #soma (usuario, valor) values ('Bruno','10')
insert into #soma (usuario, valor) values ('Bruno','15')
insert into #soma (usuario, valor) values ('Bruno','20')
insert into #soma (usuario, valor) values ('Bruno','25')

select usuario, [b]sum[/b](valor) as Total from #soma group by usuario

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa pelo post mal explicado, na hora eu estava com muita pressa. ( fiz o post 13:20 e tinha que estar no colegio as 13:30 ^^ )

 

Bom, vou tentar explicar melhor

 

Todas as tabelas citadas aki estao dentro da mesma base de dados, no caso MuOnline.

 

 

A Coluna GOLDS é usada pelo site como o "dinheiro" de cada usuario

 

 

Dentro da Base de dados MuOnline, existe varias tabelas, sendo 2 delas as que eu necessito usar nessa JOB

A primeira ( Character ) contem colunas como 'Name' (Nick do boneco), 'AccountID' (login do usuario),'Resets' ( numero de vezes que ele chegou no level maximo maximo),'Pontos' (numero de vezes que ele chegou na pontuação maxima de força, agilidade e etc.)

 

Na Tabela MEMB_INFO existem colunas referentes a conta do usuario, 'memb__id' (login do usuario), 'memb__pwd' (senha do usuario), 'Vip' ( se ele é um usuario vip vai ter valor 1, se nao for vai ter valor 0)e a coluna 'Golds'( a qual quero atribuir o valor das colunas da dbo.Character 'Pontos' )

 

Na pratica:

 

em uma unica conta, o usuario pode criar no máximo 5 bonecos, criando assim 5 linhas diferentes na dbo.Character (uma para cada boneco).

o que eu qero fazer é, colocar uma job qe some o valor que cada boneco "DE UMA MESMA CONTA" possui na coluna Pontos, e repassar para a coluna GOLDS que esta na dbo.MEMB_INFO. Só que após isso, as colunas Pontos da dbo.Character tem de ser zeradas.

 

Se elas não forem zeradas vai ocorrer o seguinte, se um usuario gastar o valor que ele possuir na coluna GOLDS, vai ocorrer a soma novamente e vai ser como se ele não tivesse gastado nada.

 

 

espero ter esclarecido um pouco.......

 

se ouver um modo mais facil de fazer isso, nao sendo desse jeito que eu disse, me fala beleza

 

conto com a ajuda de vocês...

 

Obrigado

 

edit: pensei numa coisa, cada 1 minuto roda uma JOB aki, uma JOB de UPDATE na tabela Character.

Parte da job faz o seguinte "Pontos=Pontos+3", nao da pra mim manda essa job salvar esse valor na dbo.MEMB_INFO???? Tipo um update em duas tabelas????dai só modificando o nome da coluna de Pontos pra GOLDS?????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Michel,

 

Nesse mundo da informatica tudo é possivel!

 

No seu caso, não podemos utilizar um update mais ou menos assim:

update memb_info set golds = sum(pontos)
from character inner join memb_info
on memb_info.memb_id = character.accountid
Por que?

Primeiro: Pois ele irá somar toda a coluna pontos de todos os personagens e atribuir o mesmo valor (A soma de todos eles) a todas as linhas. E segundo, o SQL dá erro!

Então devemos primeiro SOMAR o valor dos pontos de cada usuario e depois dar um update na tabela.

 

Segue exemplo:

--CRIA TABELAS TESTE
create table #memb_info
(memb_id varchar(50),
memb_pwd varchar(50),
vip int null,
golds float null)

create table #character
(nome varchar(50) null,
accountid varchar(50) null,
resets int null,
pontos int null)

--INSERE INFORMACOES TESTE
insert into #memb_info (memb_id, memb_pwd, vip, golds) values ('Michel', '12345678', 1, 0)
insert into #memb_info (memb_id, memb_pwd, vip, golds) values ('Bruno', '87654321', 0, 0)

insert into #character (accountid, nome, resets, pontos) values ('Michel', 'Hulk', 0, 20)
insert into #character (accountid, nome, resets, pontos) values ('Michel', 'Heman', 0, 50)
insert into #character (accountid, nome, resets, pontos) values ('Michel', 'Jaspion', 0, 30)
insert into #character (accountid, nome, resets, pontos) values ('Michel', 'Cebolinha', 0, 10)
insert into #character (accountid, nome, resets, pontos) values ('Michel', 'RangerAzul', 0, 60)

insert into #character (accountid, nome, resets, pontos) values ('Bruno', 'Shirra', 0, 10)
insert into #character (accountid, nome, resets, pontos) values ('Bruno', 'Cascao', 0, 5)
insert into #character (accountid, nome, resets, pontos) values ('Bruno', 'Bebeto', 0, 30)
insert into #character (accountid, nome, resets, pontos) values ('Bruno', 'Romario', 0, 15)
insert into #character (accountid, nome, resets, pontos) values ('Bruno', 'Pele', 0, 100)

--MOSTRA O CONTEÚDO DAS TABELAS
select * from #memb_info
select * from #character

--DECLARAÇÃO DAS VARIAVEIS QUE IREMOS UTILIZAR
declare @memb_id varchar(50)
declare @pontos int
--INICIO DO CURSOR COM A FUNÇÃO MIN PARA RODAR LINHA A LINHA DA TABELA
select @memb_id = min(memb_id) from #memb_info
while @memb_id is not null
begin
	--FAZ A SOMA DOS PONTOS
	select @pontos = sum(pontos) from #character where @memb_id = accountid
	--PRINT APENAS PARA TESTE PARA VERIFICAR SE ESTÁ TUDO CORRETO
	print 'Atualizando Usuario: ' + @memb_id
	print '---------------------------------'
	print 'Soma dos Pontos: ' 
	print @pontos
	--ATUALIZA A TABELA #MEMB_INFO COM O TOTAL DOS PONTOS DO CHARACTER
	update #memb_info set golds = @pontos where @memb_id = memb_id
	--PASSA PARA A PRÓXIMA LINHA DO CURSOR
	select @memb_id = min(memb_id) from #memb_info
	where memb_id > @memb_id
end
--MOSTRA O CONTEUDO DA TABELA APOS A ATUALIZACAO
select * from #memb_info

--DROPA AS TABELAS TESTE
drop table #memb_info
drop table #character

Existe outras maneiras de se fazer isso, que até podem ser mais rapidas, mas essa maneira funciona!

Qualquer duvida, só postar!

 

[]'s

Bruno

Compartilhar este post


Link para o post
Compartilhar em outros sites

vlw cara, vo testar aqui.

 

outra coisa, essa aqui é a minha Job qe roda de 1 em 1 minuto:

 

UPDATE Character

SET clevel=('6') , experience=('0') , Pontos=Pontos+3 , MapNumber=('6') , MapPosX=('63') , MapPosY=('117') , Energy = ('50') , Vitality=('50') , Strength=('50') , Dexterity=('50') , LevelUpPoint=('4000')

FROM Character JOIN Memb_Stat on Character.Accountid = Memb_Stat.memb___id COLLATE Latin1_General_CS_AS

JOIN MEMB_INFO ON Character.AccountID=MEMB_INFO.memb___id COLLATE Latin1_General_CS_AS

WHERE Energy > ('29999') and Vitality>('29999') and Strength>('29999') and Dexterity>('29999') and MEMB_INFO.vip=1 and MEMB_STAT.ConnectStat = 0

 

 

 

nessa mesma job nao teria como fazer a parte Pontos=Pontos+3 ser colocado na tabela MEMB_INFO??só qe dai com o nome GOLDS

 

 

brigadão ae

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá sim!

 

Só adicionar a parte em negrito abaixo do comando:

 

UPDATE Character

SET clevel=('6') , experience=('0') , Pontos=Pontos+3 , MapNumber=('6') , MapPosX=('63') , MapPosY=('117') , Energy = ('50') , Vitality=('50') , Strength=('50') , Dexterity=('50') , LevelUpPoint=('4000')

FROM Character JOIN Memb_Stat on Character.Accountid = Memb_Stat.memb___id COLLATE Latin1_General_CS_AS

JOIN MEMB_INFO ON Character.AccountID=MEMB_INFO.memb___id COLLATE Latin1_General_CS_AS

WHERE Energy > ('29999') and Vitality>('29999') and Strength>('29999') and Dexterity>('29999') and MEMB_INFO.vip=1 and MEMB_STAT.ConnectStat = 0

 

 

UPDATE memb_info set memb_info.golds = Character.pontos

FROM Character JOIN Memb_Stat on Character.Accountid = Memb_Stat.memb___id COLLATE Latin1_General_CS_AS

JOIN MEMB_INFO ON Character.AccountID=MEMB_INFO.memb___id COLLATE Latin1_General_CS_AS

WHERE Energy > ('29999') and Vitality>('29999') and Strength>('29999') and Dexterity>('29999') and MEMB_INFO.vip=1 and MEMB_STAT.ConnectStat = 0

Compartilhar este post


Link para o post
Compartilhar em outros sites

vo testa agora, tomara que essa segunda funcione.....

brigadao

 

 

aleluia, parece que funcionou, fiz o seguinte, adicionei a linha que o trankilis me passo, só que coloquei em cima , em vez de embaixo....pq embaixo nao funcionava axo q pq o WHERE nao ficava o mesmo ( as coluna Vitality, agility ja tava diferente...)

 

fico assim:

 

UPDATE memb_info set memb_info.golds = golds+3

FROM Character JOIN Memb_Stat on Character.Accountid = Memb_Stat.memb___id COLLATE Latin1_General_CS_AS

JOIN MEMB_INFO ON Character.AccountID=MEMB_INFO.memb___id COLLATE Latin1_General_CS_AS

WHERE Energy > ('29999') and Vitality>('29999') and Strength>('29999') and Dexterity>('29999') and MEMB_INFO.vip=1 and MEMB_STAT.ConnectStat = 0

 

UPDATE Character

SET clevel=('6') , experience=('0') , MapNumber=('6') , MapPosX=('63') , MapPosY=('117') , Energy = ('50') , Vitality=('50') , Strength=('50') , Dexterity=('50') , LevelUpPoint=('4000')

FROM Character JOIN Memb_Stat on Character.Accountid = Memb_Stat.memb___id COLLATE Latin1_General_CS_AS

JOIN MEMB_INFO ON Character.AccountID=MEMB_INFO.memb___id COLLATE Latin1_General_CS_AS

WHERE Energy > ('29999') and Vitality>('29999') and Strength>('29999') and Dexterity>('29999') and MEMB_INFO.vip=1 and MEMB_STAT.ConnectStat = 0

 

 

 

vo faze uns testes aki beleza

 

 

brigadão

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parabéns Michel!

 

Realmente, foi falta de atenção minha, os valores são atualizados, então embaixo o comando não iria atualizar mesmo!

 

[]'s

Bruno

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.