Здравствуйте! Сегодня: Чт, 22 Окт 2020, Ваш IP: 3.238.62.144 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Список форумов Kbyte.Ru - - Базы данных
+ Создать новую тему Страница: 1 · 2
Тема: Access · +  +  дата добавления: 19.04.2012 / 12:27
Автор темы:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


Доброго времени суток!Подскажите пож-та:
в базе данных есть 2 таблицы. Первая содержит информацию о водителях и соответственно первичный ключ Таб.номер водителя,Вторая таблица содержит информацию о том,какой водитель куда едит(внешний ключ-таб.номер водителя).Можно ли сделать так,что при вводе ФИО водителя во вторую таблицу информация о его таб.номере и прочее введётся автоматически?
Технологии: Microsoft Access
 
Ответ # 1 # · +  +  дата добавления: 19.04.2012 / 13:19
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Для выборки данных из нескольких таблиц по ключевому полю можно использовать инструкцию INNER JOIN.
Например:
SELECT * FROM [водители]
INNER JOIN [поездки] ON [поездки].[номер водителя] = [водители].[номер водителя]

 
Ответ # 2 # · +  +  дата добавления: 19.04.2012 / 13:30
Автор ответа:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


strSQL = "SELECT * FROM Voditely "
INNER JOIN [Reisy] ON [Reisy].[Tabelny number voditelya] = [Voditely].[Tabelny number voditelya]
Set rs = db.OpenRecordset(strSQL)
вот так это должно выглядеть?
 
Ответ # 3 # · +  +  дата добавления: 19.04.2012 / 16:41
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


strSQL = "SELECT * FROM Voditely "
INNER JOIN [Reisy] ON [Reisy].[Tabelny number voditelya] = [Voditely].[Tabelny number voditelya]
Это единый запрос, он весь должен быть в кавычках:
strSQL = "SELECT * FROM Voditely INNER JOIN [Reisy] ON [Reisy].[Tabelny number voditelya] = [Voditely].[Tabelny number voditelya]"
 
Ответ # 4 # · +  +  дата добавления: 19.04.2012 / 20:41
Автор ответа:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


Хорошо,это я сделала..а каким образом это будет работать?В первой табл вводится таб.номер водителя,желательно чтоб во второй не вводился..а выводился в соответствии с выбранной фамилией..Скажем выбираем Иванова и он определяет,что его таб.номер=5..и выводит это..Так можно?
 
Ответ # 5 # · +  +  дата добавления: 19.04.2012 / 20:57
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


В первой табл вводится таб.номер водителя,желательно чтоб во второй не вводился..а выводился в соответствии с выбранной фамилией..Скажем выбираем Иванова и он определяет,что его таб.номер=5..и выводит это..Так можно?
Да, можно. Однако с числами будет работать быстрее, чем со строками. Т.е. желательно, чтобы номер водителя был в обоих таблицах. Тем более, что у разных людей могут быть одинаковые фамилии, хотя можно в INNER JOIN добавить дополнительные условия выбора, но это может сильно отразиться на производительности (скорости выборки данных), особенно если данных будет много (тысячи строк и более).
Например:
strSQL = "SELECT * FROM Voditely INNER JOIN [Reisy] ON [Reisy].[Фамилия водителя] = [Voditely].[Фамилия водителя] AND  [Reisy].[Имя водителя] = [Voditely].[Имя водителя]"
Условия можно продолжать, добавляя AND.
Либо, аналогично, можно сделать при помощи оператора WHERE:
strSQL = "SELECT * FROM Voditely INNER JOIN [Reisy] ON [Reisy].[Фамилия водителя] = [Voditely].[Фамилия водителя] WHERE [Reisy].[Имя водителя] = [Voditely].[Имя водителя]"
Чем больше условий, тем медленней будет происходить выборка данных.
В случае с числами, выборка будет происходить быстрее, так число занимает строгое, незначительно, количество байт, в отличие от строк.
 
Ответ # 6 # · +  +  дата добавления: 20.04.2012 / 07:51
Автор ответа:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


Ну вот задание такое..ввожу фамилию,а он таб.номер сам определяет..не знаю что и делать..Может можно как-нибудь синхронно?Скажем выбираю фамилию из ComboBox,а он в текстовом поле или неважно где определяет таб.номер из первой таблицы?возможно какой-нибудь сложный запрос?При условии, что во второй таблице внешний ключ не заполнен?
 
Ответ # 7 # · +  +  дата добавления: 20.04.2012 / 10:48
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Т.е. просто поиск
strSQL = "SELECT * FROM Voditely WHERE [Фамилия водителя] = '" & Combo1.Text & "'"
выбрать данные из таблица Voditely где поле "фамилия водителя" равно значению выбранному в ComboBox.

А для рейсов, с INNER JOIN:
strSQL = "SELECT * FROM Voditely INNER JOIN [Reisy].[Фамилия водителя] = [Voditely].[Фамилия водителя] WHERE [Фамилия водителя] = '" & Combo1.Text & "'"
Выбрать данные из таблиц Voditely и Reisy, которые связаны по полю "фамилия водителя", где поле "фамилия водителя" равно значению выбранному в ComboBox.

Но в последнем варианте, как я уже говорил, лучше по единому числовому идентификатору делать объединение (JOIN).
Хотя, если в обоих таблицах есть фамилия водителя, то можно обойтись без INNER JOIN, а просто сделать два отдельных запроса, это будет лучше (будет быстрее работать):
strSQL = "SELECT * FROM Voditely WHERE [Фамилия водителя] = '" & Combo1.Text & "'"
strSQL = "SELECT * FROM Reisy WHERE [Фамилия водителя] = '" & Combo1.Text & "'"
 
Ответ # 8 # · +  +  дата добавления: 20.04.2012 / 12:38
Автор ответа:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


Пишу вот так:
strSQL = "SELECT * FROM Voditely INNER JOIN [Reisy].[Voditel] = [Voditely].[Familiya] WHERE [Voditel] = '" & Combo1.Text & "'"
Так как в таблице Рейсы поле для фамилии назыв Voditel...он мне пишит ошибку: Syntax error in FROM clause..
И как потом делать вывод этого таб.номера скажем в текстовое поле?
 
Ответ # 9 # · +  +  дата добавления: 20.04.2012 / 12:57
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Да, верно, я ошибочный синтаксис показал
Вот так правильно:
strSQL = "SELECT * FROM Voditely INNER JOIN [Reisy] ON [Reisy].[Voditel] = [Voditely].[Familiya] WHERE [Voditel] = '" & Combo1.Text & "'"
SELECT * FROM основная таблица INNER JOIN присоединяемая таблица ON по каким полям происходит соединение
 
Ответ # 10 # · +  +  дата добавления: 20.04.2012 / 13:03
Автор ответа:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


Ага=)Теперь ошибку не выдаёт..а что начёт вывода?
 
Ответ # 11 # · +  +  дата добавления: 20.04.2012 / 15:18
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Код вывода будет такой же, как и предыдущей теме.
Данные можно выводить в любой элемент управления.

Например:
strSQL = "SELECT * FROM Voditely INNER JOIN [Reisy] ON [Reisy].[Voditel] = [Voditely].[Familiya] WHERE [Voditel] = '" & Combo1.Text & "'"
Set rs = db.OpenRecordset(strSQL)
'в rs должна находиться одна строка данных
Label1.Text = rs.Fields("Familiya")'выводим фамилию водителя в Label1
Label2.Text = rs.Fields("Tabelny number voditelya")'выводим табельный номер водителя в Labe2
'и т.д. и т.п.

'рейсы можно вывести циклом
Do Until RS.EOF 

  'вывод данных в текстовое поле
  Text1.Text = Text1.Text & RS.Fields("рейс") & vbCrLf

  'следующая строка данных
  RS.MoveNext 

Loop
 
Ответ # 12 # · +  +  дата добавления: 20.04.2012 / 17:48
Автор ответа:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


Выдаёт ошибку:
Item not found in this collection.
И не могу понять.Нигде не задействован атрибут Таб.номер водителя..а тут раз и всплыл..VB сможет определить откуда его брать?
 
Ответ # 13 # · +  +  дата добавления: 20.04.2012 / 17:50
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


VB сможет определить откуда его брать?
Нет.
 
Ответ # 14 # · +  +  дата добавления: 20.04.2012 / 17:56
Автор ответа:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


?
 
Ответ # 15 # · +  +  дата добавления: 20.04.2012 / 17:58
Автор ответа:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


И что тогда?
 
Ответ # 16 # · +  +  дата добавления: 20.04.2012 / 18:40
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Указывать явно

По идеи, звездочка в SQL-запросе должна выбираит все поля таблиц.
Если в таблицах есть поля с одинаковыми именами, то нужно указывать список полей явно в инструкции SELECT. Например:
strSQL = "SELECT [Voditely].[Familiya], [Voditely].[Tabelny number voditelya] FROM Voditely INNER JOIN [Reisy] ON [Reisy].[Voditel] = [Voditely].[Familiya] WHERE [Voditel] = '" & Combo1.Text & "'"
В этом примере из таблицы Voditely будет выбрано только два поля: Familiya и [Tabelny number voditelya].

Для полей также можно создавать алиасы (синонимы):
strSQL = "SELECT [Voditely].[Familiya], [Voditely].[Tabelny number voditelya] AS nomer FROM Voditely INNER JOIN [Reisy] ON [Reisy].[Voditel] = [Voditely].[Familiya] WHERE [Voditel] = '" & Combo1.Text & "'"
В этом примере из таблицы Voditely будет выбрано только два поля: Familiya и [Tabelny number voditelya], но поле [Tabelny number voditelya] будет иметь имя nomer. Т.е. rs.fields("Tabelny number voditelya") - не будет работать (выдаст ошибку), получить данные в таком случае можно только по синониму: rs.fields("nomer").

Одно и тоже поле можно указать в запросе много раз, установив разные синонимы:
strSQL = "SELECT [Voditely].[Tabelny number voditelya] AS nomer1, [Voditely].[Tabelny number voditelya] AS nomer2, [Voditely].[Tabelny number voditelya] AS nomer3 FROM Voditely INNER JOIN [Reisy] ON [Reisy].[Voditel] = [Voditely].[Familiya] WHERE [Voditel] = '" & Combo1.Text & "'"
В данном случае будет выбрано поле [Tabelny number voditelya], которое будет доступно для выбора в RecordSet по синонимам: nomer1, nomer2 и nomer3.

Аналогично можно передать в результат выполнения запроса любые данные, например:
SELECT 123 AS [какие-то цифры] FROM table1
в выборке будет колонка с именем [какие-то цифры], содержащая число 123.
 
Ответ # 17 # · +  +  дата добавления: 20.04.2012 / 19:08
Автор ответа:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


Вот так:
strSQL = "SELECT [Voditely].[Familiya], [Voditely].[idV] FROM Voditely INNER JOIN [Reisy] ON [Reisy].[Voditel] = [Voditely].[Familiya] WHERE [Voditel] = '" & Combo1.Text & "'"
Set rs = db.OpenRecordset(strSQL)
Do Until rs.EOF
Combo4.AddItem rs.Fields("idV")
rs.MoveNext
Loop
Правильно?
 
Ответ # 18 # · +  +  дата добавления: 20.04.2012 / 20:08
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Если работает, значит правильно
Синтаксис верный.
 
Ответ # 19 # · +  +  дата добавления: 21.04.2012 / 07:11
Автор ответа:
Egoza
Egoza
тем: 2 / ответов: 18 / благодарностей: 0 / репутация: 1
ответов: 18
создал(а) тем: 2


Да вот только не работает=))Вообще ничего не выводит...и ошибок нет..
 
Ответ # 20 # · +  +  дата добавления: 21.04.2012 / 11:32
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Значит данных по указанному запросу нет. Возможно логика неправильная.

Чтобы происходило объединение таблиц [Reisy] и [Voditely], при таком запросе, поля [Reisy].[Voditel] и [Voditely].[Familiya] должны содержать абсолютно одинаковые данные.

Т.е., например, чтобы выбрались данные водителя с фамилией Иванов, должно быть:
[Reisy].[Voditel] = "Иванов"
[Voditely].[Familiya] = "Иванов"

Судя по названию поля [Reisy].[b]Voditel[/b] - возможно в нем содержится не только фамилия, а еще и имя. Если так, то причина в этом.
Например:
[Reisy].[Voditel] = "Иванов Иван Иванович"
[Voditely].[Familiya] = "Иванов"
Естественно, "Иванов Иван Иванович" не может быть равен "Иванов", и эти данные не будут связаны друг с другом.
 
Страница: 1 · 2 + Создать новую тему