Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.006 c
1-69794
Yakudza
2002-04-09 17:49
2002.04.22
TButton


14-70027
lipskiy
2002-03-18 17:04
2002.04.22
Маленький вопросик про Outlook Express


4-70056
Pat
2002-02-18 02:27
2002.04.22
ReSize формы


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


3-69677
tovSuhov
2002-03-29 14:36
2002.04.22
Люди, ну не оставляйте в беде...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский