Ir para conteúdo

POWERED BY:

Arquivado

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

Jean Franceschi

[Resolvido] Gerando Loop no BD

Recommended Posts

Ai gente =)

Como vcs sabem eu sempre venho com dúvidas bestinhas e geralmente impossíveis de serem resolvidas, mas hoje acho q tem saída =P

 

Seguinte, vou direto ao ponto...

Tenho um script, que gera um loop no meu banco de dados (isso qualquer um faz). Neste loop gerado, o banco de dados pode ou não adicionar um novo registro (depende da opção selecionada), porém, eu quero q ele seja mostrado em seguida no mesmo processo.

 

Vou dar um exemplo:

 

'Aqui uma função bestinha qualquer
	Function AddOpcao(Opcao_Qualquer)

		If Opcao_Qualquer = "Sim" Then
			Conexao_Qualquer.Execute("INSERT INTO TABELA(Valor) VALUES('Valor qualquer 1')")
		Else
			Response.Write("Olá mundo")
		End If

	End Function




	'Aqui onde será chamado a função
	Set BLABLABLA = Conexao_Qualquer.Execute("SELECT * FROM Tabela ORDER BY Id")
		If Not BLABLABLA.EOF Then
			Do While Not BLABLABLA.EOF

				Call AddOpcao("Sim")

			BLABLABLA.MoveNext
			Loop
		End If
		BLABLABLA.Close
	Set BLABLABLA = Nothing

 

A idéia é no mesmo Loop mostrar o que for adi9cionado no banco de dados pela função!

testei aqui e não dá certo, preciso chamar novamente o "SELECT * FROM TABELA" e fazer um novo loop no BD pra mostrar os novos adicionados.

Gostaria de saber se tem como mandar de dentro da função que seja recarregado do zero o loop primário.

 

Acho que é isso... simples não é, mas é isso que preciso =P

Se alguém souber agradeço muito, se não souber e não me xingar agradeço tbm =P

Valeu gente xD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente qual erro acontece?

 

Lembre-se de fechar as conexões que estão no loop...

 

Dica.: Faça o teste fora da function e fora do if... só depois que der certo você passe para o if e posteriormente para a function, isso ira derrubar algumas dúvidas em relação a erros.

 

Ao invés de utilizar "sim" ou "não", utilize true ou false.

 

Exemplo... chamativa da function

 

Call AddOpcao(true)

Chamativa If

 

If Opcao_Qualquer = true Then

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode dar um SQL SELECT usando LAST, a função last () retorna o último valor da coluna selecionada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum, calma gente, a função toda está correta, eu só reescrevi ela com termos simples, variáveis práticas e formas fáceis de entender. Não quero dizer que contenha erro nesta chamada ou na função.

 

É que o q estou precisando é algo assim: Digamos que meu BD tenha um campo Numero (do tipo número tbm) e quero ordenar ele e implementar o que falta, como por exemplo abaixo:

 

 

Numero 1

Numero 2

Numero 4

Numero 5

Numero 8

Numero 9

 

 

Certo? Notem que Numero é só pra exemplificar qual local no BD que stá, que o caso é número. Tbm da pra notar que falta os números 3, 6 e 7... e é isso que quero fazer...

 

Vou dar um loop pra dar um response no Numero por ordem:

 

Do while NOT BLABLABLA.EOF

 

response.write(BLABLABLA("Numero"))

 

BLABLABLA.MoveNext

Loop

 

Ok, agora, faço uma rotina dentro deste loop pra saber se no response tem um numero faltando (como no caso anterior o 3, 6 e 7. Quando ele encontra esta falta ele chama a função que vai adicionar o número faltando na tabela.

 

O problema vem agora!!!

Acontece que quero dar novamente um Loop com um response.write mostrando TUDO de novo a numeração com os novos dados, porém, queria saber se tem como de dentro da função eu chamar o banco pra refazer a listagem toda!

 

 

Exemplo de como seria (só como exemplo, pq não tenho idéia de como fazer):

 

'Aqui uma função bestinha qualquer
	Function AddOpcao(Opcao_Qualquer)

		If Opcao_Qualquer = "Sim" Then

			Conexao_Qualquer.Execute("INSERT INTO TABELA(Valor) VALUES('Valor qualquer 1')")
			AQUI CHAMARIA O RE-LOOP do banco de dados do zero, pra mostrar tudo de novo!

		Else
			Response.Write("Olá mundo")
		End If

	End Function




	'Aqui onde será chamado a função
	Set BLABLABLA = Conexao_Qualquer.Execute("SELECT * FROM Tabela ORDER BY Id")
		If Not BLABLABLA.EOF Then
			Do While Not BLABLABLA.EOF

				Call AddOpcao("Sim")
				Depois desta opção eu pediria pro banco de dados refazer sua lista do zero... buscando novamente os registros adicionados junto com os registros atuais! Algo como: 
				Exit Do
				Seilaoq.REFAZ_O_LOOP_PELAMOR_DE_DEUS

			BLABLABLA.MoveNext
			Loop
		End If
		BLABLABLA.Close
	Set BLABLABLA = Nothing

 

Queria fazer isso, pelo fato de ordenar pelos números listados. Então, a primeira contagem seria:

1

2

 

4

5

 

 

8

9

 

Na segunda vez que ele mostrasse já incluiria o 3 e ficaria assim:

1

2

3

4

5

 

 

8

9

 

Na terceira vez ele colocaria o 6:

1

2

3

4

5

6

 

8

9

 

E na próxima o 7... assim, quando ele acabar, uma amostra geral seria finalmente uma amostra completa, com todos os números sem nada faltando ^^

Acho que consegui explicar melhor agora...

 

 

Bem, eu pensei em fazer uma rotina com For/Next e quando encontrar número faltando, eu fecho o Loop do BD, Mando a função adicionar o novo núemro encontrado e depois o "Next" refaz sozinho o novo loop do banco de dados (pq como ele vai abrir de novo o banco de dados, ele vai encontrar os números que foram adicionados por último). E depois que listar tudo eu fecho o For e acabo com a expressão ^^

 

Se alguém viu algo do tipo, agradeço se me der uma direção =)

E valeu pela ajuda dos dois, é complicado explicar se não se sabe o que o pessoal ta achando da pergunta =P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Continuo não entendo oque tu deseja fazer, por isso passo a bola.

 

Massssss devo dizer que seu code esta incorreto sim, uma vez que você não esta fechando os objetos talvez por isso tu tb não esteja fazendo o que deseja.

 

Boa sorte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando abrimos uma conexão com um banco de dados ela consome recursos do servidor e quanto mais tempo a conexão permanecer aberta mais recursos estarão sendo consumidos. Você poderia criar novamente uma outra SQL para listar o que foi atualizado,mas não esqueça de fechar o mais rápido possível as conexões usadas nos scripts , você pode aumentar o desempenho das aplicações, agora talvez usar um recordset desconectado, possa ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

e como eu uso um recordset desconectado?

 

 

 

Sobre abrir e fechar as conexões, eu sempre tenho uma função que abre e uma que fecha o BD, então quando eu abro o BD eu chamo a função de abrir e logo depois de destruir a conexão eu já chamo a que fecha a conexão =)

Só não coloquei isso nesse código de exemplo aí de cima pq achei que iria só confundir entupir o código de exemplo =\

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha este link

e faça uma busca no fórum sobre recordsets-desconectados, que existem mais info...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi muito bem o que eu lí naquele link, então vou postar como costumo usar pra ver se estou fazendo algo tão errado assim =\

 

 

Arquivo "Conexao.asp"

'	###################################
'	######## Conexao_Ajuda
'	###################################
	Function Abrir_Conexao_Ajuda
		Set Conexao_Ajuda = Server.CreateObject("ADODB.Connection")
			Conexao_Ajuda.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Caminho_Banco_de_Dados & "Ajuda.mdb"
	End Function

	Function Fechar_Conexao_Ajuda
			Conexao_Ajuda.Close
		Set Conexao_Ajuda = Nothing
	End Function

 

E quando vou usar o BD Ajuda eu chamo a função:

 

Call Abrir_Conexao_Ajuda
		Set BLABLABLA = Conexao_Ajuda.Execute("SELECT X,Y FROM Ajuda ORDER BY Id DESC")
			If Not BLABLABLA.EOF Then
				Do WHile Not BLABLABLA.EOF

					Response.Write(BLABLABLA("X") &"-"& BLABLABLA("Y"))

				BLABLABLA.MoveNext
				Loop
			End If
			BLABLABLA.Close
		Set BLABLABLA = Nothing
	Call Fechar_COnexao_Ajuda

Isso prejudica o desempenho da máquina? Pq esta é a forma que eu utilizo sempre, em todos os BD´s...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que desta maneira esta fechando somente quando termina de da todos os loops.... e essa forma não é a correta, o certo é fechar e depois se precisar abrir e fechar novamente, talvez por isso o erro, pois pode esta havendo um conflito, pois esta tendando abrir 1,2,3 ou mais conexões "iguais" dentro do loop, tente fechar e abrir no proprio loop pois se colocar fora só ira "fechar" quando acabar o loop.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou colocar então parte do código real (só parte pq ele tem mais de 2 mil linhas), assim acho que vai dar pra entender melhor como iria ficar:

 

 

	Dim Contagem
	For Contagem = 0 To 1

		Dim Logado_Verificacao_Da_Movimentacao_Geral
		Dim Logado_Verificacao_Da_Movimentacao_Geral_Id
		Dim Logado_Verificacao_Da_Movimentacao_Geral_BD
		Dim Logado_Verificacao_Da_Movimentacao_Geral_Data
		Dim Logado_Verificacao_Da_Movimentacao_Geral_Hora
		Dim Logado_Verificacao_Da_Movimentacao_Geral_Jogador_Id
		Dim Logado_Verificacao_Da_Movimentacao_Geral_Jogador_X
		Dim Logado_Verificacao_Da_Movimentacao_Geral_Jogador_Y
		Dim Logado_Verificacao_Da_Movimentacao_Geral_Alvo_Id
		Dim Logado_Verificacao_Da_Movimentacao_Geral_Alvo_X
		Dim Logado_Verificacao_Da_Movimentacao_Geral_Alvo_Y

		Call Abrir_Conexao_Movimento_Geral

			Set Logado_Verifica_Ataques = Conexao_Movimento_Geral.Execute("SELECT Id,BD,Jogador_Id,Jogador_X,Jogador_Y,Alvo_Id,Alvo_X,Alvo_Y,Data,Hora FROM Movimento WHERE (Data="& CLng(DataContrario) &" AND Hora<="& CLng(Horas & Minutos & Segundos) &") OR (Data<"& CLng(DataContrario) &") ORDER BY Data,Hora,Id")
				If Logado_Verifica_Ataques.EOF Then
					Exit For
				Else

					Logado_Verificacao_Da_Movimentacao_Geral_Id = Logado_Verifica_Ataques("Id")
					Logado_Verificacao_Da_Movimentacao_Geral_BD = Logado_Verifica_Ataques("BD")

					Logado_Verificacao_Da_Movimentacao_Geral_Jogador_Id = Logado_Verifica_Ataques("Jogador_Id")
					Logado_Verificacao_Da_Movimentacao_Geral_Jogador_X = Logado_Verifica_Ataques("Jogador_X")
					Logado_Verificacao_Da_Movimentacao_Geral_Jogador_Y = Logado_Verifica_Ataques("Jogador_Y")

					Logado_Verificacao_Da_Movimentacao_Geral_Alvo_Id = Logado_Verifica_Ataques("Alvo_Id")
					Logado_Verificacao_Da_Movimentacao_Geral_Alvo_X = Logado_Verifica_Ataques("Alvo_X")
					Logado_Verificacao_Da_Movimentacao_Geral_Alvo_Y = Logado_Verifica_Ataques("Alvo_Y")

					Logado_Verificacao_Da_Movimentacao_Geral_Data = Logado_Verifica_Ataques("Data")
					Logado_Verificacao_Da_Movimentacao_Geral_Hora = Logado_Verifica_Ataques("Hora")

					Logado_Verifica_Ataques_Ano = Left(Logado_Verificacao_Da_Movimentacao_Geral_Data,4)
					Logado_Verifica_Ataques_Mes = Left(Logado_Verificacao_Da_Movimentacao_Geral_Data,6)
					Logado_Verifica_Ataques_Mes = Right(Logado_Verifica_Ataques_Mes,2)
					Logado_Verifica_Ataques_Dia = Right(Logado_Verificacao_Da_Movimentacao_Geral_Data,2)

					If Len(Logado_Verificacao_Da_Movimentacao_Geral_Hora) = 5 Then Logado_Verificacao_Da_Movimentacao_Geral_Hora = "0"& Logado_Verificacao_Da_Movimentacao_Geral_Hora
					If Len(Logado_Verificacao_Da_Movimentacao_Geral_Hora) = 4 Then Logado_Verificacao_Da_Movimentacao_Geral_Hora = "0"& Logado_Verificacao_Da_Movimentacao_Geral_Hora
					If Len(Logado_Verificacao_Da_Movimentacao_Geral_Hora) = 3 Then Logado_Verificacao_Da_Movimentacao_Geral_Hora = "0"& Logado_Verificacao_Da_Movimentacao_Geral_Hora
					If Len(Logado_Verificacao_Da_Movimentacao_Geral_Hora) = 2 Then Logado_Verificacao_Da_Movimentacao_Geral_Hora = "0"& Logado_Verificacao_Da_Movimentacao_Geral_Hora
					If Len(Logado_Verificacao_Da_Movimentacao_Geral_Hora) = 1 Then Logado_Verificacao_Da_Movimentacao_Geral_Hora = "0"& Logado_Verificacao_Da_Movimentacao_Geral_Hora

					Logado_Verifica_Ataques_Hora = Left(Logado_Verificacao_Da_Movimentacao_Geral_Hora,2)
					Logado_Verifica_Ataques_Minuto = Left(Logado_Verificacao_Da_Movimentacao_Geral_Hora,4)
					Logado_Verifica_Ataques_Minuto = Right(Logado_Verifica_Ataques_Minuto,2)
					Logado_Verifica_Ataques_Segundo = Right(Logado_Verificacao_Da_Movimentacao_Geral_Hora,2)

					'Se for "ATAQUE NORMAL" entra nesta opção
					If Logado_Verificacao_Da_Movimentacao_Geral_BD = "Ataque Normal" Then
						Call Adicionar_Dinheiro_E_Petroleo("Não",Logado_Verificacao_Da_Movimentacao_Geral_Alvo_Id,Logado_Verifica_Ataques_Ano,Logado_Verifica_Ataques_Mes,Logado_Verifica_Ataques_Dia,Logado_Verifica_Ataques_Hora,Logado_Verifica_Ataques_Minuto,Logado_Verifica_Ataques_Segundo,Logado_Verificacao_Da_Movimentacao_Geral_Alvo_X,Logado_Verificacao_Da_Movimentacao_Geral_Alvo_Y)
						Call Funcao_Combate_Normal(Logado_Verificacao_Da_Movimentacao_Geral_Id)
					End If

				End If
				Logado_Verifica_Ataques.Close
			Set Logado_Verifica_Ataques = Nothing

		Call Fechar_Conexao_Movimento_Geral

	Next

 

Aqui já coloquei como acho que seria mais fácil de ser feito... Note que se for chamado a função "Funcao_Combate_Normal" então outro registro vai ser criado no mesmo banco de dados, porém com outra data e outra hora pré definida!

Este é o problema que venho encontrando.

 

Como o BD guarda os ataques vindo, voltando e as defesas chegando e retornando todos na mesma tabela, então, digamos que um ataque chegou ontem, porém o banco de dados só vai ser aberto hoje pra verificação e vai criar o retorno das tropas. Acontece que este retorno pode acontecer antes de outro ataque chegar, por isso vou precisar pegar esta entrada de retorno antes que o loop no banco de dados continue.

 

Sendo assim, usando o Do While normal dentro do banco de dados não vai mostrar os dados q eu inserir depois q ele for aberto, me obrigando a fechar ele e abrir de novo, assim os registros de tropas que chegam antes realmente vão ser calculados antes!

 

Tentei usar um exemplo mais simples lá em cima pq é meio complicado explicar tudo direitinho, porém espero que alguém entenda o que estou tentando fazer. Qualquer sugestão será bem vinda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

o recordset desconectado, lê o conteudo de uma SQL, desconecta e guarda os dados, dae você, poderia comparar os mesmos, mas nada impede de criar varios recordsets com suas respoectivas SQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lendo o topico, pensei em talvez uma comparação a ser feita entre os numeros.

Vou expor o que pensei o mais claro possivel:

 

Executo um select pegando o numero mais alto cadastrado no db, e também o select "normal".

 

Dentro do loop do select "normal" uso o numero mais alto resgatado no bd para disparar um contador.

 

Nesse contador, comparo o numero do contador com o numero do db, caso exista vai para o proximo, e se não existir, executo outro comando (que acho que é o que deseja correto ?)

 

Acho que é isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ou você pode toda fez que inserir no bd, recupera o valor que você quer e joga ele num array e sempre atualiza o array e faz a veirificação nele...

Compartilhar este post


Link para o post
Compartilhar em outros sites

não dae, você gera os 1000 arrays (os 1000 dados) dentro do array, entendeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

não dae, você gera os 1000 arrays (os 1000 dados) dentro do array, entendeu

 

 

Entendi sim =)

meeeeeeeee... brigadão pela força =)

 

Pode fechar o tópico já que agora acho que vai =P

Novamente, obrigado pelo apoio e ajuda de todos =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza Jean...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até iria postar como ficou, ams ficou muito grande... e como é muito específico, acredito que ninguém acabe precisando disso.

 

Mas basicamente eu crio uma variável (nem usei array), e vou incluindo os valores de datas adicionadas no banco de dados com um separador simples, no caso usei o "|".

Depois, quando o loop do BD é continuado, eu uso split pra encontrar nesta variável algum valor de data e hora menor, então executo outra função que verifica se ela deve ser excluída, ou se mantém adicionada no BD...

 

Ficou muito simples e muito prática, mas sabe como é... Quando você faz algo muito grande você não encherga algo simples dentro de tudo que fez e uma luz de fora quase sempre resolve. No meu caso a luz foi a indicação de usar um array, eu mesmo poderia ter pensado nisso, mas quando se faz algo, geralmente a mente fica focada demais em uma forma e não encherga o todo que existe pra ser feito.

 

Dá quase pra chamar de fofoca da programação, pq quando alguém faz fofoca de alguém é pq está vendo de fora algo que a própria pessoa não vê =P

 

Obrigado a todos, especialmente ao "xanburzum" pela dica que salvou meus 4 anos de trabalho empacados num "array" invisível!

 

xD

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.