powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / значение поля последней записи
22 сообщений из 22, страница 1 из 1
значение поля последней записи
    #37428559
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Есть форма для заполнения таблицы city.dbf(c полями idcity,ccity). Первое значение idcity=1, все последующие начинаются с 101 и должны далее заполняться авт.
Т.е. если занеслась запись с idcity=101, при следующем вводе на форме должно быть dcity=102.
Сначало я как понимаю нужно получить значение idcity в последней строке таблицы
Код: plaintext
1.
2.
3.
4.
SELECT city
GO bottom
select idcity from city where ... как взять из последней строки?

...
Рейтинг: 0 / 0
значение поля последней записи
    #37428697
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей1982Здравствуйте. Есть форма для заполнения таблицы city.dbf(c полями idcity,ccity). Первое значение idcity=1, все последующие начинаются с 101 и должны далее заполняться авт.
Т.е. если занеслась запись с idcity=101, при следующем вводе на форме должно быть dcity=102.
Сначало я как понимаю нужно получить значение idcity в последней строке таблицы
Код: plaintext
1.
2.
3.
4.
SELECT city
GO bottom
select idcity from city where ... как взять из последней строки?


Вообще, не так это надо делать. Надо завести локальную/сетевую таблицу (назовём её MISC.DBF), где кроме прочего хранится последний использованный idcity. При необходимости открываем её SHARED, читаем последний idcity, увеличиваем его на 1, записываем его в MISC.DBF и юзаем в своём приложении.
...
Рейтинг: 0 / 0
значение поля последней записи
    #37428711
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей1982Здравствуйте. Есть форма для заполнения таблицы city.dbf(c полями idcity,ccity). Первое значение idcity=1, все последующие начинаются с 101 и должны далее заполняться авт.
Т.е. если занеслась запись с idcity=101, при следующем вводе на форме должно быть dcity=102.
Сначало я как понимаю нужно получить значение idcity в последней строке таблицы
Код: plaintext
1.
2.
3.
SELECT city
GO bottom
select idcity from city where ... как взять из последней строки?
Командой go bottjv вы уже встали на последнюю запись и осталось только прояитать нужное значение:
Код: plaintext
lnIdCity = idcity 
Следующая за ней команда select idcity from city where ... к предыдущим строкам не имеет никакого отношения и делает свою выборку. То есть в одном месте смешали два совершенно разных подхода к получению одного и того же результата. Выберите что-то одно.
Код: plaintext
select max(idcity) from city into array lnId City
...
Рейтинг: 0 / 0
значение поля последней записи
    #37428842
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
USE misc IN  0  EXCLUSIVE 
  SELECT misc  
  DELETE all  
  PACK  
INSERT INTO misc(lnIdcity);
select MAX(idCity) FROM city;


Дело в том, что нужно перед записью последнего idCity в таблицу misc, нужно ее очищать. А вот с удалением всех записей проблемка, выдает ошибку " File is in use "
...
Рейтинг: 0 / 0
значение поля последней записи
    #37428897
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей1982
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
USE misc IN  0  EXCLUSIVE 
  SELECT misc  
  DELETE all  
  PACK  
INSERT INTO misc(lnIdcity);
select MAX(idCity) FROM city;


Дело в том, что нужно перед записью последнего idCity в таблицу misc, нужно ее очищать. А вот с удалением всех записей проблемка, выдает ошибку " File is in use "

Блин, ну почему все лезут на одни грабли?
...
Рейтинг: 0 / 0
значение поля последней записи
    #37428907
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, какие грабли?
Код: plaintext
1.
2.
3.
SELECT misc  
  DELETE all  
  PACK 
???

Может все-таки так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
delete from misc  
  use in select('misc')  
    
  try  
     use misc  alias misc  in  0  EXCLUSIVE  
     pack  
  catch to loError  
     =messagebox(loError.Message)  
  finally  
     use in select('misc')  
  ENDTRY
...
Рейтинг: 0 / 0
значение поля последней записи
    #37428916
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей1982,

Так всем и везде пишут. Если предполагается использование программы несколькими пользователями, НЕЛЬЗЯ использовать открытие файлов в Exckusiv и использование таких команд, как PACK, т.е. использующие монопольное открытие таблицы. Иногда бывает в этом необходимость, но это как бы админский инструмент и пользуются им как правило в нерабочее время. Скорее всего у вас с логикой программы что-то неверно. Зачем удалять все записи и тут же записывать новую ???
...
Рейтинг: 0 / 0
значение поля последней записи
    #37428937
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, тогда смысл от таблицы MISC.DBF
...
Рейтинг: 0 / 0
значение поля последней записи
    #37428951
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, а все понял, нужно сделать еще одно поле idcity+1
...
Рейтинг: 0 / 0
значение поля последней записи
    #37428983
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Создать таблицу, где поле id имеет тип Integer
2. Создать первую запись таблицы с кодом 1
3. Модифицировать структуру таблицы изменив поле id с типа integer на поле типа Integer(AutoIncrement) и установить значение свойства NextValue = 101

Собственно, все. Теперь автоматически при создании новой записи поле id будет заполняться значениями начиная со 101 и дальше. Никакого кода по заполнению этого поля писать не надо.

Относительный недостаток заключается в том, что в случае удаления записей счетчик не сбрасывается. Т.е. если создали запись с кодом 101, затем ее удалили, то новая запись получит код 102. Будут "дыры" в нумерации.
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429008
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, так в том то и дело.
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429041
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На фоме в кнопке Добавить в valid прописал
Код: plaintext
1.
2.
 INSERT INTO dbf\misc(lnIdcity);
select MAX(idCity) FROM city;

В таблице misc сдел еще одну колонку lnIdcity1=lnIdcity+1.
При нажатии на кнопку добавить открывается форма editcity, где есть textbox txtidcity который должен быть равен MAX(lnIdcity1) таблицы misc. Как сделать, чтобы на форме в txtidcity отбражалось MAX(lnIdcity1) ?
Процедура Init:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
lparameters tcMode

if upper(evl(tcMode, "")) = "NEW"
	this.txtidcity.value =  0 
	this.txtcity.value = ""
	this.lNew = .t.
else
	this.txtidcity.value = city.idcity
	this.txtcity.value = city.ccity
endif
Процедура doSave:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
local llOk

do case
	case empty(this.txtidcity.value)
		wait window "Введите код населенного пункта" timeout  2 
		this.txtidcity.setfocus()

	case empty(this.txtcity.value)
		wait window "Введите название населенного пункта" timeout  2 
		this.txtcity.setfocus()

	otherwise
		if thisform.lNew
			insert into city ;
				(idcity, ccity) ;
				values ;
				(this.txtidcity.value,  this.txtcity.value)
		else
			replace next  1  in city ;
				idcity with this.txtidcity.value, ;
				ccity with this.txtcity.value
		endif
		
		llOk = .t.
endcase

return llOk

...
Рейтинг: 0 / 0
значение поля последней записи
    #37429055
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей1982,

Что бы не было дыр, то всего 2 варианта:
1. Запрет на удаление.
2. Очистка полей записи с последующим использованием. Но здесь могут возникнуть сложности при имеющихся связях с другими таблицами.

А вообще, чем смущают дыры. Не все ли равно какой ID - это же как бы внутренняя нумерация. Пользователь её все равно не видит.
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429079
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, это я понимаю. Но ведь нужно довести до конца этот способ. Осталось присвоить this.txtIdcity=max(lnIdCity) from misc, но как правильно это сделать?
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429095
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, во-первых, не вижу никаких проблем из-за наличия дыр в нумерации. С какой стати вообще использовать код удаленной записи? Как Вы собираетесь поддерживать исторические данные?

Например, год назад код 101 соответствовал "Улице 1", находящейся на севере города, а сегодня соответствует "Улице 2", которая находится на юге города? А у Вас год назад были заведены данные на улицу с кодом 101. Как будете разбираться?

Во-вторых, если Вы хотите-таки использовать "дыры" в нумерации, то все становится очень сложно. Необходима еще дополнительная таблица, которая будет хранить эти самые дыры. Ведь Вы не можете ни изменить значение счетчика, ни сделать выборку.

Поясню. Например, были записи с кодами 101, 102, 103. Вы удалили запись с кодом 102. Каким образом при создании новой записи Вы узнаете, что ей надо присвоить не код 104, а код 102?

В-третьих, а какая Вам, собственно, разница, какое значение идентификатора будет внутри системы? Какие выгоды Вы хотите получить от этой самой непрерывности номеров?

Наконец, "дыры" в нумерации неизбежны при любом варианте. Например, удалили записи, а новые еще не создали.

=============================

Насчет таблицы, Вы не поняли. Имелся в виду аналог автоинкрементных полей. Сделайте поиск по ключевому слову NewId. Ну, например, вот была тема

Вставка в таблицу записи с уникальным id
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429100
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей1982IgorNG, это я понимаю. Но ведь нужно довести до конца этот способ. Осталось присвоить this.txtIdcity=max(lnIdCity) from misc, но как правильно это сделать?
Никак не сделать. Сам подход не правильный. Разумеется, если только Вы не собираетесь разрабатывать программу для единоличного использования. Для программы, с которой одновременно могут работать несколько пользователей, подобный подход не правильный по самой сути.
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429108
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей1982,

При нажатии на кнопку добавить открывается форма editcity, где есть textbox txtidcity который должен быть равен MAX(lnIdcity1) таблицы misc. Как сделать, чтобы на форме в txtidcity отбражалось MAX(lnIdcity1) ?

Например в Init txtidcity:

SELECT MAX(lnIdcity1) AS MaxIdCity FROM misc INTO CURSOR MyCursor
SELECT MyCursor
THISFORM.txtidcity.Value = MyCursor.MaxIdCity
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429111
Banditos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей1982,

А Вы точно понимаете разницу между "ID" и "Номером по порядку"?
Или хотя бы осознаете, что это две различных сущности?
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429279
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, а можно ли поменять значение MaxIdCity в MyCursor ?
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429313
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, разобрался. :)
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429546
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей1982Дело в том, что нужно перед записью последнего idCity в таблицу misc, нужно ее очищать. А вот с удалением всех записей проблемка, выдает ошибку " File is in use "
Так-с, три шага назад, глубокий вдох и приседание. Вы кнопки давно нажимаете ? Мда, зря я спросил... Итак, если вам на экране пишут, что "File is in use", значит так оно и есть.
Надо таблу закрывать после юзания.
Код: plaintext
1.
2.
USE misc in  0 
z=misc.SomeField
USE IN misc
Все дела.
...
Рейтинг: 0 / 0
значение поля последней записи
    #37429897
Сергей1982
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
reware,
Код: plaintext
1.
2.
3.
USE misc in  0  *открываем таблицу misc
z=misc.SomeField 
USE IN misc
А что значит z=misc.SomeField ?
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / значение поля последней записи
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]