MAV Direct ODBC
Модератор: Andrew™
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Обновление от 16.01.2006
Как уже писал, один и тот же BrowseBox шаблон может выступать в качестве трёх типов: CREATE:List,CREATE:DropList, CREATE:DropCombo
при использовании Browse в качестве CREATE:DropCombo вводное поле было ВСЕГДА обязательным(req) для ввода, хотя это не всегда было надо, исправлено
спасибо за обнаруженную фичу:
Rimantas Nedzinskas
Толмачёв Игорь
При использовании BrowseBox в режиме Tree + наличии Root text
при пустом состоянии Browse (RECORDS(LIST:Queue)=1, т е только RootText) при вводе новой записи она не появлялась в Browse до принудительного Refresh'а, исправлено
спасибо за обнаруженную фичу:
Толмачёв Игорь
при использовании Browse в качестве CREATE:DropCombo вводное поле было ВСЕГДА обязательным(req) для ввода, хотя это не всегда было надо, исправлено
спасибо за обнаруженную фичу:
Rimantas Nedzinskas
Толмачёв Игорь
При использовании BrowseBox в режиме Tree + наличии Root text
при пустом состоянии Browse (RECORDS(LIST:Queue)=1, т е только RootText) при вводе новой записи она не появлялась в Browse до принудительного Refresh'а, исправлено
спасибо за обнаруженную фичу:
Толмачёв Игорь
- Admin
- Администратор
- Сообщения: 3959
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
Вот в одном бровзе такой код:
SELF.AddCol(CON:LastName,SELF.Rec.LastName,'%_%')
И что пишется в лог (Обрати внимание на %ФЕ%):
Binding field 1 A."LastName" = %ФЕ%
14555976 Parsing Cursor : SELECT A."LastName",A."FirstName",A."Patronymic",B."DepartmentName",C."RankName",A."eMailAddress",A."WorkInternalPhone",A."StaffCode",A."Sex",A."WorkStatus",C."RankCode",B."DepartmentCode",A."BirthDay" FROM refStaff_leasing A LEFT OUTER JOIN refRank_leasing C ON C."RankCode"=A."RankCode" LEFT OUTER JOIN refDepartment_leasing B ON B."DepartmentCode"=A."DepartmentCode" WHERE UPPER(A."LastName") LIKE ?
И вот в другом:
SELF.AddCol(CIT:CityName,SELF.Rec.CityName,'%_%')
И что пишется в лог (Обрати внимание на Ха без процентов!):
Binding field 1 "CityName" = Ха
14555976 Parsing Cursor : SELECT "CityName","CityStatus","CityCode" FROM refCity_leasing WHERE "CityName"=?
Поиск естественно во втором случае работает не так как мне нужно
В чем дело?
SELF.AddCol(CON:LastName,SELF.Rec.LastName,'%_%')
И что пишется в лог (Обрати внимание на %ФЕ%):
Binding field 1 A."LastName" = %ФЕ%
14555976 Parsing Cursor : SELECT A."LastName",A."FirstName",A."Patronymic",B."DepartmentName",C."RankName",A."eMailAddress",A."WorkInternalPhone",A."StaffCode",A."Sex",A."WorkStatus",C."RankCode",B."DepartmentCode",A."BirthDay" FROM refStaff_leasing A LEFT OUTER JOIN refRank_leasing C ON C."RankCode"=A."RankCode" LEFT OUTER JOIN refDepartment_leasing B ON B."DepartmentCode"=A."DepartmentCode" WHERE UPPER(A."LastName") LIKE ?
И вот в другом:
SELF.AddCol(CIT:CityName,SELF.Rec.CityName,'%_%')
И что пишется в лог (Обрати внимание на Ха без процентов!):
Binding field 1 "CityName" = Ха
14555976 Parsing Cursor : SELECT "CityName","CityStatus","CityCode" FROM refCity_leasing WHERE "CityName"=?
Поиск естественно во втором случае работает не так как мне нужно
В чем дело?
а тут всё просто, присутсвует контроль на размер параметра, он не должен превышать размера поля в БД, иначе будет ошибка, во втором случае судя из лога размер поля CityName 2 байта, процентики образаются, хотя инфо мало для анализа этой ситуации, т к приведённый код .AddCol - это условие фильтрации по локаторному полю, а SELECT непонятно по какому действиюAdmin писал(а):Вот в одном бровзе такой код:
SELF.AddCol(CON:LastName,SELF.Rec.LastName,'%_%')
И что пишется в лог (Обрати внимание на %ФЕ%):
Binding field 1 A."LastName" = %ФЕ%
14555976 Parsing Cursor : SELECT A."LastName",A."FirstName",A."Patronymic",B."DepartmentName",C."RankName",A."eMailAddress",A."WorkInternalPhone",A."StaffCode",A."Sex",A."WorkStatus",C."RankCode",B."DepartmentCode",A."BirthDay" FROM refStaff_leasing A LEFT OUTER JOIN refRank_leasing C ON C."RankCode"=A."RankCode" LEFT OUTER JOIN refDepartment_leasing B ON B."DepartmentCode"=A."DepartmentCode" WHERE UPPER(A."LastName") LIKE ?
И вот в другом:
SELF.AddCol(CIT:CityName,SELF.Rec.CityName,'%_%')
И что пишется в лог (Обрати внимание на Ха без процентов!):
Binding field 1 "CityName" = Ха
14555976 Parsing Cursor : SELECT "CityName","CityStatus","CityCode" FROM refCity_leasing WHERE "CityName"=?
Поиск естественно во втором случае работает не так как мне нужно
В чем дело?
- Admin
- Администратор
- Сообщения: 3959
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
В бровзе одно поле CityName - название города.
Оно естественно не 2 байта...
В бровзе есть твое поле локатора. Сортировка стоит по имени города.
Набираю Ха и курсор в бровзе встает на город Хабаровск.
Жму кнопу обновить и предполагаю увидеть записи у которых в имени города есть буквы ХА. В результате вижу пустой листбокс.
Последний SELECT в предыдущем письме как раз и делается по нажатию на кнопку обновить после того как в локатор ввел Ха.
Как видим селект формируется не в соответствии с тем видом поиска по полю которое я имел в виду... %_%
Так все понятно?
Оно естественно не 2 байта...
В бровзе есть твое поле локатора. Сортировка стоит по имени города.
Набираю Ха и курсор в бровзе встает на город Хабаровск.
Жму кнопу обновить и предполагаю увидеть записи у которых в имени города есть буквы ХА. В результате вижу пустой листбокс.
Последний SELECT в предыдущем письме как раз и делается по нажатию на кнопку обновить после того как в локатор ввел Ха.
Как видим селект формируется не в соответствии с тем видом поиска по полю которое я имел в виду... %_%
Так все понятно?
не вся картина видна, локаторное поле часом не STRING ?Admin писал(а):В бровзе одно поле CityName - название города.
Оно естественно не 2 байта...
В бровзе есть твое поле локатора. Сортировка стоит по имени города.
Набираю Ха и курсор в бровзе встает на город Хабаровск.
Жму кнопу обновить и предполагаю увидеть записи у которых в имени города есть буквы ХА. В результате вижу пустой листбокс.
Последний SELECT в предыдущем письме как раз и делается по нажатию на кнопку обновить после того как в локатор ввел Ха.
Как видим селект формируется не в соответствии с тем видом поиска по полю которое я имел в виду... %_%
Так все понятно?
пробелы справа являются нормальными символами, если STRING, поменяй на CSTRING, если я не угадал, бросай сюда .CLW Browse этой
- Admin
- Администратор
- Сообщения: 3959
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
Не хочу я получать такое сообщение:
Computer : SEA-NK
User : sea
Date : 25.01.2006
Time : 12:10:22
Program : C:\Cw_App\Work\xsql\11\xsql.exe
Error : [547] [Microsoft][ODBC SQL Server Driver][SQL Server]DELETE statement conflicted with COLUMN REFERENCE constraint 'refContacts_leasing_fk_Rank'. The conflict occurred in database 'Leasing', table 'refContacts_leasing', column 'RankCode'. (23000)
SQL Statement -
Binding field 1 = 9
DELETE FROM refRank_leasing WHERE "RankCode"=?
Как его поменять на нормальный текст который что то скажет обычному пользователю?
Как вообще обработать любую ошибку а не только 23000
Computer : SEA-NK
User : sea
Date : 25.01.2006
Time : 12:10:22
Program : C:\Cw_App\Work\xsql\11\xsql.exe
Error : [547] [Microsoft][ODBC SQL Server Driver][SQL Server]DELETE statement conflicted with COLUMN REFERENCE constraint 'refContacts_leasing_fk_Rank'. The conflict occurred in database 'Leasing', table 'refContacts_leasing', column 'RankCode'. (23000)
SQL Statement -
Binding field 1 = 9
DELETE FROM refRank_leasing WHERE "RankCode"=?
Как его поменять на нормальный текст который что то скажет обычному пользователю?
Как вообще обработать любую ошибку а не только 23000
не так давно в коммерческой версии появилась возможность обрабатывать ошибки с помощью ХП на сервере, на вход инфо об SQL ошибке, возвращает то что хотелось бы показать пользователю, ну а при сохранении в лог будет сохранятться как прежде та инфо которая требуется для разработчика - для анализа и разруливания ошибочной ситуации, а выглядит это следующим образом:Admin писал(а):Не хочу я получать такое сообщение:
Computer : SEA-NK
User : sea
Date : 25.01.2006
Time : 12:10:22
Program : C:\Cw_App\Work\xsql\11\xsql.exe
Error : [547] [Microsoft][ODBC SQL Server Driver][SQL Server]DELETE statement conflicted with COLUMN REFERENCE constraint 'refContacts_leasing_fk_Rank'. The conflict occurred in database 'Leasing', table 'refContacts_leasing', column 'RankCode'. (23000)
SQL Statement -
Binding field 1 = 9
DELETE FROM refRank_leasing WHERE "RankCode"=?
Как его поменять на нормальный текст который что то скажет обычному пользователю?
Как вообще обработать любую ошибку а не только 23000
реализуется вызов хранимой процедуры для обработки ошибки:
Код: Выделить всё
GetErrorMessage FUNCTION (STRING txt)
tmp MAVString
ret MAVString
tmpSQL MAVExecSP
CODE tmp.Reset(CLIP(txt))
ret.Reset(ALL('<0>',1024))
tmpSql.BindParameter(ret.S,SQL_PARAM_OUTPUT)
tmpSql.BindParameter(tmp.S)
IF tmpSQL.Run('dbo.A_ErrMessage',1)
MAVSHOWERROR
RETURN ''
END
RETURN CLIP(ret.S)
Код: Выделить всё
SETERRORFUNCTION(ADDRESS(GetErrorMessage))
Код: Выделить всё
CREATE FUNCTION A_ErrMessage (@txt varchar(4096))
RETURNS varchar(4096)
as
BEGIN
declare @Oper varchar(20)
declare @i int
declare @fk varchar(4096)
declare @table varchar(4096)
declare @out varchar(4096)
set @i=CHARINDEX ( 'INSERT statement conflicted with TABLE FOREIGN KEY constraint ''',@txt,1)
if @i>0 set @Oper='Insert'
else
begin
set @i=CHARINDEX ( 'UPDATE statement conflicted with TABLE FOREIGN KEY constraint ''',@txt,1)
if @i>0 set @Oper='Update'
else
begin
set @i=CHARINDEX ( 'DELETE statement conflicted with TABLE FOREIGN KEY constraint ''',@txt,1)
if @i>0 set @Oper='Delete'
end
end
if @Oper is not null
begin
set @txt=SUBSTRING(@txt, @i+57+LEN(@Oper),4096)
set @i=CHARINDEX ( '''',@txt,1)
set @fk=SUBSTRING(@txt,1, @i-1)
set @table=(select object_name(r.fkeyid)
from dbo.sysreferences r
where object_name(r.constid)=@fk)
set @out=CONVERT(varchar(4096),(SELECT value FROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', @table, 'constraint', @fk) where name='MS_Error'+@Oper))
if @out is null set @out='Undocumented constraint error. The operation has been aborted.'
end
else
set @out='System Error. The operation has been aborted.'
RETURN(@out)
END
- Admin
- Администратор
- Сообщения: 3959
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
Андрей. Как сделать у DropList`а возможность не отображать запись по дефолту?
Т.е. мне нужны списки выбора в которых я могу что то выбрать а могу и не выбирать.
Тогда в поля с кодами должно записаться Null (Естественно если это разрешено)
P.S. Очень нужно! Т.к. LookUp процедурами в моем случае пользоваться не совсем удобно ...
Т.е. мне нужны списки выбора в которых я могу что то выбрать а могу и не выбирать.
Тогда в поля с кодами должно записаться Null (Естественно если это разрешено)
P.S. Очень нужно! Т.к. LookUp процедурами в моем случае пользоваться не совсем удобно ...
в методе BRW1:Browse.Load после вызова PARENT.а сделай следующее:Admin писал(а):Андрей. Как сделать у DropList`а возможность не отображать запись по дефолту?
Т.е. мне нужны списки выбора в которых я могу что то выбрать а могу и не выбирать.
Тогда в поля с кодами должно записаться Null (Естественно если это разрешено)
P.S. Очень нужно! Т.к. LookUp процедурами в моем случае пользоваться не совсем удобно ...
Код: Выделить всё
SELF.Q_Mgr.ClearQ() ! аналог CLEAR
ADD(SELF.Q) ! будет пустая запись в Browse