MAV Direct ODBC

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
dadmitrii

Сообщение dadmitrii »

Вопрос:
Как отсортировать в BrowseBox записи по нескольким колонкам, а возможность изменения сортировки отключить (как в стандартном Browse) ?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

dadmitrii писал(а):Вопрос:
Как отсортировать в BrowseBox записи по нескольким колонкам, а возможность изменения сортировки отключить (как в стандартном Browse) ?
на закладке Other очисти поля связанные с индикацией сортировки и сам
отсортируй List Queue после загрузки как душе угодно
dadmitrii

Сообщение dadmitrii »

Спасибо, заработало. Было бы неплохо на закладке Other сделать какое-нибудь пояснение или в хелпе уже есть описание? в Help'e я не нашел про метод HeaderInit (у меня версия от 8.08.04)
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Обновление от 16.01.2006

Сообщение 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'а, исправлено

спасибо за обнаруженную фичу:
Толмачёв Игорь
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение 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"=?

Поиск естественно во втором случае работает не так как мне нужно
В чем дело?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение 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 непонятно по какому действию
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

В бровзе одно поле CityName - название города.
Оно естественно не 2 байта...
В бровзе есть твое поле локатора. Сортировка стоит по имени города.
Набираю Ха и курсор в бровзе встает на город Хабаровск.
Жму кнопу обновить и предполагаю увидеть записи у которых в имени города есть буквы ХА. В результате вижу пустой листбокс.

Последний SELECT в предыдущем письме как раз и делается по нажатию на кнопку обновить после того как в локатор ввел Ха.

Как видим селект формируется не в соответствии с тем видом поиска по полю которое я имел в виду... %_%

Так все понятно?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Admin писал(а):В бровзе одно поле CityName - название города.
Оно естественно не 2 байта...
В бровзе есть твое поле локатора. Сортировка стоит по имени города.
Набираю Ха и курсор в бровзе встает на город Хабаровск.
Жму кнопу обновить и предполагаю увидеть записи у которых в имени города есть буквы ХА. В результате вижу пустой листбокс.

Последний SELECT в предыдущем письме как раз и делается по нажатию на кнопку обновить после того как в локатор ввел Ха.

Как видим селект формируется не в соответствии с тем видом поиска по полю которое я имел в виду... %_%

Так все понятно?
не вся картина видна, локаторное поле часом не STRING ?
пробелы справа являются нормальными символами, если STRING, поменяй на CSTRING, если я не угадал, бросай сюда .CLW Browse этой
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Угадал. был STRING ...
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение 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
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение 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
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Ясно. В общем - ждем покупки...
Надеюсь документация уже пишется :)
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Андрей. Как сделать у DropList`а возможность не отображать запись по дефолту?
Т.е. мне нужны списки выбора в которых я могу что то выбрать а могу и не выбирать.
Тогда в поля с кодами должно записаться Null (Естественно если это разрешено)

P.S. Очень нужно! :) Т.к. LookUp процедурами в моем случае пользоваться не совсем удобно ...
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Admin писал(а):Андрей. Как сделать у DropList`а возможность не отображать запись по дефолту?
Т.е. мне нужны списки выбора в которых я могу что то выбрать а могу и не выбирать.
Тогда в поля с кодами должно записаться Null (Естественно если это разрешено)

P.S. Очень нужно! :) Т.к. LookUp процедурами в моем случае пользоваться не совсем удобно ...
в методе BRW1:Browse.Load после вызова PARENT.а сделай следующее:

Код: Выделить всё

 SELF.Q_Mgr.ClearQ() ! аналог CLEAR
 ADD(SELF.Q) ! будет пустая запись в Browse
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Нужно делать ADD(SELF.Q,1)
что бы запись была первой в листе.
Но! Когда открываешь форму на добавление выбрана первой не эта пустая запись а первая текстом ... Что делать?
Ответить