Страница 4 из 5

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

Добавлено: 03 Февраль 2023, 10:38
Игорь Столяров
Привет всем !

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

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

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

sqlite.png

SQLite for Clarion (Fork)

Добавлено: 26 Ноябрь 2023, 15:09
finsoftrz
Мы сейчас, к слову, подобный проект запускаем, "корпоративное питание" - заказ, приготовление и доставка обедов в офисы. Первые заказы пошли. ERP система на кларионе, в ней вся админка, разработка меню, управление заказами, производство сырье - п/ф - продукция. А для приема заказов адаптивная под разные девайсы страничка на php/javascript, использующая аякс запросы и всплывающие блоки, для оплаты сервис Робокасса. Данные на хостинге публикуются в виде sqlite. Работает красиво.

SQLite for Clarion (Fork)

Добавлено: 26 Ноябрь 2023, 17:04
Игорь Столяров
finsoftrz писал(а): 26 Ноябрь 2023, 15:09 А для приема заказов адаптивная под разные девайсы
Задача вообще для AnyScreen ! :)

SQLite for Clarion (Fork)

Добавлено: 26 Ноябрь 2023, 17:52
finsoftrz
Игорь Столяров писал(а): 26 Ноябрь 2023, 17:04
finsoftrz писал(а): 26 Ноябрь 2023, 15:09 А для приема заказов адаптивная под разные девайсы
Задача вообще для AnyScreen ! :)
Не уверен. Сразу встанут вопросы с адаптивной версткой (чтобы удобно было работать с компьютера/планшета/смартфона) и интеграцией с платежными системами. Плюс поддержка своего сервера в режиме 24х7.
По anyscreen пока темы не всплывают (кроме доступа к картам оплаты и итогам продаж в столовой со стороны сотрудников предприятий, которые кормим, я про это писал). Обычные приложения имеют более удобный и функциональный интерфейс, чем приложения под ayscreen, а варианты ecommerce, типа упомянутого выше, лучше на обычных вебовских инструментах делать - хотя заметно более трудоемко, зато проще в дальнейшем поддерживать.

SQLite for Clarion (Fork)

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

1.jpg

Это я пытался заюзать встроенные функции ToUnicode() / ToAnsi(), но фиг вам - приходите когда будет Clarion 12.
Хотя описание в справке уже есть. :)

SQLite for Clarion (Fork)

Добавлено: 30 Ноябрь 2023, 13:55
kreator
Судя по этому скрину и в C11 уже что-то должно работать. Ладно, подождём. Но я сомневаюсь, что в двенадцатой Юникод полноценно заработает.

SQLite for Clarion (Fork)

Добавлено: 08 Ноябрь 2024, 17:05
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?

Спасибо за внимание.

SQLite for Clarion (Fork)

Добавлено: 08 Ноябрь 2024, 17:36
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;

SQLite for Clarion (Fork)

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

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

SQLite for Clarion (Fork)

Добавлено: 08 Ноябрь 2024, 18:55
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) ! Для полей

SQLite for Clarion (Fork)

Добавлено: 08 Ноябрь 2024, 19:25
Игорь Столяров
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
в любых вариациях с проверкой условий и т.д.

SQLite for Clarion (Fork)

Добавлено: 08 Ноябрь 2024, 19:53
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 )
Чувствуем разницу? :)

SQLite for Clarion (Fork)

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

Интересная задача - это эффективно получить данные из SQLite.
Раскидывать 10 колонок из результата по параметрам ... да это, наверно, упростит какую-то частную задачу.
Мне это не интересно. Заверните, всё что рассказали, в метод и пользуйтесь если нужно. Это не сложно. ;)

SQLite for Clarion (Fork)

Добавлено: 09 Ноябрь 2024, 12:13
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.

Спасибо за внимание

SQLite for Clarion (Fork)

Добавлено: 09 Ноябрь 2024, 19:06
Игорь Столяров
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

Вопросы ? ;)

SQLite for Clarion (Fork)

Добавлено: 09 Ноябрь 2024, 20:04
gopstop2007
У Вас наверное более обновленная tSQLite, у меня ошибка (Unknown function label) на TOY::ANSItoUTF8