Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Replace / 21 сообщений из 21, страница 1 из 1
22.04.2011, 14:06
    #37228693
IgorProgrammer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
FoxPro-9

Почему лиса ругается на выполнение команды replace где более 3000 символов?
Говорит что синтактическая ошибка. (хотя ее там нет)
Выполнятеся мокроподстановкой.

Если разбить на две строки <3000 символов то все проходит.

С Ув. Игорь.
...
Рейтинг: 0 / 0
22.04.2011, 14:26
    #37228756
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
IgorProgrammer,

может, код оптимизировать?
...
Рейтинг: 0 / 0
22.04.2011, 14:31
    #37228770
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
IgorProgrammerFoxPro-9

Почему лиса ругается на выполнение команды replace где более 3000 символов?
Говорит что синтактическая ошибка. (хотя ее там нет)
Выполнятеся мокроподстановкой.

Если разбить на две строки <3000 символов то все проходит.

С Ув. Игорь.

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

а вообще команда из 3т символов - эта круто.
...
Рейтинг: 0 / 0
22.04.2011, 14:32
    #37228774
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Пример можно? Хотя бы общую схему. 3000 - это значение одного поля или вся команда replace? Если записать сформированную строку в PRG синтаксис будет корректным? А там действительно одна команда, а не несколько?

PS: 3000 - это в пределах системных ограничении FoxPro

Maximum # of characters per character string or memory variable. 16,777,184
Maximum # of characters per command line. 8,192
...
Рейтинг: 0 / 0
22.04.2011, 14:49
    #37228825
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
прошелмимовозьми листок бумаги,
вставь в принтер,
в Ворде набери большими буквами:
макрападстановка - большое зло (с кучей васклицательных знаков).
напечатай.
повесь на видном месте.
ежедневно смотри на листок.Это надо поместить в здешний ФАК.
...
Рейтинг: 0 / 0
22.04.2011, 14:50
    #37228829
IgorProgrammer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
ВладимирМ,

Пример строки:
Код: plaintext
Replace ZPRABMES1 WITH  2300 . 00000000 ,ZPRABMES2 WITH  2260 . 15000000 ,ZPRABMES3 WITH  2531 . 21000000 ,ZPRABMES4 WITH  2843 . 13000000 ,ZPRABMES5 WITH  2260 . 15000000 ,ZPRABMES6 WITH  3500 . 32000000 ,ZPRABMES7 WITH  3500 . 32000000 ,ZPRABMES8 WITH  10379 . 05000000 ,ZPRABMES9 WITH  11310 . 91000000 ,ZPRABMES10 WITH  12242 . 77000000 ,ZPRABMES11 WITH  3749 . 15000000 ,ZPRABMES12 WITH  2354 . 50000000 ,ZPRABMES13 WITH  2004 . 00000000 ,ZPRABMES14 WITH  1697 . 05000000 ,ZPRABMES15 WITH  1900 . 46000000 ,ZPRABMES16 WITH  2300 . 00000000 ,ZPRABMES17 WITH  2277 . 88000000 ,RABCHMES1 WITH  166 . 33000000 ,RABCHMES2 WITH  166 . 33000000 ,RABCHMES3 WITH  166 . 33000000 ,RABCHMES4 WITH  166 . 33000000 ,RABCHMES5 WITH  166 . 33000000 ,RABCHMES6 WITH  166 . 33000000 ,RABCHMES7 WITH  166 . 33000000 ,RABCHMES8 WITH  166 . 33000000 ,RABCHMES9 WITH  166 . 33000000 ,RABCHMES10 WITH  166 . 33000000 ,RABCHMES11 WITH  166 . 33000000 ,RABCHMES12 WITH  166 . 33000000 ,RABCHMES13 WITH  166 . 33000000 ,RABCHMES14 WITH  166 . 33000000 ,RABCHMES15 WITH  166 . 33000000 ,RABCHMES16 WITH  166 . 33000000 ,RABCHMES17 WITH  166 . 33000000 ,RAZRAD1 WITH  3 . 80000000 ,RAZRAD2 WITH  3 . 80000000 ,RAZRAD3 WITH  3 . 80000000 ,RAZRAD4 WITH  3 . 80000000 ,RAZRAD5 WITH  3 . 80000000 ,RAZRAD6 WITH  3 . 80000000 ,RAZRAD7 WITH  3 . 80000000 ,RAZRAD8 WITH  3 . 80000000 ,RAZRAD9 WITH  3 . 80000000 ,RAZRAD10 WITH  3 . 80000000 ,RAZRAD11 WITH  3 . 00000000 ,RAZRAD12 WITH  4 . 00000000 ,RAZRAD13 WITH  4 . 00000000 ,RAZRAD14 WITH  3 . 80000000 ,RAZRAD15 WITH  3 . 80000000 ,RAZRAD16 WITH  3 . 80000000 ,RAZRAD17 WITH  3 . 80000000 ,ZPMMES WITH  2300 . 00000000 ,ZPITRMES WITH  2300 . 00000000 ,KSSTRAH WITH  38 . 52000000 ,KSSTRAH1 WITH  34 . 70000000 ,KSSTRAH2 WITH  8 . 41000000 ,KSSTRAH1_R WITH  0 . 00000000 ,KSSTRAH2_R WITH  0 . 00000000 ,KSSTRAH1_I WITH  0 . 00000000 ,KSSTRAH2_I WITH  0 . 00000000 ,KBOLN WITH  0 . 78000000 ,KBOLN2 WITH  0 . 33200000 ,KBOLN3 WITH  43 . 00000000 ,KK_TZ_OP WITH  1 . 00000000 ,KK_OST_OP WITH  1 . 00000000 ,K_TZ_OPS WITH  0 . 00000000 ,K_OST_OPS WITH  0 . 00000000 ,H23 WITH  1 . 00000000 ,H24 WITH  0 . 50000000 ,H25 WITH  3 . 00000000 ,H27 WITH  0 . 90000000 ,H28 WITH  0 . 40000000 ,SHAHT WITH  0 . 00000000 ,TZ_SHAHT WITH  0 . 00000000 ,ZP_SHAHT WITH  0 . 00000000 ,KVR WITH  0 . 00000000 ,KK_VR WITH  1 . 00000000 ,KZU WITH  0 . 00000000 ,KK_ZU WITH  1 . 00000000 ,KTZ_ZU WITH  0 . 00000000 ,KLU WITH  0 . 00000000 ,KTZ_LU WITH  0 . 00000000 ,KSMP WITH  0 . 00000000 ,KADM WITH  0 . 00000000 ,KK_ADM WITH  1 . 00000000 ,KRISK WITH  0 . 00000000 ,KEDIN WITH  0 . 00000000 ,KNDS WITH  20 . 00000000 ,PE_MEST WITH  0 . 00000000 ,PE_CENAVT WITH  0 . 00000000 ,PE_CENCHAS WITH  0 . 00000000 ,PE_KOEF WITH  0 . 00000000 ,PE_CHASDEN WITH  8 . 20000000 ,KO_SUTPROJ WITH  0 . 00000000 ,KO_VSPROJ WITH  0 . 00000000 ,EXPERT1 WITH  0 . 00000000 ,EXPERT2 WITH  0 . 00000000 ,IN_1 WITH  1 . 00000000 ,IN_2 WITH  1 . 00000000 ,IN_3 WITH  0 . 50000000 ,MINZP WITH  17 . 00000000 ,ZE_GODNAL WITH  0 . 00000000 ,ZE_VSGOD WITH  0 . 00000000 ,STRAX_9 WITH  0 . 33200000 ,K_ED_FORM9 WITH  0 . 00000000 ,CHAST_ED_9 WITH  0 . 42000000 ,K_PONIJ_9 WITH  0 . 00000000 ,TIPSTROYKI WITH  0 . 00000000 ,TARS1 WITH  12 . 00000000 ,TARS2 WITH  5 . 00000000 ,TARS3 WITH  13 . 00000000 ,TARS4 WITH  1 . 00000000 ,RZTARS1 WITH  30 . 00000000 ,RZTARS2 WITH  6 . 00000000 ,RZTARS3 WITH  108 . 00000000 ,RZTARS4 WITH  7 . 00000000 ,F_OP WITH  0 . 00000000 ,PROC_OP WITH  0 . 00000000 ,F_PRIB WITH  0 . 00000000 ,PROC_PRIB WITH  0 . 00000000 ,F_ADM WITH  0 . 00000000 ,PROC_ADM WITH  0 . 00000000 ,UDSM1 WITH  0 . 00000000 ,UDPR1 WITH  0 . 00000000 ,UD2 WITH  0 . 00000000 ,ITOGI WITH  0 . 00000000 ,ZONA WITH  0 . 00000000 ,ZU WITH  0 . 00000000 ,LU WITH  0 . 00000000 ,K_STRH_OPS WITH  0 . 00000000 ,K_BOLN_OPS WITH  0 . 00000000  in options

Если ее скопировать в прг-файл. то он компилируется но при выполнении говорит син-ошибка.

Большая просьба всех "Флудеров" общаться в своем форуме...
А не засорять данную тему...

С Ув. Игорь.
...
Рейтинг: 0 / 0
22.04.2011, 14:54
    #37228845
IgorProgrammer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
прошелмимо и tanglir

Макро-подстановка существует не только в Лисе.
И успешно применяется.

Это все равно что сказать что колесо есть...
Но машина и без них может ездить!
...
Рейтинг: 0 / 0
22.04.2011, 15:00
    #37228861
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
IgorProgrammer,

Это случайно, не все поля таблицы? Может, UPDATE
...
Рейтинг: 0 / 0
22.04.2011, 15:02
    #37228872
IgorProgrammer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
IgorNG,

Это выборочные поля пользователем.

С Ув. Игорь.
...
Рейтинг: 0 / 0
22.04.2011, 15:11
    #37228910
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
IgorProgrammerПример строки:
Код: plaintext
Replace ZPRABMES1 WITH  2300 . 00000000 ,ZPRABMES2 WITH  2260 . 15  000000  ...

У тебя половину места ноли занимают, сделай их обрезание, программно ведь генеришь строку.
И при генерации проверяй длину строки, достиг например 2000 символов, выполнил, дальше генеришь. Два Replace ничем не хуже одного.
...
Рейтинг: 0 / 0
22.04.2011, 15:22
    #37228950
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Проблема не в длине команды, а в количестве полей для Replace

Если количество полей меньше 129, то пройдет нормально. Как только количество полей больше или равно 130 - синтаксическая ошибка. Пока не понял как лечится...
...
Рейтинг: 0 / 0
22.04.2011, 15:33
    #37228995
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
IgorProgrammer,

В твоем случае можно без макроподстановок обойтись. Через массивы записать.
почитай про SCATTER, GATHER и AFIELDS()
...
Рейтинг: 0 / 0
22.04.2011, 15:40
    #37229021
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Dima T, там поля не все подряд, а выбираются пользователем.
Это же придётся помимо массива с данными иметь массив со структурой, да проверять, что там пользователь понавыбирал, да в оба массива лазить... не-е-ет, МП - оно куда яснее, удобнее, надёжнее и привычнее.
...
Рейтинг: 0 / 0
22.04.2011, 15:44
    #37229037
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Для проверки ошибки

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
* Тестовый курсор, имеющий  200  полей
lcFieldCreate = "f1 I"
For lnI =  2  to  200 
	lcFieldCreate = lcFieldCreate + ", f"+transform(m.lnI) + " I"
endfor

Create Cursor test (&lcFieldCreate)
Append Blank

* Формирую строку для обновления
lcFieldReplace = "f1 with 1"
For lnI =  2  to  128 
	lcFieldReplace = lcFieldReplace + ", f" + transform(m.lnI) + " with " + transform(m.lnI)
endfor

* Если цикл до  128  полей, то пройдет без ошибок
* если поставить  129  - получим сообщение о синтаксической ошибке
* Длина команды около  1700  символов
Replace &lcFieldReplace

Поскольку число 128 - это степень двойки, то, скорее всего, какое-то не явное системное ограничение
...
Рейтинг: 0 / 0
22.04.2011, 15:54
    #37229086
IgorProgrammer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
ВладимирМ,

И что теперь делать?
Ведь такой ответ конечного пользователя не устроить.

С Ув. Игорь.
...
Рейтинг: 0 / 0
22.04.2011, 15:56
    #37229093
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Dima TIgorProgrammerПример строки:
Код: plaintext
Replace ZPRABMES1 WITH  2300 . 00000000 ,ZPRABMES2 WITH  2260 . 15  000000  ...

У тебя половину места ноли занимают, сделай их обрезание, программно ведь генеришь строку.
И при генерации проверяй длину строки, достиг например 2000 символов, выполнил, дальше генеришь. Два Replace ничем не хуже одного.
Более того, там есть 0.00000000 - можно заменить просто на 0
...
Рейтинг: 0 / 0
22.04.2011, 16:00
    #37229110
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
IgorProgrammer,

Как вариант, не все пучком обновлять, а отдельно каждое поле REPLACE
...
Рейтинг: 0 / 0
22.04.2011, 16:08
    #37229130
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
IgorProgrammerВладимирМ,

И что теперь делать?
Ведь такой ответ конечного пользователя не устроить.
Не понял, а при чем тут конечный пользователь?
...
Рейтинг: 0 / 0
22.04.2011, 16:09
    #37229131
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
tanglirDima T, там поля не все подряд, а выбираются пользователем.
Это же придётся помимо массива с данными иметь массив со структурой, да проверять, что там пользователь понавыбирал, да в оба массива лазить... не-е-ет, МП - оно куда яснее, удобнее, надёжнее и привычнее.
ХЗ чего там сложного. Получится десяток строк кода, может чуть больше чем у тебя сейчас.
...
Рейтинг: 0 / 0
22.04.2011, 16:10
    #37229136
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
IgorProgrammerВладимирМ,

И что теперь делать?
Ведь такой ответ конечного пользователя не устроить.

С Ув. Игорь.
Для VFP9 нашел такую заметку

VFP9Updatable Fields in UPDATE - SQL Command

The number of fields that can be updated with the UPDATE - SQL Command is no longer limited to 128 as in prior versions of Visual FoxPro. You are now limited to 255, which is the number of fields available in a table.
Также есть еще старая ошибка с кодом 1864 (Too many fields in UPDATE )

Другими словами, ограничение на 128 полей все-таки было. Хотя явно и не описывалось.

Решение соответственно может быть либо в использовании команды UPDATE-SQL с дописыванием WHERE

Код: plaintext
1.
2.
3.
4.
5.
6.
lcFieldUpdate = "f1 = 1"
For lnI =  2  to  200 
	lcFieldUpdate = lcFieldUpdate + ", f" + transform(m.lnI) + " = " + transform(m.lnI)
endfor
Update test set &lcFieldUpdate
* Надо еще дописать WHERE для обновления только одной записи

Либо просто банально разбить одну команду REPLACE на 2, если количество полей превысит 128. Исполнить можно либо двумя командами с макроподстановкой, либо ExecScript(). Ну, или действительно в команде REPLACE обновлять по одному полю за раз просто в цикле перебирая все указанные поля.
...
Рейтинг: 0 / 0
22.04.2011, 16:24
    #37229175
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Replace
Вот пример с массивами
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
* Мегатаблица
create Cursor MegaTable (f1 n( 10 , 2 ),f2 n( 10 , 2 ),f3 n( 10 , 2 ),f4 n( 10 , 2 ),f5 n( 10 , 2 ),f6 n( 10 , 2 ),f7 n( 10 , 2 ),f8 n( 10 , 2 ),f9 n( 10 , 2 ))
insert into MegaTable values ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )
* Пользователь навводил
create cursor tUserSet (cField c( 10 ), nValue n( 10 , 2 ))
insert into tUserSet values ('f3',  33 )
insert into tUserSet values ('f6',  66 )
index on cField tag cField
* Сохраняем
local array laRec[ 1 ], laFld[ 1 ]
sele MegaTable 
scatter to laRec
for i =  1  to afields(laFld, 'MegaTable')
	if indexseek(padr(laFld[i,  1 ],  10 ), .T., 'tUserSet', 'cField')
		laRec[i] = tUserSet.nValue
	endif
endfor
gather from laRec
brow
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Replace / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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