Mise a jour de l'identidiant

Fermé
abayekhizi Messages postés 3 Date d'inscription samedi 10 août 2013 Statut Membre Dernière intervention 21 août 2016 - 20 août 2016 à 21:17
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 21 août 2016 à 11:28
bonjour! j'ai un petit soucis qui me tracasse. Je developpe actuellement une application de gestion de stock. Je voudrais mettre a jour les ID de chaque produit ( qui ne sont pas des clés primaires) aprés suppression d'un produit.

exemple:

initiallement j'ai cette liste de produits

1 Coca Cola

2 Fata

3 Red Bull

apres suppression de Fata je dois obtenir ceci

1 Coca Cola

2 Red Bull

Voici mon code mais ca ne marche pas correctement

for (int var=0; var < lsAdresse; var++){
JOptionPane.showMessageDialog(null," debutttttttttttt");


int var1=var+1;

String lsSQL2="select num from entre where num_facture='"+nf1.getText()+"' LIMIT "+var+",1";
Statement state1 = con.createStatement();
int lsAdresse8 = 1;
ResultSet result1 = state.executeQuery(lsSQL);
result1.next();
lsAdresse8 = result1.getInt(lsAdresse8);



int var3=8;


String lsSQL1 = " update entre set num="+var1+" where num_facture='"+nf1.getText()+"' and num="+lsAdresse8+" ";
int res8 = s4.executeUpdate(lsSQL1);

table();
JOptionPane.showMessageDialog(null," finnnnnnnnnnnn");





}
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
20 août 2016 à 22:01
Bonjour,

Je ne comprends pas bien ton code...

String lsSQL2="select num from entre where num_facture='"+nf1.getText()+"' LIMIT "+var+",1";

Déjà il faudrait faire des PreparedStatement pour éviter l'injection SQL, d'autre part num_facture est a priori une clé donc à quoi sert le LIMIT ?
D'ailleurs si c'est un numéro pourquoi mettre des String ? Tu dois choisir de manière adaptée les types de données que tu manipules.

Quant à ton décalage, ça ressemble à une mauvaise idée, effectivement pour l'utilisateur c'est peut-être utile dans l'interface graphique, mais ça ne sert à rien de persister cette donnée en base, il faut juste faire un mapping côté Java pour que lorsque tu requêtes la valeur "2" dans ton interface graphique cela corresponde au num "12345" en base de données.
0
abayekhizi Messages postés 3 Date d'inscription samedi 10 août 2013 Statut Membre Dernière intervention 21 août 2016
21 août 2016 à 01:24
j'ai trouvé l'erreur
 ResultSet result1 = state.executeQuery(lsSQL2);
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
21 août 2016 à 11:28
Si tu réorganises ton code, en séparant ta partie SQL du reste du code tu n'aurais jamais ce genre d'erreur, car là tout se mélange, avec plein de variables dont on ignores le rôle d'autant qu'elles sont réutilisées au fur et à mesure...

Voici une version rigoureuse de ton décalage de numéros :

import java.sql.*;
import java.util.*;

// ...

public SortedSet<Integer> getNumForNumFacture(String numFacture) throws SQLException {
    String sql = "SELECT num FROM entre WHERE num_facture = ?";
    try (PreparedStatement ps = con.prepareStatement(sql)) {
        ps.setString(1, numFacture);
        try (ResultSet rs = ps.executeQuery()) {
            SortedSet<Integer> set = new TreeSet<>();
            while (rs.next()) {
                Integer num = rs.getInt(1);
                if (!rs.wasNull()) {
                    if (!set.add(num)) {
                        throw new SQLException("numFacture `" + numFacture + "` had multiple num " + num);
                    }
                }
            }
            return set;
        }
    }
}

public void deleteNumForNumFacture(String numFacture, Integer numToDelete) throws SQLException {
    String sql = "DELETE FROM entre WHERE num_facture = ? AND num = ?";
    try (PreparedStatement ps = con.prepareStatement(sql)) {
        ps.setString(1, numFacture);
        ps.setInt(2, numToDelete);
        int n = ps.executeUpdate();
        if (n != 1) {
            throw new SQLException(n + " rows deleted (expected 1) when deleting num " + numToDelete + " for numFacture `" + numFacture + "`");
        }
    }
}

public void updateNumForNumFacture(String numFacture, Integer numPrevious, Integer numNext) throws SQLException {
    String sql = "UPDATE entre SET num = ? WHERE num_facture = ? AND num = ?";
    try (PreparedStatement ps = con.prepareStatement(sql)) {
        ps.setInt(1, numNext);
        ps.setString(2, numFacture);
        ps.setInt(3, numPrevious);
        int n = ps.executeUpdate();
        if (n != 1) {
            throw new SQLException(n + " rows updated (expected 1) when updating num " + numPrevious + " to " + numNext + " for numFacture `" + numFacture + "`");
        }
    }
}

public void delete(String numFacture, Integer numToDelete) throws SQLException {
    SortedSet<Integer> numSet = getNumForNumFacture(numFacture);
    if (!numSet.contains(numToDelete))
        return;
    deleteNumForNumFacture(numFacture, numToDelete);
    Integer[] numArray = numSet.toArray(new Integer[numSet.size()]);
    for (int i = Arrays.binarySearch(numArray, numToDelete) + 1; i < numArray.length; i++) {
        updateNumForNumFacture(numFacture, numArray[i], numArray[i - 1]);
    }
}

Ce qui donne :

JOptionPane.showMessageDialog(null, " debutttttttttttt");
delete(nf1.getText(), var);
table();
JOptionPane.showMessageDialog(null, " finnnnnnnnnnnn");
0