Ir para conteúdo

POWERED BY:

Arquivado

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

matewz

Problemas com while

Recommended Posts

Gente, eh o seguinte, eu tenho um while que precisa checar se o registro atual é diferente dos outros 3 anteriores então o código

 

bnd = 0					if tabrow = 4 then					RSLocaliza.Movefirst					while not i = 3 or RSLocaliza.EOF						while Cami1 = RSLocaliza("ModeloCaminhao") Or Cami2 = RSLocaliza("ModeloCaminhao") or Cami3 = RSLocaliza("ModeloCaminhao")							RSLocaliza.movenext							bnd = bnd + 1						 						 wend										i = i + 1					wend

Cami1 é o primeiro, Cami2 o segundo e Cami3 é o terceiro....

quando eu uso isso, ele da erro de exceção qdo não existe o 4º registro....

 

se ele acha 3 ele da pau na linha do while,

 

while Cami1 = RSLocaliza("ModeloCaminhao") Or Cami2 = RSLocaliza("ModeloCaminhao") or Cami3 = RSLocaliza("ModeloCaminhao")

 

Alguem tem alguma ideia de como resolver isso? ja tentei com if mais num funciono...

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

voce primeiro tem de ver quantos registros pegou..ai voce varre com um FOR e não com um WHILE fica mais simples e acho que mais correto tambem pois o FOR é usado quando sabemos quantas iterações teremos e o WHILE quando não sabemos

Compartilhar este post


Link para o post
Compartilhar em outros sites

mario... poderia representar em forma de código? soh que assim, eu não tenho ideia de qtas interações eu preciso, pois há caminhões com mesmo nome, e mudam outras coisas.... isso dae serve mais ou menos pra agrupar por nome....exemplo:Cargo 1517 - Entrei-Eixo: 4800Cargo 1517 - Entrei-Eixo: 5800Cargo 1517 - Entrei-Eixo: 6300Cargo 1717 - Entre-Eixo: 4300Cargo 1717 - Entre-Eixo: 4500Cargo 1717 - Entre-Eixo: 4700Cargo 3021 - Entre-Eixo: 5800Cargo 3021 - Entre-Eixo: 6000Cargo 3021 - Entre-Eixo: 6800ele pode pegar apenas o 1 nome de cada caminhão.. no casoCargo - 1517Cargo - 1717Cargo - 3021tendeu? mto obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais com esse codigo ele vai roda apenas 3 vezes certo? eu precisava na realidade de uma função que não tivesse num laço fixo.. como rodar apenas 3 vezes... pq o numero de caminhões com o mesmo nome pode ser de 10 ou ateh mesmo de 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Explica melhor o que você quer fazer, pois de repente sai alguma lógica mais simples.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom.. eh o seguinte....Tabela CaminhõesCargo 1517 - EE: 4800Cargo 1517 - EE: 4700Cargo 1517 - EE: 4500Cargo 1517 - EE: 4300Cargo 1517 - EE: 4200Cargo 1717 - EE: 5200Cargo 1717 - EE: 5400Cargo 1717e - EE: 5200Cargo 1717e - EE: 5400Cargo 3021 - EE: 5800Cargo 3021 - EE: 6000Cargo 3021 - EE: 6800Cargo 815s - EE: 5800Cargo 815s - EE: 6000Preciso que a rotina faça o seguinte.... Check dentro dessa tabela os caminhões diferentes... apenas os 4 primeiros no caso seriam...Cargo 1517Cargo 1717Cargo 1717eCargo 3021eh isso que eu preciso na realidade... é simples mais dentro do meu contexto ta fikando cada vez mais complicado...duvidas é soh perguntar :D valew

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se puder alterar a SQL ficaria:

Select top 4 DISTINCT Campo_caminhoes From tabela;

Compartilhar este post


Link para o post
Compartilhar em outros sites

não posso pelo seguinte...

