powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вопрос по автоматическому заполнению одного поля на основе значений другого
11 сообщений из 11, страница 1 из 1
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32858344
Есть таблица tblTable1.

В таблице следующие поля:
TrackID (счетчик)
TitleID (внешний ключ)
TrackNumber
TrackTitle

Есть форма на основе этой таблицы. Она является подчиненной формой.

Подскажите, как сделать так, чтобы при внесении изменений в поле TrackTitle, в поле TrackNumber появлялся численное значение. И при последующем внесении данных в поле TrackTitle, значение в поле TrackNumber увеличивалось бы на 1.

Например.

В главной форме вношу соответсующие названия.
В подчиненной форме начинаю вносить первую запись в поле TrackTitle, поле TrackNumber должно автоматически заполнить 1. Вношу вторую запись в поле TrackTitle, поле TrackNumber должно автоматически заполнить 2.

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

Посоветуйте, у кого какие идет?
...
Рейтинг: 0 / 0
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32858357
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если прямо как написал то на событие после обновления TrackTitle
пихаеш формирование своего счетчика
http://www.sql.ru/faq/faq_topic.aspx?fid=214
но если задача просто пронумеровать
то я бы сделал составной ключь
а строки нумеровал в запросе
...
Рейтинг: 0 / 0
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32858365
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Абсолютно аналогичгная ситуация. Таблица tblQuestion имеет счетчик iQiestionID и порядковый номер iQuestionNomer для нумерации в пределах вопросов, относящихся только к конкретному тесту. (Связь с главной таблицей через iTestID).

Плюс код для кнопок [вверх] [вниз] главной формы.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
Option Compare Database
Option Explicit

Private Sub Form_Load()

    Me.RecordSource = _
        "SELECT " & _
            "q.iQuestionID, " & _
            "q.iTestID, t.iClassNomer, t.sTestName, " & _
            "t.iCourseID, c.sCourseName, " & _
            "q.iQuestionNomer, q.iQuestionTypeCode, q.sQuestionText, q.nQuestionScore " & _
        "FROM (tblQuestion q " & _
            "INNER JOIN tblTest t ON q.iTestID=t.iTestID) " & _
            "INNER JOIN tblCourse c ON t.iCourseID=c.iCourseID " & _
        "ORDER BY " & _
            "q.iTestID, q.iQuestionNomer"
            
End Sub

Private Sub Form_Current()

    UpdateMoveButtons

End Sub

Public Function UpdateMoveButtons()

    On Error Resume Next
    Dim rs As DAO.Recordset
    Set rs = Me.Recordset
    If rs.RecordCount =  0  Or Me.NewRecord Then
        Me.Parent.btnMoveUp.Enabled = False
        Me.Parent.btnMoveDown.Enabled = False
    Else
        If Me.CurrentRecord =  1  Then
            Me.Parent.btnMoveUp.Enabled = False
        Else
            Me.Parent.btnMoveUp.Enabled = True
        End If
        If Me.CurrentRecord = rs.RecordCount Then
            Me.Parent.btnMoveDown.Enabled = False
        Else
            Me.Parent.btnMoveDown.Enabled = True
        End If
    End If

End Function

Private Sub Form_BeforeInsert(Cancel As Integer)

    Dim i
    i = DCount("iQuestionID", "tblQuestion", "iTestID=" & Me.Parent.iTestID)
    If IsNull(i) Then
        i =  1 
    Else
        i = i +  1 
    End If
    Me.iQuestionNomer = i

End Sub

Private Sub Form_DblClick(Cancel As Integer)

    Dim frm As Form_frmQuestion
    Set frm = modUtil.OpenFormWithRecordset("frmQuestion", Me.Recordset)
    frm.SetupQuestionItemGrid

End Sub

'На главной форме
Private Sub btnMoveUp_Click()

    Dim iQuestionNomer As Integer
    iQuestionNomer = Me.grdQuestionTest.Form.iQuestionNomer
    If iQuestionNomer <=  1  Then
        Beep
        Exit Sub
    End If
    ' 1 A      1 A      2 A   2 A
    ' 2 B   1002 B   1002 B   1 B
    ' 3 C      3 C      3 C   3 C
    CurrentProject.Connection.Execute _
        "UPDATE tblQuestion " & _
        "SET iQuestionNomer=" & CStr(iQuestionNomer +  1000 ) & " " & _
        "WHERE iQuestionNomer=" & CStr(iQuestionNomer)
    CurrentProject.Connection.Execute _
        "UPDATE tblQuestion " & _
        "SET iQuestionNomer=" & CStr(iQuestionNomer) & " " & _
        "WHERE iQuestionNomer=" & CStr(iQuestionNomer -  1 )
    CurrentProject.Connection.Execute _
        "UPDATE tblQuestion " & _
        "SET iQuestionNomer=" & CStr(iQuestionNomer -  1 ) & " " & _
        "WHERE iQuestionNomer=" & CStr(iQuestionNomer +  1000 )
    Me.grdQuestionTest.SetFocus
    With Me.grdQuestionTest.Form
        .Requery
        .Recordset.FindFirst "iQuestionNomer=" & CStr(iQuestionNomer -  1 )
    End With

End Sub

Private Sub btnMoveDown_Click()

    Dim iQuestionNomer As Integer
    iQuestionNomer = Me.grdQuestionTest.Form.iQuestionNomer
    If iQuestionNomer = Me.grdQuestionTest.Form.Recordset.RecordCount Then
        Beep
        Exit Sub
    End If
    CurrentProject.Connection.Execute _
        "UPDATE tblQuestion " & _
        "SET iQuestionNomer=" & CStr(iQuestionNomer +  1000 ) & " " & _
        "WHERE iQuestionNomer=" & CStr(iQuestionNomer)
    CurrentProject.Connection.Execute _
        "UPDATE tblQuestion " & _
        "SET iQuestionNomer=" & CStr(iQuestionNomer) & " " & _
        "WHERE iQuestionNomer=" & CStr(iQuestionNomer +  1 )
    CurrentProject.Connection.Execute _
        "UPDATE tblQuestion " & _
        "SET iQuestionNomer=" & CStr(iQuestionNomer +  1 ) & " " & _
        "WHERE iQuestionNomer=" & CStr(iQuestionNomer +  1000 )
    Me.grdQuestionTest.SetFocus
    With Me.grdQuestionTest.Form
        .Requery
        .Recordset.FindFirst "iQuestionNomer=" & CStr(iQuestionNomer +  1 )
    End With

End Sub


...
Рейтинг: 0 / 0
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32858412
Latuk , задача просто пронумировать.
Расскажи поподробней про твою идею.

Программист-Любитель , весьма интересный пример.

База находится дома. Сейчас не могу попробовать. Просто каждый раз вручную нумировать трек, как-то неудобно.

Я вот пропустил в Факе, "Как сымитировать счетчик в обычном запросе либо ленточной форме?" .

Может восользоваться таким вариантом?
...
Рейтинг: 0 / 0
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32858427
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32858455
Latuk , спасибо за совет.

Обязательно попробую. Потом расскажу. :)
...
Рейтинг: 0 / 0
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32860343
Попробовал я вариант 1:

Код: plaintext
1.
2.
SELECT DCount("f", "t","f<=" & CStr(f)), f
FROM t
ORDER BY f;

Появляется сообщение: "Несоответсвие типов данных" .

Попробовал я вариант 2:

Код: plaintext
1.
2.
SELECT (Select Sum( 1 ) From t AS p Where p.f<=p1.f), p1.f
FROM t AS p1
ORDER BY p1.f;

Все работает хорошо, только для одной ленточной формы, а для подчиненной ленточной отображает номера в зависимости от их номера в таблице.

А мне нужно, чтобы при выборе нового исполнителя и его альбома нумерация начиналась заново.

Т.е. получатся.

Номер Название2 ббб5 ддд

Попробовал вариант 3:

Код: plaintext
1.
2.
3.
4.
select count (test_2.id_test) as rank, test_1.id_test, test_1.string
from test as test_1 inner join test as test_2 on
	test_1.id_test >= test_2.id_test
group by test_1.id_test, test_1.string
order by rank

Ругуется на >= .
...
Рейтинг: 0 / 0
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32860670
Попробовал вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select test_3.rank, test_3.id_test, test_3.string
from (select test_1.id_test,
		test_1.string,
		(select count(*) 
			from test as test_2
			where test_2.id_test <= test_1.id_test
		) as rank
	from test as test_1) as test_3
order by rank

Все нумерует, но последовательно.

Т.е. получается:

Исполнитель 1

Номер Название1 Назв12 Назв2

Исполнитель 2

Номер Название3 Назв14 Назв2

У кого есть какие соображения, чтоб заново формировать номера?
...
Рейтинг: 0 / 0
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32860694
Я вот думаю, что можно реализовать как-нибудь без запроса, а программно.

Код: plaintext
1.
2.
3.
Private Sub txtTrackTitle_AfterUpdate()
    Me.txtTrackNumber =  1  
End Sub

А потом как появилось число, для последующих записей делать + 1.
...
Рейтинг: 0 / 0
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32862473
Нашел я пример решения данной проблемы.

Кому интересно:

http://www.msaccess.ru/js_forms_14.html
...
Рейтинг: 0 / 0
Вопрос по автоматическому заполнению одного поля на основе значений другого
    #32864136
M700
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А Вам обязательно нужно чтобы в TrackID и TrackNumber были разные значения?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вопрос по автоматическому заполнению одного поля на основе значений другого
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]