powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / помогите с суммированием
20 сообщений из 20, страница 1 из 1
помогите с суммированием
    #34418205
zeroaccess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток всем.
Помогите, плиз, делающему первые шаги.
Есть таблица, допустим в 10 строк. В простом варианте надо в ячейке первой строки поставить сумму последующих девяти.
Код: plaintext
REPLACE f1 WITH select SUM(f1) FROM test where RECNO()!= 1 

Данный код не работает, выдает ошибку.

В более сложном варианте, надо считать не строки а столбцы, я понимаю что можно считать в курсоре
Код: plaintext
replace ssum with f1 + f2 + f3
, но как это потом в таблицу вставить?
И еще, если можно то подскажите как присвоить переменной значение выборки ... Например:
Код: plaintext
re = select f1 from test
...
Рейтинг: 0 / 0
помогите с суммированием
    #34418264
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По первым двум вопросам - это надо для отчета? Если да, то лучше таким суммированием заниматься в отчете.

Select SQL в фоксе - команда, а не выражение. Это касательно первого и третьего вопросов.

По второму вопросу: почему решено, что в курсоре можно, а в таблице нельзя?

Обходной маневр для третьего вопроса:

Код: plaintext
1.
select f1 from test into array testvar
?testvar

Если запрос будет возвращать одно значение, то получится полная аналогия с требуемым.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34418916
zeroaccess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Sizov.По первым двум вопросам - это надо для отчета?
Это надо в форме, в Grid
Sergey Sizov.
По второму вопросу: почему решено, что в курсоре можно, а в таблице нельзя?

т.е. я могу написать следующее:
Код: plaintext
1.
2.
goto  1 
replace f3 with f2+f1
и это будет сумма первой и второй ячейки первой строки, помещенная в третью ??
Sergey Sizov.
Обходной маневр для третьего вопроса:
Код: plaintext
1.
select f1 from test into array testvar
?testvar
Если запрос будет возвращать одно значение, то получится полная аналогия с требуемым.
а что б его вставить в таблицу нужно сделать так :
Код: plaintext
replace f3 with testvar
???????
...
Рейтинг: 0 / 0
помогите с суммированием
    #34419200
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
До чего понятливый собеседник.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34419214
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у вас VFP 8-9 - смотрите в сторону SQL комманд SELECT / INSERT/ UPDATE
В них синтаксис стал побогаче.

По поводу первого вопроса
В принципе такие вещи можно сделать с помощью UPDATE
А в гриде можно использовать самонаписанную функцию , которая считает любые суммы

По второму вопросу - если это для грида то тоже можно использовать либо функцию , либо просто в источнике контрола написать =(f1+f2+f3)

Третий вопрос
re = select f1 from test ( если возврашаеться не одно значение - такой фокус не пройдет нигде)
- для чего это нужно - если для вставки или замены в таблицы -пользуйтесь UPDATE или INSERT
Ну или
select f1 from test INTO cursor/array/table
а потом
для курсора и таблицы - обращайтесь к полю F1 , для массива- к соответствующему элементу

И если это все нужно для показа - то вполне вероятно что можно просто написать SELECT , все это отображающий как надо, и никаких Replace ...
...
Рейтинг: 0 / 0
помогите с суммированием
    #34419277
zeroaccess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал вот так:
Код: plaintext
1.
2.
SELECT SUM(c) FROM _1100 WHERE RECNO()!= 4  and RECNO()!= 5  and RECNO()!= 6  and RECNO()< 89  INTO ARRAY testarr
GOTO  1 
replace _1100.c WITH testarr
но массив не обнуляется... т.ею каждый раз получается число в два раза больше .... подскажите как с этим быть ???
...
Рейтинг: 0 / 0
помогите с суммированием
    #34419289
zeroaccess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to -=AlexiS=-
update - обновляет полностью столбец, а мне надо только одну ячейку ... или может я ошибаюсь???
...
Рейтинг: 0 / 0
помогите с суммированием
    #34419293
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Искать ошибку в данных для расчета и условиях их отбора. Select Into Array работатет правильно, не надо на нее грешить.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34419300
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Update обновляет все, что подпадает под условие выборки. Если условие пустое - то всю колонку.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34419358
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во первых - не стоит использовать в SELECT (да и принципе везде) recno() .
Судя по SELECT - что-то у вас с БД "не то". Зашиваться на физический номер записи - "кошмар !!!"

Во вторых
Это не массив не "обнуляется".
Вы посмотрите что вы делаете:
вы в массив отбираете сумму - причем первая запись тоже в этой сумме участвует,
потом записываете эту сумму в таблицу в первую запись ,
ясное дело что в следующий раз SELECT выдаст большее значение суммы
"На пальцах"
Recno C
1 - 1
2 - 1
3 - 1
1 проход
select .....
дает 3
таблица приобретает вид
Recno C
1 - 3
2 - 1
3 - 1
2 проход
select .....
дает уже 4 ну и так далее ...

to -=AlexiS=-
update - обновляет полностью столбец, а мне надо только одну ячейку ... или может я ошибаюсь???
Ошибаетесь - если вы читали хелп - там eсть WHERE - так что измениться то что вы укажите.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34419371
ValeryL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По первому вопросу. В реляционных БД таблицы должны быть однородны. Т.е., если в девяти строках цены ряда товаров - Код товара, Его цена, то в десятой не может быть сумма этих цен, это может быть только цена чего-то. Синтаксис команды совершенно неправилен. И еще. При работе с данными ни в коем случае нельзя использовать номер записи, а нужно пользоваться уникальным кодом. В моем примере это Код товара.
По второму вопросу. Данная операция допустима для таблиц, но все же лучше не записывать сумму в определенный столбец, а вычислять ее динамически в тех местах, где это потребуется. Так значительно проще и гарантирует от ошибок типа: где-то изменилось слагаемое, а сумму забыли поменять.
По третьему вопросу. Он вообще бессмысленен. Переменная хранит значение, т.е число, строку и т.д. Результатом выборки в общем является некоторое множество значений, т.е. несколько чисел, строк и т.д. Ясно, что выборку никак нельзя записать в переменную.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34419996
zeroaccess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заменил recno(), получилось:
Код: plaintext
1.
2.
SELECT SUM(c) FROM _1100 WHERE _1100.a!= 1  AND _1100.a!= 4  and _1100.a!= 5  and _1100.a!= 6  and _1100.a< 89  INTO ARRAY testarr
GO TOP 
replace _1100.c WITH testarr
проблема в том что не работает оператор go top, т.е. сумма вставляется в ту ячейку которая является активной ...
-=AlexiS=- Судя по SELECT - что-то у вас с БД "не то". Зашиваться на физический номер записи - "кошмар !!!"
1.Спаибо, первую запись я как то пропустил ...
2.Почему на физический ??? Имя файла 1001.dbf - _1001 alias, если не прав, то объясните, пожалуйста ....
ValeryL Данная операция допустима для таблиц, но все же лучше не записывать сумму в определенный столбец, а вычислять ее динамически в тех местах, где это потребуется. Так значительно проще и гарантирует от ошибок типа: где-то изменилось слагаемое, а сумму забыли поменять.
Задание именно такое : "перерасчет автоматический, при изменении любого поля." ... т.е. пользователь должен сразу после изменения любой ячейки видеть результат перерасчета в этой же таблице.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34420213
ValeriyI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уж если делать, то так:

LOCAL TestArr[1]
SELECT;
SUM(c);
FROM Test;
WHERE !INLIST(Test.a, 1,7) AND Test.a<8;
INTO ARRAY testarr

GO TOP IN 'Test'
REPLACE Test.c WITH testarr[1] IN 'Test'

Алиас _1001 заменен на Test и изменены условия отбора, но смысл соответствует Вашей задаче.
Ошибка, скорее всего, вызвана тем, что при выполнении GO TOP не выбрана нужная область, т.е.

SELECT _1001
GO TOP
или
GO TOP IN '_1001'

Указание индекса в массиве желательно, хотя бы для того, чтобы программу было легче читать.
А теперь скажите честно. Для чего все это нужно?
...
Рейтинг: 0 / 0
помогите с суммированием
    #34420563
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2.Почему на физический ??? Имя файла 1001.dbf - _1001 alias, если не прав, то объясните, пожалуйста ....
Причем тут алиас - я говорил
Зашиваться на физический номер записи
А физический номер записи - это recno()

То что вы "отвязались" от recno() - это хорошо ,
но все равно зашиваться на конкретные коды (я так понимаю это у вас автоинкримент) тоже не правильно.
Что будет если у вас "исключаемые" коды поменяются или добавяться - придеться прогу переписывать
Чем эти записи автор_1100.a!=1 AND _1100.a!=4 and _1100.a!=5 and _1100.a!=6 and _1100.a<89 отличаются от остальных ?.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34422455
zeroaccess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ValeriyI
А теперь скажите честно. Для чего все это нужно?
Была таблица в Excel (см. файл), а вот теперь надо на VFP.
-=AlexiS=- Чем эти записи отличаются от остальных ?.
Потому как такое условие расчета ... (см.аттач)

to all
посадил вот такой код на активацию страницы (использую Pageframe)
Код: plaintext
1.
SELECT SUM(c) FROM _1100 WHERE _1100.a!= 1  AND _1100.a!= 4  and _1100.a!= 5  and _1100.a!= 6  and _1100.a< 89  INTO ARRAY testarr
UPDATE _1100 SET _1100.c = testarr WHERE _1100.a= 1 
все работает, считает, но проблема в том что надо автор "перерасчет автоматический, при изменении любого поля." прописал это же на событие нажатия клавиши Enter, как Вы понимаете, не работает :) т.е. приходится сначала курсором сменить ячейку,а уж потом нажатие Enter, пересчитывает значения. Подскажите как программно заменить это нажатие, т.е. как я понимаю внести изменения в таблицу.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34422691
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аттач-то где ?
Если вы редактируете в гриде - то самое простое для вас - посадить пересчет на AfterRowColChange.
В принципе по "хорошему" надо бы проверять - менялось или нет значение , а пересчитывать только если были изменения.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34422720
zeroaccess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошу прошения..... вот файлик
...
Рейтинг: 0 / 0
помогите с суммированием
    #34422831
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну елы-палы ну у вас же сейчас не Excel - если это не разовая работа - делайте уже "по нормальному"
Я конечно не увидел что там и как.
Но вот что говориться "в лет".
Заводим еще одно поле логическое PR -
в записях , значения которых
- не включаються в сумму ставим .F.
- включаються- .T.
Тогда условие where из
Код: plaintext
 _1100.a!= 1  AND _1100.a!= 4  and _1100.a!= 5  and _1100.a!= 6  and _1100.a< 89 
у нас превратиться
Код: plaintext
_1100.PR

Теперь при изменении кодов "исключаемых" из расчетов нам не надо менять программу.
Ну и т.д. и т.п.
...
Рейтинг: 0 / 0
помогите с суммированием
    #34422954
zeroaccess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to -=AlexiS=- не подскажите ответ вот на такой вопрос
автор
посадил вот такой код на активацию страницы (использую Pageframe)

Код: plaintext
1.
SELECT SUM(c) FROM _1100 WHERE _1100.a!= 1  AND _1100.a!= 4  and _1100.a!= 5  and _1100.a!= 6  and _1100.a< 89  INTO ARRAY testarr
UPDATE _1100 SET _1100.c = testarr WHERE _1100.a= 1 

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

Вам уже намекнули, что FoxPro это не Excel. То, что Вы хотите сделать, теоретически возможно, но сопряжено с кучей сопутствующих проблем. Поэтому обычно ТАК никто не делает.

Сумма строк выводится не в том же самом Grid, а в отдельных TextBox "над" или "под" Grid. Или же вообще где-то в стороне.

Этот отдельный TextBox напрямую заполняется рассчитанной суммой

Код: plaintext
1.
2.
ThisForm.TextBox.Value = testarr
ThisForm.TextBox.Refresh()

При изменении значения в текущей строке пересчитывать всю сумму заново особого смысла нет. Достаточно из суммы вычесть значение ДО изменения и прибавить значение ПОСЛЕ изменения в этой текущей строке. Получим новую сумму.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / помогите с суммированием
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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