Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Ginger
Зарегистрирован: 12.03.2006 Сообщения: 6 Откуда: Из-за компутера!
|
Добавлено: Ср Мар 22 2006 14:56 Заголовок сообщения: MSAccess->Report-> Как программно добавить данные? |
|
|
Есть такая необходимость:
нужно программо добавлять данные для отчета в MS Access'e. Мне нужно смоделировать те данные которые приходят в отчет из запроса или таблицы.
на VB это должно выглядеть типа того:
Me.datasource.AddNew
Но я не знаю как реально это сделать! Кто знает плиз, помогите! Это нужно срочно!!! |
|
Вернуться к началу |
|
|
vladimir_kg
Зарегистрирован: 05.04.2006 Сообщения: 31
|
Добавлено: Ср Апр 05 2006 13:16 Заголовок сообщения: Re: MSAccess->Report-> Как программно добавить данные? |
|
|
Ginger писал(а): | Есть такая необходимость:
нужно программо добавлять данные для отчета в MS Access'e. Мне нужно смоделировать те данные которые приходят в отчет из запроса или таблицы.
на VB это должно выглядеть типа того:
Me.datasource.AddNew
Но я не знаю как реально это сделать! Кто знает плиз, помогите! Это нужно срочно!!! |
не совсем понятен вопрос....
Воспользуйся vba
могу только одно посоветовать, открывай запрос из формы в аксесе, но прежде чем открывать отчет, выполни функцию которая подготавливает данные и закидывает их во временную таблицу.... но всегда с одним именем....
а далее вызываешь отчет
который выдает данные из этой временной таблицы....
небольшая справочка...
Вот небольшой примерчик функции... использование АДО....
вот тут и подготовка данных....
Sub subCalcPractic()
Dim dtCurrentDate As Date
dtCurrentDate = Forms![ГлавнаяФорма]![НачалоОтсчета]
Dim cnn As New ADODB.Connection
Set cnn = CurrentProject.Connection
Dim rstpr As New ADODB.Recordset
rstpr.Open "Практика", cnn, adOpenKeyset, adLockOptimistic
Dim rsTоR As New ADODB.Recordset
rsTоR.Open "ТаблицаЗаписейРасчетВременная", cnn, adOpenKeyset, adLockOptimistic
Dim rabdn As Integer
Dim hours As Integer
Dim cursum As Currency
Do While (Not rstpr.EOF)
'' здесь такая функция которая выдает количество раб дней за период
rabdn = funRabDays(rstpr("НачДата"), rstpr("КонДата"))
hours = rabdn * 8
cursum = hours * rstpr("Ставка")
rsTоR.AddNew
rsTоR("ТабНомер") = rstpr("ТабНомер")
rsTоR("Дата") = dtCurrentDate
rsTоR("Счет") = 48 '' Рук.Практики
rsTоR("Сумма") = cursum
rsTоR.Update
rstpr.MoveNext
Loop
End Sub |
|
Вернуться к началу |
|
|
Ginger
Зарегистрирован: 12.03.2006 Сообщения: 6 Откуда: Из-за компутера!
|
Добавлено: Ср Апр 05 2006 15:48 Заголовок сообщения: Re: MSAccess->Report-> Как программно добавить данные? |
|
|
vladimir_kg писал(а): | не совсем понятен вопрос....
Воспользуйся vba
могу только одно посоветовать, открывай запрос из формы в аксесе, но прежде чем открывать отчет, выполни функцию которая подготавливает данные и закидывает их во временную таблицу.... но всегда с одним именем....
а далее вызываешь отчет
который выдает данные из этой временной таблицы....
|
Спасибо Владимир!
Но предложенный вариант не подходит.
в упрощенном виде это должно выглядеть так:
у меня в отчете в области наддых есть поле Name.
Мне нужно для этого поля на VB добавлять данные.
while(n<count)
Me!Name.value="Что-нить вставляем..."
Wend
при этом при просмотре отчета мы видем столько полей Name с теми данными которые мы вставили сколько равно значение count.
Вариант с временной таблицей очень громоздок - значений много и вычислений тоже очень много будет. Причем при каждом открытии отчета предтеся пересчитывать данные и переписывать таблицу.
Хотелось бы на прямую добавлять данные в отчет.
На SQL эту проблему решить не возможно, как я понял.
Но спасибо и за этот вариант - если не найду как это делать - придется использовать временную таблицу. |
|
Вернуться к началу |
|
|
vladimir_kg
Зарегистрирован: 05.04.2006 Сообщения: 31
|
Добавлено: Чт Апр 06 2006 10:48 Заголовок сообщения: Re: MSAccess->Report-> Как программно добавить данные? |
|
|
Спасибо Владимир!
Но предложенный вариант не подходит.
в упрощенном виде это должно выглядеть так:
у меня в отчете в области наддых есть поле Name.
Мне нужно для этого поля на VB добавлять данные.
while(n<count)
Me!Name.value="Что-нить вставляем..."
Wend
.[/quote]
Слушай есть еще один вариант...
Можно сделать так
Private Sub ОбластьДанных_Print(Cancel As Integer, PrintCount As Integer)
me.print "что хочешь, только незабудь про форматирование"
''' можешь использовать и цикл....
End Sub
только есть одна проблема отслеживание конца страницы....
нужно почить справку по этому вопросу.... |
|
Вернуться к началу |
|
|
Ginger
Зарегистрирован: 12.03.2006 Сообщения: 6 Откуда: Из-за компутера!
|
Добавлено: Чт Апр 06 2006 12:09 Заголовок сообщения: |
|
|
Вот именно! Нужно многое что отслеживать если делать таким образом.
Поэтому самый простой вариант - программано посылать данные в отчет.
Как это сделать?
Все остальные варианты очень трудные.
есть ли что-то типа
Me![ОбластьДанных].AddNewData
или
Me![ОбластьДанных].AddNewRow
какая либо функция, которой можно управлять данными в области данных! |
|
Вернуться к началу |
|
|
vladimir_kg
Зарегистрирован: 05.04.2006 Сообщения: 31
|
Добавлено: Сб Май 20 2006 14:21 Заголовок сообщения: |
|
|
Тогда предлагаю два этих метода совместить....
короче говоря прежде нужно настроить это поле:
полей есть такое свойство как "РАСШИРЕНИЕ" ставим да...
далее добавляем следующий код:
Private Sub ОбластьДанных_Format(Cancel As Integer, FormatCount As Integer)
Dim i As Integer
Dim mystr As String
For i = 1 To Me.val
mystr = mystr & "Наши данные " & Str(i) & vbCrLf
Next i
Me.НашеПоле = mystr
End Sub
vbCrLf - эта константа переводит при форматировании строки в поле курсор на новую строку, что и позволяет получить нужный результат...
типа такого вида:
id val
1 2 наше Мои данные 1
Мои данные 2
2 4 наше Мои данные 1
Мои данные 2
Мои данные 3
Мои данные 4
3 5 наше Мои данные 1
Мои данные 2
Мои данные 3
Мои данные 4
Мои данные 5
Примечание:
ТАК ЕЩЕ НЕ ИЗВРАЩАЛСЯ НА АКСЕСЕ.... |
|
Вернуться к началу |
|
|
vladimir_kg
Зарегистрирован: 05.04.2006 Сообщения: 31
|
Добавлено: Сб Май 20 2006 14:25 Заголовок сообщения: |
|
|
потерялось форматирование ((((
и по этому плохо видно что в итоге получается....
если есть желание могу выслать примерчик по почте forlove.82@mail.ru, на котором только что извращался....
|
|
Вернуться к началу |
|
|
Ginger
Зарегистрирован: 12.03.2006 Сообщения: 6 Откуда: Из-за компутера!
|
Добавлено: Вс Май 21 2006 21:55 Заголовок сообщения: |
|
|
спасибо за ответы!
Если я правильно понял - этот пример вкладывает все данные в одно поле.
А мне нужно чтобы создавалось другое поля для новых данных.
Пример:
В таблице есть строки:
Строка 1
Строка 2
Строка 3
Строка 4
Строка 5
Строка 6
Мы делаем отчет на основе этой таблице, где в свойство Source текстового поля ставим столбец таблицы в котором хранятся эти строки.
При выводе (предпросмотре или печате) отчета мы получаем 6 полей со строками из нашей таблицы.
Это есстественное дело.
ТАК ВОТ: мне нужно программно посылать данные в отчет чтобы получилось тоже самое (тот же самый результат):
SUB
For i = 1 To 6
Me.source.НашеПоле.AddNew
Me.НашеПоле = "Строка " & Str(i)
Next i
End Sub
Результат должен быть одинаковый как при естественном выводе отчета на основе таблици.
Вот только проблема как добавить это новое поле (или новый комплект данных, которые соответсвуют одной строке таблицы или запроса)???
Как смоделитьровать сами данные и как их добавлять - это не проблема. |
|
Вернуться к началу |
|
|
vladimir_kg
Зарегистрирован: 05.04.2006 Сообщения: 31
|
Добавлено: Пт Июн 09 2006 09:06 Заголовок сообщения: |
|
|
Если твой проект *.mdb
встроенный SQL .mdb не позволит создать такой запрос.
Запрос выполнятеся строка за строкой, попытка использовать подзапрос ни к чему не приведет. (т.е. нельзя заставить выполнить строку несколько раз)
но всетаки решение нашлось...
сразу хочу оговориться, что работает оно только до определенного диапазона значений...
максимально количество строк в принципе не ограничено, но необходимо их прописать...
ВОТ САМ ПРИМЕР
тебе понадобиться дополнительная таблица следующего вида...
где n - количество повторов....
ef - любое поле.... я для простоты использовал числовое поле, оно позволит контролировать кол-во строк.... желательно что бы эти два поля были ключем таблицы...
------------------------------------
n..............................ef
------------------------------------
1..............................1
2..............................1
2..............................2
3..............................1
3..............................2
3..............................3
4..............................1
4..............................2
4..............................3
4..............................4
5..............................1
5..............................2
5..............................3
5..............................4
5..............................5
---------------------------
можно продолжать в том же духе......
в моем примере максимально количесвто выводимых строк 5...
а вот твоя таблица:
где n количество повторов строки.
id - уникальный номер
val - какое либо значение
----------------------------------------------------------------------------
ID..............................n..............................val
----------------------------------------------------------------------------
1..............................2..............................два
2..............................3..............................три
3..............................5..............................а это пять
4..............................4..............................этот текст (4 раза)
А теперь самое простое:
Запрос который выведет то что мы так долго искали...
SELECT t1.ID, t1.val, t1.n
FROM t1 INNER JOIN dop ON t1.n=dop.n;
Результат запроса для представленных выше данных следущий:
----------------------------------------------------------------------------
ID..............................val..............................n
----------------------------------------------------------------------------
1..............................два..............................2
1..............................два..............................2
2..............................три..............................3
2..............................три..............................3
2..............................три..............................3
3..............................а это пять..............................5
3..............................а это пять..............................5
3..............................а это пять..............................5
3..............................а это пять..............................5
3..............................а это пять..............................5
4..............................этот текст (4 раза)..............................4
4..............................этот текст (4 раза)..............................4
4..............................этот текст (4 раза)..............................4
4..............................этот текст (4 раза)..............................4
вот пожалуй и все что могу предложить на текущий момент.
Примечание...
Как альтернативу ручному вводу в дополнительную таблицу могу предложить использовать программный код на vba... который выполниться один раз, и не будет повторяться перед каждой выборкой.
Данный пример не подойдет для тех случаев когда приходится выводить большое количество повторов....
Специально для Админа (когда будет работать форматирование, это существенно....) |
|
Вернуться к началу |
|
|
Ginger
Зарегистрирован: 12.03.2006 Сообщения: 6 Откуда: Из-за компутера!
|
Добавлено: Сб Июн 10 2006 22:01 Заголовок сообщения: |
|
|
Спасбо!
Я как раз использую сейчас такой пример с таблицей (это обсуждалось еще в других темах)...
Тока я немного оптимизировал эту схему.
Мне хочется узнать 2 вопроса:
1. Всетаки возможно ли это сделать на SQL (и в каких СУБД).
2. Возможно ли программно добавлять (засылать) данные в отчет (собственно о чем тема и идет...).
Если кто знает о такой возможности (и реальных примерах) поделитесь мудростью! |
|
Вернуться к началу |
|
|
Lamers
Зарегистрирован: 29.06.2006 Сообщения: 16
|
Добавлено: Чт Июн 29 2006 15:14 Заголовок сообщения: |
|
|
Запрос1:
Код: | SELECT [ones].[x]+[tens].[x]*10+[hundreds].[x]*100 AS [NUMBER]
FROM [SELECT 0 as x from table1
union select 1 as x from table1
union select 2 as x from table1
union select 3 as x from table1
union select 4 as x from table1
union select 5 as x from table1
union select 6 as x from table1
union select 7 as x from table1
union select 8 as x from table1
union select 9 as x from table1]. AS ones, [SELECT 0 as x from table1
union select 1 as x from table1
union select 2 as x from table1
union select 3 as x from table1
union select 4 as x from table1
union select 5 as x from table1
union select 6 as x from table1
union select 7 as x from table1
union select 8 as x from table1
union select 9 as x from table1]. AS tens, [SELECT 0 as x from table1
union select 1 as x from table1
union select 2 as x from table1
union select 3 as x from table1
union select 4 as x from table1
union select 5 as x from table1
union select 6 as x from table1
union select 7 as x from table1
union select 8 as x from table1
union select 9 as x from table1]. AS hundreds; |
Запрос2:
Код: |
SELECT Table1.Stroka, Table1.Count, Запрос1.NUMBER
FROM Table1, Запрос1
WHERE (((Запрос1.NUMBER)<=[Count]))
ORDER BY Table2.Field1;
| [/code] |
|
Вернуться к началу |
|
|
|