powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хитрый update
5 сообщений из 5, страница 1 из 1
Хитрый update
    #32249458
Есть две таблицы:

SPRAVALL (ALL_ID, ALL_NAME) - Справочник, просто содержащий названия ВСЕХ предметов.

SPRAVUSE (USE_ID, USE_NAMEID, USE_KOLVO) - Другой справочник, который содержит информацию только о тех предметах, которые используются, с указанием числового значения (количества) для каждого предмета.

Чтобы не гемороиться с интерфейсом, я вывожу для пользователя одну таблицу примерно в таком виде:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ALL_ID, ALL_NAME,  0 
FROM SPRAVALL
UNION
SELECT USE_ID, ALL_NAME, USE_KOLVO
FROM SPRAVUSE, SPRAVALL
WHERE USE_NAMEID = ALL_ID

Я думаю результат запроса вполне очевиден.

Пользователю разрешено редактировать только значение поля 'количество'. Если пользователь изменяет количество у записи, которая уже содержится в таблице SPRAVUSE , то я просто делаю апдейт.

А вот если пользователь вводит количество для предмета, который НЕ присутствует в таблице SPRAVUSE , то что тогда???

Я думаю, что легче всего сделать инсерт в SPRAVUSE по условию
Код: plaintext
1.
if FieldByName('KOLVO').AsInteger =  0  then ...

Хотя, может быть, существует более оптимальное решение...

1. Как это лучше всего реализовать на связке FB+Delphi ???
2. Возможно, стоит использовать компонент IBDataSet и что-то еще...
...
Рейтинг: 0 / 0
Хитрый update
    #32249468
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я все правильно понял тогда ошибка в самих таблицах, должно быть так

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
Результат запроса очевиден - список используемых предметов с указанием их количества..
Если необходимо показать справочник, тогда в отдельном наборе, никаких гемороев быть не может...
И не надо придумывать никакую трехзвенку для этого (хотя говорят что это круто, сам я еще не попробовал)
...
Рейтинг: 0 / 0
Хитрый update
    #32249857
Возможно я слишком много написал в первом постинге...

ЗАДАЧА.
Имеется таблица 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) . Нутром чую, что это возможно, причем очень просто.

Прав ли я или не прав? Можно или нельзя? Как?
...
Рейтинг: 0 / 0
Хитрый update
    #32249995
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делал то же самое. Пусть в запросе будет 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
...
Рейтинг: 0 / 0
Хитрый update
    #32250150
Diehard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что тебе не нравиться в предложении Gold
Не понимаю
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хитрый update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]