cro-logo      
Добро пожаловать, Гость. Пожалуйста, выберите Вход

 
 
  ГлавнаяСправкаПоискВход  
 
Страниц: 1 2 
Послать Тему Печать
Вводная форма, словарь и множественное значение (Прочитано 3 791 раз)
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 93
Вводная форма, словарь и множественное значение
12.11.2021 :: 17:05:42
 
Здравствуйте!

Создаю вводную форму для создания записи в БД
Есть поле (тип словарное), которое допускает множественное значение (категории информации)

Как правильно это организовать на форме ввода?

Допустим я в конструкторе на область данных помещаю поле базы - мой словарь и на форме появляется типа ComboBox привязанный к словарному полю. По двойному клику выпадаем список значений и я выбрал одно, а как выбрать следующее? Можно сделать это элемент более одной строки, но наверное это не правильный путь.

Можно сделать поле со списком и некое текстовое поле, куда я буду вносить выбранные значения из выпадающего поля. Наверное можно добавлять в поле Me.text.Text выбранное значение из поля со списком, но как добавить к существующему тексту новый текст и главное потом как всё это внести в БД при записи? Надо же где-то хранить код каждого значения из словаря и, как я понимаю, значения моих категорий должны быть разделены точкой с запятой (Подмигивание?

Можно показать какой-нибудь пример создания такой формы, где есть поля множественные и как это всё обрабатывается/пишется в БД?

Спасибо!
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 050
Санкт-Петербург
Re: Вводная форма, словарь и множественное значение
Ответ #1 - 12.11.2021 :: 18:16:59
 
Вы решили использовать управляющую форму для ввода записей?
Потренироваться можно, но столкнетесь со множеством проблем. Они решаемы и на них приобретается опыт, но времени уйдет очень много (до нескольких лет).
В формах ввода, привязанных к базам, это все делается проще. Посмотрите на демо пример. Поле гражданство словарное, множественное. Поле Дополнительная информация - текстовое, множественное.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 93
Re: Вводная форма, словарь и множественное значение
Ответ #2 - 13.11.2021 :: 12:26:58
 
Спасибо большое за ответ!

А как принято вводить данные в БД? Мои пользователи очень консервативны и не аккуратны, хочется сделать максимальную "защиту от дурака", при этом сделать окно ввода "user-friendly".

Спасибо!
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 050
Санкт-Петербург
Re: Вводная форма, словарь и множественное значение
Ответ #3 - 14.11.2021 :: 00:28:35
 
Юзер99335588 писал(а) 13.11.2021 :: 12:26:58:
А как принято вводить данные в БД?

Самый простой и наиболее полноценный ввод можно получить во встроенной стандартной форме. Т.е. работать напрямую с СУБД без форм. Если пользователи занимаются исключительно вводом, то надо их обучать и этот вид ввода рассматривать как основной.

Цитата:
пользователи очень консервативны

Под DOS привыкли работать? Улыбка

Цитата:
сделать максимальную "защиту от дурака"
Не получится. Опыт показывает, что обязательно найдется такой, что сможет сделать то, что даже предположить невозможно было.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 93
Re: Вводная форма, словарь и множественное значение
Ответ #4 - 14.11.2021 :: 17:11:12
 
Цитата:
Под DOS привыкли работать?


Слава небесам  от DOS отошли (хотя это спорно, многие были довольны полностью клавиатурному режиму), Базис наше всё

Посмотрел Демо-пример, там Гражданство - это две строки, а вот синтетический пример - допустим их 5, как быть?

Вот через ComboBox это можно реализовать. А как сформировать строку или команду для записи в БД?

Спасибо!
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 050
Санкт-Петербург
Re: Вводная форма, словарь и множественное значение
Ответ #5 - 14.11.2021 :: 18:29:19
 
Две строки просто видимы. Поле множественное и значений можно ввести много. Появляется прокрутка. Нажав Ctrl+F2 или сделав специальную кнопку можно перейти в редактор множественного словарного поля.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 93
Re: Вводная форма, словарь и множественное значение
Ответ #6 - 15.11.2021 :: 19:36:18
 
поэкспериментировал с Формами и Lua

заполнение ComboBox значениями из словаря при загрузке формы: (из БД Primer)

Код:
function Форма_Load( form, event )
	local base_voc=CroApp.GetBank():GetVocabulary() -- получаем словари
	local voc=base_voc:GetBase("AD"):GetRecordSet() -- получаем конкретный словарь
	Me.combobox1:Clear() -- на всякий случай очищаем наш Control
	if voc then	-- проверка существования
		for rec in voc.Records do -- в цикле проходим по всем записяк
			local vol=rec:GetValue("Понятие") -- получаем непосредственно значение
			if vol ~= "" then -- почему-то всегда появляется первым элементом пустая строка
				Me.combobox1:Add(vol) -- добавляем значение в список нашего ComboBox
			end
		end
	end
end
 



в текстовое поле заносим (по нажатию кнопки) каждое выбранное значение из нашего ComboBox и добавляем разделитель ";"

Код:
function button1_Click( control, event )
	local txt=Me.textbox1.Text
	local txt=txt..Me.combobox1.SelectedItem..";"
	Me.textbox1.Text=txt
end
 



Так как моя БД (если её можно так назвать) состоит из одной таблицы(на данный момент) с несколькими колонками:
дата ---- дата
название ---- текст
адрес  ----- текст (без разбивания на состовляющие)
тэг ------ словарное, множественное
страна  ------ словарное, множественное

функция создания новой записи будет такая:

Код:
function button2_Click( control, event )
        local base=CroApp.GetBank():GetBase("имя_БД")
        local newRec=Record()
        if newRec then
              newRec:SetValue(2, Me.text2.Text)
              newRec:SetValue(3, Me.text2.Text)
              newRec:SetValue(4, Me.text2.Text)
              local voc_1=string.split(Me.textbox1.Text, ";")
              local voc_1#=table.remove(voc_1)
              local voc_2=string.split(Me.textbox2.Text, ";")
              local voc_2#=table.remove(voc_2)
              NewRec:SetValue(5, voc_1)
              NewRec:SetValue(6, voc_2)
              base:AddRecord(newRec)
        end
end
 



всё записывается нормально, специально проверял тип словарного поля - оно получается table
у меня вопрос: т.к. я использую разделитель ";" для формирования строки словаря, то при разделении у меня получается последнее значение нулевой длинны. Я выбрал вариант его удаления table.remove и вот оно как-то странно работает, пришлось костыль городить. Почему так?

А ещё код Me.NewRecord() нужен, если я форму создаю из полей БД? Я не до конца понял. А если я форму полностью создаю свою, то надо делать как в моих примерах?

Так же не совсем понял как включить проверку правильности словарного поля (если юзер абракадабру вдруг введет)

Спасибо!
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 050
Санкт-Петербург
Re: Вводная форма, словарь и множественное значение
Ответ #7 - 15.11.2021 :: 23:40:59
 
Начнем разбор по пунктам.
Код:
function Форма_Load( form, event )
	local base_voc=CroApp.GetBank():GetVocabulary() -- получаем словари
	local voc=base_voc:GetBase("AD"):GetRecordSet() -- получаем конкретный словарь
	Me.combobox1:Clear() -- на всякий случай очищаем наш Control
	if voc then	-- проверка существования
		for rec in voc.Records do -- в цикле проходим по всем записяк
			local vol=rec:GetValue("Понятие") -- получаем непосредственно значение
			if vol ~= "" then -- почему-то всегда появляется первым элементом пустая строка
			-- потому что словарь иерархический, в котором обязательно должна быть запись с пустыми значениями кода и понятия
				Me.combobox1:Add(vol) -- добавляем значение в список нашего ComboBox
			end
		end
	end
end

-- можно решить проще одной строкой
--Me.combobox1:Clear(); Me.combobox1:Add(dsl("AD","*"):split(Formula.ValSep,0,false,function (v) return sl("AD",v)end)) 

Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 050
Санкт-Петербург
Re: Вводная форма, словарь и множественное значение
Ответ #8 - 16.11.2021 :: 00:37:16
 
Цитата:
в текстовое поле заносим (по нажатию кнопки) каждое выбранное значение из нашего ComboBox и добавляем разделитель ";"

Код:
function button1_Click( control, event )
	local txt=Me.textbox1.Text
	local txt=txt..Me.combobox1.SelectedItem..";"
	Me.textbox1.Text=txt
end 


Если использовать textbox, то лучше заносить новое значение с новой строки. Еще лучше использовать список и для выбора словарного значения (можно выбрать сразу несколько для множественного поля), и для выбранных значений.
Для textbox можно использовать режим "только для чтения" и сначала заполнять таблицу, а потом ее переносить в textbox.
Код:
t={} -- таблица выбранных значений
function button1_Click( control, event )
table.insert(t,Me.combobox1.SelectedItem)
	Me.textbox1.Text=table.concat(t,";")
end 



Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 93
Re: Вводная форма, словарь и множественное значение
Ответ #9 - 16.11.2021 :: 10:30:28
 
Спасибо большое!

Вы правы, использовать listBox с отметками для множественного выделения словарных позиций удобнее

А вот textBox в несколько строк моим будет не очень удобно, Control либо будет много места занимать на форме, чтобы видеть все строки, либо иметь полосу прокрутки, что вызовет недовольство пользователей.

Отдельное спасибо за однострочник, всегда полезно знать все возможные варианты кода. Это типа лямбда-функция? Можно чуть подробнее? Многим будет полезно  Подмигивание
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 050
Санкт-Петербург
Re: Вводная форма, словарь и множественное значение
Ответ #10 - 17.11.2021 :: 16:55:29
 
Цитата:
Код:
function button2_Click( control, event )
        local base=CroApp.GetBank():GetBase("имя_БД")
        local newRec=Record()
-- это неправильно. Так будет работать только для первой базы. Нужно Record(base).
        if newRec then
              newRec:SetValue(2, Me.text2.Text)
              newRec:SetValue(3, Me.text2.Text)
              newRec:SetValue(4, Me.text2.Text)
--здесь у Вас присвоение одного поля формы Me.text2.Text нескольким полям записи
              local voc_1=string.split(Me.textbox1.Text, ";")
-- в предыдущих частях кода Вы сами оставляли в конце строкового значения ;, а тут интересуетесь почему оно пустое.
              local voc_1#=table.remove(voc_1)
-- такого оператора #= в языке нет. Как Вы могли его использовать. Это ошибка синтаксиса.
              local voc_2=string.split(Me.textbox2.Text, ";")
              local voc_2#=table.remove(voc_2)
-- далее всё совсем неправильно. Вы пытаетесь словарному полю присвоить понятие. При заполнении полей программным способом проверки корректности и автоматического кодирования не происходит. В результате вместо кода, например 1, у Вас будет Австрия. Визуально все будет нормально, а в действительности нет. 
              NewRec:SetValue(5, voc_1)
              NewRec:SetValue(6, voc_2)
              base:AddRecord(newRec)
        end
end
  

Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 93
Re: Вводная форма, словарь и множественное значение
Ответ #11 - 18.11.2021 :: 17:45:47
 
Спасибо большое!

Я код по памяти (имена переменным давал просто так) набирал и местами использовал copy/paste, поэтому появились ошибки в текстовых полях.
Я буквально неделю занимаюсь Кронос, поэтому ещё не сильно ориентируюсь во всём этом

Цитата:
Нужно Record(base)
спасибо, буду знать

Цитата:
-- далее всё совсем неправильно. Вы пытаетесь словарному полю присвоить понятие.

я это понял уже после того, как отправил то сообщение.

Вот ещё есть вопрос:
Делаю форму ввода, допустим хочу использовать поле базы (словарное, множественное) и полученные значения передать текстовому полю, чтобы наглядно было видно что было выбрано пользователем.
Помещаю поле на область данных (было бы здорово сделать его виде кнопки или просто какого-то элемента, чтобы кликнул мышью и по cntr+F2 появлялось форма "Значения кратного поля", где юзеры бы выбирали нужные значения) и какое мне использовать событие, чтобы были выбраны некие значения, которые я могу перенести в текстовое поле?

Или как можно что-то похожее сделать?

Спасибо!
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 050
Санкт-Петербург
Re: Вводная форма, словарь и множественное значение
Ответ #12 - 18.11.2021 :: 18:33:12
 

Код:
function button1_Click( control, event ) -- кнопка создания записи
currec=CroApp:GetBank():GetBase("ЛЦ"):AddRecord()
currec:SetValue(2,"новое лицо "..currec.SN)
currec:Update()
end

function button2_Click( control, event )-- кнопка редактирования поля Гражданство
currec:EditValue ("Гражданство")
currec:Update()
end
 



Наверх
 
 
IP записан
 
Leo
Бета-тестер
Вне Форума


Мое поколение...

Сообщений: 1 572
Калуга - Москва
Re: Вводная форма, словарь и множественное значение
Ответ #13 - 18.11.2021 :: 20:55:29
 
Наверх
 

Леонтьев Ю. Ю.
**************
leo6@mail.ru
sgv.leo6@gmail.com
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 93
Re: Вводная форма, словарь и множественное значение
Ответ #14 - 18.11.2021 :: 21:42:50
 
Спасибо большое!

Я имел ввиду следующее:

На форме есть поле "Гражданство" (множественное) -> я кликаю однократно на это поле мышкой -> это поле стало выделенным -> нажимаю комбинацию "Control + F2" -> появляется окно "выбор множественного поля" -> пользователь выбирает нужные ему значения -> Ok -> и выбранные значения помещаются в текстовое поле
...
Наверх
 
 
IP записан
 
Страниц: 1 2 
Послать Тему Печать