powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Правильная работа с MySQL
97 сообщений из 97, показаны все 4 страниц
Правильная работа с MySQL
    #39626590
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пинайте сильно. :)
Как правильно работать с соединением MySql?
1. Открывать соединение - брать данные - закрывать?
2. Открывать, работать с открытым и поднимать если упало?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39626684
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEv,

Зависит от вкуса)
Я работаю по 2.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39627341
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто нет работы с таймингами и прочими вещами соединений.
Мне проще так, но терзают смутные сомнения.. :)

-Начать соединение, взять данные, закрыть, вывести данные на экран.
-Отредактировать , открыть соединение, записать в базу, закрыть соединение.
То есть всегда на короткий миг открывать соединение только для обращения к базе, потому что самое медленное - это интерфейс.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39627342
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asdorMaestroEv,

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

Спасибо.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39627358
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEv,
Описанный вами вариант, "открыть -действия- закрыть"
Мне кажется более предпочтительным.

Я держу 1 соединение, из-за некоторых особенностей архитектуры.
(Просто к БД коннектятся, как 1 пользователь, а в бд, есть своя система юзеров, прав, монитора...)
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39627375
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvКак правильно работать с соединением MySql?
1. Открывать соединение - брать данные - закрывать?
2. Открывать, работать с открытым и поднимать если упало?
Это зависит от многих причин.

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

В реальной же жизни - всё зависит от драйвера который Вы используете для connection. И как правило это "смесь" открытых connections in the pool. Дело в том, что предоставление новых connection на стороне сервера довольно затратная операция.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39635086
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжим.
Часто пользуюсь подобными конструкциями:
**
DEFINE BAR 4 OF sprav PROMPT "\<Справочник" SKIP FOR !DOSTUP("Доступ к справочнику")
ну или
IF DOSTUP("СОЗДАНИЕ_НОВОГО_КЛИЕНТА")
=CREANEWKLI()
ENDIF
***

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

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

Спасибо.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39635191
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем случае всё зависит от многих причин - скорости Вашего доступа к 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!
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39635274
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про кэширование конечно хорошо написано.
Но я бы в этом случае, слез с фокса, и писал бы на чем то более адекватном.
Потому, надо бы разобраться откуда тормоз. Может переделать что то в консерватории.
При переходе с файл-сервера, клиент -сервер, иногда и логику надо подтачивать)

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


Если общие условия использования ПО не изменились, то работа (правильная) с MySQL по меньшей мере, будет не медленнее чем с табл. фокса.
Ищите где тормоз.
Что касается меню, может при его заполнении, сразу и заполнить 1 раз, что этому юзеру можно что нет, и больше не лазить?
У меня просто иначе реализовано, когда создается объект, из БД получаю, что ему доступно в этом объекте.
И в общем то использую роли, а не персональные настройки
Но это лирика все. Ищите где тормоз.
Не может же там быть ОГРОМНЫЙ запрос.
Такие запросы как правило -миллисекнда, и ни на что не влияют
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39635735
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asdor,
Да, все так и у меня.
Dostup("добавлениеклиента") или Dostup("редактированиесчета") - это ничто иное как обращение к таблице и считывание есть у пользователя этот доступ или хотите роль.

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

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

Соответственно, если меню содержит 500 строк кода, и к каждому пункт есть DOSTUP из базы по ролям, то это уже 6 минут на запуск и торможение во время движения по секунде на каждой строке !
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39635736
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Ch- (перенести их во временную директорию фокса) все служебные таблицы (справочники) при первом обращении и уже работать с ними как раньше?
* в общем не правильно. Данные должны быть уже в памяти приложения. Создайте свой класс кэша в FoxPro - у него должно быть ограничено время, когда кэш устаревает и при новом обращении к массиву данных - происходит обновление с сервера. В MS SQL Server есть встроенная функция оповещения подписчиков если данные за которыми Вы следите - изменились.
Good luck!

Справочников не мало.. Кэшировать в память? Ну допустим, а что явится сигналом, что кэш устарел? Время?
Или все же событие, что ест изменения в таблицах?
Кто-нить знает, как в MySql узнать, что таблица изменилась, не обращаясь к ней?
Иначе скорость не вырастет и на проверку буду тратить те же 0.8 секунды.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39635770
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEv,
Тогда вернитесь к 1му вопросу.
Создайте коннект, и пользуйтесь им всегда.
Т.е. 1й вариант.
Если скорость вырастет - вот вам и ответ на 1й вопрос.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39635772
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asdor,
Пардон - 2й вариант 1го вопроса)
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39635779
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvВ моем случае нет разницы сколько запрашиваю и из какой таблицы.. всегда это 0,8 и более.
Открыть соединение , взять данные, закрыть соединение.
Подозреваю что тормоза из-за постоянного открыть-закрыть.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39635788
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПодозреваю что тормоза из-за постоянного открыть-закрыть.
Когда работал с MySql та же хрень была. Первый толчок был перейти на постоянное соединение.
Правда мускул тогда 3й был.
Думал что то изменилось...
Да и тогда, полагаю, что то в настройках не то было.
MS SQL мгновенно коннектится.
ТС - а почему на мускул переходите?
Есть бесплатные почти у всех.
Пока в процессе, подумайте...)
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39635789
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvСправочников не мало.. Кэшировать в память? Ну допустим, а что явится сигналом, что кэш устарел? Время?
Или все же событие, что ест изменения в таблицах?
Кто-нить знает, как в MySql узнать, что таблица изменилась, не обращаясь к ней?
Иначе скорость не вырастет и на проверку буду тратить те же 0.8 секунды.
Эти вопросы лучше в форуме по MySql задать. Возможно есть какие-то штатные средства для решения твоей задачи.

Можно собственный велосипед изобрести: если изменения относительно редки, то завести в базе отдельную таблицу с одной записью и там хранить дату-время последнего изменения. Менять дату при каждом внесении изменений. Прочитать одну строку займет немного времени, намного меньше 0.8 сек.
Ответ можно кэшировать на несколько сек, тогда при работе с меню будет не 500 обращений к БД, а одно в несколько секунд.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39636410
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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... В общем всё просто и надёжно. Перебои в глобальной сети ни на что не влияют, всё работает очень быстро...
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39636417
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Справочников не мало.. Кэшировать в память? Ну допустим, а что явится сигналом, что кэш устарел? Время?

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

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

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

-- такое есть в MS SQL Server (в MySQL скорее всего нет) называется "SQL Server Notification Services". Почитайте. Мы их использовали немного лет 8 назад, но когда у тебя более 20000 запросов в секунду, этот сервис просто "убивал" наш MS SQL Server и мы отказались в пользу распределённого кэша который устаревает по времени. А Вам может быть и подойдёт.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39650826
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер находиться где-то в интернете.
Выбор на MySql пал из-за простой возможности сделать на нем сразу инет магазин, чтобы не гонять данные из программы по учету на сайт. Так сказал тот кто пишет сайт.
Фокс выступит как-бы программой для работы продвинутых пользователей, руководства (потому что бизнеслогика вся описана и переход будет не такой болезненный), а через броузер пишем работу продавцов и клиентов..

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

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

Полученный Запрос невозможно проиндексировать по нескольким полям.. для контекстного поиска.
Есть варианты, или надо его переносить в таблицу для этого?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39650835
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvСервер находиться где-то в интернете.

...

А держать соединение MySQL все время открытым - это насколько плохо и почему?
В таком случае вообще нельзя разрешать доступ к MySQL извне. Сломают.

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

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

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

MaestroEvПолученный Запрос невозможно проиндексировать по нескольким полям.. для контекстного поиска.
Есть варианты, или надо его переносить в таблицу для этого?
Вот тут, мне кажется за вопросом, стоит ошибка в работе.
Тащить клиенту, надо ОЧЕНЬ ограниченный набор данных. Индексировать, для упорядочивания самим клиентом - легко.
А поиск, по небольшому курсору, на фига тратить время на индекс, locate и даже время не заметите. И не надо никаких индексов для этого.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39651448
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно надо привыкать к Locate.
Справляется легко. Более того не нужно думать об индексах. :)
Спасибо.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39714271
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопросик..
Я получил курсор запросом с MySql. Можно ли как-то в него делать Insert хотя бы одной записи?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39714272
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MSSQL можно, в MySQL не знаю, попробуй, скорее всего вставит.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39714281
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Вставляет. Спасибо.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39721198
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то где-то изменилось, не могу понять.
Перестало вставлять записи пока не закроешь соединение.
Вернее вставляю, но их не видят другие программы, кроме моей пока не закрою или не выйду.

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

А если вставить несколько записей - виснет пока не закрою соединение..
Куда смотреть?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39721208
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже на не закрытую транзакцию. Почитай хэлп про транзакции .
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39722633
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблички 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 .
Ни как не въеду в синтаксис.. таких запросов.
Помогите.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39722640
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Образец
Код: sql
1.
select ... from A, B where A.b_id = B.b_id


равносильно
Код: sql
1.
select ... from A join B on A.b_id = B.b_id
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39724232
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОбразец
Код: sql
1.
select ... from A, B where A.b_id = B.b_id


равносильно
Код: sql
1.
select ... from A join B on A.b_id = B.b_id



Спасибо огромное. А если таблиц 3 и более ? Синтаксис не понятен мне. Пишет ошибка, а какая не пойму.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39724235
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Три таблицы
Код: sql
1.
select ... from A, B, C where A.b_id = B.b_id and B.c_id = C.c_id


Код: sql
1.
2.
3.
select ... ;
         from A join B on A.b_id = B.b_id ;
                      join C on B.c_id = C.c_id
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39724369
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot MaestroEv]Dima TОбразец
Спасибо огромное. А если таблиц 3 и более ? Синтаксис не понятен мне. Пишет ошибка, а какая не пойму.
В инете куча материала по SQL
Найдите, прочтите.
Помимо inner join (=where)
есть еще разные виды соединений)))
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39724760
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39726277
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новая беда!!! В фоксе для получения уникального ключа использовал эту функцию:
*********************
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, но данные в таких полях совершенно не те!
*************************
Что делать?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39726311
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEv,
Вот не понятно.
работает с мускулом, а гуид генерите фоксом?
Каков в этом смысл?
Отдайте это мускулу.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39726315
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо сначала гуид в строку конвертировать
Попробуй так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
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 

...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39726459
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может есть какая-нибудь настройка или тип или еще что, чтобы MySql просто сохранял все как есть?
Меня бы это устроило больше всего.

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

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

То есть беда с переносом одной строки! INSERT INTO ... VALUES...
Нужно как-то иначе экранировать значение этих полей.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39726460
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asdorMaestroEv,
Вот не понятно.
работает с мускулом, а гуид генерите фоксом?
Каков в этом смысл?
Отдайте это мускулу.

Математика вся на фоксе и она работает и ее не остановить без существенной потери денег.
MySQL - хранилище и то для того, чтобы прикрутить инет магазин сразу к данным.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39726480
Penner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Select UUID() AS MyID
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39726641
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvМожет есть какая-нибудь настройка или тип или еще что, чтобы MySql просто сохранял все как есть?
Меня бы это устроило больше всего.

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

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

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

MaestroEvТо есть беда с переносом одной строки! INSERT INTO ... VALUES...
Нужно как-то иначе экранировать значение этих полей.
Для этого есть параметризованные запросы
Код: sql
1.
2.
my_guid = ...
sqlexec(h, " INSERT INTO ...  (guid) VALUES (@my_guid) ")
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39726815
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvГенерирую строку INSERT INTO ... VALUES..
Для этого данные беру в кавычки или апострофы, если таковых нет внутри строки.
Ошибку не дает, строка вставляется в MySQL, но данные в таких полях совершенно не те!
*************************
Что делать?

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

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

в любом другом случае генерить sql нельзя, и нужно использовать prepared statements в том драйвере, какой есть в используемом языке
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39728443
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем. Докладываю.
******************
Есть решение - экранирование некоторых символов. Ничего более не менял. Заработало!
*****************
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
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39729700
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТри таблицы
Код: sql
1.
select ... from A, B, C where A.b_id = B.b_id and B.c_id = C.c_id


Код: sql
1.
2.
3.
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 ...

Никаких джоинов - Фокс - лучший язык!
Как сделать это теперь?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39729705
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvВ фоксе делал так :
Select aa.*,naimpolz(aa.PSWautor) as autor,naimpolz(aa.PSWmodi) as modi from dokument aa ...

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

Код: sql
1.
2.
3.
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
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39729709
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного напутал, так правильно
Код: sql
1.
2.
3.
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
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39729805
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо огромное, не пинайте :)
Не нашел нужных примеров в инете.
Там все или простенькое или как-то не так и из-за этого синтаксиса теряю часы..
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732133
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С Join разобрался. Прикольно. Спасибо. Стало прям приятно программировать.

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

Я убираю его уже в самом ГРИД отображении, но может есть способ сразу в настройках MySQl при отсутствии значения в Join
втыкать не Null, а пустое поле как в фоксе?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732135
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFNULL() аналог фоксового NVL()
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732152
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.. :((
Как это делают на языке далеком от Фокса? :)
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732171
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvЭто придется каждое поле обернуть функцией, что ухудшит читаемость кода..
Зачем каждое? JOIN (он же INNER JOIN) не даст в результат NULL, кроме того который получен из таблицы.

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

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

Если все спроектировано правильно, то заменять NULL на '' надо только для тех таблиц, которые присоединяются LEFT/RIGHT/FULL JOIN.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732184
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMaestroEvЭто придется каждое поле обернуть функцией, что ухудшит читаемость кода..
Зачем каждое? JOIN (он же INNER JOIN) не даст в результат NULL, кроме того который получен из таблицы.

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

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

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


Ну так полей много, связей тоже много в одном запросе.. в основной таблице хранятся же только коды..
Реальные значения в справочниках все.. придется все поля, которые в Join обернуть функцией.. Ок.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732188
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvНу так полей много, связей тоже много в одном запросе.. в основной таблице хранятся же только коды..
Реальные значения в справочниках все.. придется все поля, которые в Join обернуть функцией.. Ок.Еще раз, для плохо читающих:
DimaTЕсли надо каждое, то проблема совсем в другом месте. База коряво спроектирована. Если тебе не надо чтобы в базе хранились NULL то откуда они там взялись?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732190
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторюсь: если справочник присоединяется с помощью JOIN (он же INNER JOIN) и в справочнике нет NULL, то в результате не будет ни одного NULL.

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


не будет ни одного NULL если A и B не содержат NULL.
Если будут записи где А.b_id = NULL, то такие записи будут проигнорированы и в результат не попадут.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732256
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то мы о разном..
Пример .. представим в основной таблице - некоторые поля могут быть пустыми или ссылки устареть и уже их может не быть в справочниках (пример искусственный для понимания 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 справочника в основной таблице.
Что не так?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732259
Фотография 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

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

Чем заменить ? Каков синтаксис? Не могу даже в поисковике сформулировать правильно, что я хочу на MySql.. :((
Как это делают на языке далеком от Фокса? :)
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732300
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvЧто-то мы о разном.. Угу, пустота и NULL - две очень большие разницы.Пример .. представим в основной таблице - некоторые поля могут быть пустымиИ опять не надо путать пустоту в полях с NULL или ссылки устареть и уже их может не быть в справочниках (пример искусственный для понимания NULL) .А это уже мусор в данных. Какого лешего он там есть?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732301
Фотография 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? Читаемости кода не будет..
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732303
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov.
Данные хранятся как надо мне. К ним претензий нет.
В основной базе просто может быть даже не заполнены некоторые ссылки на справочники совсем.
Тогда JOIN вернет NULL . Вот об этом речь.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732306
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или в каждом справочнике надо завести запись с пустым ID?
Так делают?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732385
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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().
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732393
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvSergey Sizov.
Данные хранятся как надо мне. К ним претензий нет. От вас? Может быть. Но вот со стороны здравого смысла и принципов работы и проектирования баз данных таки есть.В основной базе просто может быть даже не заполнены некоторые ссылки на справочники совсем.
Тогда JOIN вернет NULL . Вот об этом речь.Речь о том, что некоторые плохо понимают зачем и почему в базах данных используется троичная логика и пытаются под это плохо понимание поломать используемый инструмент. В частности, отключить нафиг эту самую троичную логику. Её ведь идиоты придумали. Сами не знали что творили...
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732487
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvВ некоторых полях в результате NULL вместо названий из справочников, потому что не заполнены соответсвующие поля.
И единственный вариант все поля обернуть функцией ISNULL? Читаемости кода не будет..
Читаемости это не повредит. В текущем виде читаемости уже нет.

PS В MySQL не ISNULL(), а I F NULL()
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732490
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvИли в каждом справочнике надо завести запись с пустым ID?
Так делают?
Можно и так поступить. Добавь в каждую таблицу пустую запись с ID=0 и ставь в родительской таблице значением по умолчанию 0.

Я только не понял чем тебя не устроило
Код: sql
1.
SET NULLDISPLAY TO ''
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39732919
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvКак это делают на языке далеком от Фокса? :)
MySQL имеет очень неразвитый/примитвный диалект SQL языка.

В T-SQL (MS SQL Server) или PL-SQL (Oracle) можно создавать в запросе временную выборку как и в FoxPro с помощью оператора "WITH".
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733294
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMaestroEvИли в каждом справочнике надо завести запись с пустым ID?
Так делают?
Можно и так поступить. Добавь в каждую таблицу пустую запись с ID=0 и ставь в родительской таблице значением по умолчанию 0.

Я только не понял чем тебя не устроило
Код: sql
1.
SET NULLDISPLAY TO ''



Ура!!!! Просто я не знал, что есть такое!!!
Спасибо. Вопрос закрыт.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733297
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov.
Сергей, русские форумы по программированию отличаются тем, что вместо простого ответа на вопрос - некоторые пытаются учить вас программировать как им хочется. Не тратьте время. Моя программа работает с 2000 года. В ней все так как мне надо. Она вся работает в PRG модулях. Да. До сих пор. На нескольких разнесенных по стране магазинов с репликациями на фоксе - я один программист. Репликации тоже просто отправка-приемка текстовых файлов с данными - для простоты. Даже серверов как таковых нет - это обычные компы. Все исправления делаю легко из-за этого .. хоть с телефона находясь у моря.. и каждый пользователь войдя в программу получает тут же новую версию. Я не тестирую их даже , потому что все модули просты. Их много, но они просты.
Мне на исправления различные уходит минимум времени, потому что основа программы - простота каждого модуля и читаемость.

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

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

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

Оказывается есть вот такая штука. SET NULLDISPLAY TO '' я не знал о ее существовании. Спасибо.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733301
Фотография 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

Каков синтаксис? В поиске по MySQL - нет похожих примеров - там обычно просто поиск в подзапросе типа есть или нет, а мне надо сумму в подзапросе вернуть или строку - в общем, значение.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733303
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
Точнее смогу сказать если на вопрос выше ответишь
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733315
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMaestroEvКак заменить использование функции в запросах на подзапрос?
в общем случае никак. Надо смотреть что именно делает функция.

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 - аналогично возвраты.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733317
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvСергей, русские форумы по программированию отличаются тем, что вместо простого ответа на вопрос - некоторые пытаются учить вас программировать как им хочется. Стандартный набор отмаз олдскула. Вы прямо таки открыли мне глаза! Описали прямо таки уникальный случай, первый в моей практике за 20+ лет.
MaestroEvОказывается есть вот такая штука. SET NULLDISPLAY TO '' я не знал о ее существовании.Похоже, вы не знаете о существовании еще многих вещей. В частности, сия настройка просто не показывает NULL не изменяя само содержимое поля. Вас ждет много граблей в связи с этим. Желаю удачи в деле обоснования нежелания учить и понимать новое для себя.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39733334
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvKOLVYD - суммирует количество выданных товаров по этому счету - их таблицы в накладных
KOLREZ - суммирует количество зарезервированного товара по этому счету - из таблицы резервов
KOLVOZ - аналогично возвраты.
Код: sql
1.
2.
3.
4.
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() можно не писать если товары в счете никогда не повторяются.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738901
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получается..
Все чуть сложнее и пляски с синтаксисом не помогли. Прошу помощи.

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
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738922
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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Откройте для себя алиасы в запросах.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738925
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну алиасы то у него есть. Название их.... по мне так, не очень )))
Выброс мозга, с пункатми, вряд ли кто то поймет (хотя, телепатов хватает)
Непонятно что хотите. Ясно, что то угодно, только не учиться.

Dima T привел вам рабочий запрос, вы его модернизировали... ну так подумайте немного, почитайте.
Должно быть примерно так.
Код: sql
1.
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.Хочу получить записи позиций в счете. " на технический язык.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738943
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEv,

Счет один или много? Если один, как в примере выше 21734842 , то
Код: sql
1.
2.
3.
4.
5.
... 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 Читай книжки.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738952
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Стало лучше. Поле в запросе итоговом уже есть. Но оно пока пустое, предполагаю, что там 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 - уже нет проблем.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738961
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMaestroEv,

Счет один или много? Если один, как в примере выше 21734842 , то
Код: sql
1.
2.
3.
4.
5.
... 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...
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738963
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты бы код форматировал прежде чем сюда постить
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 надо.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738969
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvМожно же внутри без Join? 18 лет в фоксе без джин обходился :(
Можно, но не нужно. Читать такой запрос неудобно. С join понятно где условие связи таблиц, а где условия отбора. Если все упихать во where то получается каша, особенно если таблиц намного больше двух. Лучше привыкай к join. Фокс join тоже понимает.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738976
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvТо есть подселект - может быть как обычный селект? Вот такой синтаксис мне понятен, но дает ошибку. Что не так?
Да, подселект можно запустить без внешнего, если не используются поля внешнего.

Код: sql
1.
2.
3.
4.
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 ругнется. В остальном вроде правильно.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738978
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMaestroEvМожно же внутри без 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...
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39738997
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMaestroEvТо есть подселект - может быть как обычный селект? Вот такой синтаксис мне понятен, но дает ошибку. Что не так?
Да, подселект можно запустить без внешнего, если не используются поля внешнего.

Код: sql
1.
2.
3.
4.
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 ругнется. В остальном вроде правильно.

Огромное спасибо. Значит справлюсь. Отдельно протестирую подселект.
А вообще в подселекте в итоговом селекте использовать поля внешнего можно?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39739069
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvА вообще в подселекте в итоговом селекте использовать поля внешнего можно?
Можно, но нежелательно. В этом случае для каждой записи внешнего запроса будет выполнен отдельный подзапрос.
Т.е. подзапрос отработает много раз и в результате получим тормоз.
Хотя возможно оптимизатор найдет более удачный план выполнения запроса и тормозов не будет.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39743968
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Очередной вопрос. Они усложняются. :)

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

Мне надо выбрать накладные и в них показать имя клиента, ссылка на которого есть только в счете.
Пример такого синтаксиса покажите, плиз?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39743976
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
select k.name
from Naklad  n inner join
Schet s on n.kodsce =s.id inner join
Klient k on s.kodkli = k.id


Прочтите что нибудь на эту тему
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39757603
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С новым годом! Приветствую всех.

Еще один вид селектов используемых мной в Фоксе не могу перевести на язык 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, но как бы какую вязать к какой Шапку к позициям или позиции к шапке?
Нет уверенности. Помогите.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39757605
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же это уже писал 21714529

Тут обычный join
Код: sql
1.
2.
3.
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
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39757616
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. То есть в JOIN нет особой разницы какую таблицу к какой вязать?
Это я себе лишнего накрутил?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39757617
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvСпасибо. То есть в JOIN нет особой разницы какую таблицу к какой вязать?
Если речь о том что "AA join BB" или "BB join AA", то без разницы. Оба варианта равнозначны.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39792043
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую.
Как получить доп поля заданного размера в SELECT?

Select 00 as SOST,000.00 as PROC ...
в Фоксе - получим поле числовое SOST длиной 2 и числовое поле PROC длиной 6 с дробной частью 2 .

Как это сделать в MySql ?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39792048
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEv,
а что, синтаксис MySQL лучше всего знают фоксовики? Может таки в профильном форуме спросить?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39792052
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CAST(Value as Type)

Код: sql
1.
Select cast(0 as int) as SOST ...



В фоксе тоже работает
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39802450
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Стал разбираться с вопросом экранирования.

C программы надо отправить данные с записи на Фоксе в MySQL
В проге есть уникальные Коды 16тиричные полученные Gen_id() ..
В кодах могут быть любые символы. :(

В фоксе было insert from memvar и Gather и не надо было думать об экранировании.

Теперь надо как-то их засунуть в MySql
Есть модуль - который генерит строку на синтаксисе MySql.

Типа Insert into basa () values () .
Тут нужно указывать значения переменных явно, как то экранируя кавычки и управляющие символы..

Как быть?
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39802453
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуглить не пробовал? экранирование кавычек mysql
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39802455
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты же уже решил эту проблему полгода назад 21725055 .
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39805595
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТы же уже решил эту проблему полгода назад 21725055 .

Думал, что решил..

M.str = STRTRAN(M.str, CHR(0), '\x00')
M.str = STRTRAN(M.str, CHR(26), '\x1A')

вот это не работает.. в коды вставляются эти \X00 как есть.
Кавычки отрабатываются верно. Пока убрал эти строки совсем, но сомнения остались.
...
Рейтинг: 0 / 0
Правильная работа с MySQL
    #39805634
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvDima TТы же уже решил эту проблему полгода назад 21725055 .

Думал, что решил..

M.str = STRTRAN(M.str, CHR(0), '\x00')
M.str = STRTRAN(M.str, CHR(26), '\x1A')

вот это не работает.. в коды вставляются эти \X00 как есть. А с чего бы им работать? Документацию по поводу правильного способа задания значения 16-ричным кодом не пробовали посмотреть? Да хотя бы в командном окне
Код: sql
1.
? '\x00'


не пробовали? Вы откуда такую нотацию взяли? Чем вам Chr(0) и Chr(10) не понравились? Тем более, что во втором аргументе STRTRAN() они вроде как пригодились, а в третьем уже всё, не катят?
А зачем в первой строке CHR(0) меняется на самого же себя? Или для вас CHR(0) и то, что вы пытались закодировать через '\x00', не одно и то же?
...
Рейтинг: 0 / 0
97 сообщений из 97, показаны все 4 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Правильная работа с MySQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]