powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / FoxPro + Excel: сохранение промежуточных данных
15 сообщений из 15, страница 1 из 1
FoxPro + Excel: сохранение промежуточных данных
    #36125199
NCE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в файле sheet1.prg у меня html страница обрамлённая в text/endtext.
в этом файле у меня есть следующая строка:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
text
....
<td colspan= 4  class=xl105  x:fmla="=(N[[34+i]]*L[[34+i]] + N[[34+i]] * L[[34+i]] * AN[[34+i]]) + 
(N[[34+i]] * L[[34+i]]) + ((N[[34+i]] * L[[34+i]] * AN[[34+i]]) * 0.18)+(N[[34+i]]*L[[34+i]] + 
N[[34+i]] * L[[34+i]] * AN[[34+i]]) + (N[[34+i]] * L[[34+i]]) + ((N[[34+i]] * L[[34+i]] * AN[[34+i]]) * 0.18) * 0.05"> 0 </td>
...
endtext

формула очень большая из-за этого не генерируется отчёт, фокс просто падает. Если формулу уменьшить буквально на пару действий, тогда всё работает отлично. Поэтому мне нужно как-то сохранить промежуточный результат, разбить на несколько действий. Но как мне сохранить этот результат я не знаю. Допустим я сделаю вычисление
(N[[34+i]]*L[[34+i]] + N[[34+i]] * L[[34+i]] * AN[[34+i]]) = 140;
Этих 140 мы сохраняем в переменную допустим value. И потом в формуле уже используем value + <и дальше формула> но как мне это оформить я не знаю, подскажите пожалуйста.

С фоксом работаю очень мало, поэтому, казалось бы такой простой вопрос и не знаю как решить.
Работаю под DOS.
Спасибо.
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36125292
Peisov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NCE,

попробуй строковую константу разбить на две.

т.е. вместо "Очень длинная строка" сделать "Очень длин"+"ная строка"
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36125295
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36125780
NCE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разбить строку на несколько строк не сработало. Почитал статью, и не нашёл то что искал, а то что было не смог применить в своём примере, может я что-то не допонял.

у меня в начале было так:

Код: 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.
28.
29.
30.
31.
32.
33.
34.
...
  endtext
  for i= 1  to knr
 text 
 <!--   + (N[[34+i]] * L[[34+i]]) + ((N[[34+i]] * L[[34+i]] * AN[[34+i]]) * 0.18) * 0.05 -->
 <tr height= 34  style='mso-height-source:userset;height:25.5pt'>
  <td height= 34  colspan= 3  style='height:25.5pt;mso-ignore:colspan'></td>
  <td colspan= 7  class=xl99 width= 133  style='border-right:.5pt solid black; width:98pt' x:str="[[ Nnr(i) + ' '+rus_low_let(Nmrnai(i))
+' '+allt(Nmr(i)) ]] "></td>
  <td class=xl39 style='border-left:none'>шт.</td>
  <td colspan= 2  class=xl103 style='border-right:.5pt solid black;border-left:none'>[[kr(i)]]</td>
  <td colspan= 4  class=xl105 style='border-right:.5pt solid black;border-left:none'x:num="[[left(Cnr(i),14)]]"> </td>
  <td colspan= 4  class=xl105 x:fmla="=(N[[34+i]]*L[[34+i]]+N[[34+i]]*L[[34+i]]*AN[[34+i]]/100)+
(N[[34+i]]*L[[34+i]]+(N[[34+i]]*L[[34+i]]*
AN[[34+i]]/100))*0.18+((N[[34+i]]*L[[34+i]]+N[[34+i]]*L[[34+i]]*AN[[34+i]]/100)+
(N[[34+i]]*L[[34+i]]+(N[[34+i]]*L[[34+i]]*AN[[34+i]]/100))*0.18)*0.05"> 2 </td>
  <td colspan= 2  class=xl106 style='border-right:.5pt solid black;border-left:none' x:str> 0 , 00 </td>
  <td colspan= 4  class=xl105 style='border-right:.5pt solid black;border-left:none' x:str> 0 </td>
  <td colspan= 4  class=xl105 style='border-right:.5pt solid black;border-left:none' x:fmla="=R[[34+i]]"> 0 </td>
  <td colspan= 2  class=xl105 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 3  class=xl109 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 3  class=xl105 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 2  class=xl106 style='border-right:.5pt solid black;border-left:none' x:num> 2 </td>
  <td colspan= 3  class=xl105 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 3  class=xl105 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 3  class=xl105 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 4  class=xl112 width= 76  style='border-right:.5pt solid black;border-left:none;width:56pt'> </td>
  <td></td>
  <td class=xl24></td>
 </tr>
  endtext
endfor
text
...

Я хотел сделать что-то вроде такого

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
...
  endtext
 
  for i= 1  to knr
 text 
 <tr height= 34  style='mso-height-source:userset;height:25.5pt'>
  <td height= 34  colspan= 3  style='height:25.5pt;mso-ignore:colspan'></td>
  <td colspan= 7  class=xl99 width= 133  style='border-right:.5pt solid black; width:98pt' x:str="[[ Nnr(i) + ' '+
rus_low_let(Nmrnai(i))+' '+allt(Nmr(i)) ]] "></td>
  <td class=xl39 style='border-left:none'>шт.</td>
  <td colspan= 2  class=xl103 style='border-right:.5pt solid black;border-left:none'>[[kr(i)]]</td>
  <td colspan= 4  class=xl105 style='border-right:.5pt solid black;border-left:none'x:num="[[left(Cnr(i),14)]]"> </td>
endtext


 LOCAL action1
 action1 = (N[[ 34 +i]]*L[[ 34 +i]]+N[[ 34 +i]]*L[[ 34 +i]]*AN[[ 34 +i]]/ 100 )


text
  <td colspan= 4  class=xl105 x:fmla="=[[action1]]+(N[[34+i]]*L[[34+i]]+(N[[34+i]]*
L[[34+i]]*AN[[34+i]]/100))*0.18+
((N[[34+i]]*L[[34+i]]+N[[34+i]]*L[[34+i]]*AN[[34+i]]/100)+(N[[34+i]]*L[[34+i]]+
(N[[34+i]]*L[[34+i]]*AN[[34+i]]/100))*0.18)*0.05"> 2 </td>
  <td colspan= 2  class=xl106 style='border-right:.5pt solid black;border-left:none' x:str> 0 , 00 </td>
  <td colspan= 4  class=xl105 style='border-right:.5pt solid black;border-left:none' x:str> 0 </td>
  <td colspan= 4  class=xl105 style='border-right:.5pt solid black;border-left:none' x:fmla="=R[[34+i]]"> 0 </td>
  <td colspan= 2  class=xl105 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 3  class=xl109 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 3  class=xl105 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 2  class=xl106 style='border-right:.5pt solid black;border-left:none' x:num> 2 </td>
  <td colspan= 3  class=xl105 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 3  class=xl105 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 3  class=xl105 style='border-right:.5pt solid black;border-left:none'> </td>
  <td colspan= 4  class=xl112 width= 76  style='border-right:.5pt solid black;border-left:none;width:56pt'> </td>
  <td></td>
  <td class=xl24></td>
 </tr>
 
  endtext
endfor
text
...

вот только проблема в том что за пределаем text/endtext переменные
(N[[34+i]]*L[[34+i]]+N[[34+i]]*L[[34+i]]*AN[[34+i]]/100)
не будут доступные, соответственно и не получится так вычислить.

Не ужели нет больше способов разбить вычисление?
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36125959
Peisov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NCE,


А это что за синтаксис такой???

action1 = (N[[34+i]]*L[[34+i]]+N[[34+i]]*L[[34+i]]*AN[[34+i]]/100)
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36125984
NCE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думал, что можно так вынести отдельно, в одну переменную часть формулы, а затем использовать уже вычисленный результат дальше в расчётах, тем самым сократить длину формулы. Но так записать нельзя. Поэтому я и интересуюсь как ещё можно записать, кроме разбивания строки на несколько строк, т.к. такой вариант не помогает.
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36126051
Peisov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NCE,

Ну тыже ниже это делаешь!!! Типа такого

text to action1
N[[34+i]]*L[[34+i]]+N[[34+i]]*L[[34+i]]*AN[[34+i]]/100
endtext


А вообще я не понимаю всей этой идеи. Т.Е. в результате надо получить (условно)

n40*L40+N40*L40*AN40/100

Так?
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36126098
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NCE,
Вынесите общие множители за скобки - формула и сократится (в разы). Если ничего не напутал, то будет так
Код: plaintext
1.
2.
3.
4.
5.
text
....
<td colspan= 4  class=xl105  x:fmla="=(Ni*Li)* (4+ANi*(2+0.18+0.18*0.05))"> 0 </td>
...
endtext
Сокращения, я думаю, понятны.
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36126917
NCE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PeisovТак?

Верно, если подробней то это выглядет так
Допустим, у нас есть 3 изделия, стоимость каждой по 1000 рублей. Значит мы сначало должны найти стоимость всех изделий это 1000 * 3 = 3000 - это есть

Peisov
n40*L40


Теперь мы должны к этой цене добавить оптовую надбавку 2%. Странно, но если в экселе записать прямо 3000 + 2%. то получим 300002,00% если формат ячейки сделать числовой то получим 3000. А нужно 3000 + 2% = 3060. (два процента находим от 3000 и прибавляем к 3000) Поэтому приходиться записывать это подробно, что бы эксель усёк. т.е.
3000 + 3000 * 2 / 100. Отсюда мы имеем

Peisov
n40*L40+N40*L40*AN40/100


AN40 - это 2%, а не 0,02.

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

Может и можно как-то сократить, но я не уверен что у меня получиться это сделать правильно.


попробывал так записать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  <td colspan= 4  class=xl105 style='border-right:.5pt solid black;border-left:none'x:num="[[left(Cnr(i),14)]]"> </td>
  endtext
  LOCAL action1  
  text to action1
	(N[[ 34 +i]]*L[[ 34 +i]]+N[[ 34 +i]]*L[[ 34 +i]]*AN[[ 34 +i]])
  endtext
  text

  <td colspan= 4  class=xl105 x:fmla="=[[action1]]+(N[[34+i]]*L[[34+i]]+(N[[34+i]]*L[[34+i]]*
AN[[34+i]]))*0.18+((N[[34+i]]*L[[34+i]]+N[[34+i]]*L[[34+i]]*AN[[34+i]])+(N[[34+i]]*
L[[34+i]]+(N[[34+i]]*L[[34+i]]*AN[[34+i]]))*0.18)*0.05"> 2 </td>
  <td colspan= 2  class=xl106 style='border-right:.5pt solid black;border-left:none' x:str> 0 , 00 </td>


ругается на LOCAL, пробывал писать private тоже не понимает, говорит не известный идентификатор action1.
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36127043
Peisov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NCE,

Ну - погнали наши городских!

Ставлю вопрос ребром - зачем в эксель пихать формулу? Не проще ли в программе посчитать то, что нужно, и воткнуть готовое значение?
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36127162
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PeisovNCE,

Ну - погнали наши городских!

Ставлю вопрос ребром - зачем в эксель пихать формулу? Не проще ли в программе посчитать то, что нужно, и воткнуть готовое значение?
Эксель - редактируемый формат. У нас множество экселевских форм аналитического отдела содержат формулы. Именно для того, чтобы аналитик мог мобильно поиграться граничными условиями.

Поругаю топикстартера: Вобще-то, сочетательный закон умножения проходят в седьмом классе школы.

По существу вопроса:
SET TEXTMERGE - позволяет вставлять внешние для текста переменные посредством конструкции <<action1>>

Почитайте help, чтоли?
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36127207
Peisov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kruchinin Pahan
Эксель - редактируемый формат. У нас множество экселевских форм аналитического отдела содержат формулы. Именно для того, чтобы аналитик мог мобильно поиграться граничными условиями.


А, понял.

Хотя в такой ситуации наверняка должны быть некие шаблоны документов. И проше втыкать туда данные через оле-автоматизацию.
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36127256
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PeisovKruchinin Pahan
Эксель - редактируемый формат. У нас множество экселевских форм аналитического отдела содержат формулы. Именно для того, чтобы аналитик мог мобильно поиграться граничными условиями.


А, понял.

Хотя в такой ситуации наверняка должны быть некие шаблоны документов. И проше втыкать туда данные через оле-автоматизацию.
Проще. Не спорю. Только в FoxPro for DOS нет OLE. Поэтому топикстартер выгружает форму в XML формате.
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36128821
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NCE

Код: plaintext
1.
2.
3.
4.
 LOCAL action1  
  text to action1
	(N[[ 34 +i]]*L[[ 34 +i]]+N[[ 34 +i]]*L[[ 34 +i]]*AN[[ 34 +i]])
  endtext

ругается на LOCAL, пробывал писать private тоже не понимает, говорит не известный идентификатор action1

Следует читать HELP той версии, которой Вы пользуетесь.

В FoxPro for DOS области видимости LOCAL еще не было. Неизвестная команда.

У оператора TEXT..ENDTEXT не было опции TO. Неизвестная опция. Вообще, в FoxPro for DOS эта команда была сильно урезана по возможностям. Просто потоковый вывод.

Команда PRIVATE не создает переменных, а "прячет" их (экранирует). Кроме того, давать эту команду внутри цикла FOR - просто бессмысленно. Определение области видимости должно происходить ДО начала цикла.

Вообще-то, операторные скобки TEXT...ENDTEXT - это всего-лишь один из способов формирования символьной строки. Но можно ту же самую строку формировать и через переменные пямяти. "В лоб"



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
PRIVATE action1, num, numStr
FOR i= 1  to kor

	num =  34 +i
	numStr = LTrim(STR(m.num))

	action1 = "(N" + m.numStr + "*L" + m.numStr + "+N" + m.numStr + "*L" + m.numStr + "*AN" + m.numStr + ")"

TEXT
<td colspan= 4  class=xl105 x:fmla="=[[action1]]+(N[[num]]*L[[num]]+(N[[num]]*
L[[num]]*AN[[num]]/100))*0.18+
((N[[num]]*L[[num]]+N[[num]]*L[[num]]*AN[[num]]/100)+(N[[num]]*L[[num]]+
(N[[num]]*L[[num]]*AN[[num]]/100))*0.18)*0.05"> 2 </td>
ENDTEXT

ENDFOR
...
Рейтинг: 0 / 0
FoxPro + Excel: сохранение промежуточных данных
    #36129264
NCE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ"В лоб"

Спасибо за дельную подсказку, которая почти совпала с моим вариантом.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  ...
  endtext
  SET DECI TO  2 
  for i= 1  to knr
  pr = VAL(prtn(i)) /  100 
  j =  34  + i
 text 
 <tr height= 34  style='mso-height-source:userset;height:25.5pt;'>
   ...
  <td colspan= 4  class=xl105 x:fmla="=ROUND(((AK[[j]]+AK[[j]]*[[pr]])+(AK[[j]]+(AK[[j]]*[[pr]]))*
0.18+((AK[[j]]+AK[[j]]*[[pr]])+(AK[[j]]+(AK[[j]]*[[pr]]))*0.18)*0.05)/10, 0)*10"> </td>
....

Всем спасибо.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / FoxPro + Excel: сохранение промежуточных данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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