SELECT Caminhoes.Id as CaminhoesId, Caminhoes.ModeloCaminhao, Caminhoes.PesosLMCUC, Caminhoes.MotorTipo,  Caminhoes.TransmModelo,  Caminhoes.PesosLMPED,  Caminhoes.PesosLMPET, Caminhoes.Tonelagem, Caminhoes.RRET, Caminhoes.MotorMarca_Motor, Caminhoes.DimemMDEDC, Caminhoes.DimenEE, Caminhoes.ChassiBT60, Caminhoes.ChassiBT, Caminhoes.PesosCUCED, Caminhoes.FotoCaminhoes, Caminhoes.PesosCUCET, Caminhoes.PBT, Caminhoes.PesosPVOMD, Caminhoes.PesosPVOMT,  Implementos.ID as ImplementosId, Implementos.Impl_Fabr, Implementos.Impl_Comp, Implementos.Impl_Peso,Implementos.Foto_Impl,  Implementos.Impl_EE, Tipo_Implementos.Id as TImplementosId, Tipo_Implementos.Impl_Tipo, Tipo_Implementos.StatusFROM (Implementos INNER JOIN  Caminhoes ON Implementos.Impl_EE = Caminhoes.DimenEE) INNER JOIN Tipo_Implementos on Implementos.Impl_Tipo = Tipo_Implementos.IdWHERE Peso + Implementos.Impl_Peso + PesosPVOMD + PesosPVOMT <= Caminhoes.PBT + ((Caminhoes.PBT / 100) * 5) and ((( Implementos.Impl_Peso + Peso) * (Caminhoes.DimenEE - ((Implementos.Impl_Comp / 2) + Caminhoes.DimemMDEDC)) / Caminhoes.DimenEE) + Caminhoes.PesosPVOMD) <= Caminhoes.PesosLMPED + ((Caminhoes.PesosLMPED / 100) * 7) AND ((Implementos.Impl_peso + Peso)  * ((Implementos.Impl_Comp / 2) + caminhoes.DimemMDEDC) / caminhoes.DimenEE) + Caminhoes.PesosPVOMT <= Caminhoes.PesosLMPET + ((Caminhoes.PesosLMPET / 100) * 7.5) and  Tipo_Implementos.ID = TipoORDER BY caminhoes.tonelagem, caminhoes.dimenee, Caminhoes.MotorMarca_Motor asc

essa eh minha sql :D

tem que ser em programação mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT Caminhoes.Id as CaminhoesId, Caminhoes.ModeloCaminhao, Caminhoes.PesosLMCUC, Caminhoes.MotorTipo,  Caminhoes.TransmModelo,  Caminhoes.PesosLMPED,  Caminhoes.PesosLMPET, Caminhoes.Tonelagem, Caminhoes.RRET, Caminhoes.MotorMarca_Motor, Caminhoes.DimemMDEDC, Caminhoes.DimenEE, Caminhoes.ChassiBT60, Caminhoes.ChassiBT, Caminhoes.PesosCUCED, Caminhoes.FotoCaminhoes, Caminhoes.PesosCUCET, Caminhoes.PBT, Caminhoes.PesosPVOMD, Caminhoes.PesosPVOMT,  Implementos.ID as ImplementosId, Implementos.Impl_Fabr, Implementos.Impl_Comp, Implementos.Impl_Peso,Implementos.Foto_Impl,  Implementos.Impl_EE, Tipo_Implementos.Id as TImplementosId, Tipo_Implementos.Impl_Tipo, Tipo_Implementos.Status
FROM (Implementos INNER JOIN Caminhoes ON Implementos.Impl_EE = Caminhoes.DimenEE) INNER JOIN Tipo_Implementos on Implementos.Impl_Tipo = Tipo_Implementos.Id
WHERE Peso + Implementos.Impl_Peso + PesosPVOMD + PesosPVOMT <= Caminhoes.PBT + ((Caminhoes.PBT / 100) * 5) and ((( Implementos.Impl_Peso + Peso) * (Caminhoes.DimenEE - ((Implementos.Impl_Comp / 2) + Caminhoes.DimemMDEDC)) / Caminhoes.DimenEE) + Caminhoes.PesosPVOMD) <= Caminhoes.PesosLMPED + ((Caminhoes.PesosLMPED / 100) * 7) AND ((Implementos.Impl_peso + Peso)  * ((Implementos.Impl_Comp / 2) + caminhoes.DimemMDEDC) / caminhoes.DimenEE) + Caminhoes.PesosPVOMT <= Caminhoes.PesosLMPET + ((Caminhoes.PesosLMPET / 100) * 7.5) and Tipo_Implementos.ID = Tipo AND Caminhoes.ModeloCaminhao IN (Select top 4 DISTINCT ModeloCaminhao From Caminhoes) ORDER BY caminhoes.tonelagem, caminhoes.dimenee, Caminhoes.MotorMarca_Motor asc

Repare que acrescentei mais um AND com a SQL que restringe a 4 modelos, testa e veja se funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou fazendo em Dreamweaver e banco do access... nu tem nda a v neh? pq deu pau Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)[Microsoft][Driver ODBC para Microsoft Access] Erro de sintaxe. na expressão de consulta '2541 + Implementos.Impl_Peso + PesosPVOMD + PesosPVOMT <= Caminhoes.PBT + ((Caminhoes.PBT / 100) * 5) and ((( Implementos.Impl_Peso + 2541) * (Caminhoes.DimenEE - ((Implementos.Impl_Comp / 2) + Caminhoes.DimemMDEDC)) / Caminhoes.DimenEE) + Caminhoes.PesosPVO'./filtro.asp, line 43

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionava antes?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos tentar outra coisa então:

SELECT TOP 4 DISTINCT(Caminhoes.ModeloCaminhao), Caminhoes.Id as CaminhoesId, Caminhoes.PesosLMCUC, Caminhoes.MotorTipo,  Caminhoes.TransmModelo,  Caminhoes.PesosLMPED,  Caminhoes.PesosLMPET, Caminhoes.Tonelagem, Caminhoes.RRET, Caminhoes.MotorMarca_Motor, Caminhoes.DimemMDEDC, Caminhoes.DimenEE, Caminhoes.ChassiBT60, Caminhoes.ChassiBT, Caminhoes.PesosCUCED, Caminhoes.FotoCaminhoes, Caminhoes.PesosCUCET, Caminhoes.PBT, Caminhoes.PesosPVOMD, Caminhoes.PesosPVOMT,  Implementos.ID as ImplementosId, Implementos.Impl_Fabr, Implementos.Impl_Comp, Implementos.Impl_Peso,Implementos.Foto_Impl,  Implementos.Impl_EE, Tipo_Implementos.Id as TImplementosId, Tipo_Implementos.Impl_Tipo, Tipo_Implementos.Status
FROM (Implementos INNER JOIN Caminhoes ON Implementos.Impl_EE = Caminhoes.DimenEE) INNER JOIN Tipo_Implementos on Implementos.Impl_Tipo = Tipo_Implementos.Id
WHERE Peso + Implementos.Impl_Peso + PesosPVOMD + PesosPVOMT <= Caminhoes.PBT + ((Caminhoes.PBT / 100) * 5) and ((( Implementos.Impl_Peso + Peso) * (Caminhoes.DimenEE - ((Implementos.Impl_Comp / 2) + Caminhoes.DimemMDEDC)) / Caminhoes.DimenEE) + Caminhoes.PesosPVOMD) <= Caminhoes.PesosLMPED + ((Caminhoes.PesosLMPED / 100) * 7) AND ((Implementos.Impl_peso + Peso)  * ((Implementos.Impl_Comp / 2) + caminhoes.DimemMDEDC) / caminhoes.DimenEE) + Caminhoes.PesosPVOMT <= Caminhoes.PesosLMPET + ((Caminhoes.PesosLMPET / 100) * 7.5) and Tipo_Implementos.ID = Tipo
ORDER BY caminhoes.tonelagem, caminhoes.dimenee, Caminhoes.MotorMarca_Motor asc

Caso não dê certo já tenho uma idéia do que fazer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)[Microsoft][Driver ODBC para Microsoft Access] Função 'DISTINCT' indefinida na expressão./filtro.asp, line 42:/deu este erro.. tb estou tentando de todas as formas aqui.. soh falta isso pra eu termina o projeto :/ se tiver mais ideias mandae

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oks, vamos lá:

Uso num sisteminha (experimental ainda) de busca na bíblia o seguinte esquema, ele verifica se o Livro anterior é igual ao Atual, se for ele apenas escreve o versículo numa var, se não for ele escreve o nome do livro na var. Esse é meu While

	While Not RS.EOF
	Livro_Anterior = RS("Cod")
	Nome_Livro = RS("Livro")
	Cod_Livro = RS("Cod")
	Cap_Livro = RS("Cap")
	If Livro_Anterior = RS("Cod") Then
		Livro_Atual = Livro_Anterior
		While (Livro_Atual=Livro_Anterior) AND Not(RS.EOF)
			Totais = Totais + 1
			Livro_Atual = RS("Cod")
			RS.MoveNext
		Wend
		Montagem = Montagem &"<TR bgcolor=""#FFFFCC""><TD align=""Right""><B><a OnClick=""Ver("& Cod_Livro &");"" href=""#detalhes"">"& Nome_Livro &"</a></B></TD>"
		If Texto <> "" Then
			Montagem = Montagem &"<TD align=""Left"">"& Server.HTMLEncode("Foram encontrada(s) "& Totais &" ocorrência(s) da palavra """& Texto &""" nesse livro.") &"</TD></TR>"&vbcrlf
		Else
			Montagem = Montagem &"<TD align=""Left"">"& Server.HTMLEncode("Contém: "& Cap_Livro &" Capitulos e "& Totais &" Versículos.") &"</TD></TR>"&vbcrlf
		End If
		Totais = 1
	End If

	If Not RS.EOF Then
		Totais = Totais + 1
		RS.MoveNext
	End If
Wend

Não repare que ainda tenho que ajustar algumas coisas.

 

O que podemos fazer para adaptar?

Se no seu caso o Modelo do Caminhão for diferente nós acrescentamos num contador e testamos se o contador for igual à 4 (ou à um valor pré-determinado numa outra variável) nós movemos o RecordSet para o último Registro e ele sai automáticamente do While.

 

Entendeu? Nem eu! Brincadeira, tente fazer usando essa idéia, qualquer duvida é só postar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hahaha, Bom, como ele tem que checar os 3 ultimos ja escolhidos, eu tinha pensado no While NOT Cami1 = RSLocaliza("ModeloCaminhao") OR Cami2 = RSLocaliza("ModeloCaminhao") OR Cami1 = RSLocaliza("ModeloCaminhao")por ser o mais logico entede? soh continua se não for igual aos outros 3, ja tentei com o For, mais não tenho um numero pré definido, ele é mto dinâmico... ja fiz tambem essa rotina do livro, mas não encaixa, ele pega o 1 ultimo apenas.. e laia, ki problema mais MALDITO :/continuarei tentandoideias? tudo é bem vindo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal, muito obrigado pela ajuda prestada... consegui terminar o código, espero pode ajudar alguem com ele tambem...

 

tabrow = 1	For x = 1 to 8 			if tabrow = 1 then				RSLocaliza.Movefirst				inde = 1				Cami1 = RSLocaliza("ModeloCaminhao")				tabrow = tabrow + 1				bnd = 0				call EscreveTable						elseif tabrow = 2 then						RSLocaliza.Movefirst						Do							while NOT RSLocaliza.EOF								if Cami1 = RSLocaliza("ModeloCaminhao") then									RSLocaliza.Movenext									bnd = bnd + 1								Else									exit DO								end if							wend						Exit do						Loop					tabrow = tabrow + 1					inde = bnd + 1					i = 0						if Not RSLocaliza.EOF then							call EscreveTable							Cami2 = RSLocaliza("ModeloCaminhao")							caminhao = RSLocaliza("ModeloCaminhao")								else 							Exit For													end if				bnd = 0				elseif tabrow = 3 then						RSLocaliza.Movefirst						Do							while NOT RSLocaliza.EOF								if Cami1 = RSLocaliza("ModeloCaminhao") then									RSLocaliza.Movenext									bnd = bnd + 1								Elseif Cami2 = RSLocaliza("ModeloCaminhao") then									RSLocaliza.Movenext									bnd = bnd + 1								Else									exit DO								end if							wend						Exit do						Loop					tabrow = tabrow + 1					inde = bnd + 1					i = 0						if Not RSLocaliza.EOF then							call EscreveTable							Cami3 = RSLocaliza("ModeloCaminhao")							caminhao = RSLocaliza("ModeloCaminhao")						else 							Exit For													end if				elseif tabrow = 4 then						RSLocaliza.Movefirst						Do							while NOT RSLocaliza.EOF								if Cami1 = RSLocaliza("ModeloCaminhao") then									RSLocaliza.Movenext									bnd = bnd + 1								Elseif Cami2 = RSLocaliza("ModeloCaminhao") then									RSLocaliza.Movenext									bnd = bnd + 1								Elseif Cami3 = RSLocaliza("ModeloCaminhao") then									RSLocaliza.Movenext									bnd = bnd + 1								Else									exit DO								end if							wend						Exit do						Loop					tabrow = tabrow + 1					inde = bnd + 1					i = 0						if Not RSLocaliza.EOF then							call EscreveTable							Cami4 = RSLocaliza("ModeloCaminhao")							caminhao = RSLocaliza("ModeloCaminhao")								else 							Exit For						end if				end if				x = x + 1			Next

é esse ae... muito obrigado novamente

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.