Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Кавычки в строке


Автор: Zahny 18.4.2005, 10:35
Каким символом показать, что " или ' - это не конец (начало) строки, а просто текст. Например при формировании SQL-запросов
Код

 sql = sql & " AND M.Purpose LIKE '*" & Form_Meetings.Purpose & "*'"

или
Код

Form_SiemensCWs.lblDescr.Caption = "Please, fill the information about Siemens co-worker. Filling of the field "Co-worker's name" is mandatory."

?
И если при поиске в строке поиска (в Form_Meetings.Purpose) тоже будут использованы кавычки, они ведь тоже будут истолкованы, как конец(начало) строки. Как с этим борться?
Спасибо

Автор: Akina 18.4.2005, 11:57
Вопрос неясен. Если задача - в литерале вставить кавычку, то просто удвой ее

Код

Form_SiemensCWs.lblDescr.Caption = "Please, fill the information about Siemens co-worker. Filling of the field ""Co-worker's name"" is mandatory"

потому как стринговой переменной до звезды, кавычка там или нет - это для компилера кавычка не простой символ, а управляющий.

Что же до
Цитата(Zahny @ 18.4.2005, 11:35)
если при поиске в строке поиска (в Form_Meetings.Purpose) тоже будут использованы кавычки, они ведь тоже будут истолкованы, как конец(начало) строки

то, пардон, КЕМ они будут так истолкованы??? уж никак не оператором присвоения. соответственно вопросы движку поиска - а уж у него есть какие-нить правила квотирования служебных символов...

Автор: Zahny 18.4.2005, 12:24
С двойными кавычками поняла. Спасибо. Просто ведь в разных языках - разные способы. А Basicу меня никто не учил, вот и не знаю таких мелочей.
С поиском, следовательно, тоже понятно.Теперь, правда, проблема с длиной строки. Ну ладно, сама разберусь.
Спасибо за помощь

Автор: Akina 18.4.2005, 12:44
Цитата(Zahny @ 18.4.2005, 13:24)
Теперь, правда, проблема с длиной строки

Это ты к чему? какая может быть проблема с длиной строки - в оперативку не лезет, что ли?

Автор: Zahny 18.4.2005, 17:13
Цитата(Akina @ 18.4.2005, 12:44)
Это ты к чему?

Это я к тому, что в переменную типа String влезает не бесконечное количество символов

Автор: Akina 18.4.2005, 18:16
Цитата(MS)
String Data Type     

There are two kinds of strings: variable-length and fixed-length strings.

A variable-length string can contain up to approximately 2 billion (2^31) characters.

A fixed-length string can contain 1 to approximately 64K (2^16) characters.


2 Гб на строку - и тебе ЭТОГО мало???

Автор: Zahny 19.4.2005, 09:36
Мне-то достаточно. Только почему он в таком случае мне строку обрезает?!
Строка объявлена, как
Код

Dim sql as String

Насколько я поняла после прочтения хелпа - это строка неограниченной длины. Так в чем проблема?!

Автор: Akina 19.4.2005, 09:48
Цитата(Zahny @ 19.4.2005, 10:36)
почему он в таком случае мне строку обрезает?!

Не верю! © Станиславский

Сюда - содержимое строки ДО обрезки, оператор, на котором происходит обрезка (со значениями переменных), строка ПОСЛЕ обрезки.

Автор: Zahny 19.4.2005, 10:06
У!
Ну ладно, напишу, как могу...
Код


sql = "SELECT M.ID as MeetId, T.CNames as [Names of clients], M.Date, M.Purpose, T.SNames AS [Names of Siemens co-workers] FROM Meetings as M, tblTmp as T WHERE T.MID=M.ID"
       
    Form_Meetings.Date.SetFocus
    If (Form_Meetings.Date.Text <> "") Then
        sql = sql & " AND M.Date Like ""*" & Form_Meetings.Date & "*"""
    End If

    Form_Meetings.Purpose.SetFocus
    If (Form_Meetings.Purpose.Text <> "") Then
        sql = sql & " AND M.Purpose LIKE ""*" & Form_Meetings.Purpose & "*"""  'Строка1
    End If

    If (numb > 0) Then
        sql = sql & " AND ("
    
        For i = 1 To numb
           If (i > 1) Then sql = sql & " OR "
           sql = sql & "M.ID = " & Arr(i - 1)
        Next i

        sql = sql & ")"
        
    End If
    
    sql = sql & " ORDER BY M.Date Asc"



Это в кратце, как он формирует строку. Если в Строка1 в поле очень много написано, то он обрезает, во-первых, то, что в поле, во-вторых, не дописывает всё, что должен дописывать потом. Например, ORDER BY M.Date Asc

Пример строки из дебаггера после выполнения кода:
sql="SELECT M.ID as MeetId, T.CNames as [Names of clients], M.Date, M.Purpose, T.SNames AS [Names of Siemens co-workers] FROM Meetings as M, tblTmp as T WHERE T.MID=M.ID AND M.Date Like "*12.12.2004*" AND M.Purpose LIKE "*s1s2s3s4s5s6s7s8s9s10s11s12s13s141"

Куда делось продолжение?

Автор: Akina 19.4.2005, 10:24
Цитата(Zahny @ 19.4.2005, 11:06)
Пример строки из дебаггера после выполнения кода:

А если на строке 11 поставить брейкпойнт и посмотреть как изменяется строка при пошаговом выполнении?

Цитата(Zahny @ 19.4.2005, 11:06)
Если в Строка1 в поле очень много написано, то он обрезает, во-первых, то, что в поле, во-вторых, не дописывает всё, что должен дописывать потом.

Попробуй сперва собрать все параметры в отдельные переменные и потом уже слепить строку запроса - типа (draft code!!!)

Код

Temp1 = "SELECT M.ID as MeetId, T.CNames as [Names of clients], M.Date, M.Purpose, T.SNames AS [Names of Siemens co-workers] FROM Meetings as M, tblTmp as T WHERE T.MID=M.ID"
       
    Form_Meetings.Date.SetFocus
    If (Form_Meetings.Date.Text <> "") Then
        Temp2 = " AND M.Date Like ""*" & Form_Meetings.Date & "*"""
    End If

    Form_Meetings.Purpose.SetFocus
    If (Form_Meetings.Purpose.Text <> "") Then
        Temp3 = " AND M.Purpose LIKE ""*" & Form_Meetings.Purpose & "*"""  'Строка1
    End If

    If (numb > 0) Then
        Temp4 = Temp4 " AND ("
    
        For i = 1 To numb
           If (i > 1) Then sql = sql & " OR "
           Temp4 = Temp4 & "M.ID = " & Arr(i - 1)
        Next i

        Temp4 = Temp4 & ")"
        
    End If
    
    sql = Temp1 & Temp2 & Temp3 & Temp4 & " ORDER BY M.Date Asc"

Автор: Zahny 19.4.2005, 10:46
Цитата(Akina @ 19.4.2005, 10:24)
А если на строке 11 поставить брейкпойнт и посмотреть как изменяется строка при пошаговом выполнении?

При пошаговом выполнении: просто добавляет, сколько может, а потом строка больше не меняется.
Что за draft code? В Хелпе не нашла smile

Автор: Akina 19.4.2005, 10:53
Цитата(Zahny @ 19.4.2005, 11:46)
Что за draft code? В Хелпе не нашла

draft code = написан левой пяткой smile другими словами - требует проверки.

Цитата(Zahny @ 19.4.2005, 11:46)
просто добавляет, сколько может, а потом строка больше не меняется.

А сколько может? см. как меняется len(sql)...

Как вариант

Код
Dim strSQL as String * 50000
Dim sql as String
...
' Собираем строку запроса в переменной strSQL 
...
sql = Trim(strSQL)

Добавлено @ 10:55
но вообще чудеса...
Добавлено @ 10:59
Впрочем еще предположение из разряда безумных... попробуй не

Код

sql = sql & " AND M.Purpose LIKE ""*" & Form_Meetings.Purpose & "*"""  'Строка1


а

Код

Temp = Form_Meetings.Purpose 
sql = sql & " AND M.Purpose LIKE ""*" & Temp & "*"""  'Строка1

и посмотри что в Temp останется... нет ли там служебных символов...

Автор: Zahny 19.4.2005, 11:47
Сейчас с ума сойду...
Результаты испытаний:

1.
Цитата(Akina @ 19.4.2005, 10:53)
как меняется len(sql)

Меняется, как и положено: растет... постоянно, хотя содержимое строки не меняется

2.
Цитата(Akina @ 19.4.2005, 10:53)
Как вариант
с собиранием строки запроса в строке конечной длины. Как складывать строки конечной длины?! & - не действует. После начального присвоения - см. строка 1 - ничего не добавляется. И еще там какая-то подозрительная цифра 5 в конце строки: sql="SELECT M.ID as MeetId, T.CNames as [Names of clients], M.Date, M.Purpose, T.SNames AS [Names of Siemens co-workers] FROM Meetings as M, tblTmp as T WHERE T.MID=M.ID 5"

3. c Temp'ом не проходит. Мне он никаких служебных символов не показал. И потом, если в поле написано 2-3 слова, ничего не обрезается.

Сейчас попробую с кучей переменных draft code. smile Хотя я вчера такое пробовала и вроде не спасло.

Автор: Akina 19.4.2005, 11:58
Цитата(Zahny @ 19.4.2005, 12:47)
Меняется, как и положено: растет... постоянно, хотя содержимое строки не меняется

Отлично!!! у тебя где-то в строку затесался служебный символ. Ищи его.

Цитата(Zahny @ 19.4.2005, 12:47)
Как складывать строки конечной длины?! & - не действует

LSET

Автор: Zahny 19.4.2005, 12:01
Запихнула в отдельную строку

sql3 = " AND M.Purpose LIKE ""*" & Form_Meetings.Purpose & "*"""
и
sql3 = sql3 & " ORDER BY M.Date Asc"

Далее

Form_FoundCWs.CWsListe.RowSource = sql & sql3

Вроде работает. Но уж очень длинных строк я не задавала. А кавычки для поиска я просто запретила использовать: и так нейдут, что надо

Автор: Zahny 19.4.2005, 12:19
Всё. Я завязала с этим. Во всяком случае на сегодня. А то мне плохо станет.
Как работает LSET мне не понравилось. Я так поняла, что сначала надо задать длинную пустую строку, а потом пробелы замещать. Так?
Как искать служебный символ, понятия не имею. И даже не могу предположить, откуда он там берется... посреди нормального текста. С тем, что он есть, я не спорю. Просто остановлюсь на сегодня на работающем варианте.
И как всегда, спасибо.
Сегодня мне было приятно с Вами общаться

Автор: Akina 19.4.2005, 12:30
Цитата(Zahny @ 19.4.2005, 13:19)
Как работает LSET мне не понравилось. Я так поняла, что сначала надо задать длинную пустую строку, а потом пробелы замещать. Так?

не-а...

Код

dim x as string * 16
x="123" ' Содержимое строки = "123             "
LSET x = trim(x) & "456 ' Содержимое строки = "123456          "


Но вообще Lset-Rset предназначен для заполнения полей файлов прямого доступа (field #1, 16 as A$ типа).

Автор: Zahny 19.4.2005, 13:27
tatsache... в смысле, действительно. с моим
dim sql as string*50000
почему-то не сработало.
я написала
Код

sql=""
lset sql = " AND M.Purpose="

а строка так и осталась пустой. Видимо, надо было написать
Код

sql=""
lset sql = trim(sql) & " AND M.Purpose="

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)