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

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

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

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

Откуда:
Сообщений: 13354
Похоже на не закрытую транзакцию. Почитай хэлп про транзакции.
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

Откуда:
Сообщений: 13354
Образец
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

Откуда:
Сообщений: 13354
Три таблицы
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

Откуда: Москва
Сообщений: 436
[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

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

Откуда:
Сообщений: 13354
Надо сначала гуид в строку конвертировать
+ Попробуй так
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

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

Откуда:
Сообщений: 13354
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

Откуда:
Сообщений: 454
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

Откуда:
Сообщений: 13354
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

Откуда:
Сообщений: 13354
Немного напутал, так правильно
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

Откуда:
Сообщений: 13354
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

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

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

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

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

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

Если все спроектировано правильно, то заменять NULL на '' надо только для тех таблиц, которые присоединяются LEFT/RIGHT/FULL JOIN.
13 ноя 18, 09:24    [21732580]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / FoxPro, Visual FoxPro Ответить