ПИШУ БД - установка значения в зависимости от значения поля

Статус
Новые ответы в этой теме размещать нельзя.

Рустам

Продвинутый
#1
Как сделать, чтобы когда я выбрал "Вид счета" ПРЕДОПЛАТА, то из таблицы "Счета" в это поле загрузилось значение из поля "Предоплата", а если я выберу ОПЛАТА, то загрузилось бы значение из поля "Долг"???
 

Вложения

Anti

Администратор
Команда форума
#2
Во-первых, чтобы упростить себе жизнь, для небольших наборов значений лучше использовать поле переключателя, а не поле ссылки на объект.
Далее, условная установка значения в зависимости от значения поля (предоплата или оплата) реализуется через функцию String в составном поле. Формула составного поля при этом выглядит так: [String(Вид счета=предоплата?Предоплата:Долг)]
Составное поле в общем-то служебное, его можно поместить на 8-ю вкладку, а его значение копировать в числовое поле. Это числовое поле может в свою очередь участвовать в других расчётных полях.

В приложении упрощённый пример.
 

Вложения

Рустам

Продвинутый
#3
Спасибо. Посмотрел.
Я по аналогии, конечно, сделаю,
но синтаксис функции непонятен.
И сразу вопрос, а можно скрыть вспомогательную вкладку?
 

Vladimir

Администратор
Команда форума
#4
Спасибо. Посмотрел.
Я по аналогии, конечно, сделаю,
но синтаксис функции непонятен.
Синтаксис функции [String(ПолеУсловия=Значение?Вариант1:Вариант2)]
- ПолеУсловия - поле объекта, которое надо проверить на определённое значение;
- Значение - статическое значение (строка или число) или поле объекта, с которым сравнивается значение поля условия - аналог ЕСЛИ;
- Вариант1- результат сравнения поля условия со значением при выполнении условия (может быть статическое значением или полем объекта любой глубины вложенности) - аналог ТО;
- Вариант2 - результат сравнения поля условия со значением при невыполнении условия (может быть статическое значением или полем объекта любой глубины вложенности) - аналог ИНАЧЕ.
Вариант2 является необязательным и может отсутствовать в функции.
Если необходимо получить результат из двух значений, то достаточно применить функцию один раз, прописав оба варианта. Если требуется получить один результат из 3-х и более значений, то прописывается необходимое число функций без 2-го варианта. Результатом такого применения множества функций станет одно значение.

И сразу вопрос, а можно скрыть вспомогательную вкладку?
В объекте скрыть вкладку нельзя. А в форме можно - в структуре объекта, на вкладке "Управление", свойство "Вкладки - видимые", отключить или включить к отображению необходимые вкладки (выбор аналогично полю комбинации).
Примечания:
- в объекте и форме связи отображаются только те вкладки, на которых есть поля с данными;
- если скрыть все вкладки, то область с вкладками будем убрана, а всё пространство будет занято одним списком записей;
- для дочернего объекта в форме связи, где такой тонкой настройки не предусмотрено, 8-ая вкладка по умолчанию всегда является скрытой от отображения и от редактирования.
 

Рустам

Продвинутый
#5
Насчет УПРОСТИТЬ СЕБЕ ЖИЗНЬ - это многолетняя привычка - заводить ЛЮБЫЕ списки как таблицу.
Откуда она взялась? Мои базы данных "дышат", меняются, и гораздо удобнее вносить
значение в таблицу, чем в какую-то служебную строку. Это можно доверить и секретарше,
если набрать по телефону и сказать ОТКРОЙ ФАЙЛ - ОТКРОЙ ТАБЛИЦУ - ВВЕДИ НОВОЕ ЗНАЧЕНИЕ.
А объяснить ей УСТАНОВИ СВОЙСТВО ЗНАЧЕНИЯ ТАБЛИЦА НА... нереально - накосячит.
Поэтому я всегда все делаю через таблицы, но начинаю их с префикса "_",
чтобы служебные таблицы отличать от рабочих, так как в Access нельзя создавать папки,
как у вас, куда бы я мог "мусор" нерабочий затолкать. И хорошо бы, еще скрыть от посторонних
глаз в рабочей базе.
 

Vladimir

Администратор
Команда форума
#6
Для пользователей Access-а такая привычка понятна.
Если в качестве источника выбора значения присутствует статический набор (до 5-10 записей) которые не планируется к изменению в ходе работы с базой данных, то гораздо удобнее использовать поле переключателя. В нём есть возможность добавления иконок к каждому значению, а представление вариантов может быть выполнено как выпадающим списком, так и строкой с вариантами. В списке записей значение переключателя можно задать в виде одних иконок - это очень повышает восприятие информации и экономит пространство.
Кроме того использование переключателя как раз блокирует возможность пользователя случайно изменить варианты для выбора, что особенно актуально в многопользовательской работе.
Служебные объекты, если доступ к ним требуется, удобно поместить в одну категорию (папку). Это:
- улучшает общий вид программы;
- позволяет группировать объекты/формы по смыслу;
- не даёт окну программы растягиваться при большом числе доступных объектов/форм (в след. версии - неактуально).

Объект базы данных можно полностью скрыть (свойство "В меню"). Но если на него есть ссылка из другого объекта - то он всё равно будет доступен при выборе значения.
Прмечание: по другому доступ к объекту работает в сетевой версии: если объект скрыт и доступ к нему пользователю не предоставлен, то при открытии его для выбора значения - управление записями в нём полностью заблокировано.

Форму скрыть в проекте нельзя. В сетевом режиме доступ к объектам/формам предоставляется в зависимости от назначенных прав.
 

Рустам

Продвинутый
#7
Во-первых, чтобы упростить себе жизнь, для небольших наборов значений лучше использовать поле переключателя, а не поле ссылки на объект.
Далее, условная установка значения в зависимости от значения поля (предоплата или оплата) реализуется через функцию String в составном поле. Формула составного поля при этом выглядит так: [String(Вид счета=предоплата?Предоплата:Долг)]
Составное поле в общем-то служебное, его можно поместить на 8-ю вкладку, а его значение копировать в числовое поле. Это числовое поле может в свою очередь участвовать в других расчётных полях.

В приложении упрощённый пример.
Оооххх... Сделал также - ничего не вышло ((
 

Вложения

  • 22.7 KB Просмотры: 83
  • 30.2 KB Просмотры: 88
  • 38.5 KB Просмотры: 90
  • 16.7 KB Просмотры: 76

Vladimir

Администратор
Команда форума
#8
Если "Вид счета" - поле объекта, а не переключателя, то синтаксис получения данных из него должен быть вида: ИмяОбъекта.ИмяПоля
Указывая только имя объекта, программа не знает, какое поле из него использовать для получения данных.

Полей "Предоплата" и "Долг" в Вашем проекте нет, соответственно программа не знает, из каких полей доставать информацию.
 

Рустам

Продвинутый
#9
У вас предоплата , долг и сумма платежа в одной таблице,
а у меня в 2-х разных: в таблице СЧЕТА и таблице ПЛАТЕЖИ.
У счета бывает только 1 предоплата.
Но она может гаситься несколькими платежами, причем и налом часть,
и безналом, и в вчерную и вбелую. Но пока опустим это.

Важно в связанную с таблицей СЧЕТА, таблицу ПЛАТЕЖИ,
подтягивать из СЧЕТА предоплату и копировать ее в поле Сумма... если...
выбранное значение из списка ВИД ОПЛАТЫ - Предоплата и Долг, если Оплата.
 

Vladimir

Администратор
Команда форума
#10
Значит надо указывать полный синтаксис для указания программе, откуда получать данные.

Но данные нельзя получить из дочернего списка. Их надо суммировать в родительский объект формы, а потом получать из этих полей информацию.

Вообще гораздо проще подсказывать как и что сделать - имея образец примера. По скринам это долго и не всегда понятно.
 

Рустам

Продвинутый
#11
ОК. Пришлю проект.
Но просьба удалить сообщение с файлом из форума - так как это реальная информация и коммерческая тайна.
 

Vladimir

Администратор
Команда форума
#12
Можно удалять из базы конфиденциальную информацию, прикладывая лишь проект с голой структурой. Для этого в объекте, в контекстном меню списка, есть команда "Удалить всё", которая производит удаление видимых записей (с учётом пэйджинга и фильтров). После этого рекомендуется произвести оптимизацию базы (окно управления проектами - "Оптимизировать"). Данная операция физически удаляет записи из всех объектов, помеченные к удалению, и сжимает базу данных.

На мой взгляд проект имеет излишнее число объектов - он лучше смотрится без подобной служебной информации, которую можно убрать в структуру. Но если код обязателен - то это, конечно, необходимо. Но от этой Access-ской привычки в конструкторе можно уходить.

В расчётном поле "Оплата-Предоплата" формула должна быть следующего содержания:
[String(Вид счета.Вид счета=Предоплата?Счет №1.Предоплата:Счет №1.Долг)]
В формуле было 3 ошибки:
1) ПолеУсловия является полем ссылки на объект, поэтому должно содержать кроме имени объекта ещё и его поле: Вид счета.Вид счета (не было указано имя поля объекта).
2) Значение должно точно соответствовать значению поля записи с учётом регистра (было указано с маленькой буквы).
3) Для Вариантов надо было указать объект ("Счет №1"), из которого должны были получаться данные по предоплате и долгу (полей "Предоплата" и "Долг" в данном объекте нет).
 
Последнее редактирование:

Рустам

Продвинутый
#13
Ничего не получилось из того, что хотел, ни НДС не понял.
Он почему-то содержится в таблице в той, в которую надо бы подгружать из другой.
А в другой этого значения нет. Про функцию СТРИНГ вообще ничего не понял.
Не понимаю как она работает. А есть что-нибудь попроще?
Типа
=ЕСЛИ([Вид счета]="Предоплата";[Счета].[Предоплата];[Счета].[Долг]

Но также можно руками подправить, если сумма отличается.
 

Vladimir

Администратор
Команда форума
#14
Не понимаю как она работает. А есть что-нибудь попроще?
Типа
=ЕСЛИ([Вид счета]="Предоплата";[Счета].[Предоплата];[Счета].[Долг]
В 6-ой версии добавится поле условия, в котором, кроме других вариантов, будет возможно задание значения другим полям в зависимости от условия. Но вид такого задания всё равно будет отличаться от предложенного.
Понятно, что перейти к новому всегда сложно, когда есть уже привычная, заложенная в сознание, схема. Но предложенный синтаксис отвечает понятию программирования, поэтому его просто нет в конструкторе. Надо просто разобраться с предложенным и, после небольшой практики применения, он станет привычным и понятным. :)
 

Рустам

Продвинутый
#15
Я готов. но что-то пока не получается ))
И еще таком момент.
Если мне что-то непонятно - я не могу двигаться дальше,
пока этот момент не пойму. Поэтому я не делаю свою базу,
пока с НДС не разберусь и с выбором ВИД СЧЕТА с автоматической
подстановкой значения в поле сумма платежа.

Так что я застрял, и сегодня на том же месте, что и вчера.
 
Статус
Новые ответы в этой теме размещать нельзя.