IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

3 страниц V < 1 2 3 >  
 Ответить  Открыть новую тему 
> повторяющиеся данные в dbgrid - ?
сообщение
Сообщение #21


Гость






Цитата
Программа как бы сама обнаруживает, есть ли повторения, и если есть, выдает эти строки
ADOQuery в помощь:
// настроишь AdoQuery1 в Design-е: Connection + DataSource
procedure TForm1.ButtonDuplicatedClick(Sender: TObject);
begin
with AdoQuery1 do
begin
SQL.Text :=
' SELECT Table1.index' + // Index у меня - это поле, дубликаты которого надо найти
' FROM Table1' +
' GROUP BY Table1.index' +
' HAVING (((Count(Table1.index))>1));';
Open;
while not EOF do
begin
memo1.lines.add(FieldByName('index').AsString); // для поверки - пишу найденные значения в Memo
// вместо этого можешь сразу заполнять строку для фильтрации
Next;
end;
close;
end;

// Ну, а тут - уже фильтрация
end;
Хотя, по-моему, твою программу надо полностью переделать, и она будет гораздо проще. Ты все делаешь вручную, не пользуясь никакими средствами работы с БД. Оно тебе надо? smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вынужден вернуться к первому вопросу( Обнаружились ошибки в процессе работы: при вводе данных в таблицу, все пропадает, при нажатии сохранить, опять же все пропадает, курсор прыгает на другую строку. Вот такие вот симптомы..

Значит тут все дело в том что при перемещении по таблице, данные оттуда попадают в DBEdit, отсюда путаница.
Поставил для проверки на событие OnKeyPress DBGrida -DBEdit2.clear; Прежнее противоречие изчезло, но стали пропадать данные из другого столбца.
Как бы по-другому избавить DBEdit от отображения данных во время перемещения по таблице? Похоже это единственное решение проблемы...

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Гость






Все, мои телепатические способности иссякли, я не знаю, что с чем ты там связывал, что на что устанавливал, и как это все взаимодействует. Хочешь - высылай проект или сюда или volvo71@gmail.com вместе с ТЗ, тогда возможно что-то и получится. А так - я делаю, проверяю на своей базе, а у тебя не работает, потому что понавешано еще сторонних обработчиков море, которые конфликтуют между собой. Здесь я бессилен.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Гость






Большое спасибо, но проблему удалось решить своими силами)
В самом начале, после begin в OnBeforePost поставил условие что поиск совпадений выполняется только в том случае, если DBEdit3.focused
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вопрос по дубликатам:
при нажатии на кнопку появляется такое сообщение : параметр Table1.index не имеет значения по умолчанию.
как это исправить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Гость






Добавить значение по умолчанию. Или в самой базе, или в Object Inspector-е, Table1 -> Fields -> index -> установить в Default Expression нужное значение
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Index-это получается столбец "Фамилия" например в котором производится поиск дубликатов. В БД установил для него значение-индексированное поле, совпадения допускаются, но это не помогло, ошибка таже.
В Object Inspector-е, Table1, defaul expression тоже менял значения, но безрезультатно. Хотя тут я наверное не правильно делал, т.к. не понял что в строке "Object Inspector-е, Table1 -> Fields -> index -> установить в Default Expression нужное значение" означает index, нужно ли его тоже менять и какое должно быть "нужное значение"?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Гость






Цитата
не понял что в строке "Object Inspector-е, Table1 -> Fields -> index -> установить в Default Expression нужное значение" означает index
Заметь, это ты написал:
Цитата
при нажатии на кнопку появляется такое сообщение : параметр Table1.index не имеет значения по умолчанию.
, откуда я знаю, что там у тебя за поля в базе, и какое из них нужно снабдить дефолтным значением. И при нажатии на КАКУЮ кнопку у тебя это все вылетает. В общем, читай пост №23.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


При обнаружении повторяющегося значения, программа его находит, я удаляю его (т.к. старые повторные не нужны), затем снова ввожу это же значение, но программа снова выдает мне что такой номер уже существует и демонстрирует в DBGride пустую строку. Строка получается пустая т.к. поиск ничего не находит поскольку из DBGrid мы ее удалили. Но в списке который создается при запуске программы, этот номер все еще есть. изза этого невозможно ввести нужный номер. Можно как-то решить эту проблему?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


Гость






При удалении значения заодно просматривай список, и удаляй значение оттуда тоже. Еще 2 строки кода.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #31


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


удалять сразу в formshow или на кнопку удаления повесить? даже не знаю как правильно это сделать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


Гость






В тот момент, когда удаляешь значение из базы - удаляй его же из списка:
  Index := sL.Lines.IndexOf(удаляемая_строка);
if Index <> -1 then sL.Lines.Delete(Index);
 К началу страницы 
+ Ответить 
сообщение
Сообщение #33


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Удалять значения из списка при удалении из базы не совсем удобно, т.к. вместо удаления возможно просто корректировка найденного значения. Таким образом из списка оно не будет удалено.
Лучше наверное это сделать в OnbeforePost:
...
else begin
filterStr := '';
for i := 0 to findSL.Count - 1 do begin
filterStr := filterStr + ORstr[i = 0] +
'([txt] LIKE *' + findSL.Strings[i] + '*) ';
Index := sL.Lines.IndexOf(удаляемая_строка);
if Index <> -1 then sL.Lines.Delete(Index);
end;
DataSet.Cancel;

ADOTable1.Filtered := False;
ADOTable1.Filter := filterStr;
ADOTable1.Filtered := True;

Abort;

end;

Вот только не совсем понятно с index и lines - эти переменные нужно описывать? и как обозначить "(удаляемую строку)"?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


кто-нибудь объясните, что такое index и lines! я исчерпал свои возможности !smoke2.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #35


Гость






Что значит "что такое"? Ну, смотри: в StringList-е данные хранятся в виде строк, так? Каждый sL.Strings[ i ] - отдельная строка. Как узнать, присутствует ли в СтрингЛисте определенная строка? Можно, конечно, сделать:

Found := -1; // Если искомой строки не будет, Found останется равным (-1)
for i := 0 to sL.Count do
begin
if sL.Strings[ i ] = 'нужная строка' then Found := i;
end;
// Вот теперь смотрим, если Found = -1, то 'нужная строка' в СтрингЛисте
// отсутствует, иначе Found содержит индекс того элемента Strings, в котором
// она содержится
Это все, конечно, хорошо, но у StringList-а есть готовый метод IndexOf, который получает строку, и выдает индекс элемента, в котором она хранится, или (-1), если строка не была найдена. То есть, код, написанный выше - это реализация того самого IndexOf. Теперь понятно, что значит Index? Это индекс элемента, который надо удалить. Да, это обычная переменная типа Integer, ее надо описывать.

Про Lines забудь, это мой недочет. Я просто проверял кое-что на Memo (для визуализации), а там, чтобы добраться до СтрингЛиста, надо обратиться к свойству Lines. Ну, и забыл удалить... Итого имеем:
var index: Integer;
...
Index := sL.IndexOf(удаляемая_строка);
if Index <> -1 then sL.Delete(Index);
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Еще с удаляемой строкой не совсем понятно. В создаваемом списке она представляет собой номер, который в BDEdit перечисляется через запятую, да? Значит в скобках, вместо "удаляемой_строки" должна быть какая то переменная, обозначающая найденный повторный номер?
Или удаляемая строка-это строка индексов в DBEdit, которые, если <>-1 удаляются?

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #37


Гость






Ну, ты ж выше написал:
Цитата
При обнаружении повторяющегося значения, программа его находит, я удаляю его (т.к. старые повторные не нужны)
, то есть, значение, которое является повторным, ты уже нашел, раз удаляешь? Вот ЕГО ЖЕ и удаляй из СтрингЛиста... Пойми, я уже давно потерял нить твоей программы, я не знаю, что на что у тебя навешано, что И КАК ВООБЩЕ работает, поэтому ответа "надо переменную такую-то взять и подставить туда-то" можешь не ждать. То, что удаляешь (из твоей же цитаты), то же самое удаляй из sL...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #38


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


еще 1 вопрос по поводу дупликатов:
в случае если есть 3 AdoTable, а не 1, возникает некоторая проблема. В TForm1.FormShow у нас следующий код:
procedure TForm1.FormShow(Sender: TObject);
var s: string;
begin
AdoTable1.First;
while not AdoTable1.Eof do begin
s := s + ',' + AdoTable1.FieldByName('txt').AsString;
AdoTable1.Next;
end;

SL.Duplicates := dupIgnore;
SL.Delimiter := ',';
SL.DelimitedText := s;
end;


Но AdoTable2, AdoTable3 сюда не добавишь, соответственно нужно выбрать для этого какое-то друго событие.... Перебрал наверное все что только можно, но безрезультатно.
Можно ли тут чтото сделать чтобы обнаружение дубликатов нормально работало с тремя AdoTable?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #39


Гость






Цитата
AdoTable2, AdoTable3 сюда не добавишь, соответственно нужно выбрать для этого какое-то друго событие.
Для начала неплохо бы объяснить, дубликаты ГДЕ будут искаться? Для ADOTable1 - отдельно, для ADOTable2 - отдельно (только внутри этой же таблицы, имеется в виду), и для третьей - тоже? Или эти поля как-то связаны, и это надо будет искать во всех трех таблицах?

То есть, вопрос сводится к тому, будет у тебя в результате один SL, или три разных СтрингЛиста? Как ты потом использовать-то их будешь?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #40


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Поля никак не связаны, поэтому искать нужно в каждой таблице отдельно, соответственно необходимо 3 разных SL. Т.к. если в первой таблице будут обнаружены данные из второй, например, поиск по фильтру ничего не покажет
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

3 страниц V < 1 2 3 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.01.2021 21:02
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name