Dúvida de lógica

Pessoal… estou com uma dúvida relacionada a lógica…

Tenho uma tabela onde gravo os registros… ai faço a verificação se um novo registro vai ser gravado, só que antes, se ele já estiver gravado, eu pego o registro já gravado e jogo em outra tabela (histórico).

A condição do Update na primeira tabela não sei como fazer, pois existem 3 campos que podem vir alterados (PK), e não sei como pegar este registro anterior e gravar na histórico antes de fazer o update.

abaixo como está meu código:

Aqui carrego a linha vinda de uma planilha do excel:

[code]
private Telecom carregarLinha(int nuLinhaAtual) {
ValoresPlanilhaEnum planilhaEnum = null;
Telecom linhaTelecom = new Telecom();
Cell[] celulas = sheet.getRow(nuLinhaAtual);

	for (int nuCelulaAtual = 0; nuCelulaAtual < celulas.length; nuCelulaAtual++) {
		Cell celula = celulas[nuCelulaAtual];
		TelecomCelulasEnum celulaTelecom = TelecomCelulasEnum
				.obterCelulaTelecom(nuCelulaAtual);

		switch (celulaTelecom) {
		case SIMCARD:
			linhaTelecom.setSimcard(celula.getContents());
			break;
		case LINHA:
			linhaTelecom.setLinha(celula.getContents());
			break;
		case APN_UTILIZADA:
			planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(celula
					.getContents());
			linhaTelecom.setApnUtilizada(planilhaEnum.getCodigo());
			break;
		case CONTA:
			linhaTelecom.setConta(celula.getContents());
			break;
		case OPERADORA:
			planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(celula
					.getContents());
			linhaTelecom.setOperadora(planilhaEnum.getCodigo());
			break;
		case PLANO:
			linhaTelecom.setPlano(celula.getContents());
			break;
		case STATUS_SIM_CARD:
			planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(celula
					.getContents());
			linhaTelecom.setStatusSIMCard(planilhaEnum.getCodigo());
			break;
		case DATA_ATIVACAO:
			TimeZone gmtZone = TimeZone.getTimeZone("GMT");
			SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
			format.setTimeZone(gmtZone);
			DateCell dataCell = (DateCell) celula;
			String dataFormatada = format.format(dataCell.getDate());
			linhaTelecom.setDtAtivacao(transformaData(dataFormatada));
			break;
		case FONTE:
			planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(celula
					.getContents());
			linhaTelecom.setFonte(planilhaEnum.getCodigo());
			break;
		case STATUS_LINHA:
			planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(celula
					.getContents());
			linhaTelecom.setStatusLinha(planilhaEnum.getCodigo());
			break;
		case IMSI:
			linhaTelecom.setImsi(celula.getContents());
			break;
		case CONSUMO_DADOS:
			linhaTelecom.setConsumoDados(celula.getContents());
			break;
		}
	}

	return linhaTelecom;
}[/code]

Aqui a DAO:


private static final String SQL_SIMCARD_UPDATE_CONTA = "UPDATE conta SET Numero = (?::varchar)::numeric, DataAlteracao = ? FROM simcard, plano, linha WHERE simcard.numeroConta = conta.numero AND conta.numero = linha.numeroConta AND conta.numero = plano.numeroConta AND conta.numero = (?::varchar)::numeric AND linha.numero = (?::varchar)::numeric AND simcard.numero = (?::varchar)::numeric"; 
	private static final String SQL_SIMCARD_UPDATE_PLANO = "UPDATE plano SET NumeroConta = (?::varchar)::numeric, Nome = (?::varchar), DataAlteracao = ? FROM simcard, conta, linha WHERE simcard.numeroConta = conta.numero AND conta.numero = linha.numeroConta AND conta.numero = plano.numeroConta AND conta.numero = (?::varchar)::numeric AND linha.numero = (?::varchar)::numeric AND simcard.numero = (?::varchar)::numeric";
	private static final String SQL_SIMCARD_UPDATE_LINHA = "UPDATE linha SET Numero = (?::varchar)::numeric, CodigoStatusLinha = (?::integer), NumeroConta = (?::varchar)::numeric, DataAtivacao = (?::date), DataAlteracao = ? FROM simcard, plano, conta WHERE simcard.numeroConta = conta.numero AND conta.numero = linha.numeroConta AND conta.numero = plano.numeroConta AND conta.numero = (?::varchar)::numeric AND linha.numero = (?::varchar)::numeric AND simcard.numero = (?::varchar)::numeric";
	private static final String SQL_SIMCARD_UPDATE_SIMCARD = "UPDATE SIMCard SET Numero = (?::varchar)::numeric, CodigoStatusSIMCard = (?::integer), CodigoAPNProvisionada = (?::integer), CodigoFonteDados = (?::integer), CodigoOperadora = (?::integer), NumeroConta = (?::varchar)::numeric, IMSI = (?::varchar)::numeric, ConsumoDados = (?::varchar), DataAlteracao = ? FROM conta, plano, linha WHERE simcard.numeroConta = conta.numero AND conta.numero = linha.numeroConta AND conta.numero = plano.numeroConta AND conta.numero = (?::varchar)::numeric AND linha.numero = (?::varchar)::numeric AND simcard.numero = (?::varchar)::numeric";

Declaração na DAO:

[code]public boolean simCardUpdateTelecom(String simCard, String linha,
int apnUtilizada, String conta, int operadora, String plano,
int statusSIMCard, Date dtAtivacao, int fonte, int statusLinha,
String imsi, String consumoDados) {
boolean atualiza = false;
Connection conn = null;
PreparedStatement co = null;
PreparedStatement pl = null;
PreparedStatement li = null;
PreparedStatement sc = null;

	try {
		conn = ConnectionManager.obterConexao();
		co = conn.prepareStatement(SQL_SIMCARD_UPDATE_CONTA);
		co.setString(1, conta); 
		co.setTimestamp(2,
				new java.sql.Timestamp(new java.util.Date().getTime()));
		co.setString(3, conta);
		co.setString(4, linha);
		co.setString(5, simCard);
		co.executeUpdate();

		pl = conn.prepareStatement(SQL_SIMCARD_UPDATE_PLANO);
		pl.setString(1, conta);
		pl.setString(2, plano);
		pl.setTimestamp(3,
				new java.sql.Timestamp(new java.util.Date().getTime()));
		pl.setString(4, conta);
		pl.setString(5, linha);
		pl.setString(6, simCard);
		pl.executeUpdate();

		li = conn.prepareStatement(SQL_SIMCARD_UPDATE_LINHA);
		li.setString(1, linha); 
		li.setInt(2, statusLinha);
		li.setString(3, conta);
		li.setDate(4, new java.sql.Date((dtAtivacao).getTime()));
		li.setTimestamp(5,
				new java.sql.Timestamp(new java.util.Date().getTime()));
		li.setString(6, conta);
		li.setString(7, linha);
		li.setString(8, simCard);
		li.executeUpdate();
		
		sc = conn.prepareStatement(SQL_SIMCARD_UPDATE_SIMCARD);
		sc.setString(1, simCard);
		sc.setInt(2, statusSIMCard);
		sc.setInt(3, apnUtilizada);
		sc.setInt(4, fonte);
		sc.setInt(5, operadora);
		sc.setString(6, conta);
		sc.setString(7, imsi);
		sc.setString(8, consumoDados);
		sc.setDate(9, new java.sql.Date((dtAtivacao).getTime()));
		sc.setString(10, conta);
		sc.setString(11, linha);
		sc.setString(12, simCard);
		sc.executeUpdate();

		

	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		ConnectionManager.fecharConexao(conn, null, co);
		ConnectionManager.fecharConexao(conn, null, pl);
		ConnectionManager.fecharConexao(conn, null, li);
		ConnectionManager.fecharConexao(conn, null, sc);
	}

	return atualiza;
}[/code]

Eu não entendi direito mas, vamos ver se ajuda, se a chave composta vier alterada, você não tem que fazer update e sim um insert, não se muda PK. O mais fácil para fazer histórico é inserir um campo na tabela, com o status do registro.

Então Ivan… o insert ta ok… consigo validar de boa…

O Problema ta na condição do Update, como são três campos que podem vir diferentes (simcard, conta e linha) não sei qual dos 3 podem estar vindo diferente para eu fazer a condição para o update. deixei os três ai só apra mostrar

WHERE simcard.numeroConta = conta.numero AND conta.numero = linha.numeroConta AND conta.numero = plano.numeroConta // AQUI QUE NÃO SEI QUAL VALOR DEIXAR PARA FAZER A CONDIÇÃO POIS PODE SER UM DELES QUE ESTÁ ALTERADO AND conta.numero = (?::varchar)::numeric AND linha.numero = (?::varchar)::numeric AND simcard.numero = (?::varchar)::numeric";

E o histórico é gravar essa linha anterior na tabela histórico, com os campos iguais ao das tabelas que preciso fazer o update