Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / значение поля последней записи / 22 сообщений из 22, страница 1 из 1
07.09.2011, 11:18
    #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
07.09.2011, 12:00
    #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
07.09.2011, 12:05
    #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
07.09.2011, 13:02
    #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
07.09.2011, 13:25
    #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
07.09.2011, 13:28
    #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
07.09.2011, 13:32
    #37428916
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
значение поля последней записи
Сергей1982,

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

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

Относительный недостаток заключается в том, что в случае удаления записей счетчик не сбрасывается. Т.е. если создали запись с кодом 101, затем ее удалили, то новая запись получит код 102. Будут "дыры" в нумерации.
...
Рейтинг: 0 / 0
07.09.2011, 14:15
    #37429008
Сергей1982
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
значение поля последней записи
ВладимирМ, так в том то и дело.
...
Рейтинг: 0 / 0
07.09.2011, 14:26
    #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
07.09.2011, 14:30
    #37429055
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
значение поля последней записи
Сергей1982,

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

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

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

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

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

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

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

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

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

Вставка в таблицу записи с уникальным id
...
Рейтинг: 0 / 0
07.09.2011, 14:44
    #37429100
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
значение поля последней записи
Сергей1982IgorNG, это я понимаю. Но ведь нужно довести до конца этот способ. Осталось присвоить this.txtIdcity=max(lnIdCity) from misc, но как правильно это сделать?
Никак не сделать. Сам подход не правильный. Разумеется, если только Вы не собираетесь разрабатывать программу для единоличного использования. Для программы, с которой одновременно могут работать несколько пользователей, подобный подход не правильный по самой сути.
...
Рейтинг: 0 / 0
07.09.2011, 14:47
    #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
07.09.2011, 14:47
    #37429111
Banditos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
значение поля последней записи
Сергей1982,

А Вы точно понимаете разницу между "ID" и "Номером по порядку"?
Или хотя бы осознаете, что это две различных сущности?
...
Рейтинг: 0 / 0
07.09.2011, 15:44
    #37429279
Сергей1982
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
значение поля последней записи
IgorNG, а можно ли поменять значение MaxIdCity в MyCursor ?
...
Рейтинг: 0 / 0
07.09.2011, 15:59
    #37429313
Сергей1982
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
значение поля последней записи
Спасибо, разобрался. :)
...
Рейтинг: 0 / 0
07.09.2011, 17:43
    #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
07.09.2011, 23:21
    #37429897
Сергей1982
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
значение поля последней записи
reware,
Код: plaintext
1.
2.
3.
USE misc in  0  *открываем таблицу misc
z=misc.SomeField 
USE IN misc
А что значит z=misc.SomeField ?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / значение поля последней записи / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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