Ru-Board.club
← Вернуться в раздел «Программы»

» Про MS Access

Автор: Star Ik
Дата сообщения: 07.02.2007 08:53
Pantera3587

Цитата:
Оказывается все так просто.

В проф. приложениях обычно делают несколько сложнее. Чтобы не загромождать календарем форму, особенно если на ней много полей, календарь помещают в другую модальную форму, ограниченную его размером, которую затем открывают либо двойным щелчком на поле ввода, либо нажатием небольшой кнопки справа от поля ввода, которая, в свою очередь, может появляться лишь при получении фокуса этим полем. Но это все уже из области дизайна.
Удачи и успехов!
Автор: Pantera3587
Дата сообщения: 07.02.2007 16:22
Star Ik
К тебе еще вопрос. Делаю две таблицы Товар1(КодТовар1, Наименование1, Цена1), Товар2 (КодТовар2, Наименование2, Цена2). Делаю третью таблицу Подбор (КодПодбор, Наименование, ЦенаПодбор). Делаю форму, в которой два списка: СписокТовар1 и СписокПодбор. В общем использую также как и впредыдущем вопросе принцип: при двойном щелчке из одного списка добавляю данные в другой список, т.е. из СписокТовар1 в СписокПодбор. Только теперь хочу, чтобы добавлялось два поля Наименование1 и Цена1. Пишу тот же код:

Private Sub Form_Open(Cancel As Integer)
СписокПодбор.RowSource = "SELECT [Подбор].[Наименование], [Подбор].[ЦенаПодбор]FROM [Подбор]"
End Sub

Private Sub СписокТовар1_DblClick(Cancel As Integer)
Dim База1 As Object, Подбор As Object

Set База1 = CurrentDb
Set Подбор = База1.OpenRecordset("Подбор")
Подбор.AddNew
Подбор![Наименование] = СписокТовар1
Подбор![ЦенаПодбор] = СписокТовар1
Подбор.Update
СписокПодбор.Requery
СписокПодбор = СписокТовар1
Подбор.Close
Set База1 = Nothing

End Sub

да в свойстве СписокТовар1 в строке Источник строк стоит
SELECT Товар1.Наименование1, Товар1.Цена1 FROM Товар1;
присоединенный столбец 1
в свойстве СписокПодбор в строке Источник строк:
SELECT [Подбор].[Наименование], [Подбор].[ЦенаПодбор] FROM [Подбор];
присоединенный столбец 1

При пробе выдает Ошибка преобразования данных и выделяет строку
Подбор![ЦенаПодбор] = СписокТовар1
Убираешь эту строку, добавляется только наименование. а нужно, чтобы добавилось и наименование и цена. Как правильно исправить код?

Второй вопрос. Есть еще таблица Товар2. Как можно сделать, чтобы выделив в СпискеПодбор какое-нибудь наименование, заменить его на наименование из таблицы Товар2. Может быть сделать кнопку Заменить, при нажатии на которую открывался бы список СписокТовар2. А дальше должно быть выделено наименование из СпискаПодбор, затем выделяется наименование из СпискаТовар2 и при его выделении должна произойти замена. Как это можно осуществить?


Добавлено:
Еще один вопрос. Как импортировать с интеренета какой-нибудь прайс сразу в базу. Возможно ли такое?. Может кто приведет пример?
Автор: Star Ik
Дата сообщения: 08.02.2007 14:31
Pantera3587

Цитата:
К тебе еще вопрос.

Да это не вопрос, а настоящий ДОПРОС с пристрастием!
Я могу на все ответить, но это займет слишком много места (гораздо больше чем вопрос).
Может сбросиш мне свою базу (адрес смотри в личке), я приведу её в божеский вид и через пару дней верну с комментариями. Раньше не смогу - текучка заедает.
По поводу импорта прайсов могу сказать следующее: напрямую из сети импортировать в базу ЛЮБОЙ прайс весьма затруднительно. Они могут иметь разный формат (HTML, Excel, Word и т.д.), различное оформление (разделы, примечания, картинки). Импорт обновлений одного и того же прайса возможен, если он имеет постоянный табличный формат. Методика импорта зависит от формата прайса.
Автор: Pantera3587
Дата сообщения: 08.02.2007 18:10
Star Ik
Подскажи как тебе отправить базу?
Цитата:
адрес смотри в личке
А где это?
Автор: Star Ik
Дата сообщения: 08.02.2007 20:32
Pantera3587

Цитата:
А где это?

В правом верхнем углу страницы форума ссылка Личный Ящик. Это внутренняя почта форума.
Автор: Pantera3587
Дата сообщения: 09.02.2007 15:29
Star Ik
базу тебе отправила.
Автор: Star Ik
Дата сообщения: 12.02.2007 08:34
Pantera3587
Загляни в личку.
Автор: The Invisible
Дата сообщения: 12.02.2007 18:43
Привет, сначала запостил в теме про Excel, посоветовали обратиться в эту тему.

надо осуществить следующее :

есть несколько больших файлов *.xls
файлы в виде отчетов допустим с такими колонками:
имя / фамилия / место / дата

мне надо как то сделать фильтрацию по некоторым колонкам
допустим выбираю: такая то дата, и такое то имя..

и надо чтоб взяло соответствующие данные из всех файлов *.xls
и представило в виде одного файла или предложило бы сохранить в виде *.xls

как такое в Access сделать?

заранее спасибо
Автор: Star Ik
Дата сообщения: 12.02.2007 22:17
The Invisible
Если порядок и формат соответствующих полей во всех файлах *.xls одинаковый, то вручную это сделать просто:
Из первого файла *.xls импортировать таблицу в Access. Затем, через буфер, добавить в неё все строки из таблиц других файла *.xls (ес-но без заголовков). К полученной таким образом "сводной" таблице применить необходимый фильтр (запрос) ирезультат экспортировать в новый файл .xls.
Хотя всё это аналогично можно сделать и в Excel, применив в конце автофилтры.
B в Excel и в Access все эти действия в принципе можно записать на VBA.
Автор: The Invisible
Дата сообщения: 12.02.2007 23:16

Цитата:
B в Excel и в Access все эти действия в принципе можно записать на VBA.

а не подскажите код макроса для Excel например ?
Автор: Star Ik
Дата сообщения: 13.02.2007 09:01
The Invisible
Для разработки кода макроса мало исходной информации и много "допустим".
Нужно знать структуру файлов *.xls (один или несколько листов, есть ли там посторонняя информация - другие таблицы, диаграмы и т.п.), структуру таблиц, колонки для фильтрации одни и те же, или могут быть разными. Если хотя бы некоторые из этих параметров могут меняться, то это будет уже не макрос, а небольшое приложение с интерфейсом выбора параметров, кодом их анализа, ообработки исключительных ситуаций (ошибок), выполнения объединения и фильтрации данных.
В общем, для начала неплохо было бы взглянуть на образец файла .xls.
Автор: Pantera3587
Дата сообщения: 15.02.2007 15:58
Star Ik
Привет. Послала тебе сообщение с прикрепленной базой, дай знать о получении. У меня снова скопились вопросы. Если базу опять не получится получить, то вот какие вопросы, можно на примере той базы, которую ты мне прислал.
Только для начала нужно дополнительно сделать таблицу Заказы (КодЗаказ, Артикул, Наименование, Цена, Количество, №Договора, ДатаОформления, Месяц, Год, Сотрудник, Клиент). В таблицу Подбор добавить поле Количество. Сделать запрос на добавление на основе таблицы Подбор и добавлять данные в таблицу Заказы. Сделать таблицу, например , Оформление (Код, Сотрудник, Клиент, ДатаОформления, Месяц, Год) и на основе этой таблицы сделать форму Оформление, куда ввести все поля. В форме сделать кнопку КнОформление, а в форме ПодборТовара - кнопку В заказы (кнЗаказы) и еще в список Подбор добавить поле Количество.
Если нажать на кнопку В заказы, должна открываться форма Оформление, далее (вопросы),
1. например в форму вносятся данные: сотрудник, клиент и т.д. и нажимается кнопка КнОформление и вот что должно происходить: внесенные данные из этой формы должны добавиться в таблицу Заказы для всех уже добавленных данных из таблицы Подбор, т.е. мы как бы формируем заказ. В принципе в своей базе я использовала тот же код, что и для добавления из одного списка в другой, только вместо ADDNEW использовала команду EDIT, но при этом данные добавляются, но только в одну первую строчку, а в остальные нет.
2. Еще в форму ПодборТовара нужно вставить элемент Поле (Кол), внося в это поле любую цифру она должна изменять в списке Подбор поле Количество, либо щелкая по любому наименованию в списке Товар, сколько нажатий, такое и количество. А еще около этого элемента может быть расположен элемент типа Счетчика, который бы изменял цифра в поле Кол. Только такого элемента почему то нет в Access, но есть в Excel. У меня была сделана форма в Excel, где был вставлен элемент TextBox, кнопка CommandButton и элемент
SpinButton. А код был такой:
Private Sub OKButton_Click()
If CStr(SpinButton1.Value) = TextBox1.Text Then
ActiveCell = SpinButton1.Value
Unload Me
Else

MsgBox "Неправильный ввод", vbCritical

TextBox1.SetFocus
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1.Text)
End If

End Sub

Private Sub SpinButton1_Change()
TextBox1.Text = SpinButton1.Value
Dim Новое_значение As Variant
Новое_значение = Val(TextBox1.Text)
If Новое_значение >= SpinButton1.Min And _
Новое_значение <= SpinButton1.Max Then _
SpinButton1.Value = Новое_значение

End Sub

Может поможешь в решении этих вопросов? Жду ответа.
Автор: Star Ik
Дата сообщения: 15.02.2007 21:41
Pantera3587
Базу получил. Разберусь в выходные и вышлю результат.

Автор: larin1069
Дата сообщения: 16.02.2007 17:09
access 2000
есть таблица Assigning

ID PatientID DataPrich
1 55 01.01.2002
2 56 19.02.2003
3 57 19.03.2003
4 58 22.04.2004
5 55 19.05.2003
6 55 14.06.2004
7 58 19.07.2005
8 99 30.10.2006
9 55 19.08.2005
10 55 11.09.2006


Я что то туплю.

Как сделать запрос, чтобы была выборка PatientID только с последней датой DataPrich, чтобы потом можно было выбрать тех кто не посещал более 2-х лет, или если можно, сразу в одном запросе.

Я что то туплю
Автор: Pantera3587
Дата сообщения: 16.02.2007 19:04
Удалено

Добавлено:
larin1069

Цитата:
чтобы была выборка PatientID только с последней датой DataPrich


Попробуй так: в запросе в строке Условия отбора под полем DataPrich
запиши следующее:
DLast("[Assigning]![DataPrich]";"[Assigning]")

это условие покажет только последнюю запись.

Добавлено:
larin1069

Цитата:
или если можно, сразу в одном запросе


сразу, кажется, не получится, но вот что можно попоробовать еще: сделать другой запрос на таблицу, в этом запросе добавить поле Year: Year([DataPrich]), а в строке Условия отбора под этим полем записать следующее условие:

<Year(DLast("[Assigning]![DataPrich]";"[Assigning]"))-1

Попробуй, по крайней мере выдает все записи отстоящие от последней даты на 2 года раньше.
Может, конечно, кто-то знает другой способ?
Автор: Star Ik
Дата сообщения: 18.02.2007 20:50
Pantera3587
Держи отрихтованную базу и комментарии к ней! Отправил по e-mail.


Добавлено:
larin1069
Создай запрос LastData

SELECT Assigning.PatientID, Max(Assigning.DataPrich) AS LastDataPrich, DateDiff("yyyy",[LastDataPrich],Date()) AS DiffDate
FROM Assigning
GROUP BY Assigning.PatientID;

затем запрос 2Year

SELECT LastData.*
FROM LastData
WHERE (((LastData.DiffDate)>2));

и будет тебе счастье!
Автор: Pantera3587
Дата сообщения: 19.02.2007 16:39
Star Ik
Базу получила. Большое спасибо. До скорой связи.
Автор: larin1069
Дата сообщения: 19.02.2007 20:08

Цитата:
Добавлено:
larin1069
Создай запрос LastData

SELECT Assigning.PatientID, Max(Assigning.DataPrich) AS LastDataPrich, DateDiff("yyyy",[LastDataPrich],Date()) AS DiffDate
FROM Assigning
GROUP BY Assigning.PatientID;

затем запрос 2Year

SELECT LastData.*
FROM LastData
WHERE (((LastData.DiffDate)>2));

и будет тебе счастье!



Спасибо.
До меня уже "дошло".
Сделал почти именно так.
Автор: Pantera3587
Дата сообщения: 19.02.2007 21:09
Star Ik
Привет! У меня уже вопросы. Выслала письмо по e-mail.
Автор: VovaMozg
Дата сообщения: 22.02.2007 06:11
Ребята, возник такой вопрос:
есть таблица.
Дата,Столбец1, Стобец2, ИТОГО
Мне надо чтобы в каждой строке было так:
[ИТОГО]=[Столбец1]+[Столбец2]
причём ИТОГО считалось сразу после внесения данных в [Столбец1] или [Столбец2]
Енто я не придумал как сделать. Поэтому подумал, что можно всё сделать в форме.
Сделал форму. Написал, чтобы в форме было в [ИТОГО]
=[Столбец1]+[Столбец2]
в форме считает всё прекрасно. Как теперь сделать чтобы из формы енто само заносилось ещё и столбец [ИТОГО]?
Автор: Star Ik
Дата сообщения: 22.02.2007 16:00
VovaMozg
В самой таблице енто сделать нельзя, в запросе - элементарно:

SELECT Таблица1.Дата, Таблица1.Поле1, Таблица1.Поле2, [Поле1]+[Поле2] AS ИТОГО FROM Таблица1;

А ведь запрос, это та же таблица - в чем проблема?

Pantera3587
Материал по первому вопросу отправил на Mail. Остальное - чуть позже.

Автор: VovaMozg
Дата сообщения: 25.02.2007 14:20
Star Ik
А можно поподробнее, а то я в таком виде вставляю в запрос у меня матюгается...
Мож можно в форме сделать? я там делаю Edit для столба итого, чтобы он считался у меня получается, а вот сам в таблицу результат писаться не хочет...
Автор: Sws
Дата сообщения: 26.02.2007 20:05
VovaMozg
А зачем? Такой подход противоречит принципам нормализации в части избыточно хранящихся данных. Абсолютно нет необходимости хранить таую информацию, которая получается расчетом из имеющейся.

Автор: dneprcomp
Дата сообщения: 26.02.2007 23:02
Sws

Цитата:
Абсолютно нет необходимости хранить таую информацию, которая получается расчетом из имеющейся.
Не совсем верно.
'ИТОГО' = 'ЦЕНА' x 'КОЛИЧЕСТВО'
Цена - величина, меняющаяся со временем. Соответственно, репорт, сделанный в этом году, будет не соответствовать такому же репорту за тот же период, но сделанному в прошлом году.
Можно конечно хранить все изменения цен, но тогда очень усложняются правила расчета. Проще хранить 'ИТОГО' на момент исполнения.

VovaMozg
Для сохранения в таблицу вообще-то используют не SELECT, a UPDATE
Автор: VovaMozg
Дата сообщения: 27.02.2007 05:52
dneprcomp да именно. Начальству нужны отчёты, чтобы он сам мог залезть и посмотреть прямо в таблице и чтобы, он потом мог сохранить только итого... в общем сохранить в столбец иныу действительно нужно...

Цитата:
Для сохранения в таблицу вообще-то используют не SELECT, a UPDATE

а какой должен быть синтаксис? Т.е что мне написать в свойство яейки в форме, в которой будет показываться [ИТОГО]?
Автор: dneprcomp
Дата сообщения: 27.02.2007 06:14
VovaMozg
Что-нибудь вида
UPDATE Таблица1 SET Таблица1.[ИТОГО] = 50;
или
UPDATE Таблица1 SET Таблица1.[ИТОГО] = тхт1.Техт;
Автор: Star Ik
Дата сообщения: 27.02.2007 13:59
VovaMozg

Цитата:
а то я в таком виде вставляю в запрос у меня матюгается...

Такой простенький запрос может ругаться только в трех случаях: ошибка в имени таблицы или полей (у меня Поле1, у тебя Столбец1), нечисловой тип данных суммируемых полей, нетуда было вставлено SQL-выражение запроса. Но раз уж ИТОГО нужно именно в таблице, привожу подробную инструкцию (без SQL-выражений - с ними, похоже, проблема).
1. Если в таблице уже есть записи, открываем конструктор запросов и добавляем в него нашу злосчастную таблицу. Вставляем в бланк запроса лишь поле ИТОГО, хотя можно и все - роли не играет. В меню "Запрос" выбираем "Обновление". В бланке запроса в столбце поля ИТОГО в строке Обновление вводим
[Поле1]+[Поле2]
Нажимаем "Запуск" (!) и подтверждаем свои намерения. Проверяем результат.
Если таблица изначально пуста - пункт 1 можно пропустить, это была лишь подготовка таблицы к эксплуатации.
2. В окне базы выделить название таблицы -> Панель инструментов -> Новый объект -> Автоформа, либо в своей форме привязать итоговое поле к полю ИТОГО таблицы.
В режиме конструктора формы открыть свойства любого поля, входящего в сумму (Поле1 или 2), выбрать вкладку События, строку "После обновления", в ней из списка "Процедура..." и нажать кнопку "...". В тело процедуры, тоесть между строками "Private Sub..." и "End Sub", вписать строку:
[ИТОГО] = [Поле1] + [Поле2]
Аналогично поступить со вторым полем и вставить в его процедуру это же выражение.
ВНИМАНИЕ! В обоих пунктах необходимо использовать СВОИ названия полей.
Этот способ будет работать только если заполнять таблицу и изменять данные в ней только через форму.
Автор: do_nor
Дата сообщения: 27.02.2007 14:49
Вопрос возможно детский однако… В окне MS Access в верхнем левом угле иконка и надпись Microsoft Access – [название базы данных]. Так вот как название Microsoft Access изменить? Я делал это раньше, но забыл )).
Автор: Star Ik
Дата сообщения: 27.02.2007 20:36
do_nor

Цитата:
Вопрос возможно детский однако…

Конечно детский, однако Сервис -> Параметры запуска -> Заголовок приложения. И что-нибудь исконно русское, в пику дядюшке Биллу.
Автор: dneprcomp
Дата сообщения: 27.02.2007 23:32
Star Ik

Цитата:
И что-нибудь исконно русское, в пику дядюшке Биллу

Посконное...
Не надоело фигу в кармане 'дядюшке Биллу' показывать? Впрочем, видимо это и есть 'исконно русское' занятие...

Страницы: 12345678910111213141516171819202122

Предыдущая тема: Как замедлить скорость чтения CDROM?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.