|
|
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Всем привет! Помогите, никогда не работал с массивами в 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 А вот как дальше прописать условия??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2007, 23:01 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
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. Разумеется, можно решит задачу поиска "в лоб", просто перебирая в цикле все элементы массива Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 01:03 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Спасибо, буду пробовать... Т.е. в данном случае, если я в формуле укажу название 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]) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 02:01 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Использовал первый пример, но почемуто выдает в ответ просто значение 0, а не то что заданно в базе данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 02:21 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Как использовал-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 12:10 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
изначально я просто проверил первый вариант на самой базе (ничего не переделывая), но по команде ?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 -------------------------------------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 13:19 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Проверь "сложением" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Это работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 14:00 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Привет. Я просто в данном моменте сам немного сглупил))... Дело было в том что в базе наименования заглавными пишуться а в pos = ASCAN(norma_arr,"brl") строчными я написал, вот и не выходил правильно результат. Но получаеться следующее, что по первому примеру результат выдает в виде постоянного повторения порядка нахождения "brl" а не итог коэффициента в третем массиве. Однако втрой метод ("в лоб") результат выдал верный... Впринципе можно просто и описать все условия в цикле (хотя и не так уж и рационально думаю, но главное что показывает). Так вот теперь вопрос в том как привязать к наименованиям в формулах эти коэффициенты, если формулы встречаються часто в разных частях программы??? Раньше просто был mem-файл и из него все выводилось, теперь же из базы. Вставить условия выборки я попытался, но переменной brl коєффициент не выводиться. Может подскажешь что? Заранее спасибо ВладимирМ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 18:25 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Ну, так оформить это все в виде функции. В качестве параметра передаешь ключи для поиска в качестве результата получаешь искомое значение. Функцию можно использовать напрямую в формулах. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Соответсвенно использование такой функции будет примерно так Код: plaintext Разумеется, функция должна быть видна на момент ее вызова. Поскольку функция использует глобальный массив, то и массив должен быть создан к этому моменту. Поиск функции будет осуществляться в следующем порядке: -) В текущей процедуре -) В иерархии вызвавших процедур. Т.е. в тех процедурах из которой была вызвана данная -) В процедурном файле, подключенном через SET PROCEDURE -) В файле PRG имя которого совпадает с именем функции Поиск файла PRG осуществляется в следующем порядке -) Внутри исполняемого файла EXE -) В текущей директории -) В директориях, указанных в настройке SET PATH ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2007, 21:57 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Cпасибо большое ВладимирМ!!!)) Все получилось замечательно, подправил под программу свою немного и все работает). Как говориться- век живи, век учис...)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2007, 23:03 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Еще один вопрос))... Как выбрать максимальное число из массива? max(norma_arr(nRow,1),0) - что не верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 01:22 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
А может все-таки перестать извращаться и начать пользоваться СУДБ такими способами, на которые она рассчитана и заточена? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 07:37 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Привет, Sergey Sizov. Я бы с удовольствием и не мучался, с базой проще намного, да если "старшой" сказал так значит так и надо(((... (а доказывать что он верблюд а не заяц, тут бесполезно... себе только во вред). Увы бывает и так... Если что не так, извини. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 13:17 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Любые операции с миссивами так или иначе сводятся к перебору элементов массива. Т.е. опять же организуешь цикл, перебирающий все строки массива и внутри цикла организуешь сравнение. Все это добро оборачиваешь в функцию, и организуешь вызов этой функции. По сути, все то же самое, что и при определении коэффициента, только несколько другое содержание внутри цикла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 22:23 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Всем здрасте)))... ВладимирМ спасибо за помощь, но если можно подскажи как организовать этот цикл по выбору соответствующей записи по дате еще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 19:26 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Да, всё-таки Могилевец отчасти прав. Халява совершенно отбивает стремление мыслить самостоятельно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 22:05 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
CyvДа, всё-таки Могилевец отчасти прав. Халява совершенно отбивает стремление мыслить самостоятельно... Я не программер как другие, и фокс знаю не супер а с массивами так вообще не работал(((... И если бы все знал не спрашивал, хотя ведь форум и предназначен чтобы помогать а не судить... хорошо мыслить когда знаешь, а если нет то чтобы все понять иногда и нужна помощь... Я не знаю вот и спрашиваю, но если это комуто неприятно(тебе или еще кому), чтож прошу прощения если обидел, значит уйду... спасибо всем. особенно тому кто помог. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2007, 23:01 |
|
||
|
Прошу помочь разобраться с массивами в FoxPro 2.6!!!...
|
|||
|---|---|---|---|
|
#18+
Предположим, Вам дали листок бумаги, где в столбик выписан ряд чисел. Вам надо найти максимальное число в этом ряду. Действия будут примерно такими: 1. Выписываем первое число на другую бумажку 2. Смотрим следующее число. Если оно больше выписанного, то зачеркиваем то, что написали и вместо него пишем это очередное число. Если же оно меньше или равно выписанного числа, то ничего не делаем 3. Повторяем п.2 до тех пор, пока не закончится список. "Перебор строк" - это цикл FOR...ENDFOR - пример цикла был "Записать на бумажку" - это присвоить значение переменной - пример был "Сравнить" - это оператор IF - пример был Т.е. все, что необходимо для решения задачи уже было. Надо всего-лишь применить то, что было, для решения новой задачи. Более того, это практически полностью повторение УЖЕ НАПИСАННОЙ функции для расчета коэффициента. С минимальными изменениями. И причем здесь "я не программер"? Исключительно вопрос ЖЕЛАНИЯ. Зачем самому напрягаться-то, когда проще спросить? Подобные вопросы воспринимаються исключительно как неуважение и наплевательство на труд других людей. Именно потому, что не требует каких-то особых знаний и умений. Нужно всего-лишь элементарного желания разобраться САМОМУ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2007, 21:59 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=34488370&tid=1589428]: |
0ms |
get settings: |
6ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
84ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 438ms |

| 0 / 0 |
