powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Добавление подобного набора записей
27 сообщений из 27, показаны все 2 страниц
Добавление подобного набора записей
    #39507762
greece
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Совсем мозг вывихнул от задачки. Есть набор данных выбираемых на форму по критериям из связанных таблиц.

Вот таким запросом:
Код: sql
1.
2.
3.
4.
SELECT ListOfObj1.ObjName, DataDaily.*, ListOfParam1.ParamName, ListOfObj1.Bold
FROM SubAdmin1 INNER JOIN (ListOfParam1 INNER JOIN (ListOfObj1 INNER JOIN DataDaily ON ListOfObj1.IDObj = DataDaily.IDObj) ON ListOfParam1.IDParam = DataDaily.IDParam) ON SubAdmin1.IDSubAdmin = ListOfObj1.IDSubAdmin
WHERE (((DataDaily.Y)=[Forms]![Form DATA Correction Input DataDaily]![YearBox]) AND ((DataDaily.M)=[Forms]![Form DATA Correction Input DataDaily]![MonthBox]) AND ((SubAdmin1.IDAdmin)=[Forms]![Form DATA Correction Input DataDaily]![AdminBox]))
ORDER BY DataDaily.IDObj, DataDaily.Y, DataDaily.M;



Выбор происходит из таблицы DataDaily где ключевыми полями являются IDObj, IDParam, Y, M. Поле IDObj явлляется показателем обьекта.

Как можно добавить тот же набор данных IDObj, IDParam изменив только значение M (месяц) и Y (год)?
Возможно здесь не только SQL надо использовать.
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507797
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно сформировать общий запрос, а потом отбирать нужные фильтром в форме (так намного гибче)
при создании отбора формируете фильтр и его применяете в форме.
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507847
saniiri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так и сделано, это запрос для формы.

Мой вопрос как выбрать отображаемые данные (отфильтрованные на форме), изменить в них месяц и добавить опять в общую таблицу. Т.Е. создать "новый месяц".
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507849
saniiri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какой то глюк с форумом у меня.
Ник greece это мой, наверное ночью я так воспринимаюсь форумом... :) :)
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507857
alecko5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
saniiri, greece речь идет о том чтобы отбирать данные не запросом а фильтром, т.е.
1. сделали запрос общий, типа
Код: vbnet
1.
2.
3.
4.
SELECT ListOfObj1.ObjName, DataDaily.*, ListOfParam1.ParamName, ListOfObj1.Bold
FROM SubAdmin1 INNER JOIN (ListOfParam1 INNER JOIN (ListOfObj1 INNER JOIN DataDaily ON ListOfObj1.IDObj = DataDaily.IDObj) ON ListOfParam1.IDParam = DataDaily.IDParam) ON SubAdmin1.IDSubAdmin = ListOfObj1.IDSubAdmin
WHERE (((SubAdmin1.IDAdmin)=[Forms]![Form DATA Correction Input DataDaily]![AdminBox]))
ORDER BY DataDaily.IDObj;


т.е. без "M" и "Y"
а уже в форме делаете
Код: vbnet
1.
2.
Me.filter="[M]=" & месяц - какой хотите или может даже несколько месяцев & " AND [Y]=" & год какой хотите или несколько лет
Me.filterOn=true 


менять можно либо в диалоге, либо на форме сделать список -по событию меняете фильтрацию
но и сортировка
Me.OrderBy="IDObj, M, Y"
Me.orderByOn=true
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507863
greece
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из записей отобранных в ленточную форму надо выбрать объекты (первый столбец) и создать новые пустые записи с ними в таблице.
Не могу понять как можно в ленточной форме выбирать данные.
предполагал конструкцию типа
INSERT INTO DataDaily ....

но возможно, надо будет добавить средства VBA вроде
Each for ...

Но не хватает опыта создания.
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507867
greece
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задолбало... Опять ник сменился... Глючит форум при отправке сообщений.
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507887
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выбор строк:в таблице DataDaily делаете флажок- его и нажимаете (можно программно - например даблкликом) либо физически-показываете на форме и пользователь нажимая его-выбирает.
выбор данных как Вам нужно, можно также сделать при помощи флажка - сделали флажок в таблице, при открытии формы все данные которые показаны - помечаете галочкой, далее помечаете галочкой те записи которые нужно добавить.
все эти манипуляции нужно делать когда отбора нет - иначе записи которые изначально не отобраны добавить уже не получиться.
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507895
greece
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем понятно как добавление флажков поможет. А как проводить обработку флажков?
Надо создавать рекордсет или выбирать одну запись, изменять поле и делать добавление (по одному)?
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507904
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greece,
Одно из решений:
создать два рекордсета-один на запросе(источнике данных формы после применения фильтра), которым отбираете записи,второй на таблице в которую собираетесь добавлять.
если надо увеличить на месяц дату используете DateAdd (или,в зависимости от целей, используете что-то другое).
Циклом Do Until по первому RS добавляете записи во второй RS (таблицу). Как-то так.
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507907
greece
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пытаюсь сделать такую конструкцию

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
mData = MonthBox.Value + 1
yData = YearBox.Value
If MonthBox.Value = 12 Then
mData = 1
yData = YearBox.Value + 1
End If

txtSQL = "INSERT INTO DataDaily ( IDObj, IDParam, Y, M, D1 ) " & _
"SELECT DataDaily.IDObj, DataDaily.IDParam, DataDaily.Y, DataDaily.M, DataDaily.D1 " & _
"FROM Admin1 INNER JOIN ((LinkObj1Admin1 INNER JOIN LinkObj1Param1 ON LinkObj1Admin1.IDObj = LinkObj1Param1.IDObj) INNER JOIN DataDaily ON LinkObj1Param1.IDObj = DataDaily.IDObj) ON Admin1.IDAdmin = LinkObj1Admin1.IDAdmin " & _
"WHERE (((DataDaily.Y)=""" & yData & """) AND ((DataDaily.M)=" & mData & ") AND ((Admin1.IDAdmin)=" & AdminBox.Value & "));"
MsgBox txtSQL

DoCmd.RunSQL txtSQL



Но добавляется 0 записей, вероятно потому что выбираю следующий месяц а там по умолчанию еще нет никаких записей.
Не пойму как сделать выбор существующих в данном месяце набора записей и перенести их в следующий (+1) месяц.

С рекордсетами тоже не могу понять как реализовать... Прошу прощения, не большой опыт + чужой код+ ограниченное время...
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507910
greece
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том что база данных организована так - в одной таблице Админ, в другой Объекты, связи между ними поддерживает третья таблица Линк.
Поэтому для вывода списка подчиненных объектов необходимо три таблицы. Кроме этого в таблицу DataDaily вносится значение параметра берущееся из отдельной таблицы тоже через линк-таблицу.

Итого для внесения ключевых полей DataDaily необходимо как минимум выборка из 4 таблиц (правильней из 5).
Поэтому пытаюсь выбрать оптимальный или хотябы работающий вариант...
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507915
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greece,
флажки позволят отобрать нужные строки и в фильтр добавить допусловие, в соответствии с которым добавятся к существующим нужные строки нужного(ых) месяца(ев).
обрабатывать флажки... конечно надо.
нужен пример-по нему проще показать. (в двух словах: после вывода всех записей установили флажок вывода выведенных записей в true, затем выбрали запись - флажок выбора установился в true(записей несколько) по нему вытаскиваем коды всех нужных данных, затем ищем эти данные с учетом нового месяца, в исходной таблице устанавливаем флажок вывода этих данных в true и выводим, но уже с учетом флажка вывода (все остальные условия игнорим) :) )
я вижу примерно такое решение этой задачи.
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507921
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если требуется добавить записи с max.датой +1 месяц как-то так:
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507926
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вогонку:
Стесняюсь спросить:если Вы производите выборку из 3 таблиц и хотите добавить в поля этих таблиц одно и то же значение-разве это не грубое нарушение правил "базостроения" (одни и те же данные в нескольких таблицах)?
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507929
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сообщение 20736448 не читать-прошу пощения-ляпнул бред
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39507936
greece
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что то у меня заработало, но не могу понять

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Dim  txtSQL As String

txtSQL = "INSERT INTO DataDaily ( IDObj, IDParam, Y, M, D1 ) " & _
"SELECT DataDaily.IDObj, DataDaily.IDParam, DataDaily.Y, DataDaily.M, DataDaily.D1 " & _
"FROM Admin1 INNER JOIN ((LinkObj1Admin1 INNER JOIN LinkObj1Param1 ON LinkObj1Admin1.IDObj = LinkObj1Param1.IDObj) INNER JOIN DataDaily ON LinkObj1Param1.IDObj = DataDaily.IDObj) ON Admin1.IDAdmin = LinkObj1Admin1.IDAdmin " & _
"WHERE (((DataDaily.Y)=""" & [Forms]![Form DATA Correction Input DataDaily]![YearBox] & """)  AND ((DataDaily.M)=" & [Forms]![Form DATA Correction Input DataDaily]![MonthBox] + 1 & ") AND ((Admin1.IDAdmin)=" & [Forms]![Form DATA Correction Input DataDaily]![AdminBox] & "));"

DoCmd.RunSQL txtSQL



не работает если нет записей. Если создавать запрос на добавление отдельно и с фиксированными значениями, все срабатывает. Из vba, с переменными работать не получается....

Базу приложить не могу минимальный обьем получается только 4Мб...
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39508008
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот посмотрите, лучше бы конечно бы применительно к Вашей базе, но что есть-то есть.
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39508011
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko,
хотелось бы узнать задачу стоящую перед Вами (исходные данные и конечный результат) и увидеть схему БД-может изначально все надо решать по другому
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39508136
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku, задача стоит перед greece-saniiri, а Вашу базу я взял для примера.
но суть такова - есть запрос, выводящий данные за какой-то период (например за месяц) по нескольким точкам, нужно выбрать какие-то строки и добавить данные за другой период, все остальное остается как есть (так я её понял).
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39509613
greece
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Прошу извинить за долгую задержку с ответом. Был день рождения, потом отключился интернет. Сейчас всё восстановилось... :)

Большое спасибо за помощь. Использовал вариант с полным добавлением набора строк.

Код: vbnet
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.
Dim rs As Recordset, rs1 As Recordset
Dim mData As Integer, yData As Integer
Dim txtStr As String
 
mData = MonthBox.Value + 1
yData = YearBox.Value
If MonthBox.Value = 12 Then
mData = 1
yData = YearBox.Value + 1
End If

txtStr = "SELECT ListOfObj1.ObjName, DataDaily.*, ListOfParam1.ParamName, ListOfObj1.Bold " & _
"FROM SubAdmin1 INNER JOIN (ListOfObj1 INNER JOIN (ListOfParam1 INNER JOIN DataDaily ON ListOfParam1.IDParam = DataDaily.IDParam) ON ListOfObj1.IDObj = DataDaily.IDObj) ON SubAdmin1.IDSubAdmin = ListOfObj1.IDSubAdmin " & _
"WHERE (((DataDaily.Y) =""" & [Forms]![Form DATA Correction Input DataDaily]![YearBox] & """) And ((DataDaily.M) =" & [Forms]![Form DATA Correction Input DataDaily]![MonthBox] & ") And ((SubAdmin1.IDAdmin) =" & [Forms]![Form DATA Correction Input DataDaily]![AdminBox] & ")) " & _
"ORDER BY DataDaily.Y, DataDaily.M, DataDaily.IDObj;"
 
Set rs = CurrentDb.OpenRecordset(txtStr)
Set rs1 = CurrentDb.OpenRecordset("select * from DataDaily")
    
    Do Until rs.EOF
        rs1.AddNew
                rs1!IDObj = rs!IDObj
                rs1!IDParam = rs!IDParam
                
                rs1!Y = yData
                rs1!M = mData
            rs1.Update
        rs.MoveNext
    Loop

[color=red]
rs.Close                ---- поставил сам, хотя в примере этого не было
rs1.Close              ---- не знаю правильно или нет.
Set rs = Nothing    ---- 
Set rs1 = Nothing  ----[/color]

Me.RecordSource = txtStr
Me.Requery
YearBox.Requery




К сожалению не разобрался как работает пример с отбором строк выделением. У меня не запустился (MSO 2007, MSO 2003).
Наверняка тоже интересное решение. Может понадобится в будущем, ещё потыкаюсь.

Спасибо братья по коду что не дали пропасть...
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39509630
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в примере, который я привел, может быть любой месяц, для любой строки. (там правда есть баг-в 133 строке в модуле формы вместо .findNext нужно использовать .findFirst)
написано в DAO, может поэтому не запустилось? (у мну Acc2007)
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39509638
greece
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alecko,

Поправил код. Попробовал на 2007. Результат тот же - не добавляется... (((

Ваш вариант очень эффектный, но не могу разобрать почему не срабатывает. Для меня пока даже вопрос почему не используете в обоих примерах rst.Close, Set rst = Nothing .... )))
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39509648
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greece
Код: vbnet
1.
...."WHERE (((DataDaily.Y)=""" & yData & """) AND ((DataDaily.M)=" & mData & ") AND.....

судя по этому фрагменту поле Y-текст, а М-число; это так?
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39509712
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greece, потому что рекордсет формы закрывать нельзя-пропадет источник данных для формы, а также есть такое понятие область видимости, поэтому rst хотя "висит" но он удаляется после окончания программы
но конечно set rst=nothing можно добавить в конец проги.
очень странно что не срабатывает прога-наверное её надо или запустить из надежного расположения(параметры Access-Центр управления безопасностью-кнопка Параметры центра управления безопасностью-Надежные расположения(добавляете папку из которой собираетесь запускать проги), или "включить все макросы"-временно
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39509725
хм-м-м
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
greeceВыбор происходит из таблицы DataDaily где ключевыми полями являются IDObj, IDParam, Y, M. Поле IDObj явлляется показателем обьекта.

Как можно добавить тот же набор данных IDObj, IDParam изменив только значение M (месяц) и Y (год)?Каких-то сложностей понакрутили...
Попробуйте:
Код: vbnet
1.
2.
3.
4.
5.
6.
S = "INSERT INTO DataDaily (IDObj, IDParam, Y, M) " & _
    "SELECT IDObj, IDParam, " & _
    IIf(MonthBox = 12, YearBox + 1, YearBox) & ", " & IIf(MonthBox = 12, 1, MonthBox + 1) & " " & _
    "FROM DataDaily " & _
    "WHERE Y=" & YearBox & " AND M=" & MonthBox
CurrentDb.Execute S
...
Рейтинг: 0 / 0
Добавление подобного набора записей
    #39512454
greece
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм-м-м,

Это очень красивое, элегантное решение. Именно такое - короткий и ясный запрос пытался сначала сделать. Спасибо за пример.

Решения до этого мне очень помогли продвинуться в понимании не только запросов. "Накрученный" вариант наверно более "железный", сработает в любом случае, когда есть прямая запись. И легче будет переводится из 2003 версии в 2007-ю.

Возможно это моей из-за неполной информированности.

Спасибо тем кто не прошел мимо и помогли...
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Добавление подобного набора записей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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