Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для HaRuKy
5 / 5 / 3
Регистрация: 20.03.2011
Сообщений: 299
MySQL

Проверка импортируемых записей из эксель-файла

01.04.2016, 20:32. Показов 815. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Пытаюсь реализовать импорт записей из эксель-файла в таблицу БД, с последующим отображением в ДБгрид.
Знаю тема заезженная, кому не сложно подскажите. Как можно реализовать проверку импортируемых записей на дублирование??? Чтобы не импортировать одни и те же записи дважды случайным образом ...
Попытался прописать условие, но проверки почему то не происходит ... Прошу строго не судите, я только учусь...

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
begin
  if not OD.Execute then
    Exit;
  XL := CreateOleObject('Excel.Application');
  XL.DisplayAlerts := False;
  XL.WorkBooks.Open(OD.FileName);
  i := 3;
  j := XL.ActiveCell.SpecialCells(xlCellTypeLast).Row;
  while i <> j + 1 do
  begin
    DM.Stat.Insert;
    if XL.cells[i, 7].Value <> DM.Stat.FieldByName('id_st').Value then
    begin
      DM.Stat.FieldByName('id_podr').Value := XL.cells[i, 1].Value;
      DM.Stat.FieldByName('id_work').Value := XL.cells[i, 2].Value;
      DM.Stat.FieldByName('date_st').Value := XL.cells[i, 3].Value;
      DM.Stat.FieldByName('time_s').Value := XL.cells[i, 4].Value;
      DM.Stat.FieldByName('time_f').Value := XL.cells[i, 5].Value;
      DM.Stat.FieldByName('prim').Value := XL.cells[i, 6].Value;
      DM.Stat.FieldByName('id_st').Value := XL.cells[i, 7].Value;
      DM.Stat.Post;
    end
    else
    begin
      MessageBox(Handle, 'Данные записи уже содержатся в таблице!', 'ОШИБКА',
        MB_ICONERROR);
      DM.Stat.Cancel;
      Exit;
    end;
    inc(i);
  end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.04.2016, 20:32
Ответы с готовыми решениями:

Проверка импортируемых данных на существование
Добрый день. Есть код который делает импорт данных из StringGrid в таблицу MS SQL Server 2000 ADODataSet1.DisableControls; ...

Почему при открытии файла эксель, появляется из фонового скрытого режима мой файл эксель
Добрый день уважаемые форумчане, столкнулся с такой проблеммой. Есть небольшая программка которая при запуске и нажатии кнопки запускает...

Проверка файла на его присутствие и количество записей
Проверка текстового файла на его присутствие и количество записей. Выдает ошибку в строке 27. 'end' expected but 'else' found. ...

14
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
01.04.2016, 20:41
Цитата Сообщение от HaRuKy Посмотреть сообщение
Как можно реализовать проверку импортируемых записей на дублирование?
Сделать ключевые поля уникальными. В таблице есть какие-то значения, которые не должны повторяться? - вот из проиндексировать в БД с уникальностью.
0
 Аватар для HaRuKy
5 / 5 / 3
Регистрация: 20.03.2011
Сообщений: 299
01.04.2016, 20:48  [ТС]
Hikari, поле 'id_st' и так уникальное, просто при повторном импорте программа выдает ошибку, то что записи с такими значениями уже имеются в таблице, но выводится данное сообщение в виде системной ошибки делфи, как можно вывести сообщение например MessageBox....
Блин я только сейчас понял что суть проблемы сформулировал не правильно(((
Мне необходимо как раз вывести сообщение, чтобы пользователь понимал ...
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
02.04.2016, 08:10
Цитата Сообщение от HaRuKy Посмотреть сообщение
Мне необходимо как раз вывести сообщение, чтобы пользователь понимал ...
Delphi
1
2
3
4
5
try
 ...Post();
except
 E:Exception do ShowMessage('Такая запись уже есть');
end;
0
 Аватар для HaRuKy
5 / 5 / 3
Регистрация: 20.03.2011
Сообщений: 299
02.04.2016, 10:57  [ТС]
Hikari, вставил код, ошибка выходит...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  while i <> j + 1 do
  begin
    DM.Stat.Insert;
    DM.Stat.FieldByName('id_podr').Value := XL.cells[i, 1].Value;
    DM.Stat.FieldByName('id_work').Value := XL.cells[i, 2].Value;
    DM.Stat.FieldByName('date_st').Value := XL.cells[i, 3].Value;
    DM.Stat.FieldByName('time_s').Value := XL.cells[i, 4].Value;
    DM.Stat.FieldByName('time_f').Value := XL.cells[i, 5].Value;
    DM.Stat.FieldByName('prim').Value := XL.cells[i, 6].Value;
    DM.Stat.FieldByName('id_st').Value := XL.cells[i, 7].Value;
    try
      DM.Stat.Post;
    except
    E : Exception do
    ShowMessage('Такая запись уже есть');
      inc(i);
    if VarIsEmpty(XL) = False then
    begin
      XL.Quit;
      XL := 0;
    end;
  end;
Миниатюры
Проверка импортируемых записей из эксель-файла  
0
5975 / 4550 / 1095
Регистрация: 29.08.2013
Сообщений: 28,170
Записей в блоге: 3
02.04.2016, 11:29
блок try..except имеет свой end который вы забыли

ЗЫ
Цитата Сообщение от Hikari Посмотреть сообщение
try ...Post(); except E:Exception do ShowMessage('Такая запись уже есть'); end;
это ужасный костыль
0
 Аватар для HaRuKy
5 / 5 / 3
Регистрация: 20.03.2011
Сообщений: 299
02.04.2016, 11:36  [ТС]
qwertehok, добавил все равно ошибка осталась ...
Миниатюры
Проверка импортируемых записей из эксель-файла  
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
02.04.2016, 11:51
А подключение к Экселю через Оле критично? Мне кажется вам лучше это делать обычным запросом, это и быстрее и проще будет:
Delphi
1
2
3
4
5
6
7
8
Var
  Xls: TAdoDataSet;
begin
 Xls := TAdoDataset.Create(nil);
 Xls.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\DBase\FishShipsRussia.xls;Extended Properties="Excel 8.0;Hdr=Yes";Persist Security Info=False';
 Xls.CommandText := 'select * from [Russian$] where [Ship type] = :ShipType';
 Xls.Parameters.ParamValues['ShipType'] := 'Fish Factory Ship';
 Xls.Open;
Добавлено через 9 минут
А еще можно попробовать вообще весь импорт одним запросом сделать. В таком запросе можно сразу и проверку на дубликаты делать - sql могучая штука.
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
02.04.2016, 16:27
Цитата Сообщение от qwertehok Посмотреть сообщение
это ужасный костыль
Почему?
0
5975 / 4550 / 1095
Регистрация: 29.08.2013
Сообщений: 28,170
Записей в блоге: 3
02.04.2016, 17:10
Цитата Сообщение от HaRuKy Посмотреть сообщение
добавил все равно ошибка осталась ...
ну так исправляй

Цитата Сообщение от Hikari Посмотреть сообщение
Почему?
зачем ловить исключение, если можно без него обойтись?
1
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
02.04.2016, 18:08
Цитата Сообщение от HaRuKy Посмотреть сообщение
вставил код, ошибка выходит...
А где ключевое слово on? http://www.delphibasics.ru/Try.php
Цитата Сообщение от qwertehok Посмотреть сообщение
зачем ловить исключение, если можно без него обойтись?
И как же?
1
 Аватар для HaRuKy
5 / 5 / 3
Регистрация: 20.03.2011
Сообщений: 299
02.04.2016, 20:53  [ТС]
Пытливый, а ссылку с подробным описанием реализации импорта через SQL-запрос не подкинете???
Хочу попробовать реализовать через SQL-запрос...
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
02.04.2016, 21:16
Читайте про гетерогенные запросы. Есть с ними только одна заморочка, единого синтаксиса нет, для каждой реализации SQL они немного отличаются.

Добавлено через 6 минут
Вот скажем для доступа к листу эксель через адо в дельфи:
T-SQL
1
SELECT F3 FROM [Sheet1$] IN 'С:\Example\Test.xls' 'Excel 8.0;HDR=No' GROUP BY F3
1
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,602
02.04.2016, 22:59
Цитата Сообщение от Hikari Посмотреть сообщение
Почему?
есть же триггер MySQL и можно проверить есть или нет такой запись в таблице
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
03.04.2016, 06:59
Ну тригер это уже борьба с последствиями, зачем же тогда вообще разрешать вводить повторы, сделать уникальный индекс и всех делов. Блондинка как раз и предложила решение основанное на уникальном индексе. Единственное, что мне не нравится в этом решении, что обработка ее идет на клиенте, а не на сервере, что добавит существенный прирост сетевого трафика.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2016, 06:59
Помогаю со студенческими работами здесь

Гугл-эксель проверка на совпадение
В условном форматировании гугл-экселя нет функции &quot;совпадает&quot;, какой выход? Нужно следующее: при заполнение ячейки в одном столбце(цифры,...

Проверка нескольких записей, соответствующих одному условию. Вывод нессоттветствующих записей в MsgBox.
День добрый. Мои знания в программировании растут очень вяло, но по традиции я пытаюсь задавать вопросы в крайней необходимости :) ....

Чтение файла эксель
добрый день! на inteljidea делаю задачу...проводником указываю файл эксель, и мне необходимо его содержимое прочитать, записать в базу...

Копирование файла эксель
Есть файл эксель shablon.xls. С его помощью обработкой пользователи грузят доки в эксель ...

Занесение записей в listBox из файла и изменение записей в файле
Как сделать, что бы при запуске приложения, информация из конкретного файла сразу отображалась в listBoxе, а не выбирая файл через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru