Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.22;
Скачать: CL | DM;

Вниз

Приветствую Мастеров ! Всевозможные операции в базе !   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.011 c
1-69913
inko
2002-04-09 15:40
2002.04.22
Использование CheckBox...


3-69723
Hermit
2002-04-01 12:18
2002.04.22
DBGrid и режим редактирования


1-69881
UDS
2002-04-07 20:38
2002.04.22
Можно ли просто отцентрировать текст в EDIT?


4-70072
Demn
2002-02-17 09:44
2002.04.22
Как перезагрузить чужую рабочую станцию?


1-69922
yennifaire
2002-04-09 18:41
2002.04.22
Как правильно использовать функцию power?