Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 преобразование типов  [new]
Serg197311
Member

Откуда: Жуковский
Сообщений: 1105
есть запрос
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;


Replace([main1_1].[pth],'-',',') AS qw
выдает естественно стринг - числа через запятую. , например "337638,327087,327047,327044,326764,326258,1"
Мне надо изменить запрос, чтобы работало условие MAIN1.code in (полученные выше числа).
если пишу напрямую
 MAIN1.code in (Replace([main1_1].[pth],'-',','))
- естественно получаю ошибку несовпадения типов в условии отбора.
можно ли как-нибудь функциями SQL, те в запросе,без vba выполнить преобразование типа, что бы это условие работало?
5 окт 21, 13:52    [22379615]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Eugene-LS
Member

Откуда: РФ
Сообщений: 63
Serg197311
без vba выполнить преобразование типа, что бы это условие работало?

А у вас , случаем, поле MAIN1.code не текстовое?
Похоже на то ...
Если да, то в оператор IN() следует передавать не числа, а строки, т.е. те же числа, только каждое в кавычках (как текстовое значение)
5 окт 21, 17:52    [22379738]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7584
А Вы гляньте это (может чё сгодится):

К сообщению приложен файл (формированиеСтрокиWhere.rar - 51Kb) cкачать
5 окт 21, 22:01    [22379819]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7584
Или так:
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
?my("327044-326764-326258-1")
'327044','326764','326258','1'


Сообщение было отредактировано: 5 окт 21, 22:38
5 окт 21, 22:46    [22379834]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Serg197311
Member

Откуда: Жуковский
Сообщений: 1105
Sdku, спасибо.... Но я специально подчеркнул - без vba, приведение типа необходимо выполнить в запросе методами sql...
как через vba я конечно знаю, сейчас так и работает....
6 окт 21, 06:53    [22379863]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Eugene-LS
Member

Откуда: РФ
Сообщений: 63
Serg197311
Но я специально подчеркнул - без vba

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

... противоречите самому себе, Replace() одна из встроенных функций VBA однако.
6 окт 21, 10:09    [22379915]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Serg197311
Member

Откуда: Жуковский
Сообщений: 1105
Eugene-LS

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

А можно поерничать?
Ладно,не буду. Работает она и в Jet sql, можете проверить
6 окт 21, 10:17    [22379926]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Serg197311
Member

Откуда: Жуковский
Сообщений: 1105
Eugene-LS
Serg197311
без vba выполнить преобразование типа, что бы это условие работало?

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

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

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

это было бы проще.....через тот же replace - без проблем.....sdku вон уже написал как...

Сообщение было отредактировано: 6 окт 21, 10:15
6 окт 21, 10:24    [22379931]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21483
WHERE INSTR(',' & Replace([main1_1].[pth],'-',',') & ',', ',' & MAIN1.code & ',') > 0


Сообщение было отредактировано: 6 окт 21, 10:20
6 окт 21, 10:32    [22379935]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 5361
Serg197311, как размышления. Источник подчинённого запроса.

К сообщению приложен файл (db_0001.zip - 23Kb) cкачать
6 окт 21, 10:51    [22379944]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Serg197311
Member

Откуда: Жуковский
Сообщений: 1105
Akina
WHERE INSTR(',' & Replace([main1_1].[pth],'-',',') & ',', ',' & MAIN1.code & ',') > 0

АААААААА!!!! вот что значит опыт!!! я не смог додуматься! Спасибо, еще не успел попробовать но уверен заработатет!!!
6 окт 21, 11:11    [22379955]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
stu314
Member

Откуда: Рязань
Сообщений: 79
Eugene-LS
следует передавать не числа, а строки, т.е. те же числа, только каждое в кавычках (как текстовое значение)


а что мешает в реплейсе менять [-] не на [,] а на [','] и потом добавить ['] спереди и сзади ?
тогда и IN... подойдет
6 окт 21, 11:53    [22379965]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21483
stu314
а что мешает в реплейсе менять [-] не на [,] а на [','] и потом добавить ['] спереди и сзади ?
тогда и IN... подойдет

Добавить ничего не мешает. А вот IN всё равно не будет работать. Ибо получится не
WHERE '123' IN ('123','456')
, а
WHERE '123' IN ('\'123\',\'456\'')
6 окт 21, 12:46    [22379994]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
stu314
Member

Откуда: Рязань
Сообщений: 79
Akina
stu314
а что мешает в реплейсе менять [-] не на [,] а на [','] и потом добавить ['] спереди и сзади ?
тогда и IN... подойдет

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


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

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

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

кавычки на апострофы и наоборот при необходимости можно и через Chr 34 и 39 сделать
6 окт 21, 13:30    [22380015]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Serg197311
Member

Откуда: Жуковский
Сообщений: 1105
stu314


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


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

Сообщение было отредактировано: 6 окт 21, 14:00
6 окт 21, 14:10    [22380057]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Serg197311
Member

Откуда: Жуковский
Сообщений: 1105
Для полного понимания.... я пытаюсь ускорить выполнение запроса

Вот с применением Дао(не в смысле - DAO, а в смысле тайного знания:)) Акины
'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;"


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

"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; "


+
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


Дао Панурга пока ниасилел.... получаю несовпадение типов....
6 окт 21, 14:16    [22380060]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
stu314
Member

Откуда: Рязань
Сообщений: 79
Serg197311

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




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

пардон, до сих пор не умею картинки правильно вставлять...

К сообщению приложен файл. Размер - 128Kb


Сообщение было отредактировано: 6 окт 21, 15:37
6 окт 21, 15:47    [22380105]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21483
stu314
кавычки на апострофы и наоборот при необходимости можно и через Chr 34 и 39 сделать
А ты проделай это не в Immediate (VBA), а в SQL-окне конструктора запросов. Тогда поймёшь.

Сообщение было отредактировано: 6 окт 21, 16:28
6 окт 21, 16:39    [22380150]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7584
stu314

....
?"'" & replace("327044-326764-326258-1","-","','") & "'"
'327044','326764','326258','1'
...
в редакторе это так, а вот в конструкторе запросов,в строке условий работать не будет
6 окт 21, 17:02    [22380166]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7584
Прошу пардон.
Апаздал-ходил покурить а потом, не глядя в топик, отправил
так что без VBA....
6 окт 21, 17:07    [22380170]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
stu314
Member

Откуда: Рязань
Сообщений: 79
Akina
А ты проделай это не в Immediate (VBA), а в SQL-окне конструктора запросов. Тогда поймёшь.


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

такая картинка пойдет или я что то не там сделал ?

К сообщению приложен файл. Размер - 108Kb


Сообщение было отредактировано: 6 окт 21, 16:59
6 окт 21, 17:07    [22380171]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 7584
Serg197311

можно ли как-нибудь функциями SQL, те в запросе,без vba выполнить преобразование типа, что бы это условие работало?
А в Вашем запросе строка отображается иначе, оставаясь строкой,которая не прокатит в качестве условия отбора по числовому полю
тип поля и отображение его содержимого таки разные весчи
Строку типа STR вида 327044-326764-326258-1 можно отобразить '327044','326764','326258','1' но это будет та же строка
Стесняюсь спросить-а откуда берется такая строка и разве хранить в БД данные в таком виде не есть грубейшее нарушение правил "нормальных форм"
Без VBA здесь не обойтись. Я так думаю!(Мимино)
6 окт 21, 17:38    [22380188]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
stu314
Member

Откуда: Рязань
Сообщений: 79
sdku
оставаясь строкой,которая не прокатит в качестве условия отбора по числовому полю
тип поля и отображение его содержимого таки разные весчи

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

я не утверждаю что так правильно делать, чисто теоретические изыскания...

Сообщение было отредактировано: 6 окт 21, 17:52
6 окт 21, 18:03    [22380200]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21483
stu314
такая картинка пойдет или я что то не там сделал ?
Не-е-е... ты этот плод своего творчества во WHERE попробуй запихать...
6 окт 21, 18:49    [22380224]     Ответить | Цитировать Сообщить модератору
 Re: преобразование типов  [new]
stu314
Member

Откуда: Рязань
Сообщений: 79
Akina
Не-е-е... ты этот плод своего творчества во WHERE попробуй запихать...

насчет попадания в IN и выполнения условий - я писал выше (внимательнее надо быть) - запрос не сработает правильно - там только конкретные значения (готовая строка списка значений), во всех остальных ф-циях - chr и конкатенация - нет проблем - можешь сам попробовать :)
6 окт 21, 20:02    [22380248]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить