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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2011, 22:57   #1
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
Вопрос Копирование данных из одной таблицы в другую, где ошибка

Привет всем.
Использую компоненты FIBplus и базу Firebird
В общем суть проблемы такова. При формировании отчета делаю выборку данных из одной таблицы (к примеру после выполнения скрипта количество записей = 10) и пытаюсь записать их в другую таблицу. В итоге, во вторую таблицу записывается 10 первых записей из первой таблицы.
К примеру в первой таблице после выполнения запроса присутствуют следующие записи:

1. Иванов
2. Петров
3. Сидоров

После записи их в другую таблицу, итог следующий:

1. Иванов
1. Иванов
1. Иванов

т.е. такое ощущение что весь цикл курсор стоял на первой записи первой таблицы. Вот код (первая таблица - это ABSJournal из нее копируются данные во вторую таблицу ABSReport):

Код:
ABSReport.Close;
ABSReport.SQLs.SelectSQL.Clear;
ABSReport.SQLs.SelectSQL.Add('select * from REPORT_JOURNAL');
ABSReport.Open;
ABSReport.Active:=true;
//-----------      Ñáîð äàííûõ èç Îáùåãî æóðíàëà
ABSJournal.Close;
ABSJournal.SQLs.SelectSQL.Clear;
ABSJournal.SQLs.SelectSQL.Add('select * from JOURNAL_OBSH where ID_DOK in (1, 2, 3, 4, 5, 6, 11) and ST=1 and ID_FIRMA = '+inttostr(adofirm['ID']));
if textlistbox2.Count>0 then
begin
   ABSJournal.SQLs.SelectSQL.Add(' and ID_KONTR in (');
   for i:=0 to textlistbox2.Count-1 do
      begin
         ABSJournal.SQLs.SelectSQL.Add(textlistbox2.Items.Strings[i]+', ');
      end;
   ABSJournal.SQLs.SelectSQL.Add('0)');
end
else
   begin
      if checkbox2.Checked=true then
         begin
            ABSJournal.SQLs.SelectSQL.Add(' and VID_KONTR = '''+combobox1.Text+'''');
         end;
   end;
ABSJournal.SQLs.SelectSQL.Add(' order by DATA, VREMYA, NUM_DOK');
//------------
ABSJournal.Open;
ABSJournal.Active:=true;
progressbar1.Max:=ABSJournal.RecordCountFromSrv;
progressbar1.Position:=1;
ABSJournal.First;
while not ABSJournal.Eof do
   begin
      ABSReport.Append;
      ABSReport['ST']:=ABSJournal['ST'];
      ABSReport['DATA']:=ABSJournal['DATA'];
      ABSReport['NUM']:=ABSJournal['NUM_DOK'];
      ABSReport['DOKUMENT']:=ABSJournal['DOKUMENT']+' ¹ '+inttostr(ABSJournal['NUM_DOK']);
      if (ABSJournal['DOKUMENT']='Ïîñòóïëåíèå ÒÌÖ') or (ABSJournal['DOKUMENT']='Ïîñòóïëåíèå (óñëóãè è ïð.)') or (ABSJournal['DOKUMENT']=
'Ñòðîêà âûïèñêè áàíêà (ïðèõîä)') or (ABSJournal['DOKUMENT']='Ïðèõîäíûé êàññîâûé îðäåð') then 
ABSReport['SUMMA_PRIH']:=ABSJournal['SUMMA_DOK'];
      if (ABSJournal['DOKUMENT']='Ðåàëèçàöèÿ') or (ABSJournal['DOKUMENT']='Ñòðîêà âûïèñêè áàíêà (ðàñõîä)') or (ABSJournal['DOKUMENT']=
'Ðàñõîäíûé êàññîâûé îðäåð') then 
ABSReport['SUMMA_RASH']:=ABSJournal['SUMMA_DOK'];
      ABSReport['KOMMENT']:=ABSJournal['KOMMENT'];
      ABSReport['ID_FIRMA']:=ABSJournal['ID_FIRMA'];
      ABSReport['FIRMA']:=ABSJournal['FIRMA'];
      ABSReport['ID_KONTR']:=ABSJournal['ID_KONTR'];
      ABSReport['KONTRAGENT']:=ABSJournal['KONTRAGENT'];
      ABSReport['VID_KONTR']:=ABSJournal['VID_KONTR'];
      ABSReport.Post;
      ABSJournal.Next;
      progressbar1.Position:=ABSJournal.RecNo;
   end;
В чем ошибка, не могу понять, весь вечер сидел ломал голову.
Буду признателен за помощь.

Кстати, нет, не всегда только первая запись добавляется, бывает и последняя или предпоследняя. В общем я вообще в ступоре, подскажите пожалуйста, в чем проблема?

Переводите на русский регистр то окно, из которого копируете текст - тогда не будет "крякозябров".
И разбивайте длинные строки, чтобы в браузере не появлялся горизонтальный скролл...
Водку мы пьем для запаха - а дури нам своей хватает!

Последний раз редактировалось mihali4; 26.10.2011 в 15:45.
Vit@L вне форума Ответить с цитированием
Старый 26.10.2011, 09:53   #2
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

По-моему в ABSReport тоже надо переводить курсор на следующую запись. А вообще выдели интересующие поля и прогони пошагово (Breakepoint слева от поля ставишь и при нажатии на кнопку, на F8 прогоняешь). Сразу увидишь, где не так.
Drugnir вне форума Ответить с цитированием
Старый 26.10.2011, 18:40   #3
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Drugnir Посмотреть сообщение
По-моему в ABSReport тоже надо переводить курсор на следующую запись.
Нет в ABSReport переводить курсор не надо. Там идет Append, он сам переводит на новую строку после Post.

Я понял какой кусочек кода изменяет эти данные. Вот он:
Код:
while not ABSReport.Eof do
               begin
                  ABSReport.Edit;
                  ABSReport['DOLG']:=dolg;
                  if ((ABSReport['SUMMA_RASH'])-(ABSReport['SUMMA_PRIH']))>0 then
                     begin
                        ABSReport['DOLG_2']:=((ABSReport['SUMMA_RASH'])-(ABSReport['SUMMA_PRIH']));
                        ABSReport['DOLG_1']:=0;
                     end;
                  ABSReport.Post;
                  ABSReport.Next;
                  progressbar1.Position:=ABSReport.Recno;
               end;
Только я не пойму почему он все поля изменяет когда в коде явно указано что нужно изменять поля DOLG, DOLG_1, DOLG_2
В общем у меня такое ощущение что Firebird вообще своей жизнью живет. Так как точно такой же код работал и под MS Acces и под Absolute Database.
Подскажите, в чем проблема. Просто очень нужно перевести все это дело под Firebird.
Или может как то можно запретить изменять некоторые поля в записи?
Водку мы пьем для запаха - а дури нам своей хватает!

Последний раз редактировалось Vit@L; 26.10.2011 в 22:16.
Vit@L вне форума Ответить с цитированием
Старый 27.10.2011, 03:25   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

При переходе на другую СУБД и использовании другие компонентов доступа к ее базам данных, логика и стиль мышления программера должны тоже меняться.
В этом и проблема.

То что проходило в связке ADO+Access, может запросто не понравиться тандему IBX (FIBPlus)+Firebird.
Отсюда недоумения типа: "...Firebird вообще своей жизнью живет".
Живет, разумеется, именно своей жизнью, а не жизнью Access.

В нашем случае записывать данные в другую таблицу надо никак иначе, а через запрос INSERT. Это совсем не сложно.
Но обязательно прочитать про транзакции (например, здесь).

Пожелание. При работе с Firebird употреблять не все приемы заученные при использовании Access.
Прик вне форума Ответить с цитированием
Старый 06.12.2011, 01:01   #5
Ivan_C
Пользователь
 
Регистрация: 10.10.2011
Сообщений: 11
По умолчанию

чтобы не пладить темы. помогите решить такой вопрос. имеем 2 таблицы. 1-табель, 2-время. в таблице "табель" находятся 4 кнопки. при нажатии на кнопку 1, должно открытся таблица "время". выбрать интересующие данные, и вставить из даблицы "время" значение первой колонки в таблицу табель в колонку нажатой кнопки. т.е. если нажали кнопку 1, то в первую колонку, если 2, то во вторую. для большей наглядности прикреплю исходники.
Вложения
Тип файла: rar test.rar (12.6 Кб, 12 просмотров)
Ivan_C вне форума Ответить с цитированием
Старый 06.12.2011, 10:47   #6
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Надо автору еще сообразить как добавлять новую строку в таблицу "табель".
Иначе непонятно в какую строку табеля данные из т. "время" должны вставляться: в новую или существующую.
Прик вне форума Ответить с цитированием
Старый 06.12.2011, 19:56   #7
Ivan_C
Пользователь
 
Регистрация: 10.10.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Надо автору еще сообразить как добавлять новую строку в таблицу "табель".
Иначе непонятно в какую строку табеля данные из т. "время" должны вставляться: в новую или существующую.
нужно в существующею.
Ivan_C вне форума Ответить с цитированием
Старый 06.12.2011, 21:47   #8
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

В БД data.mdb таблица "табель" пустая. О какой "существующей" строке речь?
Прик вне форума Ответить с цитированием
Старый 06.12.2011, 22:06   #9
Ivan_C
Пользователь
 
Регистрация: 10.10.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
В БД data.mdb таблица "табель" пустая. О какой "существующей" строке речь?
блин. забыл добавить пустую строку.
Ivan_C вне форума Ответить с цитированием
Старый 06.12.2011, 22:20   #10
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

1. ADOConnection не нужно плодить. Одна база - один компонент.

2. ConnectionString в ADOConnection содержит путь до базы на своем компе. Отсюда получается, что на другом компе надо менять путь в ConnectionString. Не хорошо это.
В ответном проекте этот путь вообще не указан и, прежде чем запускать прогу, надо его указать.

3. Дополнительные формы, которые нужны только время от времени необходимо оформлять как диалоги. Т.е. незачем создавать форму TChooseTime при запуске проги. В переделанном проекте показано что и как.

Четыре кнопки используют один и тот же обработчик события OnClick. Чтобы отличать одну кнопку от других используется свойство Tag.
Вложения
Тип файла: rar Ivan_C.rar (14.0 Кб, 11 просмотров)

Последний раз редактировалось Прик; 06.12.2011 в 22:22.
Прик вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование строк из одной таблицы в другую база данных paradox в делфи igi3 Помощь студентам 1 20.06.2011 08:39
Копирование части данных из одной таблицы в другую SAM77777 Microsoft Office Excel 3 12.04.2011 19:24
Копирование таблицы из одной базы в другую Sanprof БД в Delphi 4 24.09.2010 14:50
Копирование данных из одной таблицы Paradox в другую Zuzya БД в Delphi 3 16.05.2009 19:11
Копирование данных из одной таблицы в другую! фЁдОр БД в Delphi 18 06.01.2008 19:27