Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2010, 11:49   #1
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию Выборка из таблицы

Есть две таблицы H06090 и SH01007, в них имеется поле DSE(содержит строковые записи), так же имеется переменная dse с заданным значением.
Задача состоит в следующем:
Если в H06090DSE найдено заданное dse, то если в SH01007DSE тоже найдено заданное dse, то необходимо из таблицы H06090 из поля DSE выбрать все записи с заданным dse(DSE в таблице может повторятся) и записать в таблицу prom.
Использую Delphi7, компоненты Table, datasource.
Прога компилится, но в таблицу prom ничего не записывается, хотя в H06090 точно есть такая запись.
Подскажите в чем может быть проблема. Ниже приведен код


Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,ii:integer;
      dse:string;
begin
dse:='0682201040001';
dm.tb_prom.First; // Очистка таблицы tb_prom
        for i:=0 to dm.tb_prom.RecordCount-1 do begin
        dm.tb_prom.Delete;
        dm.tb_prom.Next;
        end;
if dm.tb_H06090.Locate('DSE',dse,[]) then begin  // 
if dm.tb_SH01007.Locate('DSE',dse,[]) then begin //
 dm.tb_H06090.First;
 for i:=0 to dm.tb_H06090.RecordCount-1 do begin // заполенение tb_prom из H06090
 if dm.tb_H06090DSE.AsString='0682201040001' then begin
 dm.tb_prom.Insert;
 dm.tb_promDSE.AsString:=dm.tb_H06090DSE.AsString;
 dm.tb_promZ.AsFloat:=dm.tb_H06090Z.AsFloat;
 dm.tb_prom.Post;
 dm.tb_H06090.Next;
 end;  end;

 end; end; // locate
dm.tb_prom.Active:=true;
end;

Последний раз редактировалось Stilet; 13.10.2010 в 12:07.
aimk0 вне форума Ответить с цитированием
Старый 13.10.2010, 12:21   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Почему так не любишь SQL?
Код:
 if dm.tb_H06090.Locate('DSE', dse, []) and
  dm.tb_SH01007.Locate('DSE', dse, []) then
  with Query do
  begin
  Close;
  Sql.clear;
  Sql.add('select * from H06090 where DSE = '+ dse);
  Open;
  end;
  while not Query.eof do
  begin
  {пишем в таблицу tb_prom}
  Query.Next;
  end;
И заменил бы ты имена таблиц. От таких названий в глазах рябит.
Или это из 1С?

PS.
Цитата:
for i:=0 to dm.tb_prom.RecordCount-1 do begin
dm.tb_prom.Delete;
dm.tb_prom.Next;
end;
Для чего здесь dm.tb_prom.Next;?

Последний раз редактировалось _SERGEYX_; 13.10.2010 в 12:30.
_SERGEYX_ вне форума Ответить с цитированием
Старый 13.10.2010, 13:12   #3
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию

_SERGEYX_, Спасибо за помощь. Еще 1 глупый вопрос - как записать данные из query в prom? А точнее как обратиться к полям в query?
В случае
Код:
tb_promDSE:=query1.FieldByName
функция FieldByName не работает. И добавить поля в сам компонент query нельзя, так как изначально он пуст.

PS. Имена таблиц изначально были такие в БД, менять их нельзя... но я привык уже.

Цитата:
for i:=0 to dm.tb_prom.RecordCount-1 do begin
dm.tb_prom.Delete;
dm.tb_prom.Next;
end;
dm.tb_prom.Next; тут нужен чтобы перейти на следующую строку, т.е. я удаляю каждую запись в таблице.
aimk0 вне форума Ответить с цитированием
Старый 13.10.2010, 13:22   #4
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

По индексу обращаться надо. Сделай так

Sql.add('select field1,field2,field3 from H06090 where DSE = '+ dse);
где field1,field2,field3 имена нужных полей
и далее обращайся к полям по индексам
первое поле = Query.Fields[0].AsString; //или AsInteger или AsFloat и т.п.
//в зависимости какое значение тебе нужно
второе поле = Query.Fields[1].AsString;
третье поле = Query.Fields[2].AsString;

Цитата:
dm.tb_prom.Next; тут нужен чтобы перейти на следующую строку, т.е. я удаляю каждую запись в таблице.
При удалении записи автоматически производится переход к другой записи, а так получается, что ты удаляешь записи через одну, потом (из того, что осталось) тоже через одну и т.д. Хотя результат тот же.
_SERGEYX_ вне форума Ответить с цитированием
Старый 13.10.2010, 13:22   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

tb_promDSE:=query1.FieldByName('Имя поля');
Не работает?
Какую ошибку пишет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.10.2010, 13:40   #6
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию

_SERGEYX_, Спасибо, теперь все работает.

Stilet, Я имел ввиду, что после точки в списке возможных функций и процедур просто нет FieldByName, следовательно и работать он не будет.
aimk0 вне форума Ответить с цитированием
Старый 13.10.2010, 14:01   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
просто нет FieldByName, следовательно и работать он не будет.
Ошибаешся )))
Нет его не потому что его нет а потому что Делфи просто не предполагает что ты его будешь вызывать. пиши смело, не обращай внимание на подсказки Делфи, она не всегда показывает все что нужно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.10.2010, 14:22   #8
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
Нет его не потому что его нет а потому что Делфи просто не предполагает что ты его будешь вызывать
Stilet, так опасно делать. Я сталкивался с такой штукой:
Есть таблица Table, в ней числовое поле Summa. Query пустой.
Делаю запрос
Код:
select max(Summa) from Table
x:= TableMaxOfSumma.Value;
Какое-то время программа нормально работает, потом вдруг ошибка...
Начинаю проверять - вернулось имя поля TableMax_Of_Summa. Почему это происходит я не знаю.
Может такие косяки бывают только с агрегатными функциями?
Кажется это было в Paradox-е.
_SERGEYX_ вне форума Ответить с цитированием
Старый 13.10.2010, 14:47   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
проверять - вернулось имя поля TableMax_Of_Summa. Почему это происходит я не знаю.
а Вы возьмите за правило - ВСЕГДА давать полям имена, особенно функциям (в т.ч. и агрегантым)
т.е.:
select max(Summa) as TableMaxOfSumma from Table
и оно (имя поля) НИКОГДА (само по себе) не станет другим...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.10.2010, 14:55   #10
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Serge_Bliznykov, полностью согласен. Теперь так и делаю.
_SERGEYX_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка выборка с таблицы с отношением многие-ко-многим 8alig8 БД в Delphi 2 24.06.2010 12:21
Выборка данных из таблицы SlavaSH БД в Delphi 20 14.10.2009 12:32
Выборка из таблицы Kenny Spark Microsoft Office Excel 4 16.07.2009 15:15
выборка из таблицы Screame Microsoft Office Excel 2 12.07.2009 19:55
Выборка из таблицы ivp88 БД в Delphi 5 12.01.2008 14:36