Проверить существующую запись в базе данных + идентификатор автоинкремента -> несколько условий - PullRequest
0 голосов
/ 01 апреля 2019

Я создаю приложение с графическим интерфейсом пользователя с формой пользователя для создания листа, эти листы сохраняются в базе данных H2, а для формы пользователя я вручную вводю номер листа в текстовое поле и дату из средства выбора даты.

Каждый лист имеет свой идентификатор, который должен быть уникальным для этого месяца. Первый созданный лист для этого месяца имеет идентификатор 1, 2-й - 2 и т. Д., Но в течение следующего месяца идентификатор должен перезапуститься с 1.

Мне нужно проверить, существует ли уже запись в базе данных с этим номером листа в этом месяце. Я создал еще один столбец в базе данных, где хранится число + месяц + год, который я извлекаю из текстовых полей, и проверяю его там, но я ищу другой метод без необходимости создания дополнительного столбца.

Вот сеттер и геттер (я вставил только 3 значения):

public class FiseDetails {

    private final IntegerProperty sheetNumber;
    private final ObjectProperty<Date> sheetDate;
    private final StringProperty numberAndDate;

public FiseDetails(Integer sheetNumber, Date sheetDate, String numberAndDate) {
        this.sheetNumber = new SimpleIntegerProperty(sheetNumber);
        this.sheetDate = new SimpleObjectProperty<>(sheetDate);
        this.numberAndDate = new SimpleStringProperty(numberAndDate);
}

    public Integer getSheetNumber() {
        return sheetNumber.get();
    }

    public void setSheetNumber(Integer value) {
        sheetNumber.set(value);
    }

    public IntegerProperty SheetNumberProperty() {
        return sheetNumber;
    }

    public Date getSheetDate() {
        return sheetDate.get();
    }

    public void setSheetDate(Date value) {
        sheetDate.set(value);
    }

    public ObjectProperty SheetDateProperty() {
        return sheetDate;
    }

    public String getNumberAndDate() {
        return numberAndDate.get();
    }

    public void setNumberAndDate(String value) {
        numberAndDate.set(value);
    }

    public StringProperty NumberAndDateProperty() {
        return numberAndDate;
    }

}

Вот часть контроллера:

public class StartGUIController implements Initializable {

    Connection conn = DbConnection.Connect();
    ObservableList<FiseDetails> data = FXCollections.observableArrayList();
    PreparedStatement preparedStatement = null;
    ResultSet rs = null;

    @FXML
    private TextField txt_SheetNumber;

    @FXML
    private DatePicker sheetDate;

@FXML
    void generateSheet(ActionEvent event) throws SQLException {

        Integer id = Integer.parseInt(txt_SheetNumber.getText());
        LocalDate selectedDate = sheetDate.getValue();
        Date date = Date.valueOf(selectedDate);
        LocalDate strgDate = sheetDate.getValue();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM- yyyy");
        String formatedDate = (strgDate).format(formatter);
        String last7 = formatedDate.substring(formatedDate.length() - 7);
        String numberAndDate = txt_SheetNumber.getText() + " " + last7;

try (PreparedStatement checkNumberAndDateExists = conn.prepareStatement("SELECT 1 FROM SHEETSDB WHERE NUMBERANDDATE = ?")) {
            checkNumberAndDateExists.setString(1, numberAndDate);
            try (ResultSet result = checkNumberAndDateExists.executeQuery()) {
                if (result.next()) {
                    Alert confirmation = new Alert(AlertType.INFORMATION);
                    confirmation.setTitle("Fisa existenta");
                    confirmation.setHeaderText(null);
                    confirmation.setContentText("Fisa " + txt_SheetNumber.getText() + "/" + sheetDate.getValue() + " exista");
                    confirmation.showAndWait();

                } else {
                    String query = "INSERT INTO SHEETSDB (ID, SHEETDATE,  NUMBERANDDATE) VALUES (?,?,?)";
                    preparedStatement = null;
                    try {
                        preparedStatement = conn.prepareStatement(query);
                        preparedStatement.setInt(1, id);
                        preparedStatement.setDate(2, date);
                        preparedStatement.setString(26, numberAndDate);

                    } catch (SQLException e) {
                        System.out.println(e);
                    } finally {
                        preparedStatement.execute();
                        preparedStatement.close();
                    }

                    Alert confirmation = new Alert(AlertType.INFORMATION);
                    confirmation.setTitle("Finalizare generare fisa");
                    confirmation.setHeaderText(null);
                    confirmation.setContentText("Fisa " + txt_SheetNumber.getText() + "/" + sheetDate.getValue() + " a fost creata cu succes");
                    confirmation.showAndWait();
                    TableData();
                }
            }
        }

    }

@Override
    public void initialize(URL url, ResourceBundle rb) {
//here I have some code that does not have any impact on my problem
     }
  1. Мой вопрос заключается в том, как эффективно проверить, существует ли уже номер листа в базе данных за этот месяц, не создавая дополнительный столбец. Дайте мне знать, если вы считаете, что реальное решение является лучшим, поскольку дополнительный столбец является единственным столбцом, который является уникальным, поэтому этот столбец я также использую, когда мне нужно удалить строку из базы данных.

  2. Также я не могу придумать решение для автоматического увеличения номера листа и установки его в текстовое поле, например, проверка номера последнего листа в текущем месяце и установка его в текстовое поле "txt_SheetNumber", если оно не установлено это к 1, поэтому всякий раз, когда я инициализирую приложение, чтобы уже иметь номер листа в текстовом поле. Если вы можете помочь мне с этим также будет высоко ценится.

Я впервые работаю с Java или любым другим языком программирования, поэтому не стесняйтесь комментировать любые аспекты. Приложение предназначено только для того, чтобы облегчить мою работу.

1 Ответ

0 голосов
/ 01 апреля 2019

После некоторого копания я нашел решение для 2-й проблемы. Дайте мне знать, если я улучшу это.

int lastId() {

    int newSheetNumber=0;
    String query = "SELECT MAX(ID) FROM SHEETSDB WHERE MONTH(`SHEETDATE`)=MONTH(NOW()) AND YEAR(`SHEETDATE`)=YEAR(NOW())";
    try {
        preparedStatement = conn.prepareStatement(query);

        rs = preparedStatement.executeQuery();
        if (!rs.next()) {
            newSheetNumber = 1;
        }else {
            newSheetNumber = rs.getInt(1) + 1;
        }
        preparedStatement.close();
        rs.close();
        //System.out.println("The new sheet is: " + newSheetNumber);
    } catch (SQLException ex) {
        System.err.println("Error " + ex);
    }
    return newSheetNumber;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...