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

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

Буду очень благодарен за помощь!
...
Рейтинг: 0 / 0
12.08.2011, 07:56
    #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
12.08.2011, 08:08
    #37391983
CJ Alex R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
Большое спасибо за советы, с Excel-ем разобрался, сейчас думаю над алгоритмом суммирования значений.
...
Рейтинг: 0 / 0
12.08.2011, 08:11
    #37391986
CJ Alex R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
Все-таки как будет выглядеть алгоритм без команды Select...
...
Рейтинг: 0 / 0
12.08.2011, 09:05
    #37392022
CJ Alex R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
Пожалуйста, будьте добры, помогите, у меня не получается не через Scan, не через For, While!!!
...
Рейтинг: 0 / 0
12.08.2011, 09:29
    #37392052
CJ Alex R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
Помогите, пожалуйста!!!
...
Рейтинг: 0 / 0
12.08.2011, 10:23
    #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
12.08.2011, 10:45
    #37392202
CJ Alex R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
Спасибо Вам огромное!
...
Рейтинг: 0 / 0
12.08.2011, 11:08
    #37392251
CJ Alex R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
Так и не получается...
...
Рейтинг: 0 / 0
12.08.2011, 12:52
    #37392510
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
CJ Alex RТак и не получается...
А как пробовали? Пример кода приведите.
...
Рейтинг: 0 / 0
12.08.2011, 14:15
    #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
12.08.2011, 14:37
    #37392802
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
CJ Alex R,

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

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

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

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

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

А вот дальше от Вас и требуется показать умение работать с таблицами. Собственно, ничего сложного: найти запись (LOCATE, SEEK), заменить значение в существующей записи (REPLACE), создать новую запись (INSERT). Почти то же самое, что Вы пытались сделать при помощи коллекций. Просто команды другие.
...
Рейтинг: 0 / 0
13.08.2011, 00:18
    #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
13.08.2011, 00:29
    #37393701
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
Да, тестовая табличка...
...
Рейтинг: 0 / 0
13.08.2011, 08:46
    #37393808
CJ Alex R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
Огромное спасибо, AndreTM , я Вам очень благодарен, еще один небольшой вопросик, как таблицу с результатами добавить в элемент Grid к уже существующей там таблице, полученная импортом из Excel.
...
Рейтинг: 0 / 0
13.08.2011, 09:06
    #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
13.08.2011, 09:10
    #37393815
CJ Alex R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
Спасибо, tanglir, а в свойствах и методах Grida надо что-о прописывать (Init и т.д.)?
...
Рейтинг: 0 / 0
13.08.2011, 09:14
    #37393816
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
CJ Alex R, ну, если у вас таблица уже отображается в гриде, то самое простое - дописать туда данные, после чего утащить с грида фокус и вернуть обратно (с рефреш() у грида вроде какие-то нюансы, точно не помню, но сетфокус() обновляет вид гарантированно)
...
Рейтинг: 0 / 0
13.08.2011, 09:15
    #37393817
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходима помощь в решении простой задачки!
tanglirдописать туда данные"туда" - это в таблицу, конечно же :)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Необходима помощь в решении простой задачки! / 25 сообщений из 31, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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