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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2013, 19:34   #11
Kerby666
Пользователь
 
Регистрация: 10.12.2012
Сообщений: 64
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так можно считать уникальным или всетки оно сделано как уникальное ключевое и проиндексированно?
Нет, не сделано и не проиндексировано. Я пробовал делать его уникальным, тогда при попытке импорта у меня вылетает ошибка, что поле KOD не уникально. Это видимо из-за дублирования. Я наверно что-то не так делаю.
Kerby666 вне форума Ответить с цитированием
Старый 10.08.2013, 20:47   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
тогда при попытке импорта у меня вылетает ошибка
Вот. А теперь уже можно для импорта написать свою программу, которая такие ошибки будет учитывать.

Все равно не тем путем идем... Нужно из 1С напрямую производить импорт а не заниматься самодротованием.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.08.2013, 22:03   #13
Kerby666
Пользователь
 
Регистрация: 10.12.2012
Сообщений: 64
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Вот. А теперь уже можно для импорта написать свою программу, которая такие ошибки будет учитывать.

Все равно не тем путем идем... Нужно из 1С напрямую производить импорт а не заниматься самодротованием.
Я уже импортирую не через sqlite3.exe, а средствами delphi. Не слишком быстро, но скорость приемлемая и ошибок при этом не возникает=). Осталось только проверку на уже существующие записи сделать. И почему-то sql-запрос поиска по полю работает не корректно (1 раз). Писал об этом выше. В чем может быть проблема?
Конечно если делать импорт прямо в таблицу из 1с проблем бы было на порядок меньше. Но я в конфигуратор залезаю максимум тестирование ИБ сделать=). Поэтому этот вариант стоит пока оставить. Но в понедельник я поговорю об этом с нашим программистом 1с, может что и выйдет. А так к завтрашнему вечеру проект надо бы закончить.
Kerby666 вне форума Ответить с цитированием
Старый 10.08.2013, 23:41   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Осталось только проверку на уже существующие записи сделать.
Как вариант: Запрос по всем записям. А потом сравнивать перед импортом - если ли такая, вернутая этим запросом. В этом случае максимум нагрузки пойдет не на сервер а на твоего импортера.
Цитата:
в понедельник я поговорю об этом с нашим программистом 1с, может что и выйдет. А так к завтрашнему вечеру проект надо бы закончить.
А почему раньше с ним не обсудил?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.08.2013, 23:58   #15
Kerby666
Пользователь
 
Регистрация: 10.12.2012
Сообщений: 64
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему раньше с ним не обсудил?
На больничном он, да и не рассматривал я такой вариант вообще.
Kerby666 вне форума Ответить с цитированием
Старый 11.08.2013, 08:09   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
На больничном он
От нисчастье-же...
Ну попробуй как я сказал - запросом берешь все что есть, а дальше уже не клиенте сравнение делаешь и если не найдено - впиндюривай.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2013, 10:39   #17
Kerby666
Пользователь
 
Регистрация: 10.12.2012
Сообщений: 64
По умолчанию

Код:
    DataModule4.LiteQuery1.Active:=False;
    DataModule4.LiteQuery1.SQL.Text:='select KOD from Table where KOD='+F;
    DataModule4.LiteQuery1.Active:=TRUE;
    if not DataModule4.LiteQuery1.Eof then
        ShowMessage('Запись существует')
            else
                ShowMessage('Запись не существует');
    DataModule4.LiteQuery1.Close;
У меня сейчас только так сделано. Механизм работает только мне не понятно, как идентифицировать найденную строку, чтобы вместо ShowMessage удалить ее. Или искать лучше не Sql-запросом?
Kerby666 вне форума Ответить с цитированием
Старый 11.08.2013, 11:22   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Или искать лучше не Sql-запросом?
Поле KOD индексированно? Если нет то полюбому искать не запросом.
Код:
    DataModule4.LiteQuery1.Active:=False;
    DataModule4.LiteQuery1.SQL.Text:='select KOD from Table';
    DataModule4.LiteQuery1.Active:=TRUE;
with DataModule4.LiteQuery1 do begin
 for i:=0 to Конец твоего списка в файле do begin
  if not locate('KOD',код из списка в файле) then
   Можно вставлять;
 end;
end;
Так понятнее? - выбрать все записи, и уже в твоей программе делать поиск.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2013, 11:28   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вместо
Цитата:
Код:
 if not DataModule4.LiteQuery1.Eof then
лучше (надёжнее использовать)
Код:
 if not DataModule4.LiteQuery1.isEmpty then
ну, а дальше всё просто:
Код:
 if not DataModule4.LiteQuery1.isEmpty then begin
        // ShowMessage('Запись существует')
      пишете запрос на update всех полей, кроме KOD 
 end
 else begin
        // ShowMessage('Запись не существует');
      пишете ваш запрос на INSERT
 end;
 DataModule4.LiteQuery1.Close;
p.s. ответ от Stilet я увидел после того, как написал свой пост. Можно и по ему пути пойти. тут не угадаешь, какой и способов быстрее и проще. (есть разные нюансы!)

Последний раз редактировалось Serge_Bliznykov; 11.08.2013 в 11:30.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.08.2013, 15:07   #20
Kerby666
Пользователь
 
Регистрация: 10.12.2012
Сообщений: 64
По умолчанию

Код:
ну, а дальше всё просто:
Я извиняюсь, но голова уже не переваривает инфу. У меня сделано так. Я создаю StringList и загружаю в него содержимое txt. Потом циклом иду по каждой строке и заношу в разные переменные (такие как F) то, что у меня между разделителями ';'. И делаю:
Код:
DataModule4.LiteTable1.Insert;
DataModule4.LiteTable1.FieldByName('KOD').AsString:=F;
и так далее. Как вписать то, что вы предлагаете в уже существующий цикл прохода по стокам StringList. Или переписать как-то иначе все нужно?
И еще когда меняю insert на update - ошибка типа таблица не в режиме update or insert.
Kerby666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как избежать циклической формулы? KJ_ya Microsoft Office Excel 4 27.01.2013 22:22
Как избежать излишнего использования :: invector Помощь студентам 2 28.09.2011 14:54
как избежать подвисания Juffin Общие вопросы Delphi 12 18.05.2011 23:41
Как избежать Selection? Мультипликатор Microsoft Office Word 10 21.06.2010 17:15
как избежать кэширования в Опере rolling PHP 3 01.12.2009 18:34