Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4      [все]
 Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Не пинайте сильно. :)
Как правильно работать с соединением MySql?
1. Открывать соединение - брать данные - закрывать?
2. Открывать, работать с открытым и поднимать если упало?
6 апр 18, 10:10    [21317716]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
MaestroEv,

Зависит от вкуса)
Я работаю по 2.
6 апр 18, 11:44    [21318099]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Просто нет работы с таймингами и прочими вещами соединений.
Мне проще так, но терзают смутные сомнения.. :)

-Начать соединение, взять данные, закрыть, вывести данные на экран.
-Отредактировать , открыть соединение, записать в базу, закрыть соединение.
То есть всегда на короткий миг открывать соединение только для обращения к базе, потому что самое медленное - это интерфейс.
9 апр 18, 02:29    [21322203]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
asdor
MaestroEv,

Зависит от вкуса)
Я работаю по 2.


Спасибо.
9 апр 18, 02:31    [21322204]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
MaestroEv,
Описанный вами вариант, "открыть -действия- закрыть"
Мне кажется более предпочтительным.

Я держу 1 соединение, из-за некоторых особенностей архитектуры.
(Просто к БД коннектятся, как 1 пользователь, а в бд, есть своя система юзеров, прав, монитора...)
9 апр 18, 07:47    [21322270]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8731
MaestroEv
Как правильно работать с соединением MySql?
1. Открывать соединение - брать данные - закрывать?
2. Открывать, работать с открытым и поднимать если упало?

Это зависит от многих причин.

Не вдаваясь в подробности - если много клиентов у сервера, то однозначно вариант 1 (со стороны разработчика).
Если нагрузка небольшая то можно использовать и вариант 2.

В реальной же жизни - всё зависит от драйвера который Вы используете для connection. И как правило это "смесь" открытых connections in the pool. Дело в том, что предоставление новых connection на стороне сервера довольно затратная операция.
9 апр 18, 09:19    [21322328]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Продолжим.
Часто пользуюсь подобными конструкциями:
**
DEFINE BAR 4 OF sprav PROMPT "\<Справочник" SKIP FOR !DOSTUP("Доступ к справочнику")
ну или
IF DOSTUP("СОЗДАНИЕ_НОВОГО_КЛИЕНТА")
=CREANEWKLI()
ENDIF
***

Ранее в таблицах VFP это работало на ура.
Модуль DOSTUP Обращается к таблицам и проверяет доступ.
В условиях MySQL , полагаю это слишком расточительно и скорость упала до неприемлимой, потому что модуль DOSTUP
теперь всякий раз стучится к MySQL , а это похоже не шустрое мероприятие.. Тем более пунктов меню предостаточно, да и доступов разных в программе масса подобного типа:

Вопросы.
- Правильно ли я полагаю, что надо как-то закэшировать (перенести их во временную директорию фокса) все служебные таблицы (справочники) при первом обращении и уже работать с ними как раньше? Или есть варианты?
Ну и как продолжение .. как тогда проверить дату изменения на сервере таблицы, чтобы это было быстро, без коннекта к MySql, чтобы в случае изменения таблицы на MySql - обновлять ее и на фоксе?

Спасибо.
24 апр 18, 03:22    [21362906]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8731
В общем случае всё зависит от многих причин - скорости Вашего доступа к SQL Server, загруженности самого сервера etc...

Вопросы.
- Правильно ли я полагаю, что надо как-то закэшировать

* правильно, большинство "больших" программ так и работает.

- (перенести их во временную директорию фокса) все служебные таблицы (справочники) при первом обращении и уже работать с ними как раньше?

* в общем не правильно. Данные должны быть уже в памяти приложения. Создайте свой класс кэша в FoxPro - у него должно быть ограничено время, когда кэш устаревает и при новом обращении к массиву данных - происходит обновление с сервера. В MS SQL Server есть встроенная функция оповещения подписчиков если данные за которыми Вы следите - изменились.

** я бы посветовал Вам почитать как работает кэш в ASP.NET. Потом просто перенести архитектуру в VFP (там ничего сложного нет).

*** данные по доступу к отдельным сегментам приложения, не изменяемым справочники системы обычно хранятся в кэше with long expiration time.

**** если пользователь обновляет данные, которые кэшируются - обычно все данные или частично по дате обновления переписываются.

***** для небольших прложений можно использовать технологию replication in MS SQL server. При грамотном распределение данных между подписчиками вполне неплохо получается - в каждой локальной сети у Вас будет по своему SQL Server и соответсвенно с кэшами можно не "заморачиваться"... На клиентах бесплатные урезанные MS SQL сервера.

****** можно посмотреть в сторону MS Azure но я думаю что это пока ещё дороговато да и цены не снижаются...

Good luck!
24 апр 18, 11:08    [21363475]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
Про кэширование конечно хорошо написано.
Но я бы в этом случае, слез с фокса, и писал бы на чем то более адекватном.
Потому, надо бы разобраться откуда тормоз. Может переделать что то в консерватории.
При переходе с файл-сервера, клиент -сервер, иногда и логику надо подтачивать)

MaestroEv
...
Ранее в таблицах VFP это работало на ура.
Модуль DOSTUP Обращается к таблицам и проверяет доступ.
В условиях MySQL , полагаю это слишком расточительно и скорость упала до неприемлимой, потому что модуль DOSTUP
теперь всякий раз стучится к MySQL , а это похоже не шустрое мероприятие.. Тем более пунктов меню предостаточно, да и доступов разных в программе масса подобного типа:


Если общие условия использования ПО не изменились, то работа (правильная) с MySQL по меньшей мере, будет не медленнее чем с табл. фокса.
Ищите где тормоз.
Что касается меню, может при его заполнении, сразу и заполнить 1 раз, что этому юзеру можно что нет, и больше не лазить?
У меня просто иначе реализовано, когда создается объект, из БД получаю, что ему доступно в этом объекте.
И в общем то использую роли, а не персональные настройки
Но это лирика все. Ищите где тормоз.
Не может же там быть ОГРОМНЫЙ запрос.
Такие запросы как правило -миллисекнда, и ни на что не влияют
24 апр 18, 12:31    [21363854]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
asdor,
Да, все так и у меня.
Dostup("добавлениеклиента") или Dostup("редактированиесчета") - это ничто иное как обращение к таблице и считывание есть у пользователя этот доступ или хотите роль.

У Вас обращение к MySQL - это миллисекунды? Вот тут и проблема!!!!!!!!!!!!

В моем случае нет разницы сколько запрашиваю и из какой таблицы.. всегда это 0,8 и более.
Открыть соединение, взять данные, закрыть соединение.

Соответственно, если меню содержит 500 строк кода, и к каждому пункт есть DOSTUP из базы по ролям, то это уже 6 минут на запуск и торможение во время движения по секунде на каждой строке !
25 апр 18, 02:44    [21366394]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Sergey Ch
- (перенести их во временную директорию фокса) все служебные таблицы (справочники) при первом обращении и уже работать с ними как раньше?
* в общем не правильно. Данные должны быть уже в памяти приложения. Создайте свой класс кэша в FoxPro - у него должно быть ограничено время, когда кэш устаревает и при новом обращении к массиву данных - происходит обновление с сервера. В MS SQL Server есть встроенная функция оповещения подписчиков если данные за которыми Вы следите - изменились.
Good luck!


Справочников не мало.. Кэшировать в память? Ну допустим, а что явится сигналом, что кэш устарел? Время?
Или все же событие, что ест изменения в таблицах?
Кто-нить знает, как в MySql узнать, что таблица изменилась, не обращаясь к ней?
Иначе скорость не вырастет и на проверку буду тратить те же 0.8 секунды.
25 апр 18, 03:03    [21366397]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
MaestroEv,
Тогда вернитесь к 1му вопросу.
Создайте коннект, и пользуйтесь им всегда.
Т.е. 1й вариант.
Если скорость вырастет - вот вам и ответ на 1й вопрос.
25 апр 18, 07:36    [21366506]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
asdor,
Пардон - 2й вариант 1го вопроса)
25 апр 18, 07:37    [21366508]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
В моем случае нет разницы сколько запрашиваю и из какой таблицы.. всегда это 0,8 и более.
Открыть соединение, взять данные, закрыть соединение.

Подозреваю что тормоза из-за постоянного открыть-закрыть.
25 апр 18, 07:48    [21366526]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
Dima T
Подозреваю что тормоза из-за постоянного открыть-закрыть.

Когда работал с MySql та же хрень была. Первый толчок был перейти на постоянное соединение.
Правда мускул тогда 3й был.
Думал что то изменилось...
Да и тогда, полагаю, что то в настройках не то было.
MS SQL мгновенно коннектится.
ТС - а почему на мускул переходите?
Есть бесплатные почти у всех.
Пока в процессе, подумайте...)
25 апр 18, 07:58    [21366544]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
Справочников не мало.. Кэшировать в память? Ну допустим, а что явится сигналом, что кэш устарел? Время?
Или все же событие, что ест изменения в таблицах?
Кто-нить знает, как в MySql узнать, что таблица изменилась, не обращаясь к ней?
Иначе скорость не вырастет и на проверку буду тратить те же 0.8 секунды.

Эти вопросы лучше в форуме по MySql задать. Возможно есть какие-то штатные средства для решения твоей задачи.

Можно собственный велосипед изобрести: если изменения относительно редки, то завести в базе отдельную таблицу с одной записью и там хранить дату-время последнего изменения. Менять дату при каждом внесении изменений. Прочитать одну строку займет немного времени, намного меньше 0.8 сек.
Ответ можно кэшировать на несколько сек, тогда при работе с меню будет не 500 обращений к БД, а одно в несколько секунд.
25 апр 18, 07:59    [21366547]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8731
MaestroEv
Соответственно, если меню содержит 500 строк кода, и к каждому пункт есть DOSTUP из базы по ролям, то это уже 6 минут на запуск и торможение во время движения по секунде на каждой строке !


-- таблица с правами доступа как раз первый кандидат для кэширования. И тогда меню будут стриться из таблицы памяти быстрее чем в настоящий момент.

MaestroEv
В моем случае нет разницы сколько запрашиваю и из какой таблицы.. всегда это 0,8 и более.
Открыть соединение, взять данные, закрыть соединение.


-- к сожалению я не знаю архитектуры Вашей системы. Где у Вас SQL server? В локальной сети? Тогда 0.8с это очень много. Как Вам уже посоветовали выше - надо задать этот вопрос на тематическом MySQL форуме (я сейчас в основном работаю с Oracle и MS SQL Server). В общем скорость работы сервера зависит от:
- скорости сети и внутренней firewall
- железа на котором "крутится" MySQL server
- версия - коммерческая/не коммерческая
- клиентский драйвер (очень сильно зависит)
- сколько пользователей в сети

-- по большому счёту я бы отказался от MySQL а пользу MS SQL Server. Можно начать с официально бесплатной версии Express Edition (до 50 пользователей и при правильно архитектуре приложения более чем достаточно). Будет мало - можно купить следующую версию.

-- интересно, скольуко у Вас пользователей? Все они в одной локальной сети? Или есть филиалы?

-- в конфигурации с replication которую я описал выше у нас примерно 800 магазинов от Штатов да Малазии. В каждом магазине по express edition of the MS SQL Server. К этому серверу по локальной сети подключаются кассовые терминалы (до 24 штук в самом большом магазине в Лондонстане). В отведённое время сервер передаёт данные на центральный сервер. Данные сегментированы строго по тому товару, который есть в данном магазине etc... В общем всё просто и надёжно. Перебои в глобальной сети ни на что не влияют, всё работает очень быстро...
25 апр 18, 22:26    [21369313]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8731
Справочников не мало.. Кэшировать в память? Ну допустим, а что явится сигналом, что кэш устарел? Время?

-- если честно, никто не кэширует информацию, с которой работают. Например, при выписке счёта запрашиваются "живые" остатки, одновременно блокируются чтобы кто-то другой не продал Ваш товар. После окончания выписки - база данных обновляется. Я не думаю что при работе с таблицами у Вас другая архитектура.

-- да, кэш устаревает по времени. У нас как правило три градации в зависимости от того, как меняются данные. Справочники подгружаются по мере потребности. При запросе загрузка идёт в кэш и потом уже Вы работает с данными из памяти. Устарели данные - ничего не происходит, пока они Вам снова не потребовались...

Или все же событие, что ест изменения в таблицах?

-- такое есть в MS SQL Server (в MySQL скорее всего нет) называется "SQL Server Notification Services". Почитайте. Мы их использовали немного лет 8 назад, но когда у тебя более 20000 запросов в секунду, этот сервис просто "убивал" наш MS SQL Server и мы отказались в пользу распределённого кэша который устаревает по времени. А Вам может быть и подойдёт.
25 апр 18, 22:38    [21369350]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Сервер находиться где-то в интернете.
Выбор на MySql пал из-за простой возможности сделать на нем сразу инет магазин, чтобы не гонять данные из программы по учету на сайт. Так сказал тот кто пишет сайт.
Фокс выступит как-бы программой для работы продвинутых пользователей, руководства (потому что бизнеслогика вся описана и переход будет не такой болезненный), а через броузер пишем работу продавцов и клиентов..

Ок. Спасибо. Я понял, что решение комплексное. И придется чуть поменять логику работы.. с некоторыми модулями.

А держать соединение MySQL все время открытым - это насколько плохо и почему?

Полученный Запрос невозможно проиндексировать по нескольким полям.. для контекстного поиска.
Есть варианты, или надо его переносить в таблицу для этого?
28 май 18, 06:09    [21445017]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
Сервер находиться где-то в интернете.

...

А держать соединение MySQL все время открытым - это насколько плохо и почему?

В таком случае вообще нельзя разрешать доступ к MySQL извне. Сломают.

Стандартный подход - сделать какое-нибудь WebAPI и работать через него.
28 май 18, 07:22    [21445054]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
MaestroEv
Сервер находиться где-то в интернете.
Выбор на MySql пал из-за простой возможности сделать на нем сразу инет магазин, чтобы не гонять данные из программы по учету на сайт. Так сказал тот кто пишет сайт.

Фокс выступит как-бы программой для работы продвинутых пользователей, руководства (потому что бизнеслогика вся описана и переход будет не такой болезненный), а через броузер пишем работу продавцов и клиентов..
Ок. Спасибо. Я понял, что решение комплексное. И придется чуть поменять логику работы.. с некоторыми модулями.
[/quot]
Ну может чуть, а может и не чуть. Я бы советовал сесть, и нарисовать новую ПРАВИЛЬНУЮ схему БД, с учетом жестких требований безопасности.

MaestroEv
А держать соединение MySQL все время открытым - это насколько плохо и почему?

Ничего плохого в этом нет.

MaestroEv
Полученный Запрос невозможно проиндексировать по нескольким полям.. для контекстного поиска.
Есть варианты, или надо его переносить в таблицу для этого?

Вот тут, мне кажется за вопросом, стоит ошибка в работе.
Тащить клиенту, надо ОЧЕНЬ ограниченный набор данных. Индексировать, для упорядочивания самим клиентом - легко.
А поиск, по небольшому курсору, на фига тратить время на индекс, locate и даже время не заметите. И не надо никаких индексов для этого.
28 май 18, 07:59    [21445099]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Действительно надо привыкать к Locate.
Справляется легко. Более того не нужно думать об индексах. :)
Спасибо.
29 май 18, 06:34    [21448711]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Еще вопросик..
Я получил курсор запросом с MySql. Можно ли как-то в него делать Insert хотя бы одной записи?
8 окт 18, 10:46    [21697780]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
В MSSQL можно, в MySQL не знаю, попробуй, скорее всего вставит.
8 окт 18, 10:49    [21697785]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Да. Вставляет. Спасибо.
8 окт 18, 10:59    [21697797]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Что-то где-то изменилось, не могу понять.
Перестало вставлять записи пока не закроешь соединение.
Вернее вставляю, но их не видят другие программы, кроме моей пока не закрою или не выйду.

Ничего такого вроде не менял.. да и не знаю где.

А если вставить несколько записей - виснет пока не закрою соединение..
Куда смотреть?
23 окт 18, 05:28    [21711779]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
Похоже на не закрытую транзакцию. Почитай хэлп про транзакции.
23 окт 18, 07:10    [21711807]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Таблички ZAKAZ (KOD,KODTOW,KODSTRAN,CENA,KOLVO), TOWAR(KOD,NAIM), STRANA(KOD,NAIM)

Хочу получить табличную часть документа с полями из 2 х других таблиц. Что-то типа:

Select BB.NAIM,AA.CENA,AA.KOLVO,CC.NAIM AS STRANA;
from ZAKAZ AA,TOWAR BB, STRANA CC WHERE ... тут связи и в фоксе это работало так.

Теперь надо это как-то делать через Left Join .
Ни как не въеду в синтаксис.. таких запросов.
Помогите.
25 окт 18, 09:48    [21714516]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
Образец
select ... from A, B where A.b_id = B.b_id

равносильно
select ... from A join B on A.b_id = B.b_id
25 окт 18, 09:59    [21714529]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Dima T
Образец
select ... from A, B where A.b_id = B.b_id

равносильно
select ... from A join B on A.b_id = B.b_id


Спасибо огромное. А если таблиц 3 и более ? Синтаксис не понятен мне. Пишет ошибка, а какая не пойму.
29 окт 18, 07:01    [21717593]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
Три таблицы
select ... from A, B, C where A.b_id = B.b_id and B.c_id = C.c_id

select ... ;
         from A join B on A.b_id = B.b_id ;
                      join C on B.c_id = C.c_id
29 окт 18, 07:20    [21717597]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
[quot MaestroEv]
Dima T
Образец
Спасибо огромное. А если таблиц 3 и более ? Синтаксис не понятен мне. Пишет ошибка, а какая не пойму.

В инете куча материала по SQL
Найдите, прочтите.
Помимо inner join (=where)
есть еще разные виды соединений)))
29 окт 18, 11:43    [21717809]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Спасибо.
30 окт 18, 07:12    [21718537]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Новая беда!!! В фоксе для получения уникального ключа использовал эту функцию:
*********************
DECLARE INTEGER CoCreateGuid IN Ole32.dll STRING @lcGUIDStruc
***
LOCAL cStrucGUID,cGUID,nSize
cStrucGUID=SPACE(16)
IF CoCreateGuid(@cStrucGUID) # 0
RETURN ""
ENDIF
RETURN cStrucGUID
********************
Она возвращает уникальную строку 16 символов (абракадабра). В фоксе все отлично. Но !
При попытке эту запись сохранить в MySQL - данные в этих полях меняются.. :( Это видно даже визуально.
**************************
Генерирую строку INSERT INTO ... VALUES..
Для этого данные беру в кавычки или апострофы, если таковых нет внутри строки.
Ошибку не дает, строка вставляется в MySQL, но данные в таких полях совершенно не те!
*************************
Что делать?
1 ноя 18, 08:44    [21721050]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
MaestroEv,
Вот не понятно.
работает с мускулом, а гуид генерите фоксом?
Каков в этом смысл?
Отдайте это мускулу.
1 ноя 18, 09:36    [21721097]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
Надо сначала гуид в строку конвертировать
+ Попробуй так
func GetGUID
local lcRet, lcGuid, i
lcRet = ''
try
	lcGuid = repl(chr(0), 17)
	DECLARE INTEGER CoCreateGuid IN OLE32.DLL STRING @pGuid
	if CoCreateGuid(@lcGuid) = 0
		lcRet = ToHex(StrToLong(left(lcGuid, 4)), 8) + '-';
				+ ToHex(StrToLong(substr(lcGuid, 5, 2)), 4) + '-';
				+ ToHex(StrToLong(substr(lcGuid, 7, 2)), 4) + '-';
				+ ToHex(StrToLong(substr(lcGuid, 9, 2)), 4) + '-';
				+ ToHex(StrToLong(substr(lcGuid, 11, 4)), 8);
				+ ToHex(StrToLong(substr(lcGuid, 15, 2)), 4)
	endif
catch to oErr
	* вывод сообщения от ошибке oErr
	lcRet = ''
endtry
if empty(lcRet)
	lcRet = 'BAD-GUID-' + chrtran(ttoc(datetime()), '.: ', '---') + '-' + substr(sys(2015), 2)
endif
return lcRet

* Перевод в 16-ную систему счисления
func ToHex
lpara tnValue, tnDigit
local lcRet, lnCifra
lcRet=""
do while tnValue > 0
   lnCifra = tnValue % 16
   tnValue = int(tnValue / 16)
   if lnCifra < 10
      lcRet = chr(lnCifra + 48) + lcRet
   else
      lcRet = chr(lnCifra + 55) + lcRet
   endif
enddo
if !empty(tnDigit) and tnDigit != len(lcRet)
	lcRet = padl(lcRet, tnDigit, '0')
endif
return lcRet

func StrToLong
lpara tcLongStr
local i, lnRet
lnRet = 0
for i = 0 to 24 step 8
   lnRet = lnRet + (asc(tcLongStr) * (2^i))
   tcLongStr = right(tcLongStr, len(tcLongStr) - 1)
NEXT
RETURN lnRet 
1 ноя 18, 09:44    [21721106]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Может есть какая-нибудь настройка или тип или еще что, чтобы MySql просто сохранял все как есть?
Меня бы это устроило больше всего.

Еще к размышлению...

Таблицы перенесенные целиком в MySql содержат все эти поля. И все нормально!
Старые данные работают и в полях правильные символы!

То есть беда с переносом одной строки! INSERT INTO ... VALUES...
Нужно как-то иначе экранировать значение этих полей.
1 ноя 18, 12:19    [21721333]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
asdor
MaestroEv,
Вот не понятно.
работает с мускулом, а гуид генерите фоксом?
Каков в этом смысл?
Отдайте это мускулу.


Математика вся на фоксе и она работает и ее не остановить без существенной потери денег.
MySQL - хранилище и то для того, чтобы прикрутить инет магазин сразу к данным.
1 ноя 18, 12:21    [21721336]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Penner
Member

Откуда:
Сообщений: 305
Select UUID() AS MyID
1 ноя 18, 12:43    [21721375]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
Может есть какая-нибудь настройка или тип или еще что, чтобы MySql просто сохранял все как есть?
Меня бы это устроило больше всего.

Еще к размышлению...

Таблицы перенесенные целиком в MySql содержат все эти поля. И все нормально!
Старые данные работают и в полях правильные символы!

Проблема в том что твой гуид это не строка, а бинарные данные. Для фокса нет разницы что ему вставили в строку, и при сохранении/чтении в/из dbf проблем не будет, но как только ты пытаешься залить это куда-то на сторону (например в MySQL), то сразу начинаются проблемы из-за того что это не строка в общепринятом понимании и там встречаются недопустимые символы.

Как вариант сделать под гуид тип поля BLOB

MaestroEv
То есть беда с переносом одной строки! INSERT INTO ... VALUES...
Нужно как-то иначе экранировать значение этих полей.

Для этого есть параметризованные запросы
my_guid = ...
sqlexec(h, " INSERT INTO ...  (guid) VALUES (@my_guid) ")
1 ноя 18, 15:18    [21721635]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Karbafos
Member

Откуда:
Сообщений: 453
MaestroEv
Генерирую строку INSERT INTO ... VALUES..
Для этого данные беру в кавычки или апострофы, если таковых нет внутри строки.
Ошибку не дает, строка вставляется в MySQL, но данные в таких полях совершенно не те!
*************************
Что делать?


1. бинарные данные, всегда 16 байт, для этого надо использовать тип поля binary(16)
2. чтобы гарантированно без ошибок вставить 16 байтовый бинарник, надо его перевести сначала в hex, а потом сделать вот так

INSERT INTO sometable (MyGUID) VALUES (UNHEX("8f0aaf63a93c11e4949700105690993f"))

в любом другом случае генерить sql нельзя, и нужно использовать prepared statements в том драйвере, какой есть в используемом языке
1 ноя 18, 19:37    [21721896]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Спасибо всем. Докладываю.
******************
Есть решение - экранирование некоторых символов. Ничего более не менял. Заработало!
*****************
FUNCTION STRESC
LPARAMETERS M.STR
M.str = STRTRAN(M.str, "'", "\'")
M.str = STRTRAN(M.str, '"', '\"')
M.str = STRTRAN(M.str, '\', '\\')
M.str = STRTRAN(M.str, CHR(0), '\x00')
M.str = STRTRAN(M.str, CHR(10), '\n')
M.str = STRTRAN(M.str, CHR(13), '\r')
M.str = STRTRAN(M.str, CHR(26), '\x1A')
RETURN M.STR
6 ноя 18, 12:09    [21725055]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Dima T
Три таблицы
select ... from A, B, C where A.b_id = B.b_id and B.c_id = C.c_id

select ... ;
         from A join B on A.b_id = B.b_id ;
                      join C on B.c_id = C.c_id


Еще вопрос.. А если с дочерней таблицы надо вытащить несколько разных значений как правильно написать?

В основной таблице PSWautor - код на Id автора записи, PSWmodi код на Id модератора записи и так далее.

Результат - табличка с именами их..

В фоксе делал так :
Select aa.*,naimpolz(aa.PSWautor) as autor,naimpolz(aa.PSWmodi) as modi from dokument aa ...

Никаких джоинов - Фокс - лучший язык!
Как сделать это теперь?
8 ноя 18, 06:38    [21727613]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
В фоксе делал так :
Select aa.*,naimpolz(aa.PSWautor) as autor,naimpolz(aa.PSWmodi) as modi from dokument aa ...

Никаких джоинов - Фокс - лучший язык!
Как сделать это теперь?

Почитал бы уже про SQL. Ничего сложного там нет и работает даже в фоксе.

Select d.*, au.name as autor, am.name as modi ;
          from dokument d join PSWautor au on d.PSWautor = au.id;
                  join PSWautor am on d.PSWautor = am.id
8 ноя 18, 07:25    [21727629]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
Немного напутал, так правильно
Select d.*, au.name as autor, am.name as modi ;
          from dokument d join PSWautor au on d.PSWautor = au.id;
                  join PSWautor am on d.PSWmodi = am.id
8 ноя 18, 07:26    [21727633]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Спасибо огромное, не пинайте :)
Не нашел нужных примеров в инете.
Там все или простенькое или как-то не так и из-за этого синтаксиса теряю часы..
8 ноя 18, 10:28    [21727797]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
С Join разобрался. Прикольно. Спасибо. Стало прям приятно программировать.

Но вот NULL убрать бы.. Пусть будет пустая строка.

Я убираю его уже в самом ГРИД отображении, но может есть способ сразу в настройках MySQl при отсутствии значения в Join
втыкать не Null, а пустое поле как в фоксе?
13 ноя 18, 07:32    [21732523]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
IFNULL() аналог фоксового NVL()
13 ноя 18, 07:40    [21732526]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Dima T
IFNULL() аналог фоксового NVL()


Это придется каждое поле обернуть функцией, что ухудшит читаемость кода.. Есть решения изящней? Устроила бы глобальная настройка MySQL, при которой NULL вообще заменяется сразу на пустое строковое значение.


Вопросы усложняются .. :)
В фоксе писал так:

Select *, KOLVYD(KODDOK,KODTOW) AS KOLVYD,KOLREZ(KODDOK,KODTOW) AS KOLREZ,KOLVOZ(KODDOK,KODTOW) AS KOLVOZ ;
where KODDOK=M.KODDOK from PozSce into curs poziciischeta

Используя функции в SELECT получал в результате таблицу с рассчитанными итогами из других таблиц..
В функциях обращения к другим таблицам и суммирование по товару по этому же счету.

Чем заменить ? Каков синтаксис? Не могу даже в поисковике сформулировать правильно, что я хочу на MySql.. :((
Как это делают на языке далеком от Фокса? :)
13 ноя 18, 09:08    [21732556]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
Это придется каждое поле обернуть функцией, что ухудшит читаемость кода..

Зачем каждое? JOIN (он же INNER JOIN) не даст в результат NULL, кроме того который получен из таблицы.

Если надо каждое, то проблема совсем в другом месте. База коряво спроектирована. Если тебе не надо чтобы в базе хранились NULL то откуда они там взялись?

MaestroEv
Есть решения изящней? Устроила бы глобальная настройка MySQL, при которой NULL вообще заменяется сразу на пустое строковое значение.

Именно такой настройки нет, но есть значение по умолчанию для колонки, задай там по умолчанию '' и замени уже существующие NULL на ''

Если все спроектировано правильно, то заменять NULL на '' надо только для тех таблиц, которые присоединяются LEFT/RIGHT/FULL JOIN.
13 ноя 18, 09:24    [21732580]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Dima T
MaestroEv
Это придется каждое поле обернуть функцией, что ухудшит читаемость кода..

Зачем каждое? JOIN (он же INNER JOIN) не даст в результат NULL, кроме того который получен из таблицы.

Если надо каждое, то проблема совсем в другом месте. База коряво спроектирована. Если тебе не надо чтобы в базе хранились NULL то откуда они там взялись?

MaestroEv
Есть решения изящней? Устроила бы глобальная настройка MySQL, при которой NULL вообще заменяется сразу на пустое строковое значение.

Именно такой настройки нет, но есть значение по умолчанию для колонки, задай там по умолчанию '' и замени уже существующие NULL на ''

Если все спроектировано правильно, то заменять NULL на '' надо только для тех таблиц, которые присоединяются LEFT/RIGHT/FULL JOIN.



Ну так полей много, связей тоже много в одном запросе.. в основной таблице хранятся же только коды..
Реальные значения в справочниках все.. придется все поля, которые в Join обернуть функцией.. Ок.
13 ноя 18, 09:36    [21732596]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1370
MaestroEv
Ну так полей много, связей тоже много в одном запросе.. в основной таблице хранятся же только коды..
Реальные значения в справочниках все.. придется все поля, которые в Join обернуть функцией.. Ок.
Еще раз, для плохо читающих:
DimaT
Если надо каждое, то проблема совсем в другом месте. База коряво спроектирована. Если тебе не надо чтобы в базе хранились NULL то откуда они там взялись?
13 ноя 18, 09:43    [21732603]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
Повторюсь: если справочник присоединяется с помощью JOIN (он же INNER JOIN) и в справочнике нет NULL, то в результате не будет ни одного NULL.

Т.е. в таком запросе
select * from A join B on A.b_id = B.b_id

не будет ни одного NULL если A и B не содержат NULL.
Если будут записи где А.b_id = NULL, то такие записи будут проигнорированы и в результат не попадут.
13 ноя 18, 09:45    [21732605]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Что-то мы о разном..
Пример .. представим в основной таблице - некоторые поля могут быть пустыми или ссылки устареть и уже их может не быть в справочниках (пример искусственный для понимания NULL) .

Id,data, iddok, idpsw, idvid, idtowar, idklient, и так далее .. cena, kolvo

В справочниках (пишу по русски для простоты)
1. id,названиедокумента
2. id,имяпользователя
3. id,группатоваров
4. id,товар
5. id,klient

Теперь когда я LEFT JOIN получу итоговую таблицу для ГРИД - там будет куча Null для тех, для кого не нашелся ID в справочнике или не заполнен ID справочника в основной таблице.
Что не так?
13 ноя 18, 10:43    [21732695]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Еще вопрос .. наверное о подзапросах. Я ими в фоксе никогда не пользовался.

В фоксе писал так:
Select *, KOLVYD(KODDOK,KODTOW) AS KOLVYD,KOLREZ(KODDOK,KODTOW) AS KOLREZ,KOLVOZ(KODDOK,KODTOW) AS KOLVOZ ;
where KODDOK=M.KODDOK from PozSce into curs poziciischeta

Используя функции в SELECT получал в результате таблицу с рассчитанными итогами из других таблиц.. и не используя вложенных запросов.
В функциях обращения к другим таблицам и суммирование по товару по этому же счету.

Чем заменить ? Каков синтаксис? Не могу даже в поисковике сформулировать правильно, что я хочу на MySql.. :((
Как это делают на языке далеком от Фокса? :)
13 ноя 18, 10:45    [21732700]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1370
MaestroEv
Что-то мы о разном..
Угу, пустота и NULL - две очень большие разницы.
Пример .. представим в основной таблице - некоторые поля могут быть пустыми
И опять не надо путать пустоту в полях с NULL
или ссылки устареть и уже их может не быть в справочниках (пример искусственный для понимания NULL) .
А это уже мусор в данных. Какого лешего он там есть?
13 ноя 18, 11:25    [21732762]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Вот рабочая вырезка из программы.
"SELECT S.*,K.NAIM AS NKLI,P.POLZ AS AVTOR,R.NOMER AS REZERV,PRJ.NOMER AS NPROJ,REM.NOMER AS NREM,BON.SUMMA AS
SUMBON,DOG.DATABEGIN AS DOG FROM DOKUMSCH S ;
LEFT JOIN DOKUMREZ R ON S.KOD=R.KODSCE ;
LEFT JOIN KLIENT K ON S.KODKLI=K.KODKLI "
LEFT JOIN BONUSDVI BON ON S.KOD=BON.KODSCE ;
LEFT JOIN DOGOVOR DOG ON S.KOD=DOG.SCHET ;
LEFT JOIN DOKUMREM REM ON S.KODREM=REM.KOD ;
LEFT JOIN PROJS PRJ ON S.KODPROJ=PRJ.KOD "
LEFT JOIN PSW P ON S.PSW=P.NOMERPSW "+M_WHERE+" LIMIT 80"

В некоторых полях в результате NULL вместо названий из справочников, потому что не заполнены соответсвующие поля.
И единственный вариант все поля обернуть функцией ISNULL? Читаемости кода не будет..
13 ноя 18, 11:26    [21732764]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Sergey Sizov.
Данные хранятся как надо мне. К ним претензий нет.
В основной базе просто может быть даже не заполнены некоторые ссылки на справочники совсем.
Тогда JOIN вернет NULL . Вот об этом речь.
13 ноя 18, 11:28    [21732766]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Или в каждом справочнике надо завести запись с пустым ID?
Так делают?
13 ноя 18, 11:30    [21732769]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1370
MaestroEv
Вот рабочая вырезка из программы.
"SELECT S.*,K.NAIM AS NKLI,P.POLZ AS AVTOR,R.NOMER AS REZERV,PRJ.NOMER AS NPROJ,REM.NOMER AS NREM,BON.SUMMA AS
SUMBON,DOG.DATABEGIN AS DOG FROM DOKUMSCH S ;
LEFT JOIN DOKUMREZ R ON S.KOD=R.KODSCE ;
LEFT JOIN KLIENT K ON S.KODKLI=K.KODKLI "
LEFT JOIN BONUSDVI BON ON S.KOD=BON.KODSCE ;
LEFT JOIN DOGOVOR DOG ON S.KOD=DOG.SCHET ;
LEFT JOIN DOKUMREM REM ON S.KODREM=REM.KOD ;
LEFT JOIN PROJS PRJ ON S.KODPROJ=PRJ.KOD "
LEFT JOIN PSW P ON S.PSW=P.NOMERPSW "+M_WHERE+" LIMIT 80"

В некоторых полях в результате NULL вместо названий из справочников, потому что не заполнены соответсвующие поля.
И единственный вариант все поля обернуть функцией ISNULL? Читаемости кода не будет..
Потрясающе! А мужики то и не знают! Вот уж несколько десятков лет...
Можно подумать ваша портянка читаема, хоть и без isnull().
13 ноя 18, 13:15    [21732925]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1370
MaestroEv
Sergey Sizov.
Данные хранятся как надо мне. К ним претензий нет.
От вас? Может быть. Но вот со стороны здравого смысла и принципов работы и проектирования баз данных таки есть.
В основной базе просто может быть даже не заполнены некоторые ссылки на справочники совсем.
Тогда JOIN вернет NULL . Вот об этом речь.
Речь о том, что некоторые плохо понимают зачем и почему в базах данных используется троичная логика и пытаются под это плохо понимание поломать используемый инструмент. В частности, отключить нафиг эту самую троичную логику. Её ведь идиоты придумали. Сами не знали что творили...
13 ноя 18, 13:20    [21732935]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
В некоторых полях в результате NULL вместо названий из справочников, потому что не заполнены соответсвующие поля.
И единственный вариант все поля обернуть функцией ISNULL? Читаемости кода не будет..

Читаемости это не повредит. В текущем виде читаемости уже нет.

PS В MySQL не ISNULL(), а IFNULL()
13 ноя 18, 15:28    [21733130]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
Или в каждом справочнике надо завести запись с пустым ID?
Так делают?

Можно и так поступить. Добавь в каждую таблицу пустую запись с ID=0 и ставь в родительской таблице значением по умолчанию 0.

Я только не понял чем тебя не устроило
SET NULLDISPLAY TO ''
13 ноя 18, 15:31    [21733138]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8731
MaestroEv
Как это делают на языке далеком от Фокса? :)

MySQL имеет очень неразвитый/примитвный диалект SQL языка.

В T-SQL (MS SQL Server) или PL-SQL (Oracle) можно создавать в запросе временную выборку как и в FoxPro с помощью оператора "WITH".
14 ноя 18, 12:07    [21734004]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Dima T
MaestroEv
Или в каждом справочнике надо завести запись с пустым ID?
Так делают?

Можно и так поступить. Добавь в каждую таблицу пустую запись с ID=0 и ставь в родительской таблице значением по умолчанию 0.

Я только не понял чем тебя не устроило
SET NULLDISPLAY TO ''


Ура!!!! Просто я не знал, что есть такое!!!
Спасибо. Вопрос закрыт.
15 ноя 18, 07:51    [21734778]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Sergey Sizov.
Сергей, русские форумы по программированию отличаются тем, что вместо простого ответа на вопрос - некоторые пытаются учить вас программировать как им хочется. Не тратьте время. Моя программа работает с 2000 года. В ней все так как мне надо. Она вся работает в PRG модулях. Да. До сих пор. На нескольких разнесенных по стране магазинов с репликациями на фоксе - я один программист. Репликации тоже просто отправка-приемка текстовых файлов с данными - для простоты. Даже серверов как таковых нет - это обычные компы. Все исправления делаю легко из-за этого .. хоть с телефона находясь у моря.. и каждый пользователь войдя в программу получает тут же новую версию. Я не тестирую их даже , потому что все модули просты. Их много, но они просты.
Мне на исправления различные уходит минимум времени, потому что основа программы - простота каждого модуля и читаемость.

Пользователю важен результат и скорость.

Никого не интересует как это устроено внутри. Все правила программирования хороши для своей задачи.
Я не пишу программу управления полетами - это просто торговая программа. В ней все просто. 3000 операций в день не больше.

Денормализации в ней ровно столько, чтобы хватило ей работать на обычных компах вместо серверов в отличии от 1С.
Чтобы не надо было ее инсталлировать, а можно было просто скопировать и работать. И так все.

Оказывается есть вот такая штука. SET NULLDISPLAY TO '' я не знал о ее существовании. Спасибо.
15 ноя 18, 08:05    [21734782]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Как заменить использование функции в запросах на подзапрос?

Было так
Select *, KOLVYD(KODDOK,KODTOW) AS KOLVYD,KOLREZ(KODDOK,KODTOW) AS KOLREZ,KOLVOZ(KODDOK,KODTOW) AS KOLVOZ ;
where KODDOK=M.KODDOK from PozSce into curs poziciischeta

Каков синтаксис? В поиске по MySQL - нет похожих примеров - там обычно просто поиск в подзапросе типа есть или нет, а мне надо сумму в подзапросе вернуть или строку - в общем, значение.
15 ноя 18, 08:09    [21734787]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
Как заменить использование функции в запросах на подзапрос?

в общем случае никак. Надо смотреть что именно делает функция.

MaestroEv
Было так
Select *, KOLVYD(KODDOK,KODTOW) AS KOLVYD,KOLREZ(KODDOK,KODTOW) AS KOLREZ,KOLVOZ(KODDOK,KODTOW) AS KOLVOZ ;
where KODDOK=M.KODDOK from PozSce into curs poziciischeta

Что конкретно делают KOLVYD(), KOLREZ() и т.д. ?

MaestroEv
В поиске по MySQL - нет похожих примеров - там обычно просто поиск в подзапросе типа есть или нет, а мне надо сумму в подзапросе вернуть или строку - в общем, значение.

Скорее всего надо использовать группировку group by
Точнее смогу сказать если на вопрос выше ответишь
15 ноя 18, 08:22    [21734789]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Dima T
MaestroEv
Как заменить использование функции в запросах на подзапрос?

в общем случае никак. Надо смотреть что именно делает функция.

MaestroEv
Было так
Select *, KOLVYD(KODDOK,KODTOW) AS KOLVYD,KOLREZ(KODDOK,KODTOW) AS KOLREZ,KOLVOZ(KODDOK,KODTOW) AS KOLVOZ ;
where KODDOK=M.KODDOK from PozSce into curs poziciischeta

Что конкретно делают KOLVYD(), KOLREZ() и т.д. ?

MaestroEv
В поиске по MySQL - нет похожих примеров - там обычно просто поиск в подзапросе типа есть или нет, а мне надо сумму в подзапросе вернуть или строку - в общем, значение.

Скорее всего надо использовать группировку group by
Точнее смогу сказать если на вопрос выше ответишь


KOLVYD - суммирует количество выданных товаров по этому счету - их таблицы в накладных
KOLREZ - суммирует количество зарезервированного товара по этому счету - из таблицы резервов
KOLVOZ - аналогично возвраты.
15 ноя 18, 09:17    [21734809]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1370
MaestroEv
Сергей, русские форумы по программированию отличаются тем, что вместо простого ответа на вопрос - некоторые пытаются учить вас программировать как им хочется.
Стандартный набор отмаз олдскула. Вы прямо таки открыли мне глаза! Описали прямо таки уникальный случай, первый в моей практике за 20+ лет.
MaestroEv
Оказывается есть вот такая штука. SET NULLDISPLAY TO '' я не знал о ее существовании.
Похоже, вы не знаете о существовании еще многих вещей. В частности, сия настройка просто не показывает NULL не изменяя само содержимое поля. Вас ждет много граблей в связи с этим. Желаю удачи в деле обоснования нежелания учить и понимать новое для себя.
15 ноя 18, 09:23    [21734812]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
KOLVYD - суммирует количество выданных товаров по этому счету - их таблицы в накладных
KOLREZ - суммирует количество зарезервированного товара по этому счету - из таблицы резервов
KOLVOZ - аналогично возвраты.

Select *, VYD.KOLVYD;
   from PozSce left join (select KODTOW, sum(kolvo) as KOLVYD from ... where KODDOK=M.KODDOK group by KODTOW) VYD on PozSce.KODTOW = VYD.KODTOW;
   where KODDOK=M.KODDOK;
   into curs poziciischeta 

по аналогии с выделенным добавь KOLREZ и KOLVOZ

group by и sum() можно не писать если товары в счете никогда не повторяются.
15 ноя 18, 09:58    [21734842]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Не получается..
Все чуть сложнее и пляски с синтаксисом не помогли. Прошу помощи.

1.Хочу получить записи позиций в счете.
2. У счета бывает несколько накладных (шапки и позиции). Шапка имеет ссылку на счет.
В позициях накладной есть товары, такие же как в счете или бывает, что нет.
3. У счета бывают несколько резервов (шапки и позиции). Шапка имеет ссылку на счет.
В позициях резерва есть товары, такие же как в счете или бывает, что нет.
4. У счета бывают возвраты (только позиции - все в них, ибо возвращают как правило единично).
5. Название товара хранится в базе номенклатуры.

Речь о том что в подселекте надо выбрать все накладные к этому счету , а уже в них товар.
Вот так не работает, может потому, что в подселекте нельзя обращаться к таблицам снаружи его? А как тогда?

.... LEFT JOIN (SELECT BB.KODTOW,SUM(BB.KOLVO) AS KOLVYD FROM DOKUMNAK AA,NAKLAD BB WHERE AA.KODSCE=SC.KODDOK GROUP BY KODTOW) VYD ON SC.KODTOW = VYD.KODTOW
27 ноя 18, 07:55    [21745658]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1370
MaestroEv
Не получается..
И почему-то я совсем не удивлен...
Вот так не работает, может потому, что в подселекте нельзя обращаться к таблицам снаружи его?
не может. Можно и даже нужно обращаться в подзапросе к данным основного запроса. Вы опять ищете не там,где потеряли, а там, где светлее.
А как тогда?

.... LEFT JOIN (SELECT BB.KODTOW,SUM(BB.KOLVO) AS KOLVYD FROM DOKUMNAK AA,NAKLAD BB WHERE AA.KODSCE=SC.KODDOK GROUP BY KODTOW) VYD ON SC.KODTOW = VYD.KODTOW
Откройте для себя алиасы в запросах.
27 ноя 18, 09:06    [21745695]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
Ну алиасы то у него есть. Название их.... по мне так, не очень )))
Выброс мозга, с пункатми, вряд ли кто то поймет (хотя, телепатов хватает)
Непонятно что хотите. Ясно, что то угодно, только не учиться.

Dima T привел вам рабочий запрос, вы его модернизировали... ну так подумайте немного, почитайте.
Должно быть примерно так.
LEFT JOIN (SELECT BB.KODTOW,SUM(BB.KOLVO) AS KOLVYD,AA.KODSCE FROM DOKUMNAK AA,NAKLAD BB GROUP BY KODTOW,AA.KODSCE) VYD ON SC.KODTOW = VYD.KODTOW and SC.KODDOK=VYD.KODSCE

При чем тут выше написнный вами поток сознания, совершенно не ясно.
Вы хоть для себя то, нормальным, техническим языком, напишите ТЗ, уйдя от фраз типа "1.Хочу получить записи позиций в счете. " на технический язык.
27 ноя 18, 09:21    [21745703]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

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

Счет один или много? Если один, как в примере выше 21734842, то
... LEFT JOIN (
      SELECT BB.KODTOW, SUM(BB.KOLVO) AS KOLVYD 
                 FROM DOKUMNAK AA join NAKLAD BB on AA.??? = BB.??? WHERE AA.KODSCE=M.KODDOK 
                 GROUP BY KODTOW
         ) ...


Если много, то давай структуру таблиц, можно только используемые поля (по которым связи и данные, участвующие в расчетах).

PS Читай книжки.
27 ноя 18, 10:00    [21745736]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Спасибо. Стало лучше. Поле в запросе итоговом уже есть. Но оно пока пустое, предполагаю, что там Null.

SELECT SC.*,TW.NAIM AS NTOW,TW.CENA_ZAK AS CENA_ZAK,VYD.KOLVYD FROM SCHETA SC ;
LEFT JOIN TOWAR TW ON SC.KODTOW=TW.KODTOW ;
LEFT JOIN (SELECT BB.KODTOW,SUM(BB.KOLVO) AS KOLVYD,AA.KODSCE FROM DOKUMNAK AA,NAKLAD BB GROUP BY BB.KODTOW,AA.KODSCE) VYD ON SC.KODTOW = VYD.KODTOW AND SC.KODDOK=VYD.KODSCE WHERE SC.KODDOK=?M_KODSCE

Что не так? Естественно накладные есть и позиции в них тоже есть. Почему полученный подзапрос не возвращает количество?

Я бы с радостью почитал, о том как писать такие запросы, но даже не могу найти примера подобного.
Ваши примеры мне сильно помогают: с Left Join - уже нет проблем.
27 ноя 18, 10:19    [21745757]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Dima T
MaestroEv,

Счет один или много? Если один, как в примере выше 21734842, то
... LEFT JOIN (
      SELECT BB.KODTOW, SUM(BB.KOLVO) AS KOLVYD 
                 FROM DOKUMNAK AA join NAKLAD BB on AA.??? = BB.??? WHERE AA.KODSCE=M.KODDOK 
                 GROUP BY KODTOW
         ) ...


Если много, то давай структуру таблиц, можно только используемые поля (по которым связи и данные, участвующие в расчетах).

PS Читай книжки.


Спасибо. То есть подселект - может быть как обычный селект? Вот такой синтаксис мне понятен, но дает ошибку. Что не так?
Можно же внутри без Join? 18 лет в фоксе без джин обходился :(

... LEFT JOIN (SELECT SUM(BB.KOLVO) AS KOLVYD,BB.KODTOW FROM DOKUMNAK AA,NAKLAD BB GROUP BY KODTOW WHERE AA.KODSCE=?M_KODSCE AND AA.KOD=BB.KODDOK) VYD ON SC.KODTOW = VYD.KODTOW WHERE SC.KODDOK=?M_KODSCE...
27 ноя 18, 10:31    [21745774]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
Ты бы код форматировал прежде чем сюда постить
SELECT SC.*,TW.NAIM AS NTOW,TW.CENA_ZAK AS CENA_ZAK,VYD.KOLVYD 
    FROM SCHETA SC
       LEFT JOIN TOWAR TW ON SC.KODTOW=TW.KODTOW ;
       LEFT JOIN (SELECT BB.KODTOW,SUM(BB.KOLVO) AS KOLVYD,AA.KODSCE 
                        FROM DOKUMNAK AA,NAKLAD BB 
                        GROUP BY BB.KODTOW,AA.KODSCE
             ) VYD ON SC.KODTOW = VYD.KODTOW AND SC.KODDOK=VYD.KODSCE 
    WHERE SC.KODDOK=?M_KODSCE

В выделенной строке join надо.
27 ноя 18, 10:34    [21745777]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
Можно же внутри без Join? 18 лет в фоксе без джин обходился :(

Можно, но не нужно. Читать такой запрос неудобно. С join понятно где условие связи таблиц, а где условия отбора. Если все упихать во where то получается каша, особенно если таблиц намного больше двух. Лучше привыкай к join. Фокс join тоже понимает.
27 ноя 18, 10:39    [21745783]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
То есть подселект - может быть как обычный селект? Вот такой синтаксис мне понятен, но дает ошибку. Что не так?

Да, подселект можно запустить без внешнего, если не используются поля внешнего.

SELECT SUM(BB.KOLVO) AS KOLVYD,BB.KODTOW 
          FROM DOKUMNAK AA,NAKLAD BB 
          WHERE AA.KODSCE=?M_KODSCE AND AA.KOD=BB.KODDOK
          GROUP BY KODTOW 

Сначала пишется WHERE а потом GROUP BY.
Фокс такое пропустит, а MySQL ругнется. В остальном вроде правильно.
27 ноя 18, 10:49    [21745792]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Dima T
MaestroEv
Можно же внутри без Join? 18 лет в фоксе без джин обходился :(

Можно, но не нужно. Читать такой запрос неудобно. С join понятно где условие связи таблиц, а где условия отбора. Если все упихать во where то получается каша, особенно если таблиц намного больше двух. Лучше привыкай к join. Фокс join тоже понимает.


Согласен. Так удобнее читать. Теперь уже в MySQL придется все писать как надо.

Дает ошибку. Что не так? Без Where в подзапросе - виснет насмерть.

...LEFT JOIN (SELECT SUM(BB.KOLVO) AS KOLVYD,BB.KODTOW,AA.KODSCE FROM DOKUMNAK AA JOIN NAKLAD BB ON AA.KOD=BB.KODDOK GROUP BY BB.KODTOW,AA.KODSCE WHERE AA.KODSCE=?M_KODSCE) VYD ON SC.KODTOW = VYD.KODTOW AND SC.KODDOK=VYD.KODSCE WHERE SC.KODDOK=?M_KODSCE...
27 ноя 18, 10:52    [21745794]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Dima T
MaestroEv
То есть подселект - может быть как обычный селект? Вот такой синтаксис мне понятен, но дает ошибку. Что не так?

Да, подселект можно запустить без внешнего, если не используются поля внешнего.

SELECT SUM(BB.KOLVO) AS KOLVYD,BB.KODTOW 
          FROM DOKUMNAK AA,NAKLAD BB 
          WHERE AA.KODSCE=?M_KODSCE AND AA.KOD=BB.KODDOK
          GROUP BY KODTOW 

Сначала пишется WHERE а потом GROUP BY.
Фокс такое пропустит, а MySQL ругнется. В остальном вроде правильно.


Огромное спасибо. Значит справлюсь. Отдельно протестирую подселект.
А вообще в подселекте в итоговом селекте использовать поля внешнего можно?
27 ноя 18, 11:20    [21745823]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
А вообще в подселекте в итоговом селекте использовать поля внешнего можно?

Можно, но нежелательно. В этом случае для каждой записи внешнего запроса будет выполнен отдельный подзапрос.
Т.е. подзапрос отработает много раз и в результате получим тормоз.
Хотя возможно оптимизатор найдет более удачный план выполнения запроса и тормозов не будет.
27 ноя 18, 12:44    [21745962]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Спасибо.
Очередной вопрос. Они усложняются. :)

Таблица Naklad ссылается полем kodsce на таблицу Schet в которой есть поле kodkli - ссылка на таблицу Klient.

Мне надо выбрать накладные и в них показать имя клиента, ссылка на которого есть только в счете.
Пример такого синтаксиса покажите, плиз?
7 дек 18, 07:08    [21756565]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
asdor
Member

Откуда: Москва
Сообщений: 435
select k.name
from Naklad  n inner join
Schet s on n.kodsce =s.id inner join
Klient k on s.kodkli = k.id

Прочтите что нибудь на эту тему
7 дек 18, 07:47    [21756581]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
С новым годом! Приветствую всех.

Еще один вид селектов используемых мной в Фоксе не могу перевести на язык MySql.
Надо определить если ли заказ этого товара в этот день?
То есть выбрать записи из таблицы-шапки(DOKUMZAP и таблицы-позиции(ZAP) те, у которых в шапке дата нужная, а позициях есть товар нужный.

Делал на Фоксе так:
*********************
PARAMETERS M.SYSDAT,M.KODTOW
********************
SELECT AA.KOD,AA.NOMER,AA.DATA,BB.KOLVO,BB.CENA,BB.KODTOW,AA.DOPOL FROM DOKUMZAP AA,ZAK BB ;
WHERE AA.DATA=M.SYSDAT AND AA.KOD=BB.KODDOK AND BB.KODTOW=M.KODTOW INTO CURS ExistZAP
********************
Понимаю, что надо делать Join, но как бы какую вязать к какой Шапку к позициям или позиции к шапке?
Нет уверенности. Помогите.
10 янв 19, 07:15    [21781194]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
Я же это уже писал 21714529

Тут обычный join
SELECT AA.KOD,AA.NOMER,AA.DATA,BB.KOLVO,BB.CENA,BB.KODTOW,AA.DOPOL ;
    FROM DOKUMZAP AA join ZAK BB on AA.KOD=BB.KODDOK;
    WHERE AA.DATA=M.SYSDAT AND BB.KODTOW=M.KODTOW
10 янв 19, 07:20    [21781196]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
MaestroEv
Member

Откуда: г.Благовещенск
Сообщений: 266
Спасибо. То есть в JOIN нет особой разницы какую таблицу к какой вязать?
Это я себе лишнего накрутил?
10 янв 19, 07:40    [21781207]     Ответить | Цитировать Сообщить модератору
 Re: Правильная работа с MySQL  [new]
Dima T
Member

Откуда:
Сообщений: 13023
MaestroEv
Спасибо. То есть в JOIN нет особой разницы какую таблицу к какой вязать?

Если речь о том что "AA join BB" или "BB join AA", то без разницы. Оба варианта равнозначны.
10 янв 19, 07:48    [21781208]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / FoxPro, Visual FoxPro Ответить