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

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

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

Суть такова:
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
Сообщений: 855
http://www.sql.ru/faq/faq_topic.aspx?fid=156
10 окт 18, 19:31    [21700943]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить выделенную строку подтаблицы  [new]
sdku
Member

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

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

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

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

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

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

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

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

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

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

У тебя сколько таблиц? Что служит источником строк для подчинённой формы? Почему не используешь объектную модель 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

Откуда: Петропавловск-Камчатский
Сообщений: 173
Панург, исправляюсь:
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

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

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

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

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

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

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

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

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

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

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

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

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

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