Gerar Código Automático

E ninguém resolve. O renanigt já colocou o comando de criar a sequence.

Para obter o próximo número da sequência você usa.

SELECT seq_departamento.NEXTVAL
FROM DUAL

Daí é rodar este SQL num Statement do JDBC, pegar o ResultSet, e ler o número que retorna. Se tiver usando Hibernate ou JPA, há outras formas. Se precisar também coloco o código.

O problema de usar sequences é que uma vez usadas, o número não volta, ele é sempre único e contínuo, a menos que destrua e crie a sequence de novo. Então seria bom só gerar o número junto de uma inserção e commit.

Caso, por exemplo, você gere o número, fale para o usuário que esse é o número dele, e usuário use esse número para fazer outra as operações, é capaz neste meio tempo o usuário desistir de continuar (ou por exemplo o computador travar), e com isso a tua sequence não vai ser usada. Até mesmo durante aquele insert que falei acima, o sistema pode falhar a sequence não será utilizada.

Eu recomendo que você considere isto uma situação comum, pois ela é comum mesmo, e não tenha na regra de negócio que este número deve ser sempre utilizado, que não haja pulos, etc, isso cria uma dor de cabeça enorme.

Sobre a solução do laudenpower, não funciona em um sistema com mais de um usuário concorrente, duas pessoas podem acabar com o mesmo número na mão.

Boa noiteeeee pessoal!
Estou eu de novo aqui, com o mesmo problema…sem solução, eu não consigo…fiz tudo o que postaram aqui, li o link enviado, fiz o escambau e nada…
Alguém por favor…uma luz…

Eu pensei em fazer assim:
Criar uma tabela no banco como por exemplo, autenticação, onde os campos seriam login e senha.
Logo, criaria um JSP que, no action chamaria uma servlet, nessa servlet eu gostaria de saber como faço pra reconhecer a autenticação do usuário pra acessar tal página.

Eis a questão…posso fazer isso?E como?

kkkk vcs devem estar falando essa guria é louca rssssssss, primeiro fala em gerar código automático e depois fala em login e senha hehehe…Me desculpem!
É que essa monografia tá me deixando louca, esse esquema de autenticação de usuário é outra coisa rssssssss :oops: :oops: :oops:…
Me ajudem com a geração de código automático por favoooor!

[quote=celia fernandes]Boa noiteeeee pessoal!
Estou eu de novo aqui, com o mesmo problema…sem solução, eu não consigo…fiz tudo o que postaram aqui, li o link enviado, fiz o escambau e nada…
Alguém por favor…uma luz…
[/quote]

Só uma dúvida, como vc ta fazendo para persistir no BD, quando tenta usar a sequência ?!

Eu fiz assim, como você colocou…pelo link que vc postou também vi que não posso criar com o mesmo nome da minha tabela e que esta uma sequência serve pra várias tabelas…

CREATE SEQUENCE seq_departamento     
MINVALUE 1       
 MAXVALUE 99999999       
 START WITH 1       
 INCREMENT BY 1     
 CACHE 5 

Pra obter o próximo numero da sequência fiz assim:

SELECT seq_departamento.NEXTVAL   
FROM DUAL  

Tudo executou muito bem, porém não acontece nada, ou melhor ele não gera o código quando faço o cadastro.
Uma duvida; quando fiz esta sequência todas as minhas tabelas já estavam executadas e eu já tinha cadastrado várias coisas colocando o código manualmente. Será que tenho que dar um DROP pra tudo e criar de novo?

olá celia,

bom vamos lá… você precisa gerar um codigo automático em um campo de sua tabela do castro certo?

blz, então vc já criou uma sequence agora vamos criar um trigger no oracle dentro de sua tabela de cadastro
você utiliza algum você utiliza algum regenciador de banco oracle aqui utilizo o sql navigator, assim fica bem fácio de criar, editar e apagar objetos de seu banco oracle, pode usar também o console web, mas vamos lá.
essa é a trigger q uso em uma aplicação de controle de documentos da STI/TRE
quando criar a trigger vc insere esse codigo no body:

DECLARE
-- declara as variaveis q receberão os valores

        v_num integer;
        v_count integer;

    BEGIN

-- aqui a trigger insere o numero sem precisar fazer o SELECT seq_departamento.NEXTVAL     FROM DUAL    
       -- ID é o campo q receberar o código automatico
 if :NEW.ID is null then
            SELECT SQ_DOC_STI.NextVal INTO v_num FROM DUAL;
            :NEW.ID:= v_num;
        end if;

-- insere e controla número de transferencias no ano // somente para núemero de cocumento. você também pode usá-lo para fazer seu codigo 
--aqui eu pego a quantidade + 1 por ano apara ter controle de numero
        if :NEW.NUM_DOC is null then
        SELECT (count(*) + 1)total into v_count FROM DOCUMENTOS_STI a where to_char(data, 'yyyy') = to_char(sysdate, 'yyyy') AND TIPO_DOC = :NEW.TIPO_DOC;
            :NEW.NUM_DOC:= v_count;
       end if;

    END;

ai você pode modificar como achar melhor.

qualquer coisa, caso não tenha entendido manda um e-mail q posso te ajudar.
pjunior@tre-ap.gov.br

abraço

Boa tarde, tudo bem!!!

Voltei neste tópico que eu tinha postado há algum tempo…eu não consigo gerar código automático…no meu banco (Oracle) eu fiz assim:/

CREATE TABLE VEICULO(
CODIGOVEICULO INTEGER NULL,
PLACA VARCHAR2 (10) NOT NULL,
MODELO VARCHAR2 (20) NOT NULL
);

insert into veiculo
CREATE SEQUENCE seq_veiculo
start with 1
increment by 1
maxvalue 99999999
nocycle
nocache; 

CREATE OR REPLACE TRIGGER insere_veiculo
 BEFORE INSERT ON veiculo
 FOR EACH ROW
 BEGIN
   SELECT seq_veiculo.nextval INTO :new.codigoveiculo FROM DUAL; 
END;


ALTER TABLE VEICULO
       ADD  (PRIMARY KEY (CODIGOVEICULO)) ;

Até aqui aparentemente tudo bem, porém quando vou no meu formulário e tento cadastrar algo e deixo sem preencher o código, ele não quer cadastrar… :cry:

Eu não sei se na minha Servlet eu tenho que modificar alguma coisa…segue abaixo:

package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import conexao.BDConector;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 * Servlet implementation class ServletVeiculo
 */
public class ServletVeiculo extends HttpServlet 
{
	
	private static final long serialVersionUID = 1L;
	private BDConector con = null;
       
    public ServletVeiculo() 
    {
        super();
        // TODO Auto-generated constructor stub
    }

    protected void processRequest (HttpServletRequest request, HttpServletResponse response)
    throws Exception
    {
		String action = request.getParameter("escondido");
		con = BDConector.getInstance("oracle");

		try 
		{
			if (action.equalsIgnoreCase("cadastrar")) 
			{
				PrintWriter out = response.getWriter();				
				
				   try
				   {
				      int codigoVeiculo=Integer.parseInt(request.getParameter("codigo"));
					   String placa=request.getParameter("placa");
					  String modelo= request.getParameter("modelo");
					  Statement curStmt = con.getConnection().createStatement();

				          ResultSet busca = curStmt.executeQuery("select codigoveiculo from veiculo where codigoveiculo="+codigoVeiculo);
				          if(busca.next()==true)
				          {
				             out.println("<br><br><p><h3 align = CENTER>Veículo já cadastrado.</h3></p>");
				          }
				          else
				          {    

				           boolean res = curStmt.execute("INSERT INTO veiculo Values ("+codigoVeiculo+",'"+placa+"','"+modelo+"')");
				           curStmt.close();
				           // A conexão fica aberta
                           //con.close(); // Fecha a conexão com o Banco de Dados


				           out.println("<p align='center'><font size='3' face='Verdana'><strong>Cadastro");
				           out.println("efetuado com sucesso!</strong></font></p><hr>");
				           out.println("<a target='_self' href='javascript:window.history.go(-1)'>Voltar</a>");
				           
				          }//else
				   }
				   catch(SQLException ex)
				   {
				      out.println("<p><h3 align = CENTER>Problemas com o banco de Dados!</h3></p>");
				      out.println(ex);
				   }
				   catch(java.lang.Exception ex)
				   {
				      out.println("<p><h3 align = CENTER>Erro de Comunicacao!</h3></p>");
				      out.println(ex);
				   }

			} 
			else if (action.equalsIgnoreCase("consultar")) 
			{
				//actionListarCidadesDesc(request, response);
				PrintWriter out = response.getWriter();
				out.println("<HTML><BODY><h2>");
				out.println("</span></h2><BODY><HTML>");
				
				   try
				   {
				          String cor="#FFFFFF";
					      Statement curStmt = con.getConnection().createStatement();
				          ResultSet res = curStmt.executeQuery("select * from veiculo order by modelo");

				          out.println("<h1 align=center>Consulta de Veículos</h1><br>");
				          out.println("<a target='_self' href='javascript:window.history.go(-1)'>Voltar</a>");
				          out.println("<table align='center' border='2' cellpadding='0' cellspacing='0' bgcolor='#808080' width='500'>");
				          out.println("<tr>");
				          out.println("<td><font color='#FFFFFF' face='Verdana'><strong>Código do Veículo</strong></font></td>");
				          out.println("<td><font color='#FFFFFF' face='Verdana'><strong>Placa</strong></font></td>");
				          out.println("<td><font color='#FFFFFF' face='Verdana'><strong>Modelo</strong></font></td>");
				          out.println("</tr>");
				          while (res.next()==true)
						  {
				             out.println("<tr>");
				             out.println("<td bgcolor='"+cor+"'><font face='Verdana'>"+res.getInt("codigoveiculo")+"</td>");
				             out.println("<td bgcolor='"+cor+"'><font face='Verdana'>"+res.getString("placa")+"</td>");
				             out.println("<td bgcolor='"+cor+"'><font face='Verdana'>"+res.getString("modelo")+"</td>");
				             out.println("</tr>");

					     if(cor.equals("#FFFFFF")) 
						  cor="#C0C0C0"; 
				          else    
				               if(cor.equals("#C0C0C0")) 
							      cor="#FFFFFF"; 
				          }
				          curStmt.close();
				          out.println("</table><br><br>");
				   }
				   catch(SQLException ex)
				   {
				      out.println("<p><h3 align = CENTER>Problemas com o banco de Dados!</h3></p>");
				      out.println(ex);
				   }
				   catch(java.lang.Exception ex)
				   {
				      out.println("<p><h3 align = CENTER>Erro de Comunicacao!</h3></p>");
				      out.println(ex);
				   }
			}   
						else
							if (action.equalsIgnoreCase("excluir")) 
							{
								//actionListarCidades(request, response);
								PrintWriter out = response.getWriter();
								out.println("<HTML align='center'><BODY><h2>");
								out.println("Excluído com Sucesso! <BR><span style=\"color: #FF0000\">");
								out.println("</span></h2><BODY><HTML>");
								
								   try
								   {
										  int codigoVeiculo=Integer.parseInt(request.getParameter("codigo"));
									      String placa=request.getParameter("placa");
										  String modelo= request.getParameter("modelo");
										
										  Statement curStmt = con.getConnection().createStatement();

										  ResultSet busca = curStmt.executeQuery("select codigoveiculo from veiculo where codigoveiculo = "+codigoVeiculo);
										  if(!busca.next()==true) // caso não encontre o grupo
										  {
								             out.println("<br><br><p><h3 align = CENTER>Não é possível excluir pois o código não está cadastrado.</h3></p>");
								          }
								          else
								          {   
								           boolean res = curStmt.execute("DELETE FROM veiculo where codigoveiculo = "+codigoVeiculo);
								           curStmt.close();
								           out.println("<a target='_self' href='javascript:window.history.go(-1)'>Voltar</a>");
								           
								          }//else
								   }
								   catch(SQLException ex)
								   {
								      out.println("<p><h3 align = CENTER>Problemas com o banco de Dados!</h3></p>");
								      out.println(ex);
								   }
								   catch(java.lang.Exception ex)
								   {
								      out.println("<p><h3 align = CENTER>Erro de Comunicacao!</h3></p>");
								      out.println(ex);
								   }
								
							}
							else
								if (action.equalsIgnoreCase("Relatorio"))
								{
									
									//ServletContext context = getServletContext();

									byte[] bytes = null;

									try {
										//JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject(context.getRealPath("/relatorio/Relatorio_Grupo.jasper"));
										JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject("C:\\Documents and Settings\\Celia\\Meus documentos\\testandoMONO\\ProjetoServletTFG\\WebContent\\Relatorios\\RelatorioDepartamento.jasper");
										

										Map<String, Object> params = new HashMap<String, Object>();
										//params.put("DATA", dataServidor);
										//params.put("MES_ANO_INI", dataInicial);
										//params.put("MES_ANO_FIM", dataFinal);
										//params.put("OBSERVACOES", "NÃO CONSTA AS DESPESAS GERADAS COM MATERIAIS DE ORTESE E PROTESE");

										//bytes = JasperRunManager.runReportToPdf(relatorioJasper, params, ds);
										bytes = JasperRunManager.runReportToPdf(relatorioJasper, params, con.getConnection());
									} 
									catch (JRException e) 
									{
										e.printStackTrace();
									}

									if (bytes != null && bytes.length > 0) 
									{
										response.setContentType("application/pdf");
										response.setContentLength(bytes.length);

										ServletOutputStream ouputStream = response.getOutputStream();
										ouputStream.write(bytes, 0, bytes.length);
										ouputStream.flush();
										ouputStream.close();

										//gerou = true;
									}
									
								}
				} 
		          catch (Exception e) 
		        {
		            PrintWriter out = response.getWriter();
					out.println("<HTML><BODY><h2>");
					out.println("ERRO: <BR><span style=\"color: #FF0000\">");
					out.println(e.getMessage());
					out.println("</span></h2><BODY><HTML>");
					e.printStackTrace();
					
					
				}
		          finally 
		        {
					//PrintWriter out = response.getWriter();
				    //out.close();
				}
		    	
		    }
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		try 
		{
			this.processRequest(request, response);
		} catch (Exception e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		try 
		{
			this.processRequest(request, response);
		} 
		catch (Exception e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

Me desculpem rsss por estar mandando quase um livro postado…é que não estou conseguindo fazer mesmo…Será que alguém poderia me ajudar??? :roll:

Celia,
deve haver algum problema com sua trigger;

editei sua trigger para vc alterar ai e testar:

DECLARE   
-- declara as variaveis q receberão os valores   
  // este é o valor declarado para receber a sequencia.
        v_num integer;   
         
    BEGIN   
  

if :NEW.CODIGOVEICULO is null then   
            SELECT seq_veiculo.NextVal INTO v_num FROM DUAL;   
            :NEW.CODIGOVEICULO:= v_num;   
        end if;   
   
    END; 

ok isso deve resolver.

abraço

Oii tudo bem???

Então dessa forma que eu fiz minha trigger…funcionou…por exemplo, se eu inserir algo manualmente no banco através do insert into e assim por diante e deixar o código como null…ele gera o código normal…
E lá no meu formulário que chama a Servlet…eu tenho os campos Codigo, Placa e Modelo…e o que acontece…eu cadastro sem preencher o código dá um erro: Erro de Comunicacao!

java.lang.NumberFormatException: For input string: “”

E se eu preencher o campo código com qualquer número…ele cadastra normal…e quando consulto aparece o código que teria que gerar automático e não o que eu tentei cadastrar…
Então eu acho que é algo na minha servlet, sei lá…Não sei se vcs conseguem me entender…rsss…me ajudemmmm…please!!! :?: :?: :?:

Oii bom dia pessoal!!!

Aqui na minha servlet tenho que mudar algo, mas eu não sei como colocar…ontem o prof, me explicou mais ou menos e fiz da forma que me disse porém não sei se está certo.


ResultSet busca = curStmt.executeQuery("select codigoveiculo from veiculo where codigoveiculo="+codigoVeiculo);   
                          if(busca.next()==true)   
                          {   
                             out.println("<br><br><p><h3 align = CENTER>Veículo já cadastrado.</h3></p>");   
                          }   
                          else   
                          {       
  
                           boolean res = curStmt.execute("INSERT INTO veiculo (placa,modelo) Values ("+null+",'"+placa+"','"+modelo+"')");   
                           curStmt.close();   

Poooor favor alguéeemmm!!!
Uma luzzz :idea: :idea: :idea: :?: :?: :?:

Eu nao sei se existem mais problemas, mas um deles é:

 boolean res = curStmt.execute("INSERT INTO veiculo (placa,modelo) Values ("+null+",'"+placa+"','"+modelo+"')");    

Vc esta inserindo placa e modelo, mas esta passando 3 valores no insert.

uma dica, vc nao precisa fazer:

if(busca.next()==true)

o metodo next ja retorna true ou false, vc pode fazer:

if(busca.next())

[]´s

na linha de insert vc retira o codigoVeiculo, segue alteração:

boolean res = curStmt.execute("INSERT INTO veiculo (placa,modelo) Values ('"+placa+"','"+modelo+"')"); 

veja se funciona assim.

abraços

Oiii boa noite!!!
Eu tentei fazer da forma que postaram aqui, mas também não deu certo, oh:

ResultSet busca = curStmt.executeQuery("select codigoveiculo from veiculo where codigoveiculo="+codigoVeiculo);
				          if(busca.next()==true)
				          {
				             out.println("<br><br><p><h3 align = CENTER>Veículo já cadastrado.</h3></p>");
				          }
				          else
				          {    
				           boolean res = curStmt.execute("INSERT INTO veiculo(placa,modelo)Values('"+placa+"','"+modelo+"')");
				           //Insert into veiculo (placa,modelo) values ('hgs2626','palio');
				           curStmt.close();

O que que pode ser hein…já tentei de tudooo… :frowning: :frowning:

vamos fazer o seguinte:

você posta o erro na integra para ver o q pode ser!?

aguardo

Oiii td bem?

Olha o erro que dá quando eu cadastro e deixo de preencher o campo código dá este erro:

Erro de Comunicacao!

java.lang.NumberFormatException: For input string: "" 

E na console mais específico este:

01/12/2009 20:36:46 org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:SCV' did not find a matching property.
01/12/2009 20:36:46 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Arquivos de programas\Java\jre1.6.0_07\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Arquivos de programas/Java/jre1.6.0_07/bin/client;C:/Arquivos de programas/Java/jre1.6.0_07/bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Arquivos de programas\Java\jdk1.6.0_07\bin;C:\tools\maven\bin
01/12/2009 20:36:47 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8007
01/12/2009 20:36:47 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 3384 ms
01/12/2009 20:36:47 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
01/12/2009 20:36:47 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.18
01/12/2009 20:36:52 org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\Documents and Settings\Celia\Meus documentos\SCV\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SCV\WEB-INF\lib\servlet.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
01/12/2009 20:36:55 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8007
01/12/2009 20:36:55 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8008
01/12/2009 20:36:55 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/156  config=null
01/12/2009 20:36:55 org.apache.catalina.startup.Catalina start
INFO: Server startup in 8632 ms

Bom dia,

Talvez seja a valor do codigo="" que faz erro.

dito d’outra maneira; para verificar é so inicializar a valor de codigoVeiculo=numaro inteiro .
Normalment esse valor é inicializado no Form com os params …

Uma prova em forma de demonstração :

[code]public class TestNumberFormatException {

public static void main(String[] args) {
	int codigoVeiculo=Integer.parseInt("");  
	
	System.out.println(codigoVeiculo);
}

}[/code]

Resultado :

Exception in thread "main" java.lang.NumberFormatException: For input string: ""

Pense em utilizar marcadores usando a débuggage no programa , tais como :
System.out.println ( “DEBUG: msssagem”);
Para saver o que se passa no programa, e os valores das variveis.

Abraços