Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Как удалить выделенную строку подтаблицы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 79
добрый день, форумчане.

прошу подсказать, уткнулся вроде в простую проблему, но что-то не могу сообразить как сделать

Суть такова:
1. Есть форма с n-нным количеством записей
2. В ней есть подтаблица, связана с основной таблицей по [коду базовой записи], то есть при переходах по базовым записям в подтаблице отражаются подзаписи каждой записи основной формы
3. Записи подтаблицы в качестве ключа используют счетчик 1,2,3 и т.д. В подтаблице есть несколько полей: [счетчик], [код базовой записи], [собственное имя записи], [параметр 1], [параметр 2]. Для связки с базовой записью используется поле [код базовой записи]
4. Все элементы управления подтаблицы скрыты, добавление новых записей (строк) осуществляется через кнопку "добавить" (типа как в 1С-ке), при нажатии с формы получается [код базовой записи] текущей записи и в подтаблицу посредством INSERT INTO добавляется новая запись, в которой автоматически прописывается счетчик и код базовой записи. Например,

[счетчик], [код базовой записи], [собственное имя записи], [параметр 1], [параметр 2]
001, 002, маша, 12, 14
002, 002, вася, 15, 20
003, 003, маша, 18,25
004, 003, петя, 14, 87

Соответственно, при выборе в главной форме записи 002 в подчиненной таблице будут отображаться записи
[счетчик], [код базовой записи], [собственное имя записи], [параметр 1], [параметр 2]
001, 002, маша, 12, 14
002, 002, вася, 15, 20

5. Для удаления записей в подчиненной таблице на форме есть кнопка "удалить запись", тоже типа как в 1С. При нажатии на нее система должна взять текущую запись (выделенную запись) подтаблицы и посредством SQL Delete или ADODB Delete удалить данную запись из подчиненной таблицы, потом обновить запрос. Сложностей никаких, но не пойму как однозначно идентифицировать запись. Поясню о чем речь, например, при добавлении 3 раза щелкнули "+" (добавить запись) и в подчиненной таблице возникли следующие записи.
[счетчик], [код базовой записи], [собственное имя записи], [параметр 1], [параметр 2]
001, 002, маша, 12, 14
002, 002, вася, 15, 20
003, 002, 0, 0, 0
004, 002, 0, 0, 0
005, 002, 0, 0, 0

то есть поля [собственное имя], [параметр 1] и [параметр 2] пользователь еще не успел запомнить, но потом понял, что из всех трех добавленных ему нужна только 1 надпись. Остальные две надо удалить.

В случае записей 003, 004, 005 они различаются только уникальным ключом-счетчиком, все остальные данные у всех записей одинаковые. Поле ключа-счетчика подчиненной таблицы в основной форме нигде не числится, то есть получить его значение неоткуда, кроме как напрямую обратиться к таблице. Чтобы обратиться напрямую к таблице и получить значение ключа-счетчика необходимо как-то однозначно идентифицировать надпись на которой стоит курсор. Это можно сделать через СurrentКecord подчиненной таблицы, например, курсор стоит на надписи 003, соответственно получаем номер 3 и в теории можем найти в подчиненной таблице этот номер 3 и удалить эту строку, НО, т.к. у нас есть связка по [код базовой записи], то номер 3 в подчиненной таблице с отбором по основной записи не будет равен номеру 3 в подчиненной таблице без отборов (со всеми записями), в которой, например, 20 записей и этот номер 3 в общем кол-ве записей равен номеру 10, соответственно, так идентифицировать запись в подчиненной таблице без отбора не получается.

Чтобы обратиться в подчиненную таблицу и найти надпись по полю [счетчик] надо как-то получить значение этого поля счетчик из подчиненной таблицы. В чем собственно и подзатупил, каким образом обратится к подчиненной таблице и получить значение поля [счетчик] той стройки, которая сейчас выделена в подчиненной форме-таблице (то есть на которой в данный момент стоит курсор).

p.s. В качестве подчиненной формы используется сама подчиненная таблица, то есть в окне подчиненной формы отражается непосредственно сама таблицы с записями, но с отбором-связкой [код базовой записи]

Буду признателен за наводку куда "покопать".

Заранее спасибо
10 окт 18, 18:37    [21700903]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Predeclared
Member

Откуда: And God I know I'm one
Сообщений: 834
http://www.sql.ru/faq/faq_topic.aspx?fid=156
10 окт 18, 19:31    [21700943]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5352
как Вас понял,можно так:
в таблице-источнике сделать поля,требующие ввода значения обязательными(или условие-не равные 0) а кнопку,после открытия формы ввода,недоступной (или форму ввода модальной)-если в форме ввода не заполнить обязательные поля,то при её закрытии запись не сохранится-при их заполнении запись сохранится.При закрытии сделать кнопку доступной (в случае модального окна телодвижения с доступом к кнопке излишни)
10 окт 18, 20:28    [21700981]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Tarasios
Member

Откуда: Украина
Сообщений: 375
Ганов Александр,
не знаю, правильно ли я понял ваш вопрос.
Сразу скажу, что это примеры для ленточной формы.
Если нужна возможность удалить определённую запись:
- сделал кнопочку "удалить" , разместил в области данных ленточной формы, получив, таким образом, на кнопочке запрос подтверждения и
DoCmd.RunCommand acCmdDeleteRecord.

или если надо как то дополнительно извратиться для "избранной" записи:
в структуру таблицы ввожу логическое поле "Выбор". Размещаю его в ленточной формы, скрываю отображение.
далее на события "нажатие кнопки" и "после обновления" на поля в строке формы цепляю обработчики, в результате которых после перемещения по строкам формы значение "Да" принимает "принимающая" строка, для всех остальных строк "Выбор" = "Нет".

После чего запросом всегда можно вытянуть строчку по выбору = да и что там уже нужное с ней сделать.
10 окт 18, 22:07    [21701046]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 79
Predeclared, в том то и дело, то, что в факе описано годно, если в качестве подчиненной формы используется именно форма с полями, там проблем нет, конструкция Forms![Форма1].Controls![Форма2].Form.Controls![Поле1].Value обеспечивает обращение к нужному полю формы, но если в качестве подчиненной формы используется сама таблица, то все не так очевидно
11 окт 18, 03:20    [21701123]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 79
Tarasios, DoCmd работает только для форм, для подчиненной таблицы не будет работать, если в качестве аргумента функции указать название подчиненной таблицы, то выведется сообщение, что нужная форма не найдена. Насчет скрытого поля думал, так можно решить, полностью с Вами согласен, но хотелось бы придумать более универсальный механизм, чтобы его можно было вынести в отдельную процедуру и использовать в последующем на любой нужной форме с передачей в процедуру имени подтаблицы
11 окт 18, 03:24    [21701124]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 79
sdku, мне кажется, что этот вариант самый надежный. то есть не давать пользователю делать пустые строки, пока не заполнена одна строка всеми нужными данными, то другую такую же сделать нельзя. с точки зрения пользователя не самый удобный вариант конечно, но поиск будет однозначным
11 окт 18, 03:26    [21701125]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 79
приложу внешний вид формы и пояснения, чтобы было более понятно что к чему

К сообщению приложен файл. Размер - 99Kb
11 окт 18, 03:51    [21701126]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 3816
Ганов Александр, ты б, мил человек, пример свой приложил, а не картинки эти. Никого не интересует твой дизайн.
Прочитал несколько раз. Так и не понял зачем нужны все эти телодвижения с запросами и прочее.

У тебя сколько таблиц? Что служит источником строк для подчинённой формы? Почему не используешь объектную модель DAO?
Типа так
+
Private Sub Êíîïêà4_Click()
Dim lngPos As Long
    With Me.Âíåäðåííûé2.Form
        If .NewRecord Then .Undo: Exit Sub
        With .Recordset
            If Not (.BOF And .EOF) Then
                lngPos = .AbsolutePosition
                .Delete
                    If .RecordCount = 0 Then Exit Sub
                    If lngPos <= .RecordCount Then
                        .MovePrevious
                    Else
                        .MoveNext
                    End If
            End If
        End With 'Recordset
    End With 'Form
End Sub
11 окт 18, 04:46    [21701129]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 79
Панург, исправляюсь:
1. всего таблиц 2, одна является источником строк для общей формы (Таблица 1), вторая - для подчиненной (Таблица 2), по сути в качестве подчиненной формы и выступает сама таблица с записями (Таблица 2)
2. каждой записи Таблицы 1 соответствует несколько записей Таблицы 2.
3. Таблица 2 связана с Таблицей 1 таблицей через поле [код базовой записи]

попробую свойство AbsolutePisiton.

Если весь смысл "писанины" кратко:
на скрине в подтаблице 4 строки, то есть если я возьму номер третьей сверху строки, например, то получу соответственно №3, но мне надо знать номер строки в общей таблице №2, например, текущая строка №3 в общей таблице будет номером 10. Судя по всем именно в этом месте я и затупил, пытаясь найти номер данной строки в общей таблице (не отобранной про проекту), а не сразу удалить через DAO нужную строку Таблицы №2 в уже отобранном виде, то есть именно то, что указано в примере.

Огромное спасибо за вразумение. Буду пробовать.
11 окт 18, 05:46    [21701134]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 3816
Ганов Александр
попробую свойство AbsolutePisiton.

Ганов Александр
мне надо знать номер строки в общей таблице №2
В этом плане можешь не стараться. Данное свойство относится только к конкретному набору данных и на другие наборы полученные из одного источника не распространяется. Все совпадения являются случайностями.
11 окт 18, 05:53    [21701135]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 3816
Ганов Александр,и я не понял, зачем удалять из общей таблицы когда можно удалить из частного набора данных (Recordset), при условии возможности редактирования последнего? Запись будет удалена и из таблицы. Или я опять не понял чего то?
Теперь про инсерты. Если подчинённая форма имеет источник с возможностью редактирования (а иначе как туда пользователь добавляет данные), то все вновь добавленные данные автоматически попадают в таблицу. Дополнительных телодвижений не нужно. Это ещё нужно постараться чтобы оторвать данные от источников.
11 окт 18, 06:02    [21701136]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 79
Панург, дада. все верно понял. с инсертами все отлично работает. А вот с рекордесетом затупил. зачем-то пытался найти эту запись в общей таблице, хотя можно было удалить из текущего рекордсета без танцев с бубном. Еще раз благодарю за наставление на путь истинный :-)
11 окт 18, 06:06    [21701137]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 3816
Ганов Александр, мне сначала показалась что у тебя формы стоят либо на временных таблицах, либо на отсоединённом рекордсете. Типа ADO.NET с его DataSet.
11 окт 18, 06:16    [21701139]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Tarasios
Member

Откуда: Украина
Сообщений: 375
Ганов Александр,

ну я потому и написал, что "это примеры для ленточной формы".
11 окт 18, 10:00    [21701215]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5352
Ганов Александр
.... с точки зрения пользователя не самый удобный вариант конечно, но поиск будет однозначным
Стесняюсь спросить: а чем же он "не самый удобный"-подумаешь в паре случаев юзер почитает сообщения, а на третий раз уже будет знать, что это поле надо заполнять.
Создайте приложение которым сможет пользоваться даже дурак и только он будет им пользоваться
11 окт 18, 10:51    [21701268]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 5352
Вдогонку:ради чего(для чего) на форме размещено аж 12 кнопок половина из которых выполняют штатные действия
11 окт 18, 11:00    [21701287]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4591
sdku
Вдогонку:ради чего(для чего) на форме размещено аж 12 кнопок половина из которых выполняют штатные действия

Ну, когда я делал свои первые задачи, я тоже размещал на форме кнопки, которые дублировали панель навигации. Просто потому, что те маленькие, серые и некрасивые, а мои были большими, цветными и красивыми.

Кстати, то этим признакам я научился легко угадывать новичков. Пока не ошибался...
11 окт 18, 12:24    [21701450]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 79
Joss, все верно угадали. кнопки уже поубирал - явный перебор :-)
11 окт 18, 16:59    [21701809]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить