:: Visual Foxpro, Foxpro for DOS
Временное отображение в textbox и editbox
Tanya1339
Автор

Сообщений: 8
Дата регистрации: 01.10.2017
Здравствуйте, уважаемые форумчане!

Подскажите пожалуйста как не производя запись в таблицу insert отобразить вычисляемое значение в текстовом поле новой формы при её запуске, чтобы это значение записывалось вместе с внесёнными в остальные поля изменениями только по кнопке сохранить (предполагаю, что tableupdate)
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Отображение данный в/на объектах формы вовсе не подразумевает запись их в таблицу. Исключением может быть Grid при стандартных условиях настройки и, к примеру, тот же TextBox, если его ControlSource напрямую привязан к полю таблицы, например,
Thisform.Text1.ControlSource=Mytable.Fields1
где MyTable- имя таблицы, Fields1, соответственно,- имя поля этой таблицы



Исправлено 2 раз(а). Последнее : Chemberzhy, 16.01.18 10:15
Ratings: 0 negative/1 positive
Re: Временное отображение в textbox и editbox
Tanya1339
Автор

Сообщений: 8
Дата регистрации: 01.10.2017
Простите, что не указала подробнее проблему. у меня две формы. В init для полей обозначено thisform.text1.controlsource = thisform.grd.Column1.ControlSource. Нужно просто по кнопке открывать вторую форму где одно из полей показывает число на единицу больше последнего, чем в таблице, внести изменения и только затем по кнопке сохранить внести в таблицу. Тогда запись должна отобразиться в грид на предыдущей форме.
Но проблема, что я не знаю как не записывая в таблицу и не отображая в грид в предыдущей форме показать поля, где первое заполнено с новым значением. У меня получается только продублировать грид, но тогда вся строка отображается в первой форме.
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
В Init второй формы

Thisform.Text1.ControlSource = ""
Thisform.Text1.Value = Mytable.Fields1 + 1

На кнопке Сохранения в Click
replace Mytable.Fields1 with Thisform.Text1.Value
или
insert into Mytable (Fields1) values (Thisform.Text1.Value)

ну, и, наверное, закрыть окно?
Thisform.release



Исправлено 2 раз(а). Последнее : Chemberzhy, 16.01.18 14:11
Ratings: 0 negative/2 positive
Re: Временное отображение в textbox и editbox
Tanya1339
Автор

Сообщений: 8
Дата регистрации: 01.10.2017
я о таком решении не думала. Очень интересно. А Fields1 это название текущего поля? У меня он его не может найти это поле.



Исправлено 1 раз(а). Последнее : Tanya1339, 16.01.18 11:04
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
Tanya1339
Автор

Сообщений: 8
Дата регистрации: 01.10.2017
Кое-что получилось, спасибо огромное Chemberzhy, буду разбираться дальше.
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
Tanya1339
Автор

Сообщений: 8
Дата регистрации: 01.10.2017
Я сделала вот так в init формы. Но только по нажатии сохранить не знаю как чтобы новая строчка с значениями записалась в грид grd1. На второй форме я грид удалила и обращаюсь только к таблице которая связана с грид на предыдущей форме.
Thisform.Text1.ControlSource = ""
set talk off
Calculate max(table.fields1)to var
var=var+1
Thisform.Text1.Value = var
Thisform.Edit1.ControlSource = ""
Thisform.Edit1.Value = ''
Thisform.Text3.ControlSource = ""
Thisform.Text3.Value = ''
Thisform.Text4.ControlSource = ""
Thisform.Text4.Value = ''
Thisform.Text5.ControlSource = ""
Thisform.Text5.Value = ''

Изначально по нажатии сохранить у меня был следующий код

IF EMPTY (Thisform.Edit1.Value) .or. EMPTY(Thisform.text3.Value) .or. EMPTY(Thisform.text4.Value) .or. EMPTY(Thisform.text5.Value)
=MessageBox ('Вы оставили одно из полей незаполненным',48,'Внимание')
ELSE
TABLEUPDATE()
Thisform.refresh()
RETURN
ENDIF



Исправлено 3 раз(а). Последнее : Tanya1339, 16.01.18 14:04
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Может быть начать с чтения книжки по фоксу? Понять про буферизацию хотя бы.
Ну и заодно отказаться от Calculate max(table.fields1) для генерации уникальных ключей...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
Tanya1339
Автор

Сообщений: 8
Дата регистрации: 01.10.2017
В книжках бывают опечатки. У меня не база данных, а одна таблица и я уже установила буферизацию = 5
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Tanya1339
не знаю как чтобы новая строчка с значениями записалась в грид grd1. На второй форме я грид удалила и обращаюсь только к таблице которая связана с грид на предыдущей форме.
В грид невозможно в принципе ничего записать. Ибо в нем места для данных. Он занимается работой с данными в связанной с ним таблице. Именно в неё и надо записывать. Но если таблица буферизована, то сей момент надо обязательно учитывать, ибо сами данные между таблицей и буфером автоматом не бегают.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
Tanya1339
Автор

Сообщений: 8
Дата регистрации: 01.10.2017
Да указала не корректно простите. Не записалась а отобразилась. Записываются данные в таблицу. Получается внесение новых значений возможно только в кнопке сохранить при добавлении insert или replace with?
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Что есть "внесение новых значений"? Добавление записи? Изменение записи?
Почему бы это нужно было делать именно в кнопке "Сохранить"? При том что буферизация как раз и позволяет иметь "временные" данные - они с одной стороны есть в курсоре - отображаются в гриде, или простых текстбоксах привязанных к этому курсору, их там можно спокойно изменять, а с другой стороны они не записаны "в файл на диск". И могут быть потом либо записаны (как раз это обычно и делает кнопка "Сохранить") либо отменены и "забыты" - оставив таблицу в исходном виде.
Даже если не книжки, то хотя бы статьи хелпа "Buffering Data" и "How to: Append and Delete Records in Table Buffers" следует прочитать и попытаться понять.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
Tanya1339
Автор

Сообщений: 8
Дата регистрации: 01.10.2017
Я в фоксе новичок, но я готова изучать все, что нужно. В том числе и книжки и help. Просто я полагаю, решение должно быть простым, а я могу уйти не в ту сторону. Да, задача подразумевает добавление записи. Но в текущей форме в которой в пять полей куда вводятся пользователем данные, грида в ней нет. Мне это сложно объяснить так как такие требования устанавливала не я. Попробую описать по-другому. Есть две формы. В первой есть грид. Рядом поля для редактирования записей. Есть кнопки обновить и добавить запись. При нажатии на добавить запись ничего, в том числе и строка на номер больше не добавляется. Открывается новая форма в которой поля для добавления не пустой записи в таблицу. При запуске данной формы в первом поле автоматически значение становится на 1 больше максимального. Другие поля должен заполнить пользователь. Если нажать на сохранить, только тогда запись будет сохранена в таблице и стало быть и в грид на первой форме появится заполненная строка. Я буду сейчас читать про то, что Вы указали по буферизации. Если придут иные мысли я готова прочитать и попробовать.
Ratings: 0 negative/0 positive
Re: Временное отображение в textbox и editbox
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Есть много вариантов такого рода интерфейс делать. Основных подхода два
1) В основной форме (с буферизованной таблицей) выполнить INSERT INTO таблица (ID) VALUES (новое_значение_id) - это добавит запись , но именно в БУФЕР. вызвав вторую форму можно там менять все прочие поля этой записи (вторая форма работает в той же датасессии что и первая, текстбоксы напрямую привязаны к полям этой же таблицы). В принципе ничто не мешает редактировать эту новую запись в тех же самых полях что есть и на первой форме (и даже в самом гриде). Но если зачем то хотят отдельную форму - не проблема. При её закрытии можно либо tableupdate-ом попытаться сохранить таки новую запись в таблицу (кнопка "Сохранить"), либо tablerevert-ом её "отменить" (одноименная кнопка). Как подвариант - делать INSERT INTO в LOAD второй формы - раз уж она сугубо для "добавления новой записи". Да и сам tableupdate вполне себе можно делать лишь в первой форме - т.е. запись будет висеть в буфере до тех пор пока в первой форме не соизволят "всё сохранить". Ключевой момент - две формы работают с одной таблицей/курсором и одним буфером.

2) Сделать в первой форме SCATTER NAME oRecord BLANK, потом oRecord.ID = новое_значение_id и вызвать вторую форму передав ей эту самую переменную oRecord как параметр. Во второй форме в Init принять параметр, "запомнить" его в свойстве формы (можно в редакторе прописать такое свойство, можно программно через AddProperty его добавить). Текстбоксы привязывать к ThisForm.свойство_хранящее_ссылку_на_oRecord.поле1 и т.п. Все изменения вносимые во второй форме будут видны в свойствах объекта oRecord в первой форме. Можно там же по результатам ввода сделать INSERT INTO таблица FROM NAME oRecord. Можно в принципе и во второй форме это же сделать (но тогда она опять должна работать в одной датасессии с первой формой - чтобы видеть открытую таблицу. Либо сама открывать её - что не всегда удобно). Ключевой момент - вторая форма НЕ работает с курсором/таблицей, а просто вводит данные в свойства объекта ей переданного - логику по добавлению записи на основе данных в этом объекте реализуют уже после вводе данных и закрытия второй формы (или во время такого закрытия).

Ну и ещё раз повторю - ни в одной нормальной программе НЕ считают "очередной номер" через calc max(), или аналогичны


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Временное отображение в textbox и editbox
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Краткая инструкция по созданию формы

1. Создаете новую форму в дизайнере и устанавливаете для нее свойства

DataSession = 2 - Private DataSession
WindowType = 1 - Modal

2. Открываете DataEnvironment этой формы. Сразу добавляете нужную таблицу в этот DataEnvironment
3. У добавленной таблицы (внутри DataEnvironment это объект Cursor) устанавливаете свойство

BufferModeOverride = 5 - Optimistic table buffering

4. Подвиньте окно DataEnvironment так, чтобы оно не загораживало окно формы. Далее щелкаете левой клавишей мыши по одному из полей таблицы внутри окна DataEnvironment и не отпуская клавиши мыши тащите поле на форму. На нужном месте формы отпускаете клавишу мыши.

В результате, на форме будет создано два объекта. Объект Label, содержащий название поля из настроек таблицы и объект, ассоциированный с соответствующим типом поля таблицы. Если это текстовое поле, то, скорее всего, это будет объект TextBox. Созданные объекты уже имеют все нужные настройки. Ну, разве что, можно текст у объекта Label поправить, если необходимо

Перетащите на форму все нужные поля. После этого закрываете окно DataEnviroment. Больше оно не нужно. Возвращаемся к форме

5. Дважды щелкаете мышкой по свободному месту формы. Открывается окно редактирования методов. Вам нужно выбрать метод init формы (сверху раскрывающийся список методов формы). В этом методу пишите примерно такой код

select MyTable
append blank
replace id with (новое значение)

здесь MyTable - это имя Вашей таблицы

6. Снова возвращаемся на форму и создаем на ней 2 кнопки: Ok, Отмена

7. В методе Click кнопки Ok пишите такой код

select MyTable
if TableUpdate(.t., .t.)
thisForm.release()
endif

8. В методе Click кнопки "Отмена" пишите такой код

thisForm.release()

9. Собственно, все. С подчиненной формой закончили. Теперь надо организовать ее вызов из формы с Grid. Для этого на форме с Grid создаете кнопку "Новая запись" и в методе Click этой кнопки пишите такой код

this.setFocus()
do form MyForm.scx
thisForm.Grid1.setFocus()
thisForm.Grid1.refresh()

Здесь MyForm - это имя файла SCX в котором была создана форма для создания новой записи. Grid1 - это имя объекта Grid, в котором отображается содержимое таблицы

----------------------------------------------------------------------------

Теперь, что это вообще было сделано?

DataSession = 2 - Private DataSession

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

WindowType = 1 - Modal

В этом режиме, пока форма с такой настройкой не будет закрыта невозможно будет переключиться на любую другую форму. Строго говоря, такой режим в современных приложениях используется крайне редко. Здесь это сделано потому, что без этого режима придется писать много кода. А для такой простой задачи - оно того не стоит

BufferModeOverride = 5 - Optimistic table buffering

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

Буфферизация делится на оптимистическую и пессимистическую, а также на строковую и табличную.

Разделение на оптимистическую и пессимистическую - это разделение по способу наложения блокировки.

Пессимистическая - блокировка накладывается в момент начала внесения изменений.
Оптимистическая - в процессе внесения изменений данные не блокируются. Блокировка только на момент записи внесенных изменений в таблицу

В сетевых приложения пессимистическая блокировка не используется. Как правило, по той причине, что напрямую с таблицами в таких приложениях никто не работает. Обычно используют выборки. Как следствие, просто нет смысла накладывать блокировку на источник данных. Это не есть исходная таблица

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

Табличная буфферизация - сохранение внесенных изменений только по команде TableUpdate() и никак иначе. Закрытие таблицы с не сохраненным буфером приведет к потере всех сделанных в этом буфере изменений. Ничего не будет сохранено

Таким образом, как правило, если используют буфферизацию, то используют именно 5 режим буфферизации. Оптимистическая буфферизация таблиц

Организация вызова подчиненной формы

this.setFocus()
do form MyForm.scx
thisForm.Grid1.setFocus()
thisForm.Grid1.refresh()

this.setFocus()

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

do form MyForm.scx

Поскольку форма модальная, то, в данном случае, код обработки метода Click будет остановлен на данной команде до тех пор, пока вызванная форма не будет закрыта. Все, что написано после этой команды будет выполнено после закрытия этой формы. Т.е. после создания новой строки

thisForm.Grid1.refresh()

Это обновление картинка на форме. Запись-то создана, но в Grid она по умолчанию отображена не будет. Надо обновить "картинку". Правда, тут еще можно было бы сделать переход к новой записи, но это надо дополнительно писать "обвязку" на предмет того, что запись была создана, а не нажали кнопку "Отмена". В данном случае в этом нет смысла
Ratings: 0 negative/3 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 27 akvvohinc alex;  (Гостей: 25)

© 2000-2024 Fox Club 
Яндекс.Метрика