powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Необходима помощь в решении простой задачки!
25 сообщений из 31, страница 1 из 2
Необходима помощь в решении простой задачки!
    #37391965
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Хотел обратиться к вам в необходимости решения следующей задачки.

1. Считать данные из файла EXCEL 1.xls (произвольным способом);
2. Произвести группировку значений по первым трем столбцам и суммирование по следующим четырем столбцам,
например, значение первых трех столбцов с уникальным ключом 1-1-1 будет иметь суммарные значения следующих четырех столбцов 2-4-6-8;
3. Вывести результат преобразований для просмотра тем или иным способом.
4. Команду Select SQL не использовать.

Буду очень благодарен за помощь!
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37391975
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Самое "лобовое" решение: открываем файл в экселе, "сохранить как", выбираем внизу тип файла dbase IV, сохраняем. У вас готов DBF с вашими данными. Если хочется всё делать программно - в поиск по createobject("Excel.Application") .
2.
Код: plaintext
1.
2.
select стобец1,..,столбецK, sum(столбецM),...,sum(столбецN) 
from таблица
group by стобец1,..,столбецK
rtfm "Select - SQL"
3. см. выше + команда Browse + читать про отчёты (reports)
4. Убить об стену укурка, придумавшего это условие. Если невозможно, то читать про scan/endscan.
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37391983
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за советы, с Excel-ем разобрался, сейчас думаю над алгоритмом суммирования значений.
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37391986
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все-таки как будет выглядеть алгоритм без команды Select...
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37392022
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуйста, будьте добры, помогите, у меня не получается не через Scan, не через For, While!!!
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37392052
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите, пожалуйста!!!
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37392150
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CJ Alex R, оверпостинг это зло.
Идея г-кода такая: у вас есть курсор (field1,...,fieldK,fieldM,...fieldN), где 1-K - группировочные поля, а M-N - суммируемые поля. Псевдокод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
создаёте индекс на поля, по которым идёт группировка (index on ...)
"сортируете" курсор по этому индексу (set order t0 ...)
var1=field1,...,varK=fieldK --начальные значения групп.полей 
sumM= 0 ,...,sumN= 0  --тут нули, здесь будут суммы
scan
if field1<>var1 or ... or fieldK<>varK --если группа изменилась
 ?var1,...,varK,sumM,...sumN --выводим результаты по предыдущей группе
 sumM= 0 ,...,sumN= 0  --обнуляем суммы
 var1=field1,...,varK=fieldK --запоминаем новую группу
else
 sumM+=fieldM,...,sumN+=fieldN --а если группа не изменилась, то продолжаем суммировать
endif
endscan
ЗЫ. после написания смотрим на г-код и понимаем, зачем нужен селект-скл.
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37392202
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Вам огромное!
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37392251
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так и не получается...
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37392510
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CJ Alex RТак и не получается...
А как пробовали? Пример кода приведите.
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37392718
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приведу код:

Class CItem
Public key1 As Long
Public key2 As Long
Public key3 As Long
Public val1 As Long
Public val2 As Long
Public val3 As Long
Public val4 As Long

LOCAL loCol, loItem
loCol = NEWOBJECT("Collection")

USE YOURDATA table
SET TALK OFF

DO WHILE .T.
IF EOF( )
EXIT
ENDIF
IF EMPTY(loCol.GetKey(key1+"-"+key2+"-"+key3))
loItem = NEWOBJECT("CItem")
loItem.key1 = key1
loItem.key2 = key2 &&
loItem.key3 = key3 &&
loItem.val1 = value1 && value1
loItem.val2 = value2 && value1
loItem.val3 = value3 && value1
loItem.val4 = value4 && value1
loCol1.Add(loItem, key1+"-"+key2+"-"+key3)

SKIP
LOOP
ENDIF

loCol.GetKey(key1+"-"+key2+"-"+key3).val1= loCol.GetKey(key1+"-"+key2+"-"+key3).val1 +value1
loCol.GetKey(key1+"-"+key2+"-"+key3).val2= loCol.GetKey(key1+"-"+key2+"-"+key3).val2 +value2
loCol.GetKey(key1+"-"+key2+"-"+key3).val3= loCol.GetKey(key1+"-"+key2+"-"+key3).val3 +value3
loCol.GetKey(key1+"-"+key2+"-"+key3).val4= loCol.GetKey(key1+"-"+key2+"-"+key3).val4 +value4
SKIP
LOOP
ENDDO
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37392802
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CJ Alex R,

код выдаёт ошибку (какую?) или просто ничего не считает?
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37392829
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибку сначала выдает -> в прикрепленном файле
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37392973
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CJ Alex R,

А, собственно, зачем вам паблики? Ну и насчёт класса - на крайний случай (фокса сейчас нет под рукой, проверить ошибку не могу) сделайте библиотеку, сделайте там класс на основе кастома, и сделайте в нём метод, выполняющий всё написанное вами выше (кроме первой строки :) ). Потом креатеобжект, обжект.метод() и смотрите результат/ошибки.
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393060
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, не "class", а "DEFINE CLASS". Во-вторых, а на кой здесь класс и такое кол-во глобальных переменных, которые в данном модуле и так прекрасно видны ?
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393062
Может, проще отчет создать, который сам автоматически все сгруппирует и посчитает?
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393396
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rewareа на кой здесь классдля ООП :)
FffffffffffffffffffffМожет, проще отчет создать, который сам автоматически все сгруппирует и посчитает?Кстати, самая умная мысль в топике, но, боюсь, препод ТСа не оценит и добавит 5-е условие "не использовать отчёты"
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393506
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxPro - это СУБД. Т.е. "заточена" под работу с таблицами (базами данных). Вот и надо показать умение работать с этими самыми таблицами. То, что "творите" Вы - это работа с памятью. Причем на принципах какого-то другого языка программирования.

Этап 1: Загрузка данных из Excel. Ну, собственно к задаче отношения не имеет. Это некий подготовительный этап, чтобы просто сформировать таблицу (курсор) в среде FoxPro.

Далее от Вас требуется выполнить некие вычисления по этой таблице. Для FoxPro совершенно "естесственно" поместить результат этих вычислений тоже в таблицу. Пусть и временную. Хранить результат обработки в переменных памяти, а тем более объектах - это "не естесственно" для FoxPro. Возможно, но будут проблемы.

Поскольку Select-SQL для Вас под запретом, то следует создать результирующую таблицу "вручную". В данном случае, очевидно, что структура результирующей таблицы будет совпадать со структурой исходной таблицы с данными. Читайте справку по командам CREATE CURSOR и AFields().

А вот дальше от Вас и требуется показать умение работать с таблицами. Собственно, ничего сложного: найти запись (LOCATE, SEEK), заменить значение в существующей записи (REPLACE), создать новую запись (INSERT). Почти то же самое, что Вы пытались сделать при помощи коллекций. Просто команды другие.
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393694
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не использовать -SQL полностью (включая INSERT и т.п.), то так примерно:
Код: 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.
SET TALK OFF
CLOSE all
SET SAFETY OFF
SET DELETED ON

SELECT  0 
USE mytable ALIAS my
COPY TO tmp_table
SELECT  0 
USE tmp_table ALIAS tmp
DELETE ALL
SELECT my
INDEX on STR(k1)+STR(k2)+STR(k3) to mytable
SET INDEX TO mytable
GO top

SCAN
	SCATTER MEMVAR
	SUM n1, n2, n3, n4 WHILE my.k1=m.k1 AND my.k2=m.k2 AND my.k3=m.k3 TO n1, n2 ,n3 ,n4
	SELECT tmp
	APPEND BLANK
	GATHER MEMVAR
	SELECT my
ENDSCAN
USE
SELECT tmp
BROWSE
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393701
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, тестовая табличка...
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393808
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо, AndreTM , я Вам очень благодарен, еще один небольшой вопросик, как таблицу с результатами добавить в элемент Grid к уже существующей там таблице, полученная импортом из Excel.
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393814
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CJ Alex R,

грид - это средство просмотра данных. Сами данные "лежат" не в гриде, а в таблице, которую он отображает (у вас это исходная таблица). Соответственно вам надо взять данные из сгруппированной таблицы и дописать их в исходную. Если структуры совпадают, то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
scan groupedtable
  select groupedtable
  scatter memvar
  select basetable
  append blank
  gather memvar
endscan
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393815
CJ Alex R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, tanglir, а в свойствах и методах Grida надо что-о прописывать (Init и т.д.)?
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393816
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CJ Alex R, ну, если у вас таблица уже отображается в гриде, то самое простое - дописать туда данные, после чего утащить с грида фокус и вернуть обратно (с рефреш() у грида вроде какие-то нюансы, точно не помню, но сетфокус() обновляет вид гарантированно)
...
Рейтинг: 0 / 0
Необходима помощь в решении простой задачки!
    #37393817
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirдописать туда данные"туда" - это в таблицу, конечно же :)
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Необходима помощь в решении простой задачки!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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