powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Правильная работа с MySQL
25 сообщений из 97, страница 2 из 4
Правильная работа с 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
25 сообщений из 97, страница 2 из 4
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Правильная работа с MySQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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