Страница 9 из 12
Добавлено: 23 Декабрь 2005, 17:08
dadmitrii
Вопрос:
Как отсортировать в BrowseBox записи по нескольким колонкам, а возможность изменения сортировки отключить (как в стандартном Browse) ?
Добавлено: 26 Декабрь 2005, 8:40
Andrew™
dadmitrii писал(а):Вопрос:
Как отсортировать в BrowseBox записи по нескольким колонкам, а возможность изменения сортировки отключить (как в стандартном Browse) ?
на закладке Other очисти поля связанные с индикацией сортировки и сам
отсортируй List Queue после загрузки как душе угодно
Добавлено: 26 Декабрь 2005, 11:05
dadmitrii
Спасибо, заработало. Было бы неплохо на закладке Other сделать какое-нибудь пояснение или в хелпе уже есть описание? в Help'e я не нашел про метод HeaderInit (у меня версия от 8.08.04)
Обновление от 16.01.2006
Добавлено: 16 Январь 2006, 10:02
Andrew™
Как уже писал, один и тот же 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'а, исправлено
спасибо за обнаруженную фичу:
Толмачёв Игорь
Добавлено: 24 Январь 2006, 3:01
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"=?
Поиск естественно во втором случае работает не так как мне нужно
В чем дело?
Добавлено: 24 Январь 2006, 8:11
Andrew™
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"=?
Поиск естественно во втором случае работает не так как мне нужно
В чем дело?
а тут всё просто, присутсвует контроль на размер параметра, он не должен превышать размера поля в БД, иначе будет ошибка, во втором случае судя из лога размер поля CityName 2 байта, процентики образаются, хотя инфо мало для анализа этой ситуации, т к приведённый код .AddCol - это условие фильтрации по локаторному полю, а SELECT непонятно по какому действию
Добавлено: 24 Январь 2006, 10:02
Admin
В бровзе одно поле CityName - название города.
Оно естественно не 2 байта...
В бровзе есть твое поле локатора. Сортировка стоит по имени города.
Набираю Ха и курсор в бровзе встает на город Хабаровск.
Жму кнопу обновить и предполагаю увидеть записи у которых в имени города есть буквы ХА. В результате вижу пустой листбокс.
Последний SELECT в предыдущем письме как раз и делается по нажатию на кнопку обновить после того как в локатор ввел Ха.
Как видим селект формируется не в соответствии с тем видом поиска по полю которое я имел в виду... %_%
Так все понятно?
Добавлено: 24 Январь 2006, 14:58
Andrew™
Admin писал(а):В бровзе одно поле CityName - название города.
Оно естественно не 2 байта...
В бровзе есть твое поле локатора. Сортировка стоит по имени города.
Набираю Ха и курсор в бровзе встает на город Хабаровск.
Жму кнопу обновить и предполагаю увидеть записи у которых в имени города есть буквы ХА. В результате вижу пустой листбокс.
Последний SELECT в предыдущем письме как раз и делается по нажатию на кнопку обновить после того как в локатор ввел Ха.
Как видим селект формируется не в соответствии с тем видом поиска по полю которое я имел в виду... %_%
Так все понятно?
не вся картина видна, локаторное поле часом не STRING ?
пробелы справа являются нормальными символами, если STRING, поменяй на CSTRING, если я не угадал, бросай сюда .CLW Browse этой
Добавлено: 24 Январь 2006, 15:38
Admin
Угадал. был STRING ...
Добавлено: 25 Январь 2006, 5:15
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
Добавлено: 25 Январь 2006, 8:45
Andrew™
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
не так давно в коммерческой версии появилась возможность обрабатывать ошибки с помощью ХП на сервере, на вход инфо об SQL ошибке, возвращает то что хотелось бы показать пользователю, ну а при сохранении в лог будет сохранятться как прежде та инфо которая требуется для разработчика - для анализа и разруливания ошибочной ситуации, а выглядит это следующим образом:
реализуется вызов хранимой процедуры для обработки ошибки:
Код: Выделить всё
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
Добавлено: 25 Январь 2006, 9:45
Admin
Ясно. В общем - ждем покупки...
Надеюсь документация уже пишется

Добавлено: 26 Январь 2006, 3:46
Admin
Андрей. Как сделать у DropList`а возможность не отображать запись по дефолту?
Т.е. мне нужны списки выбора в которых я могу что то выбрать а могу и не выбирать.
Тогда в поля с кодами должно записаться Null (Естественно если это разрешено)
P.S. Очень нужно!

Т.к. LookUp процедурами в моем случае пользоваться не совсем удобно ...
Добавлено: 26 Январь 2006, 8:33
Andrew™
Admin писал(а):Андрей. Как сделать у DropList`а возможность не отображать запись по дефолту?
Т.е. мне нужны списки выбора в которых я могу что то выбрать а могу и не выбирать.
Тогда в поля с кодами должно записаться Null (Естественно если это разрешено)
P.S. Очень нужно!

Т.к. LookUp процедурами в моем случае пользоваться не совсем удобно ...
в методе BRW1:Browse.Load после вызова PARENT.а сделай следующее:
Код: Выделить всё
SELF.Q_Mgr.ClearQ() ! аналог CLEAR
ADD(SELF.Q) ! будет пустая запись в Browse
Добавлено: 26 Январь 2006, 9:58
Admin
Нужно делать ADD(SELF.Q,1)
что бы запись была первой в листе.
Но! Когда открываешь форму на добавление выбрана первой не эта пустая запись а первая текстом ... Что делать?