powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Рекурсивное сложение
25 сообщений из 26, страница 1 из 2
Рекурсивное сложение
    #39420897
Windo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Пользователи в таблице "пользователь" могут приглашать других пользователей, это отображается в таблице "пользователь-приглашенный", есть запрос, который формирует все затраты пользователя из таблицы "посещения". Нужно чтобы пользователю пригласившему другого пользователя начислялся % от его затрат.

Я хочу сделать это в VBA - написать функцию, которая читает всех приглашенных и вычисляет % от каждого приглашенного, и так далее рекурсией до верхнего уровня (искомого пользователя).

Не могу разобраться как мне считать данные из таблицы Access (получить результат SQL запроса) в переменную VBA (массив) для анализа и работы с ними. Дайте пожалуйста пример получения данных.
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39420933
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Windoкак мне считать данные из таблицы Access (получить результат SQL запроса) в переменную VBA (массив) для анализа и работы с ними.
А зачем в массив-то? работай напрямую с рекордсетом...
WindoПользователи в таблице "пользователь" могут приглашать других пользователей, это отображается в таблице "пользователь-приглашенный"
Структура допускает "петли", это плохо. Однако в MS Access затруднительно организовать соответствующий констрейнт.

Для упрощения работы с указанным функционалом я бы рекомендовал вместо таблицы Пользователь-Приглашённый добавить в таблицу пользователей поле материализованного пути цепочки пригласивших. Т.е. вместо

IDПользователь1Иванов2Петров3Сидоров4Пупкин
ПригласившийПриглашённыйИвановПетровПетровСидоров
сделать так:

IDПользовательПригласившие1Иванов\2Петров\Иванов\3Сидоров\Петров\Иванов\4Пупкин\
Само собой, в материализованном пути использовать не ФИО, а ID-ы. Тогда решение поставленной задачи становится элементарным. Ещё лучше хранить ID-ы, выровненные ведущими нулями, тогда расчёт просто ведём в порядке убывания длины данных в поле.
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39420960
Windo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пользователь может быть приглашен только 1 раз, петлей нет.
Хочу работать с переменными для формирования функции, с помощью которой организовать рекурсию.
Грубо функция (ID (имя пользователя)) = сумма
в функции условие-
Если ID приглашенных > 0, то функция (ID (имя пользователя_приглашенного)) = сумма

Подскажите хороший мануал по рекордсет с синтаксисом и необходимыми настройками access пожалуйста. И команду для записи рекордсета в массив.
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39420970
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WindoПользователь может быть приглашен только 1 раз
Тогда в таблице приглашённых поле участника сделай обязательным, поле приглашённого первичным индексом, а ID вообще убери за ненадобностью.
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39420976
Windo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sub test()

Dim RS As ADODB.Recordset
'Строка запроса
Dim sql_query As String
'Строка для вывода итоговых данных в сообщении
Dim str As String
'Создаем новый объект для записей
Set RS = New ADODB.Recordset
'Строка запроса
sql_query = "SELECT Участники.ФИОучастника FROM Участники WHERE Участники.Код =2"
'Выполняем запрос с использованием текущих настроек подключения проекта
RS.Open sql_query, CurrentProject.Connection
'Циклом перебираем записи
While Not (RS.EOF)
'Заполняем переменную для вывода сообщения
str = str & RS.Fields("ФИОучастника") & " "
'переход к следующей записи
RS.MoveNext
Wend
'Вывод сообщения
MsgBox str
End Sub

(WHERE Участники.Код =2 )
Как мне сюда ставить переменную? Не могу найти мануал нормальный по функциям ADODB.
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422021
Фотография гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub test()

Dim RS As ADODB.Recordset
Dim sql_query As String
Dim str As String
Set RS = New ADODB.Recordset
sql_query = "SELECT Участники.ФИОучастника FROM Участники WHERE Участники.Код =2"
RS.Open sql_query, CurrentProject.Connection

	While Not (RS.EOF)
		str = str & RS.Fields("ФИОучастника") & " "
		RS.MoveNext
	Wend

	MsgBox str
End Sub



(WHERE Участники.Код =2 )
Как мне сюда ставить переменную? Не могу найти мануал нормальный по функциям ADODB.
Не понял
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422022
Фотография гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гурД,
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422023
Фотография гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гурД,
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422024
Фотография гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гурД,
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422025
Фотография гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гурДгурД,
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422097
Windo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гурД,

Спасибо, буду разбираться, жаль не по русски.
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422172
Фотография гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Windoбуду разбираться, жаль не по русски.
Сам от этого порой испытываю неудобства.
В интернете не пробовали смотреть? Добрые люди вроде перевели с английского ...
Единственно, сам код пока остался на английском. Но скоро обещали также адаптировать .
Согласно изменениям в федеральном законодательстве о защите потребителей
никуда они не денутся: Apple будет называться Яблоком, a Windows - Окнами ...
Непонятное слово Интерфейс - Междуличием, Интерес - Междуб ы тием, программный код - Алгоритмописью...
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422174
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WindoгурД,

Спасибо, буду разбираться, жаль не по русски.
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422176
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chm --это архив
--рапаковать с сохранением каталогов
--немного преобразовать файл оглавления
--через броузер смотришь --он умный, предлагает перевести на русский

достаточно удобно
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422194
хм-м-м
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гурДИнтерес - Междуб ы тием???
Была такая книжка, Колпакчи "Ложные друзья переводчика")))
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422213
Фотография гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм-м-м,

буквально - '
Код: plaintext
быть между
':
inter + esse

Интересно осмыслена сущность...
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422215
Фотография гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Nullum esse castellum quot asinus auro onustus poscendere non potest

Ooo...
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422259
Windo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Кнопка13_Click()
Dim A As Integer


MsgBox Forms!Form1!ПолеСоСписком0
A = Forms!Form1!ПолеСоСписком0
Call Module.summ(A)
MsgBox A

End Sub



- не работает, в то же время если вызвать функцию summ(A) из модуля, то все в порядке?
Ошибка method or data member not found.
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422260
Windo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
Public Function summ(ID As Integer) As Integer

Dim RS As ADODB.Recordset
Dim RS_1 As ADODB.Recordset
'Строка запроса
Dim summa As Integer
Dim summa1 As Integer
Dim sql_query As String
Dim sql_query_1 As String

'Создаем новый объект для записей
Set RS = New ADODB.Recordset
'Найдем имя по ид
sql_query = "SELECT Посещения.Сумма FROM Посещения WHERE Посещения.УчастникРуководитель =" & ID
'записываем в RS список сумм приглашенных пользователем
RS.Open sql_query, CurrentProject.Connection
' обнуляем переменную для суммы
summa = 0
'перечисляем все суммы
While Not (RS.EOF)
'находим собственную сумму
summa = summa + RS.Fields("Сумма")
'переход к следующей записи
RS.MoveNext
Wend
'закрываем соединение
RS.Close

'Перечисляем всех приглашенных
Set RS_1 = New ADODB.Recordset
'Найдем ID приглашенных по главному
sql_query = "SELECT УчастникПриглашенный.Приглашенный FROM УчастникПриглашенный WHERE УчастникПриглашенный.Участник =" & ID
RS_1.Open sql_query, CurrentProject.Connection
' обнуляем переменную для суммы
summa1 = 0
While Not (RS_1.EOF)
'находим собственную сумму
summa1 = summa1 + 0.1 * summ(RS_1.Fields("Приглашенный"))
'переход к следующей записи
RS_1.MoveNext
Wend
'закрываем соединение
RS_1.Close
'MsgBox ID & " " & summa
'MsgBox ID & "  " & summa1
summ = 0.1 * summa + summa1

End Function
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422284
_гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WindoПочему
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Кнопка13_Click()
Dim A As Integer


MsgBox Forms!Form1!ПолеСоСписком0
A = Forms!Form1!ПолеСоСписком0
Call Module.summ(A)
MsgBox A

End Sub



- не работает, в то же время если вызвать функцию summ(A) из модуля, то все в порядке?
Ошибка method or data member not found.

А вы вообще хэлп, хотя бы примеры кода, смотрите? Или полагаетесь на свою опытность...
Или там всё ясно, но также сделать не выходит?
Summ - это что? Член этого модуля?
Заодно, когда разберётесь, следите ещё, чтобы одинаковых названий не было.
А то вы так именуете, что субботний вечер занят...
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422295
_гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
встроенн справка: Modules collection Module Property ModuleTypeавторThe Modules collection

contains all open Module objects, regardless of their type. Modules in the Modules collection can be compiled or uncompiled.

To return a reference to a particular standard or class Module object in the Modules collection, use any of the following syntax forms.

' Syntax Description
Modules!modulename The modulename argument is the name of the Module object.
Modules("modulename") The modulename argument is the name of the Module object.
Modules(index) The index argument is the numeric position of the object within the collection.

' The following example returns a reference to a standard Module object and assigns it to an object variable:

Код: vbnet
1.
2.
Dim mdl As Module
Set mdl = Modules![Utility Functions]



Note that the brackets enclosing the name of the Module object are necessary only if the name of the Module includes spaces.

The next example returns a reference to a form Module object and assigns it to an object variable:
Код: vbnet
1.
2.
Dim mdl As Module
Set mdl = Modules!Form_Employees



To refer to a specific form or report module, you can also use the Form or Report object's Module property:
Код: vbnet
1.
Forms!formname.Module


The following example also returns a reference to the Module object associated with an Employees form and assigns it to an object variable:

Код: vbnet
1.
2.
Dim mdl As Module
Set mdl = Forms!Employees.Module



Once you've returned a reference to a Module object, you can set or read its properties and apply its methods.
авторModule Property
See AlsoApplies ToExampleSpecificsYou can use the Module property to specify a form module or report module. Read-only Module object.

Код: vbnet
1.
expression.Module


expression Required. An expression that returns one of the objects in the Applies To list.


The Module property is available only by using Visual Basic and is read-only in all views.

The Module property also returns a reference to a specified Module object.

Use the Module property to access the properties and methods of a Module object associated with a Form or Report object.

The setting of the HasModule property of a form or report determines whether it has an associated module. If the HasModule property is False, the form or report does not have an associated module. When you refer to the Module property of that form or report while in design view, Microsoft Access creates the associated module and sets the HasModule property to True. If you refer to the Module property of a form or report at run-time and the object has its HasModule property set to False, an error will occur.

You could use this property with any of the properties and methods of the module object.

Example
The following example uses the Module property to insert the Beep method in a form's Open event.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim strFormOpenCode As String
Dim mdl As Module

Set mdl = Forms!MyForm.Module
strFormOpenCode = "Sub Form_Open(Cancel As Integer)" _
    & vbCrLf & "Beep" & vbCrLf & "End Sub"
    With mdl
        .InsertText strFormOpenCode
    End With
		
Type Property


See AlsoApplies ToExampleSpecificsShowType property as it applies to the AccessObject object.

Returns the value of an AccessObject object type. Read-only AcObjectType.

AcObjectType can be one of these AcObjectType constants.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
acDataAccessPage 
acDefault 
acDiagram 
acForm 
acFunction 
acMacro 
acModule 
acQuery 
acReport 
acServerView 
acStoredProcedure 
acTable 



Код: vbnet
1.
expression.Type


expression Required. An expression that returns an AccessObject object.

ShowType property as it applies to the FormatCondition object.

Returns the value of a FormatCondition object type. Read-only AcFormatConditionType.

' AcFormatConditionType can be one of these AcFormatConditionType constants.
Код: vbnet
1.
2.
3.
acExpression 
acFieldHasFocus 
acFieldValue



Код: vbnet
1.
expression.Type


' expression Required. An expression that returns a FormatCondition object.

ShowType property as it applies to the Module object.

' Indicates whether a module is a standard module or a class module. Read-only AcModuleType.

' AcModuleType can be one of these AcModuleType constants.
Код: vbnet
1.
2.
acClassModule 
acStandardModule 



Код: vbnet
1.
expression.Type


expression Required. An expression that returns a Module object.

' Example
' ShowAs it applies to the Module object.

' The following example determines whether a Module object represents a standard module or a class module:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function CheckModuleType(strModuleName As String) As Integer
    Dim mdl As Module

    ' Open module to include in Modules collection.
    DoCmd.OpenModule strModuleName
    ' Return reference to Module object.
    Set mdl = Modules(strModuleName)
    ' Check Type property.
    If mdl.Type = acClassModule Then
        ' Insert comment.
        mdl.InsertLines 1, "' Class module."
        CheckModuleType = acClassModule
    Else
        ' Insert comment.
        mdl.InsertLines 1, "' Standard module."
        CheckModuleType = acStandardModule
    End If
End Function
				
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39422298
_гурД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создайте новый модуль (Insert- Module)
и попробуйте так:
Код: vbnet
1.
2.
3.
sub Test ()
  msgbox summ(10)
end sub
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39429386
Windo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT  АбонементыПосещения.Дата, АбонементыПосещения.Абонент, Абонементы.ТипЗанятий, АбонементыПосещения.Сумма, 
АбонементыПосещения.ВремяПрибытия, АбонементыПосещения.ВремяОкончания, АбонементыПосещения.Убыл
FROM ТипЗанятия INNER JOIN (Абонементы INNER JOIN АбонементыПосещения 
ON Абонементы.Код = АбонементыПосещения.Абонент) 
ON ТипЗанятия.Код = Абонементы.ТипЗанятий
WHERE (((АбонементыПосещения.Дата)=Date()) AND ((АбонементыПосещения.Убыл)=False));

union

SELECT Посещения.Дата, Посещения.ФИОГостя, Посещения.ТипЗанятия, Посещения.Сумма, Посещения.ВремяПрибытия, 
Посещения.ВремяОкончания, Посещения.Убыл
FROM ТипЗанятия INNER JOIN Посещения 
ON ТипЗанятия.Код = Посещения.ТипЗанятия
WHERE (((Посещения.Дата)=Date()) AND ((Посещения.Убыл)=False));



Проблема в следующем: при выполнении двух запросов отдельно значения Посещения.ТипЗанятия подтягиваются из таблицы ТипЗанятия, аналогично для Абонементы.ТипЗанятий, но при использовании union в результирующей таблице отображаются только значения ключей. Как побороть?
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39429403
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Проблема в следующем: при выполнении двух запросов отдельно
-- значения Посещения.ТипЗанятия подтягиваются из таблицы ТипЗанятия,
-- аналогично для Абонементы.ТипЗанятий,

но при использовании union в результирующей таблице отображаются только значения ключей. [/quote]
у вас там подстановка ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT  АбонементыПосещения.Дата, АбонементыПосещения.Абонент,
 Абонементы.ТипЗанятий, АбонементыПосещения.Сумма,
 АбонементыПосещения.ВремяПрибытия,
 АбонементыПосещения.ВремяОкончания, АбонементыПосещения.Убыл
FROM ТипЗанятия
 INNER JOIN (Абонементы
 INNER JOIN АбонементыПосещения
   ON Абонементы.Код = АбонементыПосещения.Абонент)
   ON ТипЗанятия.Код = Абонементы.ТипЗанятий
WHERE (((АбонементыПосещения.Дата)=Date())
   AND ((АбонементыПосещения.Убыл)=False));

union

SELECT Посещения.Дата, Посещения.ФИОГостя,
 Посещения.ТипЗанятия, Посещения.Сумма,
 Посещения.ВремяПрибытия, Посещения.ВремяОкончания, Посещения.Убыл

FROM ТипЗанятия
 INNER JOIN Посещения
   ON ТипЗанятия.Код = Посещения.ТипЗанятия
WHERE (((Посещения.Дата)=Date())
   AND ((Посещения.Убыл)=False));
...
Рейтинг: 0 / 0
Рекурсивное сложение
    #39429426
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WindoЗдравствуйте.
..Пользователи в таблице "пользователь" могут приглашать других пользователей, это отображается в таблице "пользователь-приглашенный".. А если сделать "финт ушами" и при занесении приглашенного в тбл.приглашенные автоматически создавать
для него запись в тбл.пользователи
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Рекурсивное сложение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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