Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вопрос по автоматическому заполнению одного поля на основе значений другого / 11 сообщений из 11, страница 1 из 1
11.01.2005, 09:20:11
    #32858344
Вопрос по автоматическому заполнению одного поля на основе значений другого
Есть таблица tblTable1.

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

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

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

Например.

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

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

Посоветуйте, у кого какие идет?
...
Рейтинг: 0 / 0
11.01.2005, 09:31:43
    #32858357
Latuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по автоматическому заполнению одного поля на основе значений другого
Если прямо как написал то на событие после обновления TrackTitle
пихаеш формирование своего счетчика
http://www.sql.ru/faq/faq_topic.aspx?fid=214
но если задача просто пронумеровать
то я бы сделал составной ключь
а строки нумеровал в запросе
...
Рейтинг: 0 / 0
11.01.2005, 09:35:18
    #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
11.01.2005, 10:04:42
    #32858412
Вопрос по автоматическому заполнению одного поля на основе значений другого
Latuk , задача просто пронумировать.
Расскажи поподробней про твою идею.

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

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

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

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

Обязательно попробую. Потом расскажу. :)
...
Рейтинг: 0 / 0
12.01.2005, 09:33:19
    #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
12.01.2005, 11:45:26
    #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
12.01.2005, 11:51:13
    #32860694
Вопрос по автоматическому заполнению одного поля на основе значений другого
Я вот думаю, что можно реализовать как-нибудь без запроса, а программно.

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

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

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

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


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