Dúvida de lógica

2 respostas
P

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:
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;
	}

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:

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;
	}

2 Respostas

ivandasilva

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.

P

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

Criado 16 de outubro de 2012
Ultima resposta 16 de out. de 2012
Respostas 2
Participantes 2