Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определение текущей таблицы / 5 сообщений из 5, страница 1 из 1
16.12.2005, 10:12
    #33439830
Протеин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение текущей таблицы
Проблема в следующем. Есть таблица, и есть поле, в которое вставляется значение по default функцией newvalue("tablename"). Так вот эта функция выдает значение на основании другой таблицы, в которой имени таблицы соответствует предыдущее значение, фунция просматривает эту таблицу, находит нужное имя и выбирает значение. Вопрос в следующем, как в функции узнать из какой таблицы она была вызвана, просто хочется в поле defaul value вставить newvalue() вместо newvalue("tablename")
...
Рейтинг: 0 / 0
16.12.2005, 10:33
    #33439910
kdanylo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение текущей таблицы
Код: plaintext
1.
2.
3.
? Alias() &&alias tablitsy otkrytoy v tekushchey rabochey oblasti;
? Dbf(Alias ()) &&polnoe imia tablitsy otkrytoy v tekushchey rabochey oblasti


** SET FULLPATH vliyaet na znachenie vozvrashchaemoe functsiey Dbf()

A dal'she po kodu nado smotret'.
...
Рейтинг: 0 / 0
16.12.2005, 10:59
    #33440003
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение текущей таблицы
В момент вызова Default автоматически осуществляется переход в ту рабочую область, которая вызвала срабатывание Default. Т.е. достаточно в начале функции newvalue() сделать анализ текущей рабочей области.

Код: plaintext
?JUSTSTEM(DBF())

Однако я не советовал бы убирать параметр из функции newvalue(), поскольку эта функция может быть вызвана и из вне Default. Например, из Local View. В этом случае нет никакой гарантии, что текущей будет именно нужная рабочая область.

И еще, если в Default поля записано несколько функций. Ну, например

NewValue()+NewValue2()

то при входе в первую функцию текущей будет именно рабочая область соответствующей таблицы, а вот при входе во вторую функцию, текущей будет та рабочая область, которая была текущей при выходе из первой.

Разумеется, для Default это достаточно экзотический случай, но его нужно иметь в виду.

Т.е. начало функции будет примерно таким

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
FUNCTION NewValue(tcAlias)
  LOCAL lcAlias
  IF TYPE("tcAlias")<>"C" OR EMPTY(m.tcAlias)=.T.
    lcAlias = UPPER(JUSTSTEM(DBF()))
  ELSE
    lcAlias = UPPER(AllTrim(m.tcAlias))
  ENDIF

...
...
Рейтинг: 0 / 0
16.12.2005, 11:02
    #33440010
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение текущей таблицы
У меня такая ХП для получения нового ID:
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Function New_ID(tcAlias)
	local lcAlias, lnID, lcOldReprocess, lnOldArea

	lnOldArea = select()

	if parameters() <  1 
		lcAlias = upper(alias())
	else
		lcAlias = upper(alltrim(tcAlias))
	endif

	lnID =  0 
	lcOldReprocess = set('REPROCESS')
  
	*-- Lock until user presses Esc
	set reprocess to automatic

	if !used("ID_Counter")
		use Interest!ID_Counter in  0 
	endif
	select ID_Counter

	if seek(lcAlias, "ID_Counter", "table_name")
		if rlock()
			lnID = ID_Counter.ID
			replace ID_Counter.ID with lnID +  1 
			unlock
		endif
	else
		lnID =  1 
		insert into ID_Counter (Table_Name,ID) values (lcAlias, 2 )
	endif

	select (lnOldArea)
	set reprocess to lcOldReprocess

	return lnID
EndFunc
Можешь указывать имя таблицы явно, если не указал берёт текущий алиас.
...
Рейтинг: 0 / 0
17.12.2005, 04:05
    #33442162
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение текущей таблицы
Hi AleksMed!

2 момента
1) set reprocess to automatic - ожидание блокировки может быть прервано по
ESC - а у тебя нету ветки ELSE для IF RLOCK() - хотя не ясно (с точки
зрения логики) что делать в такой ситуации. Возможно возврат 0 это не самое
плохое решение... Хотя я бы наверное возвращал NULL (обычно ключевое поле
так заполняется, а там NULL непозволены) - и тем самым генерировал ошибку в
коде инициировавшем вставку записи.
2) Alias и реальное имя таблицы - это 2 большие разницы - т.е. вариант с
JUSTSTEM(DBF()) мне кажется более надёжным... В принципе есть ещё и
CURSORGETPROP("SourceName") ;)

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определение текущей таблицы / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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