Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разбивка текста [D5, MSSQL]


Страницы:   1 2

Марат ©   (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 + ')'

можно объяснить подробнее?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо