powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определение текущей таблицы
5 сообщений из 5, страница 1 из 1
Определение текущей таблицы
    #33439830
Протеин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в следующем. Есть таблица, и есть поле, в которое вставляется значение по default функцией newvalue("tablename"). Так вот эта функция выдает значение на основании другой таблицы, в которой имени таблицы соответствует предыдущее значение, фунция просматривает эту таблицу, находит нужное имя и выбирает значение. Вопрос в следующем, как в функции узнать из какой таблицы она была вызвана, просто хочется в поле defaul value вставить newvalue() вместо newvalue("tablename")
...
Рейтинг: 0 / 0
Определение текущей таблицы
    #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
Определение текущей таблицы
    #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
Определение текущей таблицы
    #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
Определение текущей таблицы
    #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
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определение текущей таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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