|
|
|
Хитрый update
|
|||
|---|---|---|---|
|
#18+
Есть две таблицы: SPRAVALL (ALL_ID, ALL_NAME) - Справочник, просто содержащий названия ВСЕХ предметов. SPRAVUSE (USE_ID, USE_NAMEID, USE_KOLVO) - Другой справочник, который содержит информацию только о тех предметах, которые используются, с указанием числового значения (количества) для каждого предмета. Чтобы не гемороиться с интерфейсом, я вывожу для пользователя одну таблицу примерно в таком виде: Код: plaintext 1. 2. 3. 4. 5. 6. Я думаю результат запроса вполне очевиден. Пользователю разрешено редактировать только значение поля 'количество'. Если пользователь изменяет количество у записи, которая уже содержится в таблице SPRAVUSE , то я просто делаю апдейт. А вот если пользователь вводит количество для предмета, который НЕ присутствует в таблице SPRAVUSE , то что тогда??? Я думаю, что легче всего сделать инсерт в SPRAVUSE по условию Код: plaintext 1. Хотя, может быть, существует более оптимальное решение... 1. Как это лучше всего реализовать на связке FB+Delphi ??? 2. Возможно, стоит использовать компонент IBDataSet и что-то еще... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2003, 06:05 |
|
||
|
Хитрый update
|
|||
|---|---|---|---|
|
#18+
Если я все правильно понял тогда ошибка в самих таблицах, должно быть так SPRAVALL (ALL_ID, ALL_NAME) - Справочник, просто содержащий названия ВСЕХ предметов. SPRAVUSE (ALL_ID, USE_KOLVO) - Другой справочник, который содержит информацию только о тех предметах, которые используются, с указанием числового значения (количества) для каждого предмета. тогда выборка будет намного проще SELECT t1.ALL_ID, t1.ALL_NAME, t2.USE_KOLVO FROM SPRAVUSE t2, SPRAVALL t1 WHERE ALL_ID t1= ALL_ID t2 Результат запроса очевиден - список используемых предметов с указанием их количества.. Если необходимо показать справочник, тогда в отдельном наборе, никаких гемороев быть не может... И не надо придумывать никакую трехзвенку для этого (хотя говорят что это круто, сам я еще не попробовал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2003, 06:38 |
|
||
|
Хитрый update
|
|||
|---|---|---|---|
|
#18+
Возможно я слишком много написал в первом постинге... ЗАДАЧА. Имеется таблица SPRAVALL (ALL_ID, ALL_NAME) - справочник неважночего, допустим в ней ОЧЕНЬ МНОГО записей. И пользователю предлагается 1)выбрать некоторые наименования из этого справочника и 2)указать число (количество) для выбранных. Классическая реализация представляется в виде двух ЛистБоксов, в левом показываются все невыбранные, а в правом - только выбранные. Затем каким-либо образом пользователь указывает количество для каждого выбранного. Информация получена - программно заполняем второй справочник (таблицу) SPRAVUSE (USE_ID, USE_NAMEID, USE_KOLVO) Я хочу реализовать это на Delphi немного по-другому: Пользователю показывается одна таблица, заполненная из справочника SPRAVALL , но если соответствующая запись присутствует в SPRAVUSE , то указывается количество (иначе - нулик). Пользователь проставяет количество для выбранных. Если количество остается нулевым, значит этот элемент не выбрали. Теперь нужно проапдейтить SPRAVUSE . Дальше действуем по простому алгоритму: 1. Цикл по переменной id := ALL_ID 2. Если в SPRAVUSE отсутствует запись с USE_NAMEID = id , то добавить новую запись и присвоить ей USE_NAMEID := id (конец Если) 3. Апдейт SPRAVUSE по USE_NAMEID = id присвоить USE_KOLVO из таблицы 4. Конец Цикла Так вот, собственно, зачем я все это написал. Я хочу, чтобы этот несложный алгоритм реализовывался посредством компоненты IBDataSet (на Delphi) . Нутром чую, что это возможно, причем очень просто. Прав ли я или не прав? Можно или нельзя? Как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2003, 12:04 |
|
||
|
Хитрый update
|
|||
|---|---|---|---|
|
#18+
Делал то же самое. Пусть в запросе будет 2 поля - изменяемое и первоначальное. При нажатии кнопки применить (или как там у тебя) делаешь цикл: with DataSet do begin First; for i:=1 to RecordCount do begin if FieldByName('Начальное').Value<>FieldByName('Изменяемое').Value then { Делай чего душа пожелает, например выполняй команду в отдельной компоненте: SQL.SQL.Text:='UPDATE ... SET ...='+...+' WHERE ...='+...; SQL.ExecQuery } Next end end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2003, 13:14 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32249857&tid=1580051]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
144ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 459ms |

| 0 / 0 |
