#java #javafx #jdbc
#java #javafx #jdbc
Вопрос:
Я создаю приложение с графическим интерфейсом с пользовательской формой для создания листа, эти листы сохраняются в базе данных H2, что касается пользовательской формы, я вручную ввожу номер листа в текстовое поле и дату из datepicker.
Каждый лист имеет свой идентификатор, который должен быть уникальным для этого месяца. Первый созданный лист за этот месяц имеет идентификатор 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
}
-
Мой вопрос в том, как я могу эффективно проверить, существует ли номер листа в базе данных за этот месяц, без необходимости создавать дополнительный столбец. Дайте мне знать, если вы считаете, что фактическое решение является лучшим, поскольку дополнительный столбец — единственный столбец, который уникален, поэтому этот столбец я также использую, когда мне нужно удалить строку из базы данных.
-
Также я не могу придумать решение для автоматического увеличения номера листа и установки его в текстовое поле, например, проверить номер последнего листа за текущий месяц и установить для него текстовое поле «txt_SheetNumber», если ни одно из них не установлено равным 1, поэтому всякий раз, когда я инициализирую приложение, в текстовом поле уже есть номер листа. Если вы можете помочь мне с этим, я также был бы очень признателен.
Я впервые работаю с Java или любым другим языком программирования, поэтому не стесняйтесь комментировать любой аспект. Приложение предназначено только для того, чтобы облегчить мою работу.
Комментарии:
1. выглядит не связанным с javafx … сначала изучите материал, связанный с db, затем сделайте следующий шаг 🙂
2. Не имеет отношения к вашей проблеме: пожалуйста, изучите соглашения об именовании Java и придерживайтесь их. И дополнительно убедитесь, что вы изучили специальные соглашения об именовании свойств javafx (должно быть
sheetNumberProperty()
f.i.)3. хорошо, спасибо, сделаю, и я изменю свой код.
Ответ №1:
После некоторого копания я нашел решение для 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;
}