Класс для API SQLite «На основе штатного SQLite»

Программы на Clarion, шаблоны, библиотеки и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7867
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 85 раз

Класс для API SQLite «На основе штатного SQLite»

Сообщение Игорь Столяров »

Привет всем !

Имею непреодолимое желание апнуть ископаемый класс SQLite и у меня для этого есть 5 причин:

1. Направление интересное само по себе, а в контексте взаимодействия с Android / Web - незаменимое;
2. Расширены возможности, устранены известные ограничения и проблемы (подозреваю, что добавлены новые);
3. За годы (десятилетия !) накопились всевозможные исправления и доработки в куче разных мест;
4. Как-то хотелось бы вот это вот всё, собрать где-то в одном месте, что бы использовать по назначению;
5. Приглашаю всех кому не пофиг предыдущие пункты к обсуждению и развитию этого свободного проекта.

Буду потихоньку собирать и показывать на примерах решение реальных задач.

sqlite.png
Вложения
tSQLite.zip
Версия от 05.02.2023 г.
(724.03 КБ) 381 скачивание
Последний раз редактировалось Игорь Столяров 29 Ноябрь 2024, 7:48, всего редактировалось 6 раз.
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5078
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 50 раз

SQLite for Clarion (Fork)

Сообщение finsoftrz »

Мы сейчас, к слову, подобный проект запускаем, "корпоративное питание" - заказ, приготовление и доставка обедов в офисы. Первые заказы пошли. ERP система на кларионе, в ней вся админка, разработка меню, управление заказами, производство сырье - п/ф - продукция. А для приема заказов адаптивная под разные девайсы страничка на php/javascript, использующая аякс запросы и всплывающие блоки, для оплаты сервис Робокасса. Данные на хостинге публикуются в виде sqlite. Работает красиво.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7867
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 85 раз

SQLite for Clarion (Fork)

Сообщение Игорь Столяров »

finsoftrz писал(а): 26 Ноябрь 2023, 15:09 А для приема заказов адаптивная под разные девайсы
Задача вообще для AnyScreen ! :)
Make Clarion Great Again ! 😎
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5078
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 11 раз
Поблагодарили: 50 раз

SQLite for Clarion (Fork)

Сообщение finsoftrz »

Игорь Столяров писал(а): 26 Ноябрь 2023, 17:04
finsoftrz писал(а): 26 Ноябрь 2023, 15:09 А для приема заказов адаптивная под разные девайсы
Задача вообще для AnyScreen ! :)
Не уверен. Сразу встанут вопросы с адаптивной версткой (чтобы удобно было работать с компьютера/планшета/смартфона) и интеграцией с платежными системами. Плюс поддержка своего сервера в режиме 24х7.
По anyscreen пока темы не всплывают (кроме доступа к картам оплаты и итогам продаж в столовой со стороны сотрудников предприятий, которые кормим, я про это писал). Обычные приложения имеют более удобный и функциональный интерфейс, чем приложения под ayscreen, а варианты ecommerce, типа упомянутого выше, лучше на обычных вебовских инструментах делать - хотя заметно более трудоемко, зато проще в дальнейшем поддерживать.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7867
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 85 раз

SQLite for Clarion (Fork)

Сообщение Игорь Столяров »

kreator писал(а): 26 Ноябрь 2023, 14:38 Опять же, где обещание юникода в C12?
В справке текущего релиза Clarion есть вот такой раздел:

1.jpg

Это я пытался заюзать встроенные функции ToUnicode() / ToAnsi(), но фиг вам - приходите когда будет Clarion 12.
Хотя описание в справке уже есть. :)
Make Clarion Great Again ! 😎
kreator
✯ Ветеран ✯
Сообщения: 5119
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 23 раза

SQLite for Clarion (Fork)

Сообщение kreator »

Судя по этому скрину и в C11 уже что-то должно работать. Ладно, подождём. Но я сомневаюсь, что в двенадцатой Юникод полноценно заработает.
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1779
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 19 раз
Поблагодарили: 10 раз

SQLite for Clarion (Fork)

Сообщение gopstop2007 »

Из Вашего примера, откорректировал, оставил только нужное

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

     SQLite.StartWithNew('CREATE TABLE MyTable (RecID INTEGER PRIMARY KEY AUTOINCREMENT,')
     SQLite.AddEnumTitle(qList,True)          ! Добавить перечисление заголовка структуры + ')'

     If    Not SQLite.Exec() then Message(' Не удалось создать структуру таблицы !','Ошибка',Icon:Exclamation,'&1. Закрыть')
     elsIf SQLite.Exec('BEGIN TRANSACTION')
        ...
        If SQLite.Exec('COMMIT') then Message('Успешная запись ToyTest.db !','ToySQLite',Icon:Asterisk,'&1. Закрыть').  ! Успех
     end
Вопрос, при создании таблицы MyTable как добавить ключи и индексы в конце списка qList?

Спасибо за внимание.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
gopstop2007
Полимат
Сообщения: 1779
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 19 раз
Поблагодарили: 10 раз

SQLite for Clarion (Fork)

Сообщение gopstop2007 »

Вроде нашел решение

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

        tSQLite.StartWithNew('CREATE TABLE cust (')
        tSQLite.AddEnumTitle(qListCust, False)          ! Добавить перечисление заголовка структуры + ')'
        tSQLite.QueryStr.Cat(', PRIMARY KEY(CUST_ID))')
Еще вопрос, как получить ответ например на такой запрос, в которой нет необходимости в Queue?

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

SELECT * FROM MyTable WHERE fildID = 1 LIMIT 1;
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7867
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 85 раз

SQLite for Clarion (Fork)

Сообщение Игорь Столяров »

gopstop2007 писал(а): 08 Ноябрь 2024, 17:36 Еще вопрос, как получить ответ например на такой запрос, в которой нет необходимости в Queue?
Добрый день !

Результат - это ведь всегда строка. Вопрос только в том, в каком виде мы её хотим увидеть. :)
Передайте QUEUE c одним длинннннннным полем, и потом через Get(QUEUE,1) получите результат.
Make Clarion Great Again ! 😎
gopstop2007
Полимат
Сообщения: 1779
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 19 раз
Поблагодарили: 10 раз

SQLite for Clarion (Fork)

Сообщение gopstop2007 »

Игорь Столяров писал(а): 08 Ноябрь 2024, 18:39
gopstop2007 писал(а): 08 Ноябрь 2024, 17:36 Еще вопрос, как получить ответ например на такой запрос, в которой нет необходимости в Queue?
Добрый день !

Результат - это ведь всегда строка. Вопрос только в том, в каком виде мы её хотим увидеть. :)
Передайте QUEUE c одним длинннннннным полем, и потом через Get(QUEUE,1) получите результат.
Может дополнить и позаимствовать код из LoadQueueFromSQL (Юрия Ф.), удобно :)

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

LoadQueueFromSQL ('SELECT f1,f2,f3 From Table', qList) ! Для очереди
LoadQueueFromSQL ('SELECT f1,f2,f3 From Table WHERE cust_id = 1;', , loc:f1,loc:f2,...loc:f10) ! Для полей
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7867
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 85 раз

SQLite for Clarion (Fork)

Сообщение Игорь Столяров »

gopstop2007 писал(а): 08 Ноябрь 2024, 18:55 LoadQueueFromSQL ('SELECT f1,f2,f3 From Table', qList) ! Для очереди
LoadQueueFromSQL ('SELECT f1,f2,f3 From Table WHERE cust_id = 1;', , loc:f1,loc:f1,...loc:f10) ! Для полей
1. Это тот же самый ToySQLite.Exec('SELECT f1,f2,f3 From Table', qList)

2. Здесь уже интересней, но у меня нет этого класса Юрия.
И опять-таки это нужно только для какого-то частичного заполнения ... распарс 10 полей ... зачем ... ?

Мой подход: "Котлеты отдельно, мухи отдельно" (не я сказал). ;)
Класс - это ведь интерфейс обмена с таблицами SQLite, а не формирование каких-то прикладных структур данных.

- Создайте QUEUE c N (или лучше cразу K) полями CSTRING();
- Выполните ToySQLite.Exec('SELECT f1,f2,f3 From Table', QUEUE)
- Забирайте результат и делайте с ним всё что считаете нужным, в т.ч. заполняйте вот эти loc:f1,loc:f1,...loc:f10
в любых вариациях с проверкой условий и т.д.
Make Clarion Great Again ! 😎
gopstop2007
Полимат
Сообщения: 1779
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 19 раз
Поблагодарили: 10 раз

SQLite for Clarion (Fork)

Сообщение gopstop2007 »

Игорь Столяров писал(а): 08 Ноябрь 2024, 19:25
2. Здесь уже интересней, но у меня нет этого класса Юрия.
И опять-таки это нужно только для какого-то частичного заполнения ... распарс 10 полей ... зачем ... ?

Мой подход: "Котлеты отдельно, мухи отдельно" (не я сказал). ;)
Класс - это ведь интерфейс обмена с таблицыми SQLite, а не формирование каких-то прикладных структур данных.

- Создайте QUEUE c N (или лучше cразу K) полями CSTRING();
- Выполните ToySQLite.Exec('SELECT f1,f2,f3 From Table', QUEUE)
- Забирайте результат и делайте с ним всё что считаете нужным, в т.ч. заполняйте вот эти loc:f1,loc:f1,...loc:f10
в любых вариациях с проверкой условий и т.д.
Для того чтобы получить ответ с одним значением, нужно:
1. Создать Queue хотя бы с одним полем (Queue.ret)
2. Выполнить ToySQLite.Exec('SELECT f1,f2,f3 From Table', QUEUE)
3. GET(Queue,1)
4. присвоить loc:ret = Queue.ret
или
1. LoadQueueFromSQL('SELECT f1,f2,f3 From Table', ,loc:ret )
Чувствуем разницу? :)
Вложения
loadqueue.zip
(45.54 КБ) 112 скачиваний
loadqueue-20171009.rar
(1007.68 КБ) 111 скачиваний
LoadQueueFromSQL.zip
(783.8 КБ) 114 скачиваний
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7867
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 85 раз

SQLite for Clarion (Fork)

Сообщение Игорь Столяров »

gopstop2007 писал(а): 08 Ноябрь 2024, 19:53 Чувствуем разницу?
Конечно ! Но только до того места, когда Вам понадобятся 2 записи или 12 полей ... ;)

Интересная задача - это эффективно получить данные из SQLite.
Раскидывать 10 колонок из результата по параметрам ... да это, наверно, упростит какую-то частную задачу.
Мне это не интересно. Заверните, всё что рассказали, в метод и пользуйтесь если нужно. Это не сложно. ;)
Make Clarion Great Again ! 😎
gopstop2007
Полимат
Сообщения: 1779
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 19 раз
Поблагодарили: 10 раз

SQLite for Clarion (Fork)

Сообщение gopstop2007 »

При добавлении новых записей, заполнение полей кириллицей отображается корректно в таблице базы sqlite.
При изменении (update) записей, отображается не корректно в виде ромбиков.

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

SQLite.Exec('Update cust SET fullname="'& qList.fullname &'"  WHERE cust_id='& qList.cust_id &';')
IF NOT SQLite.Exec() then
      ! error
END
SQLite у меня будет использоваться только для хранения данных, для дальнейшей загрузки в Memory table.

Спасибо за внимание
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7867
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 85 раз

SQLite for Clarion (Fork)

Сообщение Игорь Столяров »

gopstop2007 писал(а): 09 Ноябрь 2024, 12:13 При изменении (update) записей, отображается не корректно в виде ромбиков.
ДД !

Вы же помните, что SQLite работает только с кодировкой UTF-8 ?

За отсутствием рабочего примера - предлагаю использовать штатный.
Добавим в него изменение записи с правильным синтаксисом:

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

  ! 4. Тест изменения записи № 2
  
  If SQLite.OpenDB('ToyTest.db')
     SQLite.Exec('Update MyTable SET NAME="'& TOY::ANSItoUTF8('Игорь Столяров') & '" Where RecID=' & 2 & ';')
     SQLite.CloseDB()
  end
Результат:

1.jpg

Вопросы ? ;)
Make Clarion Great Again ! 😎
gopstop2007
Полимат
Сообщения: 1779
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 19 раз
Поблагодарили: 10 раз

SQLite for Clarion (Fork)

Сообщение gopstop2007 »

У Вас наверное более обновленная tSQLite, у меня ошибка (Unknown function label) на TOY::ANSItoUTF8
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Ответить