Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Ehlib и ключи бинарного типа.  [new]
L_argo
Member

Откуда:
Сообщений: 1297
В Ehlib если очень удобные пик-листы, основанные на TStrings.
Они прекрасно работают с целочисленными и строчными ключами.
Но иногда в БД приходится работать с ключами бинарного типа, н-р binary(8 , 16).
В том же 1C или различных телефониях.

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

Кто как решал подобную проблему ?
16 ноя 20, 11:23    [22232702]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26836
L_argo
Кто как решал подобную проблему ?

Например, lookup поля использовать.
16 ноя 20, 12:18    [22232766]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
L_argo
Member

Откуда:
Сообщений: 1297
wadman
L_argo
Кто как решал подобную проблему ?

Например, lookup поля использовать.
Можно, но неудобно.
Хотелось бы поискать способ использования сабжа.
16 ноя 20, 12:25    [22232775]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775

L_argo
Они прекрасно работают с целочисленными и строчными ключами.

Как они работают с целочисленными ключами?

Posted via ActualForum NNTP Server 1.5

16 ноя 20, 13:44    [22232890]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
L_argo
Member

Откуда:
Сообщений: 1297
Dimitry Sibiryakov

L_argo
Они прекрасно работают с целочисленными и строчными ключами.
Как они работают с целочисленными ключами?
Текстом пишешь в KeyItems значения ключа и он работает с целочисленным полем датасета.

Очень удобно в живом гриде делать минисправочники.

Или я неправильно понял вопрос ?
16 ноя 20, 17:08    [22233131]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
L_argo
Конечно можно преобразовывать байты в тхт-строку, но тогда будет проблема живого редактирования полей.

Что за проблема?
16 ноя 20, 17:16    [22233141]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
L_argo
Member

Откуда:
Сообщений: 1297
ъъъъъ
L_argo
Конечно можно преобразовывать байты в тхт-строку, но тогда будет проблема живого редактирования полей.

Что за проблема?
Как грид проапдейтит binary-поле датасета, если ему передать в него текстовое представление (дамп) типо 0х00ACBF9E45B1 ?
16 ноя 20, 19:00    [22233244]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2321
Написать обработчик TField.SetText не поможет?
16 ноя 20, 19:16    [22233270]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
L_argo
ъъъъъ
пропущено...

Что за проблема?
Как грид проапдейтит binary-поле датасета, если ему передать в него текстовое представление (дамп) типо 0х00ACBF9E45B1 ?

Да как хочешь. В OnGetTex/OnSetText.
16 ноя 20, 19:17    [22233272]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
L_argo
Member

Откуда:
Сообщений: 1297
Michael Longneck
Написать обработчик TField.SetText не поможет?
Пробовал писать.
По непонятной причине пишет ошибку:

Invalid variant type or size for field 'хххх'

юзаю FireDAC.

Поле Binary(1) mssql в датасете типа TBytesField. Передаю в него правильный Variant из одного байта.

в OnSetText пишу:
Sender.Value := HexToVar(Text);

HexToVar возвращает variant. Пробовал передать и явный байт. И с явным приведением Sender.AsVariant. Тож самое.
17 ноя 20, 12:46    [22233642]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
L_argo
По непонятной причине пишет ошибку:

L_argo,
можно, конечно, сделать, чтобы "получилось".

Но - скажи, на кой чёрт вообще это нужно - ключевые поля "руками" редактировать?
17 ноя 20, 12:55    [22233652]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
L_argo
Member

Откуда:
Сообщений: 1297
ъъъъъ
L_argo
По непонятной причине пишет ошибку:

L_argo,
можно, конечно, сделать, чтобы "получилось".

Но - скажи, на кой чёрт вообще это нужно - ключевые поля "руками" редактировать?
Не ключевые поля, а поля с внешними ключами.
Ссылки на пункты справочника. Чтобы удобно в гриде менять значение с помощью выпадающего списка.
17 ноя 20, 13:03    [22233656]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
L_argo
ъъъъъ
пропущено...

L_argo,
можно, конечно, сделать, чтобы "получилось".

Но - скажи, на кой чёрт вообще это нужно - ключевые поля "руками" редактировать?
Не ключевые поля, а поля с внешними ключами.
Ссылки на пункты справочника. Чтобы удобно в гриде менять значение с помощью выпадающего списка.


Неужели это удобно - из базы извлекать значения ключевых и отображаемых полей, преобразовывать их в текст и засовывать в keylist/picklist комбо-поля TDBGridEh?

Вместо того, чтобы просто указать лист-датасорц лукап-поля?
17 ноя 20, 13:25    [22233670]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
L_argo
Ссылки на пункты справочника. Чтобы удобно в гриде менять значение с помощью выпадающего списка.

А сами "бинарные" поля в гриде ты как отображаешь? В "бинарном" виде, или как?
17 ноя 20, 13:41    [22233694]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
L_argo
Member

Откуда:
Сообщений: 1297
ъъъъъ
L_argo
пропущено...
Не ключевые поля, а поля с внешними ключами.
Ссылки на пункты справочника. Чтобы удобно в гриде менять значение с помощью выпадающего списка.


Неужели это удобно - из базы извлекать значения ключевых и отображаемых полей, преобразовывать их в текст и засовывать в keylist/picklist комбо-поля TDBGridEh?

Вместо того, чтобы просто указать лист-датасорц лукап-поля?
Да, удобно. Это делает простая процедура.
В некот. случаях минисправочника в БД вообще нет (н-р Муж/Жен, Да/Нет, или дни недели). Есть подготовленные списки ключ/значение.

Я ответил на вопрос "для чего ?" ? :)

Осталось найти ответ, почему выдает ошибку в OnSetText....
17 ноя 20, 13:42    [22233695]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
L_argo
Member

Откуда:
Сообщений: 1297
ъъъъъ
L_argo
Ссылки на пункты справочника. Чтобы удобно в гриде менять значение с помощью выпадающего списка.

А сами "бинарные" поля в гриде ты как отображаешь? В "бинарном" виде, или как?
Если у поля есть пик-лист (ключ/значение), то поле выглядит как комбобокс с возможными значениями. Если пиклиста нет и поле бинарное, то по OnGetText выводится в виде 0xXXXXXXXXXXX.

пысы: Пиклист не у поля, а у колонки грида.

Сообщение было отредактировано: 17 ноя 20, 13:43
17 ноя 20, 13:47    [22233701]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
L_argo
Да, удобно. Это делает простая процедура.

Ясно, ты научился "как-то", и другие способы "не катят".
Не за горами вопрос: "Долго отображается форма, что делать?".
Ну да ладно, не моё дело.
~~~~~~~~~~~~~~

L_argo
Осталось найти ответ, почему выдает ошибку в OnSetText....
L_argo
Invalid variant type or size for field 'хххх'

юзаю FireDAC.

Поле Binary(1) mssql в датасете типа TBytesField.

У меня нет FireDac но вообще новых Дельфей, но я бы попробовал:
var fB : byte = 123;
<Поле TBytesField>.SetData(@fB);

- и по результатам действовал дальше.
17 ноя 20, 14:09    [22233727]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6656
L_argo,

я просто подумал, возможно и не в DBGridEh дело вообще.

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

DS.Edit();
DS.FieldByName('Name').AsString := 'Иванов Иван Иванович';
DS.FieldByName('Age').AsInteger := 65;
DS.Post();


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

Сообщение было отредактировано: 17 ноя 20, 14:16
17 ноя 20, 14:16    [22233740]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
L_argo
Member

Откуда:
Сообщений: 1297
ъъъъъ,

TField.SetData() действительно помогла. Спасибо !.

Как-то упустил этот способ.
17 ноя 20, 14:20    [22233748]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1350
Кроик Семён
DS.FieldByName('Name').AsString := 'Test';

У него тестовое поле размером в 1 байт...не всякий символ в 1 байт того... :)
17 ноя 20, 14:20    [22233750]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
L_argo
Member

Откуда:
Сообщений: 1297
Кроик Семён
L_argo,

я просто подумал, возможно и не в DBGridEh дело вообще.

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

DS.Edit();
DS.FieldByName('Name').AsString := 'Иванов Иван Иванович';
DS.FieldByName('Age').AsInteger := 65;
DS.Post();


ведь если так не пройдет, значит придется колдовать вокруг датасета
Это прекрасно работает. Главное ключи датасета не забыть.

Кстати интересный прикол, если кому интересно:
Если явно не объявить первичные ключи в свойствах датасета, то ФайрДАК пытается сам найти первичные ключи. Но если в конструкции FROM имя таблицы идет в следующей строке, то этот поиск оказывается неудачным и ФайрДАК фейлит живой апдейт.
Правда фейлит не всегда. Пока закономерности не нашел.

Сообщение было отредактировано: 17 ноя 20, 14:29
17 ноя 20, 14:28    [22233766]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
L_argo

Если явно не объявить первичные ключи в свойствах датасета, то ФайрДАК пытается сам найти первичные ключи. Но если в конструкции FROM имя таблицы идет в следующей строке, то этот поиск оказывается неудачным и ФайрДАК фейлит живой апдейт.
Правда фейлит не всегда. Пока закономерности не нашел.

У файрдака автоматика вообще иногда странно работает. Особенно на всяких RefreshRecord().
17 ноя 20, 15:17    [22233850]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2321
alekcvp
У файрдака автоматика вообще иногда странно работает. Особенно на всяких RefreshRecord().


Поэтому лучше положить UpdateSQL и всё написать самому. Гораздо надёжнее
18 ноя 20, 11:40    [22234448]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
Michael Longneck
alekcvp
У файрдака автоматика вообще иногда странно работает. Особенно на всяких RefreshRecord().

Поэтому лучше положить UpdateSQL и всё написать самому. Гораздо надёжнее

Апдейты я и так руками делаю через отдельный query (не люблю редактирование в датасетах).
А вот как для RefreshRecord свой SQL написать?.. Собственно там даже писать ничего не надо, только один Where добавить, но он не справляется.
18 ноя 20, 12:07    [22234466]     Ответить | Цитировать Сообщить модератору
 Re: Ehlib и ключи бинарного типа.  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2321
В UpdateSQL FireDac есть FetchRecordSQL
18 ноя 20, 23:56    [22235012]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить