PowerBuilder Retrieve() через элементы управления пользователем
Я использую SetTransObject() и Retrieve() на PowerBuilder 12.5 Classic. Однако это не дает пользователю много возможностей в получении данных; У меня есть редактирование в одну строку (sle_employeeID), которое пользователь должен вставить в идентификатор сотрудника, а в окне DataWindow отображаются данные сотрудника (IDNO, имя, возраст, назначение) выбранного идентификатора NO.
dw_1.settransobject(sqlca)
string employeeID
employeeID=sle_employee.text
dw_1.retrieve(employeeID)
Код извлекает все данные в соответствии с моими спецификациями из объекта DataWindow, я использовал табличный оператор и оператор быстрого выбора. Пожалуйста, помогите с кодом, который даст мне более свободный способ выбора данных с помощью элементов управления.
2 ответа
Вы можете использовать режим запросов DataWindow, как упомянул Терри. Вы должны будете предоставить своему пользователю инструкции, но основное использование - просто ввести значения, которые вы хотите сопоставить, непосредственно в DataWindow. Для получения дополнительной информации см. Раздел " Предоставление пользователям возможности запросов" в Руководстве программиста DataWindow. Вот код, который я имею в одном из моих окон утилиты. Он использует меню с кнопкой на панели инструментов, чтобы перевести DataWindow в режим запросов и отключить режим запросов и получить их. Я использую PFC-маршрутизацию сообщений между меню и событием DataWindow, но вы можете просто вызвать событие из события нажатия кнопки, и в этом случае вы удалите строки, которые изменяют меню.
// this code is in an event in the DataWindow
// toggles query mode on and off
if "no" = object.dataWindow.queryMode then
// you may want to check for unsaved changes here and let the user go back
object.dataWindow.queryMode = "yes"
m_myMenu.m_rows.m_query.checked = TRUE // this has a button on the toolbar
else
m_myMenu.m_rows.m_query.checked = FALSE
acceptText()
object.dataWindow.queryMode = "no"
retrieve()
end if
Чтобы получить максимальную гибкость, установите критерий.override_edit='да' для некоторых или всех столбцов. Приведенный ниже код устанавливает критерии.override_edit='да' для всех столбцов. Это может не подходить для вашей ситуации. Без override_edit пользователь ограничен вводом значений запроса, которые проходят проверку столбца.
// this code is in an event in the DataWindow
// it is called after the DataObject is set
// it sets criteria.override_edit='yes' for all the columns
string ls_describe, ls_modify, ls_col, ls_result
integer li_colCount, li_col
setTransObject(SQLCA)
ls_describe = "datawindow.column.count"
ls_result = dw_1.describe(ls_describe)
if not isnumber(ls_result) then
// logging code elided
ls_result = '0'
end if
li_colCount = integer(ls_result)
for li_col = li_colCount to 1 step -1
ls_col = "#" + string(li_col)
ls_modify = ls_col + ".criteria.override_edit='yes'"
ls_result = dw_1.modify(ls_modify)
if "" <> ls_result then
// every column may not have an edit, and some edits might not // have the property. it's just as fast to try to modify it as it
// is to check it
// logging code elided
end if
next
Мне не ясно, каковы ваши ожидания, но мне кажется, что SetTransObject() и Retrieve() делают именно то, о чем вы их просили; проблема не в этом. Если вы создадите 20 SLE и DataWindow с 20 аргументами (и сопровождающим оператором SELECT, достаточно сложным, чтобы обрабатывать пропуск аргументов в качестве критерия, если аргумент пуст), то SetTransObject() и Retrieve() будут работать очень хорошо.
В DataWindow есть функция Query By Example (QBE), на которую вы, возможно, захотите взглянуть. Однако, хотя это дает пользователю значительные возможности для запросов, вы можете подумать, кто ваш пользователь. Если у пользователя есть докторская степень в области анализа данных или информатики, то QBE просто отлично; если пользователь - ненормальный телемаркетер, занятый случайным трудоустройством, вы можете бросить его через голову.
Удачи,
Терри.