Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Приветствую Мастеров ! Всевозможные операции в базе ! [D5, dBase, FoxPro]


Страницы:   1 2

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 одинаковых записей, и ещё при подсчёте суммы !


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо