|
|
|
rubey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 24.7.2010 Репутация: нет Всего: нет |
Пробую слепить учебные программки и наткнулся на проблему заполнения колонки Grid.
Есть форма с Grid к которому подключена таблица PERSONAL с кодами должностей ID_DOL а в справочнике STUFF находятся коды и наименования должностей ID_DOL, NAM_DOL. Как мне теперь сформировать Grid с выводом в колонку должностей изх названий из справочника. Буду благодарен за помощь. |
|||
|
||||
Reese |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 6.6.2009 Репутация: 1 Всего: 1 |
select p1.*, nvl(s1.NAM_DOL,"") as NAM_DOL;
from PERSONAL p1 ; left join STUFF s1 on s1.id_dol==p1.id_dol ; into cursor tmp_cursor nofilter А к гриду цепляем уже tmp_cursor Это сообщение отредактировал(а) Reese - 28.4.2012, 13:49 |
|||
|
||||
rubey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 24.7.2010 Репутация: нет Всего: нет |
Воспроизвел предложенный код и привязал курсор к Grid следующим макаром
RecordSourceType= 1 RecordSource="TMP_CURSOR" но при запуске формы Grid ничего не показывает - белый фон без ишформации. Видно что-то с привязкой курсора не але, но чт именно - не пойму. |
|||
|
||||
Reese |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 6.6.2009 Репутация: 1 Всего: 1 |
Сначала просто выполните запрос, чтобы убедиться что он работает.
А во вторых как вы привязываете? В коде или в дизайнере? Если вы сделали в дизайнере, то его все равно надо будет перепривязать. И, кстати, в каком месте данный код вызываете? Это сообщение отредактировал(а) Reese - 3.5.2012, 18:50 |
|||
|
||||
rubey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 24.7.2010 Репутация: нет Всего: нет |
Селект работает. Это я проверил добавив в код команду
SELECT * FROM tmp_cursor TO proba_cur.dbf и на экране отображаются значения курсора. Правда таблицу PROBA_CUR FOX не может почему-то открыть. Говорить, что это не таблица. Код я разместил в методе INIT формы, а привязал курсор в свойствах Grid RecordSourceType= 1 RecordSource="TMP_CURSOR" но видно не все по неграмотности учел. |
|||
|
||||
Reese |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 6.6.2009 Репутация: 1 Всего: 1 |
В Init формы после команды select добавьте
thisform.Grid1.RecordSource="TMP_CURSOR" А в дизайнере сбросьте RecordSource в значение по умолчанию. Grid1 - это ваш объект Grid. У вас он может называться по другому.
Используйте лучше не TO а INTO. И добавляйте в конце NOFILTER, иначе фокс пытается сначала просто фильтр наложить на таблицу Это сообщение отредактировал(а) Reese - 4.5.2012, 12:16 |
|||
|
||||
rubey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 24.7.2010 Репутация: нет Всего: нет |
Спасибо за советы. Все заработала. Ошибка была где-то в привязке курсора через дизайнер. Создал форму с нуля ( с учетом всех ваших советов ) и все получилось как надо.
Поскольку ваши подсказки оказались весьма ценными для меня, как новичка, то осмелюсь чуть развить тему этой учебной формы дальше. Хотелось бы попробовать реализовать методику изменения таблицы PERSONAL через имеющийся GRID с курсором. По моему надо создать еще одну форму и вызывать ее по кнопкам “Вставить” “Изменить” “Удалить ” на основной форме и соответственно изменять PERSONAL и обновлять GRID с курсором. Это первое что пришло в голову. Вот только не хватает знаний и опыта реализовать это все. Возникли следующие вопросы : Как отобразить в GRID выборочные поля из курсора , а не все. Как синхронизировать код выбранной записи из курсора с нужной записью в таблице PERSONAL. Как обновлять курсор, чтобы на экране отображалось уже измененное состояние. Если на форме корректировки выбирать должности из справочника через ComboBox, то как изменять код должности в курсоре и таблице. Это первые вопросы, которые возникли перед решением этой задачи. Может еще что добавится. Буду благодарен за подсказки по возникшим вопросам. |
|||
|
||||
rubey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 24.7.2010 Репутация: нет Всего: нет |
Спасибо за советы. Все заработала. Ошибка была где-то в привязке курсора через дизайнер. Создал форму с нуля ( с учетом всех ваших советов ) и все получилось как надо.
Поскольку ваши подсказки оказались весьма ценными для меня, как новичка, то осмелюсь чуть развить тему этой учебной формы дальше. Хотелось бы попробовать реализовать методику изменения таблицы PERSONAL через имеющийся GRID с курсором. По моему надо создать еще одну форму и вызывать ее по кнопкам “Вставить” “Изменить” “Удалить ” на основной форме и соответственно изменять PERSONAL и обновлять GRID с курсором. Это первое что пришло в голову. Вот только не хватает знаний и опыта реализовать это все. Возникли следующие вопросы : Как отобразить в GRID выборочные поля из курсора , а не все. Как синхронизировать код выбранной записи из курсора с нужной записью в таблице PERSONAL. Как обновлять курсор, чтобы на экране отображалось уже измененное состояние. Если на форме корректировки выбирать должности из справочника через ComboBox, то как изменять код должности в курсоре и таблице. Это первые вопросы, которые возникли перед решением этой задачи. Может еще что добавится. Буду благодарен за подсказки по возникшим вопросам. |
|||
|
||||
Reese |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 6.6.2009 Репутация: 1 Всего: 1 |
Ну начнем с малого.
Мысль хорошая. Предлагаю сделать так. Создаем форму, в Init формы добавим два параметра lparam ln_typeoper, ln_id Первый параметр - это у нас будет тип операции (Допустим, будет так 0 - Вставить, 1 - Изменить) вторым параметром будет id записи Добавляем форме свойство typeoper после чего пишем thisform.typeoper = ln_typeoper На форме с гридом добавляем кнопки “Вставить” и “Изменить” (я бы их правда назвал "Добавить" и "Редактировать") на клике этих кнопок пишем примерно следующее для изменения local ln_id ln_id = tmp_cursor.id && tmp_cursor - наш курсор из предыдущего примера. id - уникальный идентификатор записи (я не знаю как у вас это поле называется) do form editform with 1, ln_id для добавления do form editform with 0, 0 На форме (я ее тут назвал editform) в Init пишем if used("cur_edit") use in cur_edit endif select * from PERSONAL where id==ln_id into cursor cur_edit nofilter readwrite после чего добавляем контролы и привязываем их к курсору cur_edit В методе Click кнопки сохранить (ее еще надо добавить) пишем что-то вроде if thisform.typeoper = 0 insert into personal select * from cur_edit && Написано приблизительно. Конкретно см. хелп по команде insert-sql else update personal set ... from cur_edit where personal.id==cur_edit.id && Написано приблизительно. Конкретно см. хелп по команде update-sql Тут уже надо пробовать. Вместо курсора можно использовать объект или просто переменные, см. команды scatter gather Это сообщение отредактировал(а) Reese - 18.5.2012, 12:25 |
|||
|
||||
rubey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 24.7.2010 Репутация: нет Всего: нет |
Воспроизвел предложенное и на мое удивление вся конструкция заработала, но получилось не совсем то, что задумывалось. В результате селекта
thisform.typeoper=vcTypeoper thisform.in_kod=vcid_dol IF USED("Cur_Edit") USE IN cur_edit ENDIF SELECT * FROM personal WHERE id_dol==id_dol INTO CURSOR cur_edit NOFILTER readwrite **************************************** *** Получаем в результате следующий курсор *** Код - 1 ПИБ - Иванов *** 2 Феофанов *** 3 Ионкин ............ *************************************** Из этого мне не сов сем ясно как через форму EditForm откорректировать Должность работника. Мне представлялось, что при выборе строки Grida на форме EditForm в контролах отобразятся все значения по работнику и через TextBox откорректируется фамилия и адрес, а через CheckBox - должность и заменится в Гриде и таблице, но из полученного курсора не ясно как это сделать. Спасибо |
|||
|
||||
Reese |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 6.6.2009 Репутация: 1 Всего: 1 |
Вот где проблема. Во первых
Т.е. вы выбираете все записи т.к. сравниваете поле с самим собой. Во вторых id_dol. Я имел ввиду идентификатор таблицы PERSONAL. В результате должен получиться курсор с одной записью. Ну а дальше на форму кидаем контролы и привязываем их к нашему курсору (см. ControlSource) |
||||
|
|||||
rubey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 24.7.2010 Репутация: нет Всего: нет |
Спасибо за ответ, но я не понял как мне изменить последний Селект, чтобы получить одну выбранную запись. Дело в том, что у меня и основной базе PERSONAL и в справочнике STUFF код должности одинаково называется - ID_DOL.
|
|||
|
||||
Reese |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 6.6.2009 Репутация: 1 Всего: 1 |
Да причем тут id_dol.
Вам же нужно выбрать уникальную запись из таблицы PERSONAL, следовательно и надо сравнивать с идентификатором таблицы PERSONAL. И сравнивать его надо с тем значением которое сохранили, т.е. thisform.in_kod. |
|||
|
||||
rubey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 24.7.2010 Репутация: нет Всего: нет |
Я понимаю Ваше недовольство, но для меня многое в новинку при программировании на isual Foxpro. Похожее я делал, но еще в древнем Foxpro 2.6 и это меня часто сбивает с толку.
Напутал я слегка с параметрами, но наконец разобрался и все наладилось. Теперь у меня в курсоре нужная запись со всеми реквизитами, но не получается повесить на нее 2 контрола - TextBox для фамилии и ComboBox для выбора должности. Рылся по книжкам, но не наткнулся на похожий пример ни в одной. Не подкажете, в очередной раз, как реализовать подключение этих контролов к реквизитам курсора, особенно ComboBox. Благодарю за помощь. |
|||
|
||||
Reese |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 6.6.2009 Репутация: 1 Всего: 1 |
Нужны свойства ControlSource для обоих и RowSource для ComboBox Назначаем примерно так
|
||||
|
|||||
Правила форума "Foxpro/Clipper/Dbase" | |
|
Запрещается! 1. Публиковать ссылки для чисто рекламных целей. 2. Оффтопить, флеймить, говорить не культурно. Пожалуйста, адекватно задавайте свой вопрос. Тема должна создаваться с названием характеризующем Вашу проблему. Задавайте вопросы правильно - как спросите, так вам и ответят. Разрешено! Давать ссылки на статьи, обзоры, если это не нарушает первый пункт правил. Задавая вопрос, давайте нужную информацию касающуюся Вашей проблемы. Этим вы ускорите полезные ответы. P.S. Размещение рекламы будет строго наказываться! Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MoLeX |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Foxpro/Clipper/Dbase | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |