Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / TableUpdate / 5 сообщений из 5, страница 1 из 1
20.07.2011, 11:58
    #37359102
IgorProgrammer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TableUpdate
Лиса 9.0
DRIVER={Advantage StreamlineSQL ODBC}
При TableUpdate(.T.) ошибка на сервере 2232 Numeric Overflow
Код: plaintext
1.
The evaluation of an exact numeric expression exceeds the predetermined precision. This is a run time error. In addition, subtraction and multiplication operations, the scale
of the exact numeric expression is determined following the SQL standards guideline and the precision is capped at the maximum supported value ( 30 ). If the result of evaluating exceed the supported precision, this error is returned.

Вопрос к Гуру
Можно ли как-то получить скрипт который отправляется на сервер при TableUpdate(.T.)
Или может кто-то знает как ее устранить

Привожу полный пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
IF !USED('projects')
	USE "d:\программы\fox pro\работа с базой\projects.dbf" IN  0  SHARED && локальная таблица с данными
ENDIF
loConn = SQLSTRINGCONNECT("DRIVER={Advantage StreamlineSQL ODBC};DataDirectory=\\viktor\fox;CharSet=win-1251;DefaultType=Visual FoxPro;RightsChecking=OFF;ServerType=REMOTE;")
?SQLEXEC(loConn,"select top 0 kdprojects, iznos_k from projects", "prh1") && пустая таблица куда добавляем новые данные
DO setfieldtoupdate WITH 'Prh1','Projects','kdprojects' && Какие поля нужно обновлять и по какому ключу
SELECT Prh1
APPEND FROM projects && Добавляем записи
?CURSORSETPROP("SendUpdates", .T., "Prh1")
?TABLEUPDATE(.T., .T., "Prh1") && Ошибка  2232  

DEBUG
susp
?SQLDISCONNECT(loConn)
loConn = SQLSTRINGCONNECT("DRIVER={Advantage StreamlineSQL ODBC};DataDirectory=\\viktor\fox;CharSet=win-1251;DefaultType=Visual FoxPro;RightsChecking=OFF;ServerType=REMOTE;")
?SQLEXEC(loConn,"execute procedure sp_zaptable('projects')")
?SQLDISCONNECT(loConn)

setfieldtoupdate
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
PARAMETERS toAlias, toAliasFrom, toKeyFields
IF EMPTY(m.toAlias) OR EMPTY(m.toAliasFrom) OR EMPTY(m.toKeyFields)
	RETURN
ENDIF
m.loCountField = AFIELDS(loFields,m.toAlias)
STORE '' TO loStrField, loStrUpdateField
FOR loFieldI =  1  TO m.loCountField
	m.loStrField = m.loStrField + IIF(EMPTY(m.loStrField),'',',') + m.loFields[m.loFieldI, 1 ]
	m.loStrUpdateField = m.loStrUpdateField + IIF(EMPTY(m.loStrUpdateField),'',',') + m.loFields[m.loFieldI, 1 ] + " " + m.toAliasFrom + "." + m.loFields[m.loFieldI, 1 ]
ENDFOR
IF AT(',',m.toKeyFields) =  0 
	SELECT (m.toAlias)
	INDEX ON &toKeyFields. TAG &toKeyFields. OF (m.toAlias)
ENDIF
?CURSORSETPROP("Tables", m.toAliasFrom, m.toAlias)
?CURSORSETPROP("KeyFieldList", m.toKeyFields, m.toAlias)
?CURSORSETPROP("UpdatableFieldList", m.loStrField, m.toAlias)
?CURSORSETPROP("UpdateNameList", m.loStrUpdateField, m.toAlias)
?CURSORSETPROP("Buffering",  5 , m.toAlias)
...
Рейтинг: 0 / 0
20.07.2011, 12:38
    #37359174
IgorProgrammer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TableUpdate
Нашел ошибку в данных...

Объяснита как в N(6,2) записалось значение 1034,4
И как можно проверить таблицу на такие несоответствия???
...
Рейтинг: 0 / 0
20.07.2011, 14:01
    #37359335
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TableUpdate
Физически, поля типа Numeric хранятся как символьные строки. Т.е. если открыть файл DBF как обычный текстовый файл, например, в блокноте, то содержимое полей типа Numeric так прямо и будет записано как текст. В данном случае как "1034.4".

Как следствие, указание количества знаков после запятой носит, скорее, рекомендательный характер. Если размерность числа позволяет, то будет записано указанное количество дробных знаков, если нет, то запишется столько, сколько есть места.

Код: plaintext
1.
2.
3.
4.
5.
6.
create cursor test (f1 N( 3 , 1 ))
insert into test values ( 1 )
insert into test values ( 10 )
insert into test values ( 100 )
go top
browse nowait

Как найти подобные ошибки? Ну, просто сравнить содержимое с максимально допустимым

Код: plaintext
select * from test where f1 >=  10 

Как предотвратить запись таких значений? Ну, проконтролировав то значение, которое пытается записаться, например, в RULE-поля (если это возможно). Хотя, ведь значение появилось не "с потолка". Если это не опечатка оператора, то, вероятно, выделенной размерности поля недостаточно и надо просто его увеличить.
...
Рейтинг: 0 / 0
20.07.2011, 14:03
    #37359340
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TableUpdate
> Объяснита как в N(6,2) записалось значение 1034,4

кста, подобную фишку видел в таблицах к 7му Парусу
как это получилось - загадка, Парус то на VFP 8 вроде писан

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
20.07.2011, 14:20
    #37359366
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TableUpdate
IgorProgrammerНашел ошибку в данных...

Объяснита как в N(6,2) записалось значение 1034,4
Вот так
Код: plaintext
1.
2.
create Cursor test (nTest n( 6 , 2 ))
append Blank
repl nTest with  1034 . 4 
IgorProgrammerИ как можно проверить таблицу на такие несоответствия???
Так
Код: plaintext
select * from test where nTest >=  1000  or nTest <= - 100 
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / TableUpdate / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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