powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
18 сообщений из 18, страница 1 из 1
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34481965
apl78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Помогите, никогда не работал с массивами в FoxPro 2.6 (хотя фокс немного знаю) и вот столкнулся((...

Проблема в следующем: существует база данных s_nom.dbf в которой следующая структура:
Per (N) Nai (C) Norma(N)
0 plt 5.80
88 plt 6.80
0 brl 6.50
88 brl 9.50
0 kol 9.50
88 kol 15.50

В поле Per соответствующий период, в поле Nai введено название кода, в Norma его коэффициент. Мне необходимо ввести все данные в массивы так, чтобы потом в программе, где будут встречаться названия кодов в формулах (plt, kol и т.д.), каждому названию автоматически вставлялся соответствующий ему коэффициент (т.е. всем названиям присваивало свой коэффициент) при условии что период равен 88 или другому периоду (если будут изменения в данных базы).

В массив данные базы внес следующим образом:

publ array norma_arr(1)
publ norma_len

sele per, nai, norm from s_norma where type=1 order by per into array norma_arr
norma_len=alen(norma_arr)/3

А вот как дальше прописать условия???
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34482059
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxPro - это все-таки СУБД. Т.е. "заточена" под работу с таблицами. Работа с массивами поставлена хуже. В идеале, лучше бы оставить данные в таблице и там и выполнять поиск. Но, поскольку речь идет о FP2.x, где количество рабочих областей сильно ограничено, то придется выкрчиваться.

Для работы с массивами в FoxPro есть ряд команд, начинающихся с буквы A...

ASCAN() - поиск в массиве по значению одного элемента. На способ поиска символьных данных влияет настройка SET EXACT

Эта функция возвращает номер элемента массива. "Перевести" найденный номер элемент в номер строки или столбца можно при помощи функции ASUBSCRIPT()

Чтобы понять, что такое "элемент" следует учитывать тот факт, что хотя к двумерному массиву можно обращаться с указанием номера строки и столбца, но физически, где-то там у себя, FoxPro все равно хранит любой массив как одномерный . Вот этот самый "внутренний" номер элемента массива и вернет функция ASCAN().

Кстати, к элементам двумерного массива можно обращаться как к элементам одномерного массива по их внутренним номерам.

В твоем случае все осложняется тем, что искать надо не по значению одного элемента, а по значению двух элементов:

Per=88 AND Nai=...

Функции по работе с массивами в FoxPro этого делать не умеют. Надо будет либо последовательно использовать ASCAN() - там можно задать номер элемента с которого надо начинать поиск - либо создать отдельные массивы, каждый для своего значения Per, что тоже не есть хорошо

Для примера

Код: 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.
publ array norma_arr( 1 )
publ norma_len

sele per, nai, norm from s_norma where type= 1  order by per into array norma_arr
norma_len=_TALLY  && Системная переменная _TALLY - количество строк, обработанных Select-SQL
*norma_len=alen(norma_arr, 1 )  && количество строк в массиве
*norma_len=alen(norma_arr)/ 3 

* Ищем в массиве значение
* Per= 88  AND Nai="brl"

* Первый поиск с самого начала массива
pos = ASCAN(norma_arr,"brl")
DO WHILE pos >  0 
	aRow = ASUBSCRIPT(norma_arr,pos, 1 )  && номер строки массива
	IF norma_arr(aRow, 1 )<> 88 
		* если в найденной строке первый элемент отличен от  88  повторяем поиск
		* но начиная со следующего элемента
		pos = ASCAN(norma_arr,"brl",pos+ 1 )
	ENDIF
ENDDO

* Если в результате pos> 0 , значит нашли нужный элемент
IF pos> 0 
	aRow = ASUBSCRIPT(norma_arr,pos, 1 )  && номер строки массива
	?norma_arr(aRow, 3 )  && смотрим значение из  3  столбца найденной строки
ENDIF

Разумеется, можно решит задачу поиска "в лоб", просто перебирая в цикле все элементы массива

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
FOR aRow= 1  TO norma_len
	IF norma_arr(aRow, 1 )= 88  AND norma_arr(aRow, 2 ) = "brl"
		EXIT
	ENDIF
ENDFOR

IF aRow<=norma_len
	?norma_arr(aRow, 3 )  && смотрим значение из  3  столбца найденной строки
ENDIF
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34482079
apl78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, буду пробовать... Т.е. в данном случае, если я в формуле укажу название blr то подставиться коэффициент автоматически или надо чтото еще указать дополнительно?
Пример формулы:

@ row(), col()+2 SAY TRANSFORM(ROUND((r_pgv*pgv+c_plt*plt+r_kol*kol+r_blr*blr+r_elt*elt)*abo+otpl*IIF(lm=0, r_otp, 0), 0), [@z 9999999])
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34482084
apl78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использовал первый пример, но почемуто выдает в ответ просто значение 0, а не то что заданно в базе данных
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34482957
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как использовал-то?
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34483266
apl78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
изначально я просто проверил первый вариант на самой базе (ничего не переделывая), но по команде ?norma_arr(aRow,3) выводиться 0 значение. Почему то получаеться вроде что
pos = ASCAN(norma_arr,"brl") - не находит запись "brl" в базе а соответственно и его позицию и получаеться 0 ... (может я чтото не так сделал, если у тебя получаеться)
Может я базу чтото не так описал (одно поле не указал, хотя думаю что понятно какое):
Type(N) - Per (N) - Nai (C) - Norma(N)
1 - 0 - plt - 5.80
1 - 88 - plt - 6.80
1 - 0 - brl - 6.50
1 - 88 - brl - 9.50
1 - 0 - kol - 9.50
1 - 88 - kol - 15.50
--------------------------------------------
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34483440
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверь "сложением"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DIMENSION norma_arr( 2 , 3 )
norma_arr( 1 , 1 ) =  0 
norma_arr( 1 , 2 ) = "plt"
norma_arr( 1 , 3 ) =  5 . 8 
norma_arr( 1 , 1 ) =  88 
norma_arr( 1 , 2 ) = "brl"
norma_arr( 1 , 3 ) =  6 . 8 

pos = ASCAN(norma_arr,"brl")
?"pos=",pos
aRow = ASUBSCRIPT(norma_arr,pos, 1 )
?"aRow=",aRow
?"norma_arr(aRow,3)=",norma_arr(aRow, 3 )

Это работает?
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34484570
apl78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет. Я просто в данном моменте сам немного сглупил))... Дело было в том что в базе наименования заглавными пишуться а в pos = ASCAN(norma_arr,"brl") строчными я написал, вот и не выходил правильно результат. Но получаеться следующее, что по первому примеру результат выдает в виде постоянного повторения порядка нахождения "brl" а не итог коэффициента в третем массиве.
Однако втрой метод ("в лоб") результат выдал верный... Впринципе можно просто и описать все условия в цикле (хотя и не так уж и рационально думаю, но главное что показывает).

Так вот теперь вопрос в том как привязать к наименованиям в формулах эти коэффициенты, если формулы встречаються часто в разных частях программы??? Раньше просто был mem-файл и из него все выводилось, теперь же из базы. Вставить условия выборки я попытался, но переменной brl коєффициент не выводиться. Может подскажешь что?

Заранее спасибо ВладимирМ.
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34484867
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, так оформить это все в виде функции. В качестве параметра передаешь ключи для поиска в качестве результата получаешь искомое значение. Функцию можно использовать напрямую в формулах.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
FUNCTION Koef
PARAMETERS tPer, tNai

PRIVATE nKoef, nRow
nKoef =  0   && значение по умолчанию, если ничего не будет найдено

* Проверяем факт существования массива
IF TYPE("norma_arr(1)")<>"U"
	* Массив существует, организуем перебор элементов
	FOR nRow= 1  TO ALEN(norma_arr, 1 )
		* Используем UPPER(), чтобы не зависеть от регистра букв
		IF norma_arr(nRow, 1 )=m.tPer AND UPPER(norma_arr(nRow, 2 ))=UPPER(m.tNai)
			nKoef = norma_arr(nRow, 3 )
			EXIT
		ENDIF
	ENDFOR
ENDIF

RETURN m.nKoef

Соответсвенно использование такой функции будет примерно так

Код: plaintext
@ row(), col()+ 2  SAY TRANSFORM( 10 *Koef( 88 ,"brl"),"@Z 9999999")

Разумеется, функция должна быть видна на момент ее вызова. Поскольку функция использует глобальный массив, то и массив должен быть создан к этому моменту.

Поиск функции будет осуществляться в следующем порядке:

-) В текущей процедуре
-) В иерархии вызвавших процедур. Т.е. в тех процедурах из которой была вызвана данная
-) В процедурном файле, подключенном через SET PROCEDURE
-) В файле PRG имя которого совпадает с именем функции

Поиск файла PRG осуществляется в следующем порядке

-) Внутри исполняемого файла EXE
-) В текущей директории
-) В директориях, указанных в настройке SET PATH
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34488145
apl78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cпасибо большое ВладимирМ!!!)) Все получилось замечательно, подправил под программу свою немного и все работает). Как говориться- век живи, век учис...))
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34488265
apl78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще один вопрос))...
Как выбрать максимальное число из массива?

max(norma_arr(nRow,1),0) - что не верно?
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34488370
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может все-таки перестать извращаться и начать пользоваться СУДБ такими способами, на которые она рассчитана и заточена?
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34489518
apl78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, Sergey Sizov.
Я бы с удовольствием и не мучался, с базой проще намного, да если "старшой" сказал так значит так и надо(((... (а доказывать что он верблюд а не заяц, тут бесполезно... себе только во вред).
Увы бывает и так... Если что не так, извини.
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34491213
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любые операции с миссивами так или иначе сводятся к перебору элементов массива. Т.е. опять же организуешь цикл, перебирающий все строки массива и внутри цикла организуешь сравнение. Все это добро оборачиваешь в функцию, и организуешь вызов этой функции. По сути, все то же самое, что и при определении коэффициента, только несколько другое содержание внутри цикла
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34493990
apl78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем здрасте)))...
ВладимирМ спасибо за помощь, но если можно подскажи как организовать этот цикл по выбору соответствующей записи по дате еще?
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34494132
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, всё-таки Могилевец отчасти прав.
Халява совершенно отбивает стремление мыслить самостоятельно...
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34494191
apl78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CyvДа, всё-таки Могилевец отчасти прав.
Халява совершенно отбивает стремление мыслить самостоятельно...

Я не программер как другие, и фокс знаю не супер а с массивами так вообще не работал(((... И если бы все знал не спрашивал, хотя ведь форум и предназначен чтобы помогать а не судить... хорошо мыслить когда знаешь, а если нет то чтобы все понять иногда и нужна помощь... Я не знаю вот и спрашиваю, но если это комуто неприятно(тебе или еще кому), чтож прошу прощения если обидел, значит уйду... спасибо всем.

особенно тому кто помог.
...
Рейтинг: 0 / 0
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
    #34496628
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположим, Вам дали листок бумаги, где в столбик выписан ряд чисел. Вам надо найти максимальное число в этом ряду. Действия будут примерно такими:

1. Выписываем первое число на другую бумажку
2. Смотрим следующее число. Если оно больше выписанного, то зачеркиваем то, что написали и вместо него пишем это очередное число. Если же оно меньше или равно выписанного числа, то ничего не делаем
3. Повторяем п.2 до тех пор, пока не закончится список.

"Перебор строк" - это цикл FOR...ENDFOR - пример цикла был
"Записать на бумажку" - это присвоить значение переменной - пример был
"Сравнить" - это оператор IF - пример был

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

И причем здесь "я не программер"? Исключительно вопрос ЖЕЛАНИЯ. Зачем самому напрягаться-то, когда проще спросить?

Подобные вопросы воспринимаються исключительно как неуважение и наплевательство на труд других людей. Именно потому, что не требует каких-то особых знаний и умений. Нужно всего-лишь элементарного желания разобраться САМОМУ!
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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