Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / преобразование типов / 25 сообщений из 25, страница 1 из 1
05.10.2021, 13:52
    #40102086
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
есть запрос
Код: sql
1.
2.
3.
4.
5.
SELECT MAIN1_1.codever, MAIN1_1.prod, MAIN1_1.code, 1 AS Выражение1, MAIN1_1.pth, Replace([main1_1].[pth],'-',',') AS qw
FROM MAIN INNER JOIN (main1 INNER JOIN MAIN1 AS MAIN1_1 ON main1.code = MAIN1_1.OWN) ON MAIN.CODE = MAIN1_1.coded
WHERE (((MAIN1_1.prod)=True) AND ((MAIN1_1.pth) Like '*327044-326764-326258-1') AND ((MAIN.MARKA) Not Like '*erp*') 
AND ((Exists (SELECT MAIN1.code FROM MAIN1 where main1.own=main1_1.code;))=True))
ORDER BY MAIN.MARKA;



Код: sql
1.
Replace([main1_1].[pth],'-',',') AS qw

выдает естественно стринг - числа через запятую. , например "337638,327087,327047,327044,326764,326258,1"
Мне надо изменить запрос, чтобы работало условие MAIN1.code in (полученные выше числа).
если пишу напрямую
Код: sql
1.
 MAIN1.code in (Replace([main1_1].[pth],'-',','))

- естественно получаю ошибку несовпадения типов в условии отбора.
можно ли как-нибудь функциями SQL, те в запросе,без vba выполнить преобразование типа, что бы это условие работало?
...
Рейтинг: 0 / 0
05.10.2021, 17:52
    #40102156
Eugene-LS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Serg197311
без vba выполнить преобразование типа, что бы это условие работало?

А у вас , случаем, поле MAIN1.code не текстовое?
Похоже на то ...
Если да, то в оператор IN() следует передавать не числа, а строки, т.е. те же числа, только каждое в кавычках (как текстовое значение)
...
Рейтинг: 0 / 0
05.10.2021, 22:01
    #40102198
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
А Вы гляньте это (может чё сгодится):
...
Рейтинг: 0 / 0
05.10.2021, 22:46
    #40102207
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Или так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Function my(ctl)
Dim ar, i, str
ar = Split(ctl, "-")
For i = 0 To UBound(ar)
str = str & "','" & ar(i)
Next
my = Mid(str, 3) & "'"
End Function

Код: vbnet
1.
2.
?my("327044-326764-326258-1")
'327044','326764','326258','1'
...
Рейтинг: 0 / 0
06.10.2021, 06:53
    #40102221
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Sdku, спасибо.... Но я специально подчеркнул - без vba, приведение типа необходимо выполнить в запросе методами sql...
как через vba я конечно знаю, сейчас так и работает....
...
Рейтинг: 0 / 0
06.10.2021, 10:09
    #40102262
Eugene-LS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Serg197311
Но я специально подчеркнул - без vba

Хм ...
А как насчёт вашего же:
Код: sql
1.
MAIN1.code in (Replace([main1_1].[pth],'-',','))


... противоречите самому себе, Replace() одна из встроенных функций VBA однако.
...
Рейтинг: 0 / 0
06.10.2021, 10:17
    #40102270
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Eugene-LS

... противоречите самому себе, Replace() одна из встроенных функций VBA однако.

А можно поерничать?
Ладно,не буду. Работает она и в Jet sql, можете проверить
...
Рейтинг: 0 / 0
06.10.2021, 10:24
    #40102275
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Eugene-LS
Serg197311
без vba выполнить преобразование типа, что бы это условие работало?

А у вас , случаем, поле MAIN1.code не текстовое?
Похоже на то ...

Счетчик, ключевое поле

Eugene-LS
Если да, то в оператор IN() следует передавать не числа, а строки, т.е. те же числа, только каждое в кавычках (как текстовое значение)

это было бы проще.....через тот же replace - без проблем.....sdku вон уже написал как...
...
Рейтинг: 0 / 0
06.10.2021, 10:32
    #40102278
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Код: sql
1.
WHERE INSTR(',' & Replace([main1_1].[pth],'-',',') & ',', ',' & MAIN1.code & ',') > 0
...
Рейтинг: 0 / 0
06.10.2021, 10:51
    #40102285
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Serg197311, как размышления. Источник подчинённого запроса.
...
Рейтинг: 0 / 0
06.10.2021, 11:11
    #40102293
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Akina
Код: sql
1.
WHERE INSTR(',' & Replace([main1_1].[pth],'-',',') & ',', ',' & MAIN1.code & ',') > 0


АААААААА!!!! вот что значит опыт!!! я не смог додуматься! Спасибо, еще не успел попробовать но уверен заработатет!!!
...
Рейтинг: 0 / 0
06.10.2021, 11:53
    #40102300
stu314
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Eugene-LS
следует передавать не числа, а строки, т.е. те же числа, только каждое в кавычках (как текстовое значение)


а что мешает в реплейсе менять [-] не на [,] а на [','] и потом добавить ['] спереди и сзади ?
тогда и IN... подойдет
...
Рейтинг: 0 / 0
06.10.2021, 12:46
    #40102317
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
stu314
а что мешает в реплейсе менять [-] не на [,] а на [','] и потом добавить ['] спереди и сзади ?
тогда и IN... подойдет

Добавить ничего не мешает. А вот IN всё равно не будет работать. Ибо получится не
Код: sql
1.
WHERE '123' IN ('123','456')

, а
Код: sql
1.
WHERE '123' IN ('\'123\',\'456\'')
...
Рейтинг: 0 / 0
06.10.2021, 13:30
    #40102325
stu314
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Akina
stu314
а что мешает в реплейсе менять [-] не на [,] а на [','] и потом добавить ['] спереди и сзади ?
тогда и IN... подойдет

Добавить ничего не мешает. А вот IN всё равно не будет работать. Ибо получится не
Код: sql
1.
WHERE '123' IN ('123','456')

, а
Код: sql
1.
WHERE '123' IN ('\'123\',\'456\'')



у меня по другому получается :)

?"'" & replace("327044-326764-326258-1","-","','") & "'"

'327044','326764','326258','1'

кавычки на апострофы и наоборот при необходимости можно и через Chr 34 и 39 сделать
...
Рейтинг: 0 / 0
06.10.2021, 14:10
    #40102352
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
stu314


кавычки на апострофы и наоборот при необходимости можно и через Chr 34 и 39 сделать


Чего там в replace не вытворяй - все равно в итоге будет string
а в
Код: sql
1.
WHERE MAIN1.CODE IN()

нужны числа
...
Рейтинг: 0 / 0
06.10.2021, 14:16
    #40102354
Serg197311
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Для полного понимания.... я пытаюсь ускорить выполнение запроса

Вот с применением Дао(не в смысле - DAO, а в смысле тайного знания:)) Акины
Код: sql
1.
2.
3.
4.
5.
6.
'CurrentDb.Execute "INSERT INTO tempvygr ( codever, prod, code, tp, pth, qt ) " _
'                & " SELECT MAIN1_1.codever, MAIN1_1.prod, MAIN1_1.code, 1 AS Âûðàæåíèå1, MAIN1_1.pth, (SELECT exp(Sum(log( [MAIN1]![qt] ))) FROM main1 " _
'                & " WHERE INSTR(',' & Replace([main1_1].[pth],'-',',') & ',', ',' & MAIN1.code & ',') > 0) AS qz " _
'                & " FROM MAIN INNER JOIN (main1 INNER JOIN MAIN1 AS MAIN1_1 ON main1.code = MAIN1_1.OWN) ON MAIN.CODE = MAIN1_1.coded " _
'                & " WHERE (((MAIN1_1.prod)=True) AND ((MAIN1_1.pth) Like '*" & ptcodm1 & "') AND ((MAIN.MARKA) Not Like '*erp*') AND " _
'                & "((Exists (SELECT MAIN1.code FROM MAIN1 where main1.own=main1_1.code;))=True)) ORDER BY MAIN.MARKA;"



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

Код: sql
1.
2.
3.
4.
5.
"INSERT INTO tempvygr ( codever, prod, qt, codm1, tp, pth )" _
                & " SELECT MAIN1_1.codever, MAIN1_1.prod, getqbp(MAIN1_1.pth), MAIN1_1.code, 1 AS Âûðàæåíèå1, MAIN1_1.pth " _
                & " FROM MAIN INNER JOIN (main1 INNER JOIN MAIN1 AS MAIN1_1 ON main1.code = MAIN1_1.OWN) ON MAIN.CODE = MAIN1_1.coded " _
                & " WHERE (((MAIN1_1.prod)=True) AND ((MAIN.MARKA) Not Like '*erp*') AND ((Exists (SELECT MAIN1.code FROM MAIN1 where main1.own=main1_1.code;))=True) AND ((MAIN1_1.pth) Like '*" & ptcodm1 & "')) " _
                & " ORDER BY MAIN.MARKA; "



+
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Function Getqbp(pth As String) As Long

Dim rst As DAO.Recordset
Dim qq As Long
qq = 1
20 Set rst = CurrentDb.OpenRecordset("SELECT main1.qt  from MAIN1 where MAIn1!code in (" & Replace(pth, "-", ",") & ");", dbOpenForwardOnly) ', dbOpenForwardOnly
   If rst.EOF = False Then
      Do Until rst.EOF
               qq = qq * rst.Collect("qt")
               rst.MoveNext
      Loop
   End If
   Getqbp = qq
End Function



Дао Панурга пока ниасилел.... получаю несовпадение типов....
...
Рейтинг: 0 / 0
06.10.2021, 15:47
    #40102371
stu314
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Serg197311

Чего там в replace не вытворяй - все равно в итоге будет string
а в
Код: sql
1.
WHERE MAIN1.CODE IN()

нужны числа




можно и строки - добавить CStr, только строка должна уже быть готова для IN - в самом запросе преобразование не срабатывает т.е.
'327044','326764','326258','1'

пардон, до сих пор не умею картинки правильно вставлять...
...
Рейтинг: 0 / 0
06.10.2021, 16:39
    #40102393
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
stu314
кавычки на апострофы и наоборот при необходимости можно и через Chr 34 и 39 сделать
А ты проделай это не в Immediate (VBA), а в SQL-окне конструктора запросов. Тогда поймёшь.
...
Рейтинг: 0 / 0
06.10.2021, 17:02
    #40102402
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
stu314

....
?"'" & replace("327044-326764-326258-1","-","','") & "'"
'327044','326764','326258','1'
...
в редакторе это так, а вот в конструкторе запросов,в строке условий работать не будет
...
Рейтинг: 0 / 0
06.10.2021, 17:07
    #40102406
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Прошу пардон.
Апаздал-ходил покурить а потом, не глядя в топик, отправил
так что без VBA....
...
Рейтинг: 0 / 0
06.10.2021, 17:07
    #40102407
stu314
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Akina
А ты проделай это не в Immediate (VBA), а в SQL-окне конструктора запросов. Тогда поймёшь.


попробовал, не понял :(

такая картинка пойдет или я что то не там сделал ?
...
Рейтинг: 0 / 0
06.10.2021, 17:38
    #40102420
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Serg197311

можно ли как-нибудь функциями SQL, те в запросе,без vba выполнить преобразование типа, что бы это условие работало?
А в Вашем запросе строка отображается иначе, оставаясь строкой,которая не прокатит в качестве условия отбора по числовому полю
тип поля и отображение его содержимого таки разные весчи
Строку типа STR вида 327044-326764-326258-1 можно отобразить '327044','326764','326258','1' но это будет та же строка
Стесняюсь спросить-а откуда берется такая строка и разве хранить в БД данные в таком виде не есть грубейшее нарушение правил "нормальных форм"
Без VBA здесь не обойтись. Я так думаю!(Мимино)
...
Рейтинг: 0 / 0
06.10.2021, 18:03
    #40102429
stu314
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
sdku
оставаясь строкой,которая не прокатит в качестве условия отбора по числовому полю
тип поля и отображение его содержимого таки разные весчи

можно не строку к числу приводить, а число к строке :)
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1339220&msg=22380105

я не утверждаю что так правильно делать, чисто теоретические изыскания...
...
Рейтинг: 0 / 0
06.10.2021, 18:49
    #40102447
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
stu314
такая картинка пойдет или я что то не там сделал ?
Не-е-е... ты этот плод своего творчества во WHERE попробуй запихать...
...
Рейтинг: 0 / 0
06.10.2021, 20:02
    #40102457
stu314
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преобразование типов
Akina
Не-е-е... ты этот плод своего творчества во WHERE попробуй запихать...

насчет попадания в IN и выполнения условий - я писал выше (внимательнее надо быть) - запрос не сработает правильно - там только конкретные значения (готовая строка списка значений), во всех остальных ф-циях - chr и конкатенация - нет проблем - можешь сам попробовать :)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / преобразование типов / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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