Ir para conteúdo
Fórum Script Brasil
  • 0

2º Desafio


[ GuTo ]

Pergunta

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! wink.gif

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

  • 0

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 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...)...

Link para o comentário
Compartilhar em outros sites

  • 0

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, hehe

Bom, 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, hehe

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

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! biggrin.gif

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? blink.gif

Se não, diga-me ao q equivale o 1.

t+ laugh.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Putz, ninguém tá interessado, nem sabe a minha dúvida... sniff sniff

Mas 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 + 1

Colocando 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?

Link para o comentário
Compartilhar em outros sites

  • 0

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...

Link para o comentário
Compartilhar em outros sites

  • 0

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+

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...