![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разбивка текста [D5, MSSQL]
Марат © (2004-04-21 12:21:00)Здравствуйте, мастера. У меня есть такой вопрос. В одном из справочников хочется сделать поле Answer (Char(50)), которое будет содержать список ID-шек из другого справочника. Например: ,0301,0302,0604. Теперь после считывания получаю переменную ССС:=FieldByName('Answer').AsString (пусть не покажется странным, что ID-String). Теперь мне надо выделить каждый ID в отдельную переменную (допустим в массив) для дальнейшего использования в другом запросе, но я не знаю как вытащить значения между запятыми и как посчитать количество (3) этих ID-шек?
Курдль (2004-04-21 14:15:00) [1]Марат, а Вы упорный! :)
Последний раз взываю к Вашему разуму! Откажитесь от упадочной идеи подобной реализации! А если это просто эксперимент над своим упорством - хотя бы найдите СУБД попроще (при всей моей нелюбви к MSSQLServer-у - это довольно-таки умная система и не любит стрельбы из пушки по воробьям).
Так вот, то, что Вы пытаетесь изобразить, давно придумано, использовано, отвергнуто и забыто. Называется это Хэш-таблицы. Реализованы, попробую вспомнить навскидочку, в Clarion.
Reindeer Moss Eater (2004-04-21 14:07:00) [2]А массив - то же не твоя работа?
Марат (2004-04-21 14:06:00) [3]Вся беда в том, что массив А[0..500] of variant;
т.к. считываемое поле типа Char (не я делал и изменить уже невозможно). И получается inttostr('0302')=302, а в таблице нужно именно '0302' по другому не выбирается.
Марат (2004-04-21 14:00:00) [4]Сделал вот так: sql.add(and AT.AnswTypID='+inttostr(A[i]) + ' ');
RecordCount получается 0. Может еще чего-то не то?
KSergey (2004-04-21 13:51:00) [5]Ну еще аопстофик пропустил - ну да ладно ;)
KSergey (2004-04-21 13:50:00) [6]> [16] KSergey © (21.04.04 13:48)
Нудачно подчеркивание добавил....
Читать так:
with Query do begin
sql.clear;
sql.add('select ...');
for i:=0 to Cou-1 do begin
sql.add(and AT.AnswTypID='+ inttostr(A[i]) + ' ');
end;
(про пробел между and не надо забывать! А вообще- есть отладчик, в нем надо смотреть формируемый текст и проверять его в QueryAnalizer - так его отладить существенно проще)
Reindeer Moss Eater (2004-04-21 13:49:00) [7]То, что у тебя проблема - все уже поняли.
Вопрос давай!
KSergey (2004-04-21 13:48:00) [8]А зачем в динамическом запросе использовать параметры??
Может просто сразу весь текст нормально сформировать
with Query do begin
sql.clear;
sql.add('select ...');
for i:=0 to Cou-1 do begin
sql.add(and AT.AnswTypID='+ inttostr(A[i])+ ' ' );
end;
Марат (2004-04-21 13:44:00) [9]возникла проблема в следующем запросе:
with Query do begin
sql.clear;
sql.add('select ...');
for i:=0 to Cou-1 do begin
sql.add('and AT.AnswTypID=:pP'+inttostr(i));
end;
...
for i:=0 to Cou-1 do begin
ParamByName('pP'+inttostr(i)).asstring:=A[i];
end;
По логике вроде так, а на деле не проходит?
Reindeer Moss Eater (2004-04-21 13:39:00) [10]Есть проблема - хорошо.
А вопрос у тебя есть?
Марат (2004-04-21 13:33:00) [11]Я конечно дико извиняюсь, что вмешиваюсь, но у меня возник уже другой вопрос. Повторяю у меня проблема с вышеуказанным запросом.
MOA (2004-04-21 13:28:00) [12]На Марат (21.04.04 13:25) [10]
2 Reindeer Moss Eater Ну вот, а Вы говорите - через чур категорично.
Reindeer Moss Eater (2004-04-21 13:26:00) [13]Кто ж спорит с тем, что подумать нужно?
Я же спорю с тем, что
Не делайте так! Делайте так:
...
Ещё раз - так как Вы хотите - не делайте!
Марат (2004-04-21 13:25:00) [14]У меня получилось через Pos. Теперь возник другой вопрос.
В итоге получилось так: все ID-шки записал в массив A. A[0]='0301',A[1]='0302',A[2]='0604' и количество получилось Cou=3.
Но возникла проблема в следующем запросе:
with Query do begin
sql.clear;
sql.add('select ...');
for i:=0 to Cou-1 do begin
sql.add(and AT.AnswTypID=:pP'+inttostr(i));
end;
...
for i:=0 to Cou-1 do begin
ParamByName('pP'+inttostr(i)).asstring:=A[i];
end;
Чую, что неправильно, а где не знаю?
MOA (2004-04-21 13:22:00) [15]>Нормализация - не самоцель, а средство облегчить жизнь
А абсолютно согласен с Вами. Но у мне кажется, что спрашивающий имеет некий опыт работы с файловыми СУД и пытается перенести освоенные приёмы работы на релационные СУБД. И всё-таки, ПМСМ, отказываться от 1-я нормальной формы (а тут ведь просто справочники) нужно очень хорошо подумав.
Reindeer Moss Eater (2004-04-21 13:15:00) [16]Не надо быть столь категоричным не принимая во внимание конкретный случай.
Нормализация - не самоцель, а средство облегчить жизнь
MOA (2004-04-21 13:13:00) [17]Не делайте так! Делайте так:
Vlad © (21.04.04 12:24) [1]
Курдль © (21.04.04 12:24) [2]
Ещё раз - так как Вы хотите - не делайте! Это самая наихудшая идея, которая только может быть! Если Вы сделаете так, как хотите - ваше отношение не будет даже в 1 нормальной форме -> в будущем Вас ожидает громадный геморрой с этой таблицей. Собственно, рн уже есть;)
Удачи!
Users (2004-04-21 12:57:00) [18]На MSSQL функция CHARINDEX
Reindeer Moss Eater (2004-04-21 12:55:00) [19]select * from mytable where myfield in ('1','2','3','4','5')
Марат (2004-04-21 12:54:00) [20]А вот про это ... and somefield in '(' + AnswerFieldText + ')'
можно объяснить подробнее?