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