[ GuTo ] Postado Maio 24, 2004 Denunciar Share Postado Maio 24, 2004 (editado) Salve ASPers SB's.Vamos ao nosso 2º desafio.Criar uma função que retorne a 1ª incidência de uma falha na contagemde qualquer campo númerico de qualquer tabela, apartir do número 1 (não do zero).E se não houver falha, então dizer qual será a próxima "vaga" disponível.Nota: Trabalhe com todas as hipóteses de possíveis erros.Esta função deve:- servir para qualquer campo de qualquer tabela- trazer como retorno apenas o novo número- o código deve ser totalmente otimizado- o código deve ser o mais perfeito possívelSuponhamos...:Tabela: usuarios;Campos: id, nome;Registros: 10;Ex.1:Sendo os seguintes id's: 1,2,3,4,5,6,7,8,9,11Notem que falta o 10.Portanto, o 10 é a 1ªincidência de falha na contagem.Ex.2:Sendo os seguintes id's: 1,2,3,4,5,6,7,8,9,10Notem que não a falha.Portanto, o 11 será o novo número que poderá ser inserido.Dicas e mais informações: http://scriptbrasil.com.br/forum/index.php?showtopic=11193Realizado o desafio, encaminhar-me uma PM juntamente com o código.Boa programação! A única coisa que poderá ser diferente de um ASPer para outro no código são:O nome dado ao Objeto do Recordset e a sua Conexão.Obs.: se seu código estiver errado por apenas algum detalhe será recusado.Ranking:Diprezadark0mariofdfPS: Desafios Anteriores:- 1º Desafio Editado Junho 3, 2004 por [ GuTo ] Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 [ GuTo ] Postado Julho 8, 2004 Autor Denunciar Share Postado Julho 8, 2004 Opa...Voltando ao fórum à todo vapor e com os códigos do nosso 2º desafio!!!Antes de mais nada, quero dizer que organizei os códigos dos que participaram, porém não alterei sua lógica nem nada... em alguns coloquei um comentário.Depois de vocês terem visto todos os códigos, gostaria que chegassemos todos a um consenso (acho que é assim que se escreve) para podermos dizer qual seria o mais viavél, em todos os sentidos.Logo depois disso eu vou abrir diversas discussões sobre o mesmo (mesmo se até lá o 3ºdesafio já estiver feito...)Vamos lá:aqui o 1º código que eu fiz sobre isso... Ruim, lerdinho, grande d+, porém bastante didático. (depois melhorei ele um pouco, mas este é o PRIMEIRÃO...depois de eu ter alcançado meu objetivo, de ensinar vários detalhes a vocês, postarei a minha última versão desta função...e depois vamos analisa-las...e fazer tudo que disse mais acima.)Function NovoID(Tabela) Set rs8 = db.Execute("SELECT MAX(id) AS id_maior FROM "&Tabela&"") If IsNull(rs8("id_maior")) Then id_novo = 1 Else id_maior = rs8("id_maior") End If For x = 1 to Int(id_maior + 1) Set rs9 = db.Execute("SELECT id FROM "&Tabela&" WHERE id="&x) If rs9.eof Then id_novo = Int(x) Exit For End If Next Set rs9 = nothing Set rs8 = nothing NovoID = id_novo End Function Agora o código do: dipreza <% Function MostrarRegistro(Campo,Tabela) Set RS = Server.CreateObject("ADODB.Recordset") SQL = "Select "& Campo &" From "& Tabela &"" RS.Open SQL,db,1,1 If Rs.eof then response.write "Nenhum Registro !!!" 'bem, digamos que aqui seria um pequeno erro 'pois aqui deveria informar o nº1 como novo registro 'mas td bem... else Ultimo = Rs.recordcount For i = 1 to ultimo Atual = RS(""& Campo &"") If i <> Atual then MostrarRegistro = "Incidencia : <b>"& i Exit For Else MostrarRegistro = "Novo Numero : <b>"& Atual + 1 end if RS.MoveNext 'response.write i & " - " & atual & "<BR>" Next end if RS.close db.Close Set RS = nothing Set db = nothing End Function 'Response.Write MostrarRegistro("nomeCampo","nomeTabela")%> dark0 <% Function FProximo_registro(tabela,campo) sql = "select * from "&tabela&" order by "&campo&"" set rs = conexao.execute(sql) if rs.eof = true then FProximo_registro = 1 else i = 1 rs.MoveFirst do while not rs.eof if i <> rs(""& campo &"") then FProximo_registro = i else i = i + 1 FProximo_registro = i end if rs.MoveNext loop rs.MoveFirst end if End Function 'Response.Write FProximo_registro("nomeTabela","nomeCampo")%> mariofdf <% function brexa(a,b) cont = 1 SQL = "SELECT * FROM "& b &" order by "& a &"" Set RS = Con.Execute(SQL) Do While not RS.EOF if rs(""& a &"") = cont then cont = cont+1 else brexa = "Brexa no BD = "&cont end if RS.MoveNext Loop if brexa = "" then brexa = "Próximo vago = "&cont end if end function Response.Write brexa("id","membros")%>Aguardo comentários sobre os mesmos, sendo dúvidas, críticas, sugestões, erros (se tiverem...)... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 dark0 Postado Julho 8, 2004 Denunciar Share Postado Julho 8, 2004 Salve Guto !!!Bem vindo de volta ao fórum brother !! (Welcome Back, ou WB, que nem diriam os gringos.. huahuauha)É isso aí.. a galera já tava ansiosa à espera desses códigos !!!Bom, olhando assim, teoricamente parecem todos funcionar, mas não tive tempo de testar nenhum deles!No seu primeiro codigo tá esquisito!você faz o select na tabela, só pra pegar o ultimo, né.E depois, você testa um a um, se existe brecha.O Do dipreza e do Mario, apesar de estarem diferentes, usam basicamente a mesma lógica que eu usei aí!No meu, eu recebo o nome da tabela e do campo, como parametros, inicio um contador, depois faço um loop percorrendo toda a tabela, comparando o ID com o contador. Se forem diferentes, significa que há brecha. então, a brecha é armazenada!Se não tiver brecha, o novo registro se torna o número que vem depois do último registro.Taí.. gostei dos codigos, heheBom, já falei demais, né.então, vamos fazer o 3º desafio, e para o quarto, acho que vai ter uma surpresa pra galera!não dá de fazer a surpresa no 3º, porque já tá muito em cima, mas quem sabe prum quarto..Chega de papo, heheAbraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 [ GuTo ] Postado Julho 9, 2004 Autor Denunciar Share Postado Julho 9, 2004 No seu primeiro codigo tá esquisito!você faz o select na tabela, só pra pegar o ultimo, né.E depois, você testa um a um, se existe brecha. Antes de mais nada, quero agradecer pela recepção brother! Agora quanto ao q to citando:Sim, meu 1ºcódigo ficou bem esquisito. Acho q na época que fiz não sabia mta coisa de ASP (rs*), assim, eu 1º fiz um select na tabela pra pegar o MAIOR VALOR do campo ID, e depois testo um a um. Bem didático, porém ruim d+, como já disse.E cara, no meu primeiro código eu pensava q tinha analisado bem todas as questões, mas estava enganado. quando criei o desafio, fui verificar tudo melhor, e dae sim vi que tinham coisas d+ q eu podia mudar, e uma coisa que eu tinha pensado errado, mas q no código tanto fazia, não tinha problema.Uma é que eu dizia que tinha que ser o maio valor do campo ID pra poder se montar o loop, sendo que pode ser o total de registros (recordcount) também, ou como você dark0 fez.Como você mesmo disse dark0, os códigos de vc3 estão bem parecidos, e bons.Agora, depois disso tudo me intriguei com mtas coisas. Sou meio perfeccionista, e quero chegar ao "apse" deste código, rs*.Por isso levanto algumas questões:- Pensar numa maneira de deixar a aplicação mais rápida ainda.- Juntamente, tentar usar o menos o código possível.- E juntamente, não deixar nenhuma possibilidade de erro.Resumindo: uma aplicação o mais próximo da perfeição; rápida, pequena e sem erros.Depois de pensar nisso tudo, eu montei um código (logo mais posto ele), porém me pergunto.Se fizermos um recordset (só ele) assim:1- dim rs set rs = conexao.Execute(sql) e outro assim: 2 - dim rs set rs = server.createobject("adodb.recordset") rs.Open sql,conexao,1,1 'rs.CursorType = 1 'rs.LockType = 1 'rs.Location = ???o 1 é igual ao 2? Se não, diga-me ao q equivale o 1.t+ Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 [ GuTo ] Postado Julho 12, 2004 Autor Denunciar Share Postado Julho 12, 2004 Putz, ninguém tá interessado, nem sabe a minha dúvida... sniff sniffMas vamos lá!Fiz um código um pouco melhorado, aí está:<% Function NovoReg(strCampo,strTabela) Dim objRS, strCon, intCont Set objRS = Server.CreateObject("ADODB.RecordSet") objRS.Open("SELECT "&strCampo&" FROM "&strTabela&" ORDER BY "& strCampo&""),strCon,1,1 If objRS.EOF Then NovoReg = 1 Else For intCont = 1 To objRS.RecordCount Step 1 If objRS(strCampo) = intCont Then objRS.MoveNext Else NovoReg = intCont Exit For : Exit Function End If Next End If If NovoReg = "" Then NovoReg = objRS.RecordCount + 1 ObjRS.Close : Set objRS = Nothing End Function %> Podemos pensar melhor na linha: If NovoReg = "" Then NovoReg = objRS.RecordCount + 1Colocando de outra forma, talvez usando o IsNull ou o IsEmpety, não pensei nisso ainda e nem testei... Mas tudo bem, que acham deste último código?Podemos melhora-lo? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 mariofdf Postado Julho 13, 2004 Denunciar Share Postado Julho 13, 2004 Ai galera beleza....Bem quanto ao ultimo codigo,eu diria que o guto usou quase a mesma logica qua os outros usaram mas em outras palavras por assim dizer, achei legal o codigo, nem tinha imaginado em fazer desta forma, vou analisalo e tentar encontrar algum bug, vou comparar tambem o tempo de execução dele para ver se é mais agil que o meu... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 [ GuTo ] Postado Julho 24, 2004 Autor Denunciar Share Postado Julho 24, 2004 Ae mariofdf, como você vai fazer pra ver o tempo de execução? se já viu, quanto tempo deu?ah, já analisou o código do pessoal aí?Aos pouquinhos a gente sempre vai pensando um pouco mais além, eu estou olhando os códigos aos poucos e estou pequenas coisas que poderiam ser consideradas falhar, mas que no momento prefiro não dizer...t+ Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
[ GuTo ]
Salve ASPers SB's.
Vamos ao nosso 2º desafio.
Criar uma função que retorne a 1ª incidência de uma falha na contagem
de qualquer campo númerico de qualquer tabela, apartir do número 1 (não do zero).
E se não houver falha, então dizer qual será a próxima "vaga" disponível.
Nota: Trabalhe com todas as hipóteses de possíveis erros.
Esta função deve:
- servir para qualquer campo de qualquer tabela
- trazer como retorno apenas o novo número
- o código deve ser totalmente otimizado
- o código deve ser o mais perfeito possível
Suponhamos...:
Tabela: usuarios;
Campos: id, nome;
Registros: 10;
Ex.1:
Sendo os seguintes id's: 1,2,3,4,5,6,7,8,9,11
Notem que falta o 10.
Portanto, o 10 é a 1ªincidência de falha na contagem.
Ex.2:
Sendo os seguintes id's: 1,2,3,4,5,6,7,8,9,10
Notem que não a falha.
Portanto, o 11 será o novo número que poderá ser inserido.
Dicas e mais informações: http://scriptbrasil.com.br/forum/index.php?showtopic=11193
Realizado o desafio, encaminhar-me uma PM juntamente com o código.
Boa programação!
A única coisa que poderá ser diferente de um ASPer para outro no código são:
O nome dado ao Objeto do Recordset e a sua Conexão.
Obs.: se seu código estiver errado por apenas algum detalhe será recusado.
Ranking:
Dipreza
dark0
mariofdf
PS: Desafios Anteriores:
- 1º Desafio
Editado por [ GuTo ]Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.