Форум: "Базы";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];
ВнизПриветствую Мастеров ! Всевозможные операции в базе ! Найти похожие ветки
← →
IronHawk (2002-03-28 13:34) [0]Есть база 1.dbf, я на форме своей повесил: DataSource, Table, DBGrid, DBNavigator и повязал их между собой и на базу 1.dbf - всё гуд !
Есть так же Буттоны : Буттон1, Буттон2 !
И Простой Едит1 !
А теперь вопрос :
Как мне в этой базе (1.dbf) вести счетчик, По клику на Буттон1 суммировались данные в столбце 9 грида и бросать в простой Едит1,
а по Буттон2 удалять одинаковые строки в базе ?
Ээээ, ну вот впринципе такой малюсенький вопрос !
P.S. это продолжение ветки http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1017244552&n=1
.... заранее благодарен !
← →
Aleksandr (2002-03-28 13:42) [1]На кнопку1 делаешь:
With TQuery.Create(nil) do begin
DataBaseName:=Table.DataBaseName;
SQL.Add("SELECT SUM(9) FROM "+Table.TableName);
SQL.Add("WHERE NOT 9 IS NULL");
Open;
Edit1.Text:=Fields[0].AsString;
Close;
Free
end;
На кнопку2 кода больше, прочитай про FindFirst и прочее, но принцип тот же...
← →
IronHawk (2002-03-28 14:17) [2]>>> Aleksandr ©
Извините, но у меня на форме нет > TQuery и у меня нет особого желания его туда совать ! И без SQL запросов я тож хочу обойтись !
Как ещё можно ???
← →
Val (2002-03-28 14:59) [3]если нет желания работать с SQL, значит придется пробегать всю таблицу в цикле и суммировать значения поля в переменную
← →
Oleon (2002-03-28 15:05) [4]var
sum : double;
..........
sum := 0;
Table.First;
with table do
Begin
while not EOF do
Begin
sum := sum + Fields[8].AsFloat; //8 т.к. с нуля начинается
next;
end;
Edi1.Text := FloatToStr(sum);
end;
2. Удалять одинаковые строки в базе
Без SQL наверное будет долго. Так нужо проверку на вводе ставить, чтобы одинаковые не вводили.
← →
IronHawk (2002-03-28 15:11) [5]
> Val ©
Именно так и надо !
> Oleon
Спасибо уважаемый !
> Без SQL наверное будет долго. Так нужо проверку на вводе
> ставить, чтобы одинаковые не вводили.
Не, так непойдет потому что стоит пробел или знак лишний всунут уже будет пропускать !
← →
Oleon (2002-03-28 15:27) [6]А что в твоем понимании одинаковые строки в базе? Это когда значения всех полей одинаковые или нескольких полей?
← →
Sava (2002-03-28 15:28) [7]В таком случае определись что ты имеешь в виду под понятьем одинаковые, но стоит ли ввести в таблицу первичный ключ и его отслеживать? Если всунуть лишний пробел или два боюсь очень сложно будет найти одинаковые поля, ьоюсь в таком случае и SQL не помощник. Может я не прав?
← →
IronHawk (2002-03-28 15:47) [8]
> Oleon (28.03.02 15:27)
> А что в твоем понимании одинаковые строки в базе? Это когда
> значения всех полей одинаковые или нескольких полей?
Всех, несчитая пробелов !
← →
IronHawk (2002-03-28 15:49) [9]
> Sava © (28.03.02 15:28)
> В таком случае определись что ты имеешь в виду под понятьем
> одинаковые, но стоит ли ввести в таблицу первичный ключ
> и его отслеживать? Если всунуть лишний пробел или два боюсь
> очень сложно будет найти одинаковые поля, ьоюсь в таком
> случае и SQL не помощник. Может я не прав?
У меня в проге в базу записи загоняет Юзер по Буттону, а он на это буттон может нажать 3-5-7-57 раз, так наф№;%а мне 57 одинаковых записей, и ещё при подсчёте суммы !
← →
data (2002-03-28 15:55) [10]2 IronHawk © (28.03.02 15:11)
>Не, так непойдет потому что стоит пробел или знак лишний всунут
>уже будет пропускать !
Для ввода можно использовать ComboBox со стилем csDropDown (со всеми выбранными по Distinct значениями поля) это не решение проблемы "лишних пробелов", но значительно их сократит, да и пользователям удобнее.
2IronHawk © (28.03.02 14:17)
>Извините, но у меня на форме нет > TQuery и у меня нет особого
>желания его туда совать ! И без SQL запросов я тож хочу
>обойтись !
Во-первых не обязательно его на форму класть, а можно создать и убить в Run-time.
А если уж не хотите, то при пребеге по таблице, если она у вас связана с DBGrid, не забудьте сделать
Table.DisableControls;
try
....(пробег)
finally
Table.EnableControls;
end;
← →
Aleksandr (2002-03-28 16:12) [11]Во-первых, тот код, который я привел, не требует Query на форме - он его в нескольких строчках создает, заполняет, выполняет и убивает...
А вообще - это не серьезно - компоненты на форме кидать... Если влом работать с динамикой, то уж модуль данных используйте - он на то и существует - как форма для компонентов данных. И если Вы собираетесь не пользоваться запросами - никакую нормальную программу не создадите... Пример? Самая легкая из всех прог, используемых в нашей фирме, использует около 30 хранимых процедур, пять форм с графиками и столько же - с отчетами... А уж говорить о таких вещах, как сортировка данных... Не будете же Вы создавать индексы по количеству полей, чтобы юзвер мог сортировать по нужному полю?!
А для того, чтобы пользователь не мог разнообразить варианты вводимой информации, здесь справедливо упомянули о разных лукапах. Старайтесь юзать минимум эдитов и максимум справочных таблиц. Очевидно, что Вы не знаете, что это такое. Пример:
Таблица 1 содержит поля: FirmID, FirmName, CityID, LicenseID
Таблица 2 содержит поля: CityID,CityName
Таблица 3 содержит поля: LicenseID,LicenseName.
С помощью лукапных компонент, лукапных полей или запроса можно сделать так, чтобы пользователь вводил только FirmName, а остальное выбирал из списка. У меня в базах клиентов фирмы пользователь вводит только четыре поля:
название фирмы, телефон, контактное лицо и примечание.
При этом по ходу ввода прога ему показывает все введенные фирмы с похожим названием, а телефон жестко форматирует по стандарту типа +7(812)111-11-11.
Вот в этом коде нужна истчо одна строка:
...
Begin
if NOT Fields[8].IsNull then //иначе с пустым полем проблема будет...
sum := sum + Fields[8].AsFloat; //8 т.к. с нуля начинается
next;
end;
← →
IronHawk (2002-03-28 16:36) [12]
> data © (28.03.02 15:55)
О, всамый раз !
Спасибо учту !
> Aleksandr © (28.03.02 16:12)
> Не будете же Вы создавать индексы по количеству полей, чтобы
> юзвер мог сортировать по нужному полю?!
В ДБФ, а если можно то как это, я б судовольствием сделал !
> Очевидно, что Вы не знаете, что это такое. Пример:
> Таблица 1 содержит поля: FirmID, FirmName, CityID, LicenseID
> Таблица 2 содержит поля: CityID,CityName
> Таблица 3 содержит поля: LicenseID,LicenseName.
Это вы про DBDEMOS ?
> Вот в этом коде нужна истчо одна строка:
> ...
>
ОК !
Спасибо учту!
А Как сделать счетчик ?
← →
Aleksandr (2002-03-28 16:46) [13]2 Iron Hawk
>> Очевидно, что Вы не знаете, что это такое. Пример:
>> Таблица 1 содержит поля: FirmID, FirmName, CityID, LicenseID
>> Таблица 2 содержит поля: CityID,CityName
>> Таблица 3 содержит поля: LicenseID,LicenseName.
>Это вы про DBDEMOS ?
Нет, это я про организацию любой базы данных, в которой есть таблица с информацией о клиентах... DBDemos - не самая умная, но классика в ней есть... А про индексы советую забыть - потом плакать будете с тем, сколько они проблем доставляют...
← →
IronHawk (2002-03-28 16:51) [14]
> Aleksandr ©
> А про индексы советую забыть - потом плакать будете с тем,
> сколько они проблем доставляют...
ОК !
А если мне кто скажет как счетчик замутить, я по нему вести счет, сортировать, фильтровать смогу ?
← →
Aleksandr (2002-03-28 17:08) [15]Что Вы подразумеваете под счетчиком?
Классикой работы с информацией является следующее:
Делаются в модуле данных два Query. Один из них - для отображения данных, другой - для изменения. Например, первый содержит запрос:
SELECT FirmID,FirmName,C.CityName,L.LicenseName
FROM Firms
LEFT JOIN Cities C
ON C.CityID=Firms.CityID
LEFT JOIN Licenses L
ON L.LicenseID=Firms.LicenseID
ORDER BY FirmName
а второй:
SELECT * FROM Firms
WHERE FirmID=:FirmID1
Первым запросом Вы оперируете, например, клик на колонке гриды обрабатываете так:
with qViewFirms do try
CurrRecord:=FieldByName("FirmID").AsInteger;
DisableControls;
Close;
SQL.Delete(SQL.Count-1);
SQL.Add("ORDER BY "+Grid.SelectedCol.FieldName);
//или, если надо фильтровать, то
// SQL.Add("WHERE FirmID LIKE "A%");
Open;
Finally
if Active then
Locate("FirmID",CurrRecord,[]);
EnableControls
end;
А со второй, когда пользователь меняет данные:
with qEditFirms do try
Params.ParamByName("FirmID1").Value:=qViewFirms.FieldByName("FirmID").Value;
Open;
Edit;
...//вызвали форму редактирования записи, дождались ее Modal-Result
if EditForm.ModalResult=mrOK then
Post
else
Cancel
finally
Close;
end
...
← →
IronHawk (2002-03-28 17:54) [16]Счетчик, это при внесении строки в базу ей присваеваеться номер +1 от предыдущей записи !
← →
Aleksandr (2002-03-28 18:29) [17]Это не счетчик, это идентификатор... Есть разные пути, зависящие от драйвера базы, с которым ты работаешь... У многих драйверов есть специальный тип (у Парадокса, например - AutoIncrement). Всегда и во всех таблицах первым полем делается поле как раз для идентификатора (Id, FirmID, OrderID, название роли не играет, но для удобства всегда делают добавку ID)... Это поле и должно служить для того, чтобы различать запись с другими...
Если ты не пользуешься Парадоксом и не пользуешься компонентами АДО, то лучше по ходу работы программы пользоваться глобальными переменными, ведущими счет номерам. После запуска, если в САМОМ простом варианте, то делаешь так:
CurrentRecNo:=Table.RecordCount+1;
в чуть более умном, так:
with TQuery.Create(nil) do begin
DataBaseName:=Table.DataBaseName;
SQL.Add("SELECT MAX(Id)+1 FROM "+Table.TableName);
Open;
CurrentRecNo:=Fields[0].AsInteger;
Close;
Free
end.
В самом умном варианте, который будет искать "дырки" от удаленных записей, делаешь так:
CurrentRecNo:=1;
with TQuery.Create(nil) do begin
DataBaseName:=Table.DataBaseName;
SQL.Add("SELECT ID FROM "+Table.TableName);
Open;
while Locate("ID",CurrentRecNo,[]) do
inc(CurrentRecNo);
Close;
Free
end
Теперь осталось одно: на событие OnNewRecord таблицы сделать так:
FieldByName("ID").AsInteger:=CurrentRecNo;
← →
IronHawk (2002-03-29 10:33) [18]
> Aleksandr © (28.03.02 18:29)
> если в САМОМ простом варианте, то делаешь так:
> CurrentRecNo:=Table.RecordCount+1;
О, вот так и надо !
> в чуть более умном, так:
> with TQuery.Create(nil) do begin
> DataBaseName:=Table.DataBaseName;
> SQL.Add("SELECT MAX(Id)+1 FROM "+Table.TableName);
> Open;
> CurrentRecNo:=Fields[0].AsInteger;
> Close;
> Free
> end.
Тоже вариант, для создать и убить в Run-time Квери !
> В самом умном варианте, который будет искать "дырки" от
> удаленных записей, делаешь так:
>
> CurrentRecNo:=1;
> with TQuery.Create(nil) do begin
> DataBaseName:=Table.DataBaseName;
> SQL.Add("SELECT ID FROM "+Table.TableName);
> Open;
> while Locate("ID",CurrentRecNo,[]) do
> inc(CurrentRecNo);
> Close;
> Free
> end
А почему дырки, зазве дуюлирующие и одинаковые строки не будут удаляться совсем ?
> Теперь осталось одно: на событие OnNewRecord таблицы сделать
> так:
> FieldByName("ID").AsInteger:=CurrentRecNo;
Круто, спасибо !
Но я всего до конца непонял !
Если что, переспрошу !
← →
IronHawk (2002-03-29 13:07) [19]
> Aleksandr ©
Давайте рассмотрим с вами проблемму по Буттон2 удалять одинаковые строки в базе поскольку возникли кое какие вопросы с непонятными мне моментами !
> В самом умном варианте, который будет искать "дырки" от
> удаленных записей, делаешь так:
> CurrentRecNo:=1;
На это оно ругаеться !
> with TQuery.Create(nil) do begin
> DataBaseName:=Table.DataBaseName;
> SQL.Add("SELECT ID FROM "+Table.TableName);
> Open;
> while Locate("ID",CurrentRecNo,[]) do
> inc(CurrentRecNo);
> Close;
> Free;
> end;
> Теперь осталось одно: на событие OnNewRecord таблицы сделать
> так:
> FieldByName("ID").AsInteger:=CurrentRecNo;
А Это что ?
← →
Aleksandr (2002-03-29 13:46) [20]Jumala, я же условно обозвал переменную! Конечно, ругается, потому что это у TDataSet есть свойство такое - CurrentRecNo! Назови по-другому, и не будет ругаться...
← →
IronHawk (2002-03-29 14:00) [21]
> Aleksandr © (29.03.02 13:46)
> Конечно, ругается, потому что это у TDataSet есть свойство
> такое - CurrentRecNo! Назови по-другому, и не будет ругаться...
Не в переменной дело !
Я немогу Ваще найти такую вещь как - CurrentRecNo !
И даже по Ф1 !
У меня Д5 СП2 ! Не в этом дело ?
← →
vopros (2002-03-29 14:05) [22]>IronHawk © (29.03.02 14:00)
>Не в переменной дело !
>Я немогу Ваще найти такую вещь как - CurrentRecNo !
>И даже по Ф1 !
Это переменная которую ты сам создаеш.
Можеш назвать ее IronHawk_CurrentRecNO
← →
vopros (2002-03-29 14:08) [23]>Aleksandr © (29.03.02 13:46)
Что-то я такое свойство первый раз слышу...
← →
IronHawk (2002-03-29 14:10) [24]
> vopros © (29.03.02 14:08)
> >Aleksandr © (29.03.02 13:46)
> Что-то я такое свойство первый раз слышу...
Может это в Д6 и с СП2 !
> Это переменная которую ты сам создаеш.
> Можеш назвать ее IronHawk_CurrentRecNO
И какого она Типа должна быть ? Интегер ?
← →
vopros (2002-03-29 14:13) [25]Да.
← →
IronHawk (2002-03-29 14:15) [26]
> vopros © (29.03.02 14:13)
> Да.
Good ! Thanks !
← →
Anatoly Podgoretsky (2002-03-29 14:55) [27]IronHawk © (29.03.02 14:10)
Может быть любого совместимого в методами AsXXX
← →
IronHawk (2002-03-29 15:47) [28]
> Anatoly Podgoretsky © (29.03.02 14:55)
Спасибо учту !
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.007 c