powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация
13 сообщений из 13, страница 1 из 1
Оптимизация
    #38129880
Nikita_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые, извиняюсь конечно но в очередной раз прошу вашего help(а)
вывод данных из нескольких таблиц в шаблон word, накропал вот такой код:
Код: sql
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
IF cdat={}
cdat=DATE()
endif
LOCAL lcFileName, lcFullFileName,lnWordRowNum
lnWordRowNum=2
lcFileName = "ostatki.dot"
IF File(m.lcFileName)
	lcFullFileName = FullPath(m.lcFileName)
ELSE
	MessageBox("Файл шаблона "+m.lcFileName+" не найден")
	return
ENDIF
loWord = CREATEOBJECT( 'WORD.APPLICATION')
loDoc=m.loWord.Documents.Add(m.lcFullFileName) 
LOCAL loTable as Word.Table   
  loTable = m.loDoc.Tables(3)     
LOCAL kolpost,su,kolras,suras,ostt,pln,ost_s,ost_su
ost_su=0.00
ost_s=0
pln=0.00
ostt=0
suras=0.00
kolras=0
su=0.00
kolpost=0 


SELECT gr_tovara
SCAN
m.loTable.Cell(m.lnWordRowNum,1).Range.Text = gr_tovara.grup_tov
SELECT nametov
SCAN
IF gr_tovara.idx_t=nametov.idx_t
m.loTable.Cell(m.lnWordRowNum,2).Range.Text = nametov.name_tov
SELECT bigtable
SCAN
IF bigtable.idx_lo=nametov.idx_lo
kolpost=bigtable.kolvo + kolpost
su=bigtable.na_sum + su
pln=bigtable.plan+pln
SELECT tablerash
SCAN
IF tablerash.idx_rs = bigtable.idx_rs
kolras=tablerash.ras_kol+kolras
suras=tablerash.itogo_cena+suras
endif
m.loTable.Cell(m.lnWordRowNum,5).Range.Text = kolras
m.loTable.Cell(m.lnWordRowNum,6).Range.Text = suras
ENDSCAN
ENDIF
ost_su=pln-suras
ostt=kolpost-kolras
m.loTable.Cell(m.lnWordRowNum,3).Range.Text = kolpost
m.loTable.Cell(m.lnWordRowNum,4).Range.Text = su
m.loTable.Cell(m.lnWordRowNum,7).Range.Text = ostt
m.loTable.Cell(m.lnWordRowNum,8).Range.Text = ost_su
ENDSCAN
IF kolras=0
m.loTable.Cell(m.lnWordRowNum,5).Range.Text = kolras
endif
ost_su=0.00
pln=0.00
ost_su=0.00
ostt=0
*kolpost=0
su=0.00
kolras=0
suras=0
IF kolpost>0
lnWordRowNum=lnWordRowNum+1
m.loTable.Rows.Add()  
endif
kolpost=0
endif
ENDSCAN
ENDSCAN
 ya=year(cdat)
day_=DAY(cdat)
da1=CMONTH(cdat)
Do mesrus
  lnWordRowNum=1
  loTable = m.loDoc.Tables(1)     
m.loTable.Cell(m.lnWordRowNum,2).Range.Text = day_
	m.loTable.Cell(m.lnWordRowNum,3).Range.Text = da1
       m.loTable.Cell(m.lnWordRowNum,4).Range.Text = ya
 lnWordRowNum=1
  loTable = m.loDoc.Tables(2)     
  m.loTable.Cell(m.lnWordRowNum,2).Range.Text ='Все периоды'
   m.loWord.Visible = .T.


в принципе все работает так как и задумывалось -

но, есть большое но: сейчас в таблице обрабатывается порядка 200 записей, документ формируется порядка 1,5 минут, а если тысяча -5-10 это же..... кошмар. Вопрос - как правильно с вашей точки зрения организовать данное действо?
...
Рейтинг: 0 / 0
Оптимизация
    #38130027
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сформировать сначала курсор с содержимым .Tables(3), в нем провести все вычисления и замены значений - а затем разом переписать в таблицу. Перед этим строки в таблице тоже удалять/добавлять можно разом, а не по одной.
...
Рейтинг: 0 / 0
Оптимизация
    #38130037
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тоже составлял временную таблицу(можно в неё и формулы наверное записать) и потом COPY TO xx.XLS" TYPE XL5, открываешь в Excel всё довольно быстро..
...
Рейтинг: 0 / 0
Оптимизация
    #38130040
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
q1w1e1, у ТСа ворд, а не эксель.
Вот интересно, получится ли к вордовским таблицам применить arraypasser? Нотация доступа к ним вроде похожа на экселевскую...
...
Рейтинг: 0 / 0
Оптимизация
    #38130305
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikita_2но, есть большое но: сейчас в таблице обрабатывается порядка 200 записей, документ формируется порядка 1,5 минут, а если тысяча -5-10 это же..... кошмар. Вопрос - как правильно с вашей точки зрения организовать данное действо?
Word - это текстовый редактор. Предназначен для ввода/отображения текста . Для него таблицы - это вспомогательный инструмент отображения того же текста. И именно в небольших объемах. Порядка нескольких десятков записей.

Если речь идет об отображении тысяч и десятков тысяч записей, то текстовый редактор для этого мало пригоден. Нужно использовать инструмент, специально для этого и предназначенный. Т.е. табличный редактор Excel. Гораздо проще нарисовать некую шапку в Excel, чем мучиться с выводом большой табличной части в Word.
...
Рейтинг: 0 / 0
Оптимизация
    #38130396
Nikita_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за ответы. В принципе это понятно , что для этих целей excel более приемлем, но вот начальник бяка - вынь да положь ему в word(e). По мне так вообще в report вывести и делов то ... но ... буду дальше ваять в конце концов не мне ж потом мучиться ..
...
Рейтинг: 0 / 0
Оптимизация
    #38130413
Ffffffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Word можно вставлять листы Excel.
...
Рейтинг: 0 / 0
Оптимизация
    #38130927
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nikita_2,

Лучше разделять создание отчета на 2 части: 1) выборка данных для отчета в курсор(ы), 2) вывод данных в отчет. Так убиваем несколько зайцев: скорость работы (Ваш случай); наглядность кода; если потребуется отчет в разных форматах (родной/pdf,excel,word...), то дописывается всего лишь дополнительный вариант части 2, первая же без изменений
...
Рейтинг: 0 / 0
Оптимизация
    #38131417
Nikita_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
XAndy
Спасибо. Именно этим сейчас и занялся на ночь глядя ..
...
Рейтинг: 0 / 0
Оптимизация
    #38131465
Sea_Cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nikita_2,
Если нужно ускорить процесс формирования документа, то воспользуйтесь генератором отчетов GENREP (автор - А.Куденцов, сайт проекта - http://www.genrep.net). Он формирует документ в формате RTF без вызова WORDа, что на порядок быстрее.
В разделе "Решения" FoxClub можно найти и другие решения, основанные на этом принципе.
...
Рейтинг: 0 / 0
Оптимизация
    #38133051
fore5ta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nikita_2Уважаемые, извиняюсь конечно но в очередной раз прошу вашего help(а)
вывод данных из нескольких таблиц в шаблон word, накропал вот такой код

SCAN нормальная команда, но когда четыре вложенных SCANа и без видимых условиях отбора, это imho перебор. Попробуйте внутри внешнего цикла отбор данных другими командами. Начните с SEEK, может быть понадобится еще и DO WHILE.
...
Рейтинг: 0 / 0
Оптимизация
    #38134362
Nikita_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fore5ta
Не спасибо, загнал все в курсоры, скорость формирования от начала и до .Visible = .T. , возросла с 2 мин до 2,7 сек, оно то что нужно. 33 раза зарекался людей своими заморочками от дел отвлекать пока сам все варианты не переберу ан нет руки чешутся ..
...
Рейтинг: 0 / 0
Оптимизация
    #38544513
Yura_Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nikita_2Спасибо всем за ответы. В принципе это понятно , что для этих целей excel более приемлем, но вот начальник бяка - вынь да положь ему в word(e). По мне так вообще в report вывести и делов то ... но ... буду дальше ваять в конце концов не мне ж потом мучиться ..

Можно попробовать объяснить что иной способ более технологичный,
возможно выслушав ваши убедительные аргументы он согласиться - не можете убедить - извиняйте.
С другой стороны у начальника могут быть свои аргументы - и логика в связи с которой отчет нужно в ворд
В конце то концов , Вам какая Вам разница у вас есть задача - выполняйте
Начальник ведь будет в курсе , что вывод таблиц лучше делать excel ... он и сам это понимает наверняка
опять же положительный момент в том что вы изучите вывод в word !



к примеру вывод одного поля ...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
                SELECT qVIP
		oWord=CREATEOBJECT('Word.Application')
		oDoc = oWord.Documents.Add
		oRange = oDoc.Range(0,0)
		nRows = RECCOUNT()+1
		nCols = FCOUNT()
		PUBLIC oTable
		oTable = oDoc.Tables.Add(oRange,nRows,nCols)
		SCAN
			nRow = RECNO()+1
			oTable.Cell(nRow,1).Range.InsertAfter(ALLTRIM(Line))
		ENDSCAN
* по необходимости показать 
		oWord.Visible=.t.
* не требовать сохранить  файл при выходе
		oWord.DisplayAlerts =.F.
		RELEASE oWord
 
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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