«Отчёты всевозможные» (необычный экран, CS)
Общий вид:
Сразу надо написать, что тут выбран язык Си, но по моему вариант для VB у них банально более доделан. В числе прочего здесь в правом списке все события страницы, что по-моему неудобно. В варианте для VB можно слева выбрать экранный элемент а справа будет список только его событий.
Но так или иначе всё, что расположено на странице во-первых, отрисовывается, во-вторых, позволяет что-то с собой делать (кнопку можно нажимать, текст в текстовое поле можно вводить. В-третьих все эти элементы как-то обрабатываются автоматически. На нажатие кнопки, например, машина сама реагирует мгновенным изменением изображения, изображающим то самое нажатие. Но этого мало. Надо ещё дать программисту возможность написать где-то что должно произойти, например, если нажата кнопка. Потому в-четвёртых все эти компоненты – элементы генерируют так называемые события, обработчики которых может написать программист.
Например, у кнопки есть событие – нажатие (Click). Когда на кнопку с именем btnSave нажимают то кроме стандартных действий выполняется то, что написано в обработчике под названием btnSave_Click().
А у выпадающего списка логично что-то делать сразу после того как в нем что-то выбрали. Это событие называется OnSelectedIndexChanged. Значит имя обработчика для выбора чего-то в первом списке ddl_lst1 будет ddl_lst1_OnSelectedIndexChanged.
Текстовые поля генерируют событие «изменение текста» (OnTextChanged) когда нажали Enter, Tab или как-то иначе явно показали что корректировка этого элемента закончена.
При вводе даты, например, после этого введённая строка (типа “1-1-1”) преобразуется в стандартный вид даты (01.01.2001):
События возникают и, соответственно, могут обрабатываться в определённой последовательности. Кроме интуитивно понятых (типа нажатий кнопок) есть менее очевидные. Например, можно что-то сделать в момент загрузки страницы:
Элемент, который сгенерировал событие это Page (страница), а событие это Load- загрузка страницы (т.е передача её пользователю и загрузка в его машину). У меня здесь проверяется есть ли у этого пользователя доступ к этой странице. Ведь никто не мешает учреждению ввести в адресной строке тот адрес который подключен только для района и региона. Если не блокировать эту возможность на уровне проверки в странице то это очень смешная защита информации.
Вверху серым написано «Не меняется». Я уже писала, что текст рассчитан на штамповку, т.е на то чтобы быстро скопировать, поменять в нужных местах и начать работать. Но есть места которые точно не придётся менять при такой работе. Они скрыты средствами редактора в такие куски «Не меняется». Их, конечно, можно открыть и посмотреть, что там:
Но всё делалось для того чтобы скрыть как можно больше типовых текстов, чтобы они даже перед глазами не маячили.
Вот, например, начало страницы:
d664 естественно надо поменять на что-то другое (не очень важно что это такое). В начало страницы вынесены названия всех хранимых процедур для работы с информацией.
pri_sp_List = "sp_dir_lst_d664" – считывание списка информации. Это процедура должна быть специально сделана для этого экрана. Про такие списки было тут:
http://akostina76.ucoz.ru/blog/2017-07-25-4300
pri_sp_Get, pri_sp_Ins , pri_sp_Del тут присвоены названия трёх стандартных процедур соответственно поучения всей информации по строке (нужно при корректировке существующей строки), вставке новой строки и удаления строки. Есть некоторая избыточность потому что эти процедуры гоняют между клиентом и сервером всё содержание строки таблицы dDoc_List_0:
… но то, что база не захламляется какими-то новыми процедурами которых и так много тоже хорошо. Создаётся ощущение меньшего из двух зол.
Так вот, где-то ниже происходит обращение к этим процедурам со всеми текстовыми «завитушками», но вытащив названия наверх иногда можно скрыть и обращение и «завитушки» оставив видимым только те места, где надо что-то менять. Так и сделано.
Точно также переменная pri_lblName это номер колонки из которую будет считываться название строки для вопроса об её удалении. В таблице с людьми в первой колонке может быть фамилия, во второй имя, в третей отчество. Если надо в вопросе фамилию, то надо присвоить номер 1. Тогда при нажатии кнопки «удаление» будет так:
и ставший видимым вопрос дополнится записанным в надпись lbl_delRec текстом:
В результате получится что-то примерно такое:
Но нет никакого смысла выяснять как это оно всё это рисует. Достаточно цифру в одной из верхних строк.
pri_AutoAdd = True – после добавления новой строки сразу предлагается добавить ещё (элементы очищаются и экран остаются в режиме корректировки). Это удобно если обычно (как в «Кассе») надо постоянно вводить строки одна за другой.
Если же обычно надо ввести строку и уйти, то надо установить pri_AutoAdd = false. Тогда после сохранения новой строки будет возврат в режим просмотра.
Отрисовка таблицы:
Здесь в хранимую процедуру засовываются все параметры переданные в адресной строке:
Процедура возвращает информацию, информация засовывается в экранную таблицу.
Какое-то прямое присвоение обработчиков событий в Page_Load():
Это уже не помню что. Узнаю когда напишу. Тоже скорее всего что-то с автоматическим переходом по элементам. Если просто стереть придётся где-то лишний раз щёлкать мышкой чтобы перевести курсор.
Присвоение заголовка – названия страницы:
Т.е вот этого:
Название возвращает хранимая процедура, что в данном случае обучения немного эстетство. Можно просто руками написать (строкой) что там должно быть в заголовке.
Элемент шаманизма:
Это обработчик события инициализации страницы. Если здесь не прицепить обработчики событий в явном виде события работать не будут. В VB ничего подобного делать не надо. Если это специально сделанная возможность подключить только нужное то я не поняла зачем. Здесь надо удалить два списка и добавить один текст.
Очистка полей ввода информации при добавлении новой строки:
… и заполнение этих полей информацией по умолчанию. В данном случае дата по умолчанию берётся из «Дата по» в полях для поиска информации. Можно ничего не присваивать dt_doc. Тогда при вводе новой строки там будет то, что вводили в предыдущей. А можно брать значение введённой константы, про которые было тут:
http://akostina76.ucoz.ru/blog/2017-07-24-4298
Это всё зависит от того, как удобнее вводить конкретную информацию.
В заполнение списка людей sp_ddl_sUchTipPers тут засунута цифра 659. В изучаемой задаче было только два типа людей – сотрудники и школьники. И в штатное расписание надо выбирать только сотрудников. Здесь логичнее передавать группу людей через параметр в адресной строке.
То, что выполняется при нажатии кнопки «Корректировка строки»:
В «Не меняется» идёт обращение к хранимой процедуре, которая возвращает всю информацию по строке. Дальше экранные элементы (ddl_uch.Value, dt_doc.Value и т.д) заполняются полученной информацией.
Заполняются содержания списков (ddl) - sp_ddl_sUchTipPers. Ведь выводить в список надо не вообще всех людей какой-то группы а только тех, кто привязан к конкретной организации. А организация содержится в корректируемой строке потому один раз при загрузке страницы заполнись этот список нельзя.
Последние действия – подсветка строки dtlLabelString. Это вот это:
Без этого просто очень неудобно работать. По чему-то щёлкнуто, а где это, что это… А так строка с которой выполняются какие-то действия ярко подсвечена и глазами её искать не надо.
Последнее: txt_sum1.TextFocus(). Когда вводится новая информация обычно надо последовательно заполнить всё и потому логично устанавливать курсор на первый элемент. А при корректировке обычно меняется что-то конкретное. В данном случае логично предположить что про корректировке чаще всего будут менять количество ставок. Вот на этот элемент сразу и устанавливается курсор.
Проверки при попытке сохранить информацию, т.е при нажатии кнопки «Сохранить» после корректировки:
Основной набор довольно примитивен. Просто строка должна иметь например хоть какую-то дату. Если её не ввели выводится сообщение и курсор устанавливается на элемент для ввода даты. Тоже самое и с остальной информацией. Если примитивная проверка не выявила ошибок то запускается сложная проверка sp_dir_664_can_add() корректности информации в этой строке.
Проверка делается хранимой процедурой на сервере. Это один из плюсов клиент-серверного приложения. Иногда довольно сложно определить насколько корректна информация, которую пытаются записать. Может потребоваться чтение разных таблиц, суммирование информации, сравнение чего-то с чем-то. Вся эта информация есть на SQL сервере. Так пусть он внутри себя всё это найдёт (никуда не отправляя), посчитает и вернёт клиенту только итоговый результат – можно такое записывать в базу или нет. Так и делается:
В процедуру передаётся @UI т.е новая строка или корректировка существующей строки и всё то, что планируется записать. Процедура возвращает либо код ошибки либо то, что ошибок нет и записывать такое можно.
Если ошибок нет, то вся информация, которая введена на странице передаётся хранимой процедуре, которая запишет это в таблицу на SQL сервере:
Я думаю, что для понимания основной логики этого достаточно, остальное в текстах.
|