![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Всем доброго времени суток.
Вот какая проблема: Работаю в delphi 7 данные хранятся в файле .mdb, через ADOgrid, ADOTable и остальные компоненты ADO. в таблице rss есть поле link мне нужно чтобы по этому полю искались дубликаты, проще говоря чтобы в этой таблице не было повторяющихся записей, а проверять это получится только по полю link, потому что ссылка уникальна, а остальные поля, такие как Тема - не уникальны Не могу понять как это сделать помогите... толи свойство для таблицы задать нужно, толи запрос какой написать... не понимаю я... в программе просто этот кусок кода не мой, я ни с Адо, ни с запросами не знаком... |
#2
|
||||
|
||||
![]() Отобрать все дубликаты в таблице rss можно так:
Код:
select Link from rss group by link having Count(Link)>1 Код:
delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1) Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() Огромное мерси, сейчас попробую что нить сотворить с этим
www.forumforall.net - Мы создаем общение! |
#4
|
|||
|
|||
![]() блин, не получается....
Как написать нужно? ADOTable1.SQL := select Link from rss group by link having Count(Link)>1 или как? www.forumforall.net - Мы создаем общение! |
#5
|
||||
|
||||
![]() Ну вы хоть с синтаксисом немножко ознакомьтесь.
Код:
ADOTable1.SQL.text := 'select Link from rss group by link having Count(Link)>1'; ADOTable1.Open; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
![]() неа, в обоих примерах выдает ошибку
[Error] Unit1.pas(362): Incompatible types: 'TStrings' and 'String' Пишу так: Код:
ADOQuery1.SQL := 'delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)'; ADOTable1.Open; www.forumforall.net - Мы создаем общение! |
#7
|
||||
|
||||
![]() Вы сравните, то что вы написали и что я предложил. Найдите отличие.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#8
|
|||
|
|||
![]() А у меня по другому не работает,
когда я пишу ADOTable1.SQL.text дельфи выдает ошибку, что SQL необъявленная переменная, а как ее объявить я не знаю, ничего похожего на ADOSQL нет, зато есть ADOQuery... www.forumforall.net - Мы создаем общение! |
#9
|
||||
|
||||
![]() Давайте так. Вы сюда код свой выложите и содержимое dfm-файла. Тогда будем дальше разбираться.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#10
|
|||
|
|||
![]() Хорошо =)
код: Код:
adotable1.Insert; title.value:=_node.selectnodes('//item').item[i].selectSingleNode('title').Text; link.value:=_node.selectnodes('//item').item[i].selectSingleNode('link').Text; description.Value:=_node.selectnodes('//item').item[i].selectSingleNode('description').Text; pubDate.Value:=_node.selectnodes('//item').item[i].selectSingleNode('pubDate').Text; adotable1.Post; countF := ADOTable1.RecordCount; // подсчет label1.caption := IntToStr(countF) // сообщений dfm Код:
object DBMemo1: TDBMemo Left = 0 Top = 360 Width = 640 Height = 97 Align = alBottom DataField = 'description' DataSource = DataSource1 ReadOnly = True TabOrder = 2 end object DataSource1: TDataSource DataSet = ADOTable1 Left = 480 Top = 56 end object ADOTable1: TADOTable Active = True ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=rssbase.mdb;Persist' + ' Security Info=False' CursorType = ctStatic TableName = 'rss' Left = 512 Top = 56 object title: TWideStringField DisplayLabel = #1058#1077#1084#1072 DisplayWidth = 48 FieldName = 'title' Size = 100 end object link: TWideStringField DisplayLabel = #1057#1089#1099#1083#1082#1072 DisplayWidth = 48 FieldName = 'link' Size = 50 end object description: TMemoField DisplayLabel = #1054#1087#1080#1089#1072#1085#1080#1077 FieldName = 'description' Visible = False BlobType = ftMemo end object author: TWideStringField DisplayLabel = '/' FieldName = 'author' Size = 15 end object pubDate: TWideStringField DisplayLabel = #1044#1072#1090#1072 FieldName = 'pubDate' Size = 50 end object ADOTable1id: TAutoIncField FieldName = 'id' ReadOnly = True Visible = False end end object ADOConnection1: TADOConnection Connected = True ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=rssbase.mdb;Persist' + ' Security Info=False' LoginPrompt = False Mode = cmShareDenyNone Provider = 'Microsoft.Jet.OLEDB.4.0' Left = 552 Top = 56 end object ADOQuery1: TADOQuery Parameters = <> Left = 584 Top = 56 end end www.forumforall.net - Мы создаем общение! |
#11
|
|||
|
|||
![]() Всем спокойной ночи! До завтра
www.forumforall.net - Мы создаем общение! |
#12
|
||||
|
||||
![]() 1. Ваш AdoQuery1 надо связать с ADOConnection1
2. В вашей ADOTable1 вы используете ConnectionString, у вас есть уже один AdoConnection1 его и надо использовать для ADOTable1. Так у вас получается запрос в одной сессии, а таблица в другой. 3. Мой косяк - скопировал неглядя. Вместо ADOTable1.SQL.text надо писать ADOQuery1.SQL.Text Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#13
|
|||
|
|||
![]() Спасибо, сейчас исправлю и отпишусь
www.forumforall.net - Мы создаем общение! |
#14
|
|||
|
|||
![]() Вот что получилось:
1. Сначала я понял, что, как вы написали (и я сам тоже заметил), АДОТаблица уже использует параметры подключения, значит АДОКоннект вообще не нужен. Проверил - удалил АДОКоннект - программа осталась в работоспособности. Значит он ни на что не влиял. Мой косяк - видимо когда-то добавил коннект и забыл зачем добавил... 2. Добавляю на форму программы ADOQuery из вкладки АДО. - В свойствах АДОзапроса нахожу параметр connection и настраиваю его (Provider=Microsoft.Jet.OLEDB.4.0;Data Source=rssbase.mdb;Persist Security Info=False) - Теперь в коде вставляю после ADOTable1.Post; Код:
ADOQuery.SQL.Text := 'select Link from rss group by link having Count(Link)>1'; ADOQuery.Open; Пробую по другому запросу: Код:
ADOQuery.SQL.Text := 'delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)'; ADOQuery.Open; Но еще и ошибку выдает при выполнении программы: Цитата:
Что тут может быть не так? (я использую ваш второй запрос "delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)") www.forumforall.net - Мы создаем общение! |
#15
|
||||
|
||||
![]() Цитата:
Код:
ADOQuery.SQL.Text := 'select Link from rss group by link having Count(Link)>1'; ADOQuery.Open; Что-бы удалить уже имеющиеся дубликаты я вам дал второй код: Код:
ADOQuery.SQL.Text := 'delete Link where id in (select Max(id) from rss group by Link having Count(Link)>1)'; ADOQuery.ExecSQL; Теперь вы уже хотите проверять данные перед вставкой на дубликаты, а это уже третий запрос. Третьего запроса можно избежать, если вы на таблицу rss построите уникальный индекс по полю Link, но создать уникальный индекс на данные содержащие повторяющиеся значения невозможно, поэтому прежде чем его создать пропустите свои данные через запрос на удаление, о котором я писал чуть выше. Об этом я писал вам в теме из раздела БД. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 05.04.2009 в 12:42. |