![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приветствую Мастеров ! Всевозможные операции в базе ! [D5, dBase, FoxPro]
IronHawk © (2002-03-28 13:34:00)Есть база 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
.... заранее благодарен !
IronHawk (2002-03-29 15:47:00) [1]
> Anatoly Podgoretsky © (29.03.02 14:55)
Спасибо учту !
Anatoly Podgoretsky (2002-03-29 14:55:00) [2]IronHawk © (29.03.02 14:10)
Может быть любого совместимого в методами AsXXX
IronHawk (2002-03-29 14:15:00) [3]
> vopros © (29.03.02 14:13)
> Да.
Good ! Thanks !
vopros (2002-03-29 14:13:00) [4]Да.
IronHawk (2002-03-29 14:10:00) [5]
> vopros © (29.03.02 14:08)
> >Aleksandr © (29.03.02 13:46)
> Что-то я такое свойство первый раз слышу...
Может это в Д6 и с СП2 !
> Это переменная которую ты сам создаеш.
> Можеш назвать ее IronHawk_CurrentRecNO
И какого она Типа должна быть ? Интегер ?
vopros (2002-03-29 14:08:00) [6]>Aleksandr © (29.03.02 13:46)
Что-то я такое свойство первый раз слышу...
vopros (2002-03-29 14:05:00) [7]>IronHawk © (29.03.02 14:00)
>Не в переменной дело !
>Я немогу Ваще найти такую вещь как - CurrentRecNo !
>И даже по Ф1 !
Это переменная которую ты сам создаеш.
Можеш назвать ее IronHawk_CurrentRecNO
IronHawk (2002-03-29 14:00:00) [8]
> Aleksandr © (29.03.02 13:46)
> Конечно, ругается, потому что это у TDataSet есть свойство
> такое - CurrentRecNo! Назови по-другому, и не будет ругаться...
Не в переменной дело !
Я немогу Ваще найти такую вещь как - CurrentRecNo !
И даже по Ф1 !
У меня Д5 СП2 ! Не в этом дело ?
Aleksandr (2002-03-29 13:46:00) [9]Jumala, я же условно обозвал переменную! Конечно, ругается, потому что это у TDataSet есть свойство такое - CurrentRecNo! Назови по-другому, и не будет ругаться...
IronHawk (2002-03-29 13:07:00) [10]
> 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;
А Это что ?
IronHawk (2002-03-29 10:33:00) [11]
> 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;
Круто, спасибо !
Но я всего до конца непонял !
Если что, переспрошу !
Aleksandr (2002-03-28 18:29:00) [12]Это не счетчик, это идентификатор... Есть разные пути, зависящие от драйвера базы, с которым ты работаешь... У многих драйверов есть специальный тип (у Парадокса, например - 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-28 17:54:00) [13]Счетчик, это при внесении строки в базу ей присваеваеться номер +1 от предыдущей записи !
Aleksandr (2002-03-28 17:08:00) [14]Что Вы подразумеваете под счетчиком?
Классикой работы с информацией является следующее:
Делаются в модуле данных два 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 16:51:00) [15]
> Aleksandr ©
> А про индексы советую забыть - потом плакать будете с тем,
> сколько они проблем доставляют...
ОК !
А если мне кто скажет как счетчик замутить, я по нему вести счет, сортировать, фильтровать смогу ?
Aleksandr (2002-03-28 16:46:00) [16]2 Iron Hawk
>> Очевидно, что Вы не знаете, что это такое. Пример:
>> Таблица 1 содержит поля: FirmID, FirmName, CityID, LicenseID
>> Таблица 2 содержит поля: CityID,CityName
>> Таблица 3 содержит поля: LicenseID,LicenseName.
>Это вы про DBDEMOS ?
Нет, это я про организацию любой базы данных, в которой есть таблица с информацией о клиентах... DBDemos - не самая умная, но классика в ней есть... А про индексы советую забыть - потом плакать будете с тем, сколько они проблем доставляют...
IronHawk (2002-03-28 16:36:00) [17]
> 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:12:00) [18]Во-первых, тот код, который я привел, не требует 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;
data (2002-03-28 15:55:00) [19]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;
IronHawk (2002-03-28 15:49:00) [20]
> Sava © (28.03.02 15:28)
> В таком случае определись что ты имеешь в виду под понятьем
> одинаковые, но стоит ли ввести в таблицу первичный ключ
> и его отслеживать? Если всунуть лишний пробел или два боюсь
> очень сложно будет найти одинаковые поля, ьоюсь в таком
> случае и SQL не помощник. Может я не прав?
У меня в проге в базу записи загоняет Юзер по Буттону, а он на это буттон может нажать 3-5-7-57 раз, так наф№;%а мне 57 одинаковых записей, и ещё при подсчёте суммы !