diff options
| author | Andrew Guschin <guschin.drew@gmail.com> | 2022-05-30 00:54:47 +0400 |
|---|---|---|
| committer | Andrew Guschin <guschin.drew@gmail.com> | 2022-05-30 00:54:47 +0400 |
| commit | 30cac6776ffe530892f27c87f7fc26db0f08fd8b (patch) | |
| tree | 47358897c9db1706f289433f979ba797a514cf68 | |
| parent | e296b1dbb2319b26282a1b6fac034ce1048714b9 (diff) | |
Отображение связи один ко многим
| -rw-r--r-- | interface/database.go | 41 | ||||
| -rw-r--r-- | interface/main.go | 131 |
2 files changed, 148 insertions, 24 deletions
diff --git a/interface/database.go b/interface/database.go index 446b015..4ddd2eb 100644 --- a/interface/database.go +++ b/interface/database.go @@ -29,15 +29,6 @@ func (conn *SQLConnection) init() error { return err } -type Box struct { - id int - orderId int - warehouseId int - wrappingId int - volume float32 - weight float32 -} - func (conn *SQLConnection) getTables() ([]string, error) { result, err := conn.db.Query( `SELECT TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME as TABLE_NAME @@ -100,17 +91,29 @@ func (conn *SQLConnection) getTable(table string) ([][]string, error) { _ = result.Scan(dest...) msg = append(msg, boxes) } - - //for result.Next() { - // var box Box - // err = result.Scan( - // &box.id, &box.orderId, - // &box.warehouseId, - // &box.wrappingId, - // &box.volume, &box.weight) - // msg = append(msg, box) - //} _ = result.Close() return msg, err } + +func (conn *SQLConnection) getOneToManyTable(manyTable string, manyColumn string, oneValue string) ([][]string, error) { + result, err := conn.db.Query(fmt.Sprintf( + "SELECT * FROM %s WHERE %s=%s", manyTable, manyColumn, oneValue)) + if err != nil { + return nil, err + } + + var msg [][]string + cols, _ := result.Columns() + for result.Next() { + boxes := make([]string, len(cols)) + dest := make([]interface{}, len(cols)) + for i, _ := range dest { + dest[i] = &boxes[i] + } + _ = result.Scan(dest...) + msg = append(msg, boxes) + } + + return msg, nil +} diff --git a/interface/main.go b/interface/main.go index 342debc..15a0077 100644 --- a/interface/main.go +++ b/interface/main.go @@ -5,6 +5,7 @@ import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/widget" ) @@ -145,6 +146,95 @@ func (app *DBInterface) selectAdminView(table string) { updateView() } +func (app *DBInterface) oneToManyShowAdmin(manyTable string, manyColumn string, oneValue string) { + data, err := app.db.getOneToManyTable(manyTable, manyColumn, oneValue) + if err != nil { + fmt.Println(err) + return + } + columns, err := app.db.getColumns(manyTable) + + tableWidget := widget.NewTable( + func() (int, int) { + return len(data) + 1, len(columns) + }, + func() fyne.CanvasObject { + return widget.NewLabel("some very wide content") + }, + func(i widget.TableCellID, o fyne.CanvasObject) { + if i.Row == 0 { + o.(*widget.Label).Alignment = fyne.TextAlignCenter + o.(*widget.Label).TextStyle = fyne.TextStyle{Bold: true} + o.(*widget.Label).SetText(fmt.Sprintf("%v", columns[i.Col])) + } else { + o.(*widget.Label).Alignment = fyne.TextAlignLeading + o.(*widget.Label).TextStyle = fyne.TextStyle{Bold: false} + o.(*widget.Label).SetText(fmt.Sprintf("%v", data[i.Row-1][i.Col])) + } + }) + + app.window.SetContent(container.NewMax(tableWidget)) +} + +func (app *DBInterface) oneToManyParamsAdmin(table string, row int) { + app.window.Resize(fyne.NewSize(720, 480)) + oneColumns, _ := app.db.getColumns(table) + tables, _ := app.db.getTables() + data, _ := app.db.getTable(table) + + oneColumn := "" + manyTable := "" + manyColumn := "" + oneValue := "" + + showTable := widget.NewButton("Показать таблицу", func() { + app.oneToManyShowAdmin(manyTable, manyColumn, oneValue) + }) + showTable.Disable() + + manyFieldSelect := widget.NewSelect([]string{}, func(manyColumnVal string) { + manyColumn = manyColumnVal + showTable.Enable() + }) + manyFieldSelect.Disable() + + manyTablesSelect := widget.NewSelect(tables, func(manyTableVal string) { + manyTable = manyTableVal + manyColumns, _ := app.db.getColumns(manyTable) + manyFieldSelect.Options = manyColumns + manyFieldSelect.Refresh() + manyFieldSelect.Enable() + }) + manyTablesSelect.Disable() + + selectedLabel := widget.NewLabel("") + + oneFieldSelect := widget.NewSelect(oneColumns, func(oneColumnVal string) { + oneColumn = oneColumnVal + columnIdx := 0 + for i, val := range oneColumns { + if val == oneColumn { + columnIdx = i + } + } + oneValue = fmt.Sprintf("%v", data[row][columnIdx]) + selectedLabel.Text = fmt.Sprintf( + "Значение [%s] выбранной строки = %v", + oneColumn, oneValue) + selectedLabel.Refresh() + manyTablesSelect.Enable() + }) + + app.window.SetContent( + container.NewVBox( + widget.NewLabel(fmt.Sprintf("Выбранная таблица: [%s]", table)), + container.NewHBox(widget.NewLabel("Представитель связи \"один\":"), oneFieldSelect), + selectedLabel, + container.NewHBox(widget.NewLabel("Таблица связи \"многие\":"), manyTablesSelect), + container.NewHBox(widget.NewLabel("Представитель связи \"многие\":"), manyFieldSelect), + showTable)) +} + func (app *DBInterface) showAdminTable(table string) { data, err := app.db.getTable(table) if err != nil { @@ -153,17 +243,30 @@ func (app *DBInterface) showAdminTable(table string) { } columns, err := app.db.getColumns(table) - list := widget.NewTable( + tableWidget := widget.NewTable( func() (int, int) { - return len(data), len(columns) + return len(data) + 1, len(columns) }, func() fyne.CanvasObject { - return widget.NewLabel("wide content") + return widget.NewLabel("some very wide content") }, func(i widget.TableCellID, o fyne.CanvasObject) { - o.(*widget.Label).SetText(fmt.Sprintf("%v", data[i.Row][i.Col])) + if i.Row == 0 { + o.(*widget.Label).Alignment = fyne.TextAlignCenter + o.(*widget.Label).TextStyle = fyne.TextStyle{Bold: true} + o.(*widget.Label).SetText(fmt.Sprintf("%v", columns[i.Col])) + } else { + o.(*widget.Label).Alignment = fyne.TextAlignLeading + o.(*widget.Label).TextStyle = fyne.TextStyle{Bold: false} + o.(*widget.Label).SetText(fmt.Sprintf("%v", data[i.Row-1][i.Col])) + } }) + selectedRow := -1 + tableWidget.OnSelected = func(id widget.TableCellID) { + selectedRow = id.Row - 1 + } + selectBtn := widget.NewButton("Выбрать", func() { app.selectAdminView(table) }) @@ -176,11 +279,29 @@ func (app *DBInterface) showAdminTable(table string) { app.deleteAdminView(table) }) + oneToMany := widget.NewButton("Один ко многим", func() { + if selectedRow == -1 { + dialog.ShowInformation( + "Один ко многим", + "Не выбрана ни одна строка в таблице", + app.window) + } else { + w := app.application.NewWindow("hello") + w.Resize(fyne.NewSize(100, 100)) + conn := DBInterface{app.application, w, app.db} + conn.oneToManyParamsAdmin(table, selectedRow) + w.Show() + } + }) + back := widget.NewButton("Назад", func() { app.adminView() }) - app.window.SetContent(genMainView(list, []fyne.CanvasObject{selectBtn, insertBtn, deleteBtn, back})) + app.window.SetContent( + genMainView( + tableWidget, + []fyne.CanvasObject{selectBtn, insertBtn, deleteBtn, oneToMany, back})) } func (app *DBInterface) adminView() { |