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

Вниз

Drag & Drop в DBGrid   Найти похожие ветки 

 
MsGuns ©   (2009-03-16 16:44) [40]

>sniknik ©   (16.03.09 12:44) [39]
>> то можно реализовать еще одну сетку, не связанную с БД (стрингрид например),
>и опять, а нафига?

А "фиг" в том, чтобы опер мог перенести данные с "бумаги" в том порядке, в котором они там нарисованы.


 
sniknik ©   (2009-03-16 16:56) [41]

> чтобы опер мог перенести данные с "бумаги" в том порядке, в котором они там нарисованы.
даже при отсутствии "поля для упорядочивания", они и будут именно в том порядке в котором их заносят.
а если оно есть, + сортированное, то туда достаточно вносить авто(/просто)инкрементное значение, и они не только будут в этом порядке, но и его можно будет менять меняя их значения, и сохранять именно в этом порядке.

и вот нафига еще добавлять стринглист в схему? все и так можно сделать лучше и без лишних "телодвижений".

ты читал начало?


 
Mishechka ©   (2009-03-16 18:49) [42]

Ребята!
Я сделал сортированное поле для упорядочивания, меняя значения этого поля - меняю порядок расположения записей, поставил на форму две кнопки "Вверх" и "Вниз" - думаю, так Марьванне будет проще передвигать записи.

Потом застрял и вот такое навоял:

procedure TfmProv.UpBtnClick(Sender: TObject);
begin
 if not Prov.FindFirst then
   UpBtn.Enabled := True;
   Prov.Edit;
   ProvPNo.Value := ProvPNo.Value -1;
   Prov.Prior;
 if Prov.FindFirst then UpBtn.Enabled := False;
end;

procedure TfmProv.DownBtnClick(Sender: TObject);
begin
 if not Prov.FindLast then
   DownBtn.Enabled := True;
   Prov.Edit;
   ProvPNo.Value := ProvPNo.Value +1;
   Prov.Next;
 if Prov.FindLast then DownBtn.Enabled := False;
end;

Подскажите с кодом для кнопок, пожалуйста. Спасибо.


 
MsGuns ©   (2009-03-16 21:55) [43]

>sniknik ©   (16.03.09 16:56) [41]
>даже при отсутствии "поля для упорядочивания", они и будут именно в том >порядке в котором их заносят.
>а если оно есть, + сортированное, то туда достаточно вносить авто
>(/просто)инкрементное значение, и они не только будут в этом порядке, но >и его можно будет менять меняя их значения, и сохранять именно в этом >порядке.
>и вот нафига еще добавлять стринглист в схему? все и так можно сделать >лучше и без лишних "телодвижений".
>ты читал начало?

1. Имеется база, в которой есть ФИО. Например: А,Б,В,Г
2. Есть опредеденный неким "вц" "порядок" следования этих самых ФИО, например, по году рождения:
 Б
 А
 Г
 В
3. Есть некоторые данные, поступающие на бумаге в произвольном порядке, при этом часть ФИО из этой бумаги мжет отсутствовать в БД. Данные, напнример, о з/пл за месяц
Ж 15000
А  17500
Г  20000
Б  10000

Задача
Как сделать программу, чтобы
а) данные с "бумаги" в процессе ввода распололагались точно в том же порядке, в котором они на "бумаге". Для удобства полноты и правильности контроля оператором.
б) после того, как оператор ввел всю "бумагу", данные были перенесены в БД, при этом новые ФИО были бы добавлены в БД, а з/пл "разнесены корректно.
в) после добавления новых данных в БД все записи отобразились бы в том, порядке, который требуется "вц"

Как это сделать с помощью единственного НД и спецключа "порядок" ?

Если я нарисовал картину не так как надо, значит я действительно неверно понял суть задачи.


 
MsGuns ©   (2009-03-16 21:58) [44]

Пардон, я не написал результат.
Б 10000
Ж 15000 (+)
А  17500
Г 20000
В

При условии, что Ж родился до А и позже Б


 
sniknik ©   (2009-03-17 00:21) [45]

> Как это сделать с помощью единственного НД и спецключа "порядок" ?
про спецключ речь не шла (просто у понятие ключ вообще то вполне определенное понятие. не надо сюда ключи пусть и спец вмешивать), простое поле для упорядочивания  
легко

1  Б   10000
2  Ж  15000 (+)
3  А   17500
4  Г   20000
5  В

первое поле это оно и есть, с нужными значениями...
хочется сменить порядок, например поменять местами  "Ж  15000 (+)" и "А   17500"?
тоже легко, в Ж" вставляем 3, в "А" 2, и при включенной сортировке по этому полю они "сами" поменяются местами, будет уже в новом порядке.  

> При условии, что Ж родился до А и позже Б
да плевать, порядок определяется значениями "нашего" поля, что будет в остальных записях абсолютно неважно.
(не, если хочется еще и сохранять так же упорядочено, будет чуть сложнее, но про сохранение речи не было... в вопросе по крайней мере. после вроде упоминали.)


 
Германн ©   (2009-03-17 00:38) [46]

Складывается у меня упорное мнение, что все участники данного обсуждения решают разные задачи. В чём-то сходные, но всё равно разные.
А всё потому, что автор свою задачу не смог или не захотел объяснить.


 
MsGuns ©   (2009-03-17 09:30) [47]

>sniknik ©   (17.03.09 00:21) [45]

Ты [43] читал ?


 
sniknik ©   (2009-03-17 10:27) [48]

> Складывается у меня упорное мнение, что все участники данного обсуждения решают разные задачи.
однозначно.
задача автора "выдавить" код для копи пасте.
задача MsGuns-а внести хаос в обсуждение. запутывание простых вещей.
задача sniknik... ну не знаю... мне кажется я развлекаюсь.
задача Германн ... ???

> Ты [43] читал ?
а то. там ты пытаешься запутать простую вещь вводя дополнительные, не фигурирующие в основном вопросе сущности...
типа второй не связанной с первой упорядоченности...
это проблема? если нужно 2 несвязанные, введи 2 поля упорядочивания...

хотя и это не нужно, при внимательном прочтении, т.к.  
> 2. Есть опредеденный неким "вц" "порядок" следования этих самых ФИО, например, по году рождения:
один из порядков у тебя естественный. второй искуственно настраиваемый по полю.

p.s. ты сам то [43] читал? или только писал?


 
MsGuns ©   (2009-03-17 12:23) [49]

>sniknik ©   (17.03.09 10:27) [48]
>задача MsGuns-а внести хаос в обсуждение. запутывание простых вещей.

Вовсе нет.
Бывают такие случаи, когда данные вводятся в определенном, задаваемом ДОКУМЕНТОМ порядке, но сам документ в БД не "представлен", например пресловутая "бумага". Если инфу вводить непосредственно в базу, то порядок записей как новых, так и старых, будет определяться условиями ОТОБРАЖЕНИЯ БД и не совпадать с "бумагой". В этом случае оператор СРАЗУ не видит из датасета что он ввел, а что нет и нет другого выхода как рисовать в "бумаге" птицы.
Очевидно, было бы неплохо дать возможность вводить данные не напрямую в датасет (БД), а отдельной сеткой, где записи расположены строго в том порядке, как и на "бумаге".

Ситуация не такая уж редкая. Я неоднократно встречался с такой. Например, когда вводилась приходная накладная, писанная от руки, но надо было сохранить "естественный" порядок фактуры т.к. она состояла из большого к-ва строк. Или при работе с прайсами поставщиков, представленных в экселе по отсортированных совершенно непонятному принципу. Номер строки не всегда помогает в таких случаях.

43 я все-таки "читал" в т.ч. последнюю фразу, на которую ты, очевидно, не обратил внимания.

В целом, конечно, Сергей (Герман) прав - автор невнятно сформулировал вопрос и в итоге неясно что ему нужно и каким боком тут вообще "перетаскивание" (Drag&Drop)

"задачей" же своей видел не во "внесении хаоса", а подсказать автору способ при котором отпадает вообще необходимость что-либо перетаскивать (и соответственно сильно усложнять код ненужными громоздкими деталями), а "технологичность" программы только выиграет.


 
sniknik ©   (2009-03-17 13:09) [50]

> Если инфу вводить непосредственно в базу
ну во первых, насколько помню, никто не обязывал "вводить непосредственно в базу", и даже предлагалось использовать "оторванный" рекордсет... возможно в BDE это бы и не прошло, но уж механизм CachedUpdates там точно есть.
т.е. "вводить непосредственно" необязательно.

во вторых, даже если бы изменения и вводятся в базу, что с того (это даже хорошо если мы этот порядок хотим сохранять)? это же был бы только индекс по дополнительному, ни к чему не обязывающему, в остальных аспектах, полю ...
оригинальный, ваш горячо любимый, порядок ввода сохранился бы, хотя он то как раз в базах НИЧЕГО не значит. значат только данные по которым можно упорядочивать.

> будет определяться условиями ОТОБРАЖЕНИЯ БД и не совпадать с "бумагой".
с чего это не будет совпадать, если мы его ОТОБРАЗИМ в этом порядке (поле со значениями порядка "по бумаге" есть). включили нужный индекс/сортировку/ордер в запрос и будет нужный, не нужен - выключили, нужен другой? - включаем второй индекс.

> В целом, конечно, Сергей (Герман) прав - автор невнятно сформулировал вопрос
а по моему все предельно ясно...
берем вопрос автора "чистый" от его понимания реализации т.е.
> [0] Мне необходимо менять порядок следования записей в DBGrid...
что тут невнятного?
и ответ, полностью на него отвечающий.
> [1] заведи поле для упорядочивания, потом меняй значения

зачем к этому добавлять еще какие то сущности? типа второго порядка, записываемого порядка, порядка ввода, порядка в стрингриде, собственно сам стринггрид, другую таблицу...
если у него с этим и возникнут проблемы то потом, а пока он даже с простейшим не разобрался.

> "задачей" же своей видел не во "внесении хаоса"
а вот позвольте с вами не согласится... имхо такое.


 
Mishechka ©   (2009-03-17 14:19) [51]

Ребята, я извиняюсь за за то, что плохо сформулировал свой вопрос, но это ради того, чтобы его упростить. Пример с фамилиями - только пример, на самом деле программа бухгалтерская и несколько сложнее, просто если всё изложить, то вы замучаетесь читать. Скажу только, что три года назад я купил книгу Валерия Фаронова "Система программирования DELPHI" и за пару месяцев сварганил для жены программу, которую она полгода ломала, а я исправлял, пока не наступил тот момент, когда программа перестала зависать и ломаться. После чего она занесла в неё данные и пользуется ею по сей день, ведёт уже три предприятия. С тех пор я программированием не занимался. На сегодняшний день, кардинально изменять программу, пока не создана более совершенная, нет возможности, ведь нужно не потерять все данные. Потому я и решил пока ограничитья либо двумя кнопками "Вверх" и "Вниз", либо перетаскиванием записей. Но тем не менее, MsGuns в [43] абсолютно точно понял и изложил суть задачи, просто у меня вместо фамилий, так называемые проводки (ордера, разброс по счетам, подсчёт сумм за месяц, квартал, полгода, 9 месяцев, год, баланс, остаток на следующий год и т.д.), словом всякая бухгалтерская дребедень.

> Задача
> Как сделать программу, чтобы
> а) данные с "бумаги" в процессе ввода распололагались точно
> в том же порядке, в котором они на "бумаге". Для удобства
> полноты и правильности контроля оператором.
> б) после того, как оператор ввел всю "бумагу", данные были
> перенесены в БД, при этом новые ФИО были бы добавлены в
> БД, а з/пл "разнесены корректно.
> в) после добавления новых данных в БД все записи отобразились
> бы в том, порядке, который требуется "вц"
>
> Как это сделать с помощью единственного НД и спецключа "порядок"
> ?
>
> Если я нарисовал картину не так как надо, значит я действительно
> неверно понял суть задачи.

Спасибо, MsGuns, это именно то, что мне и надо.
А пока, всё-таки, прошу помочь с кнопками. Спасибо.


 
MsGuns ©   (2009-03-17 16:47) [52]

>sniknik ©   (17.03.09 13:09) [50]
>ну во первых, насколько помню, никто не обязывал "вводить непосредственно в базу", и даже >предлагалось использовать "оторванный" рекордсет... возможно в BDE это бы и не прошло, но уж >механизм CachedUpdates там точно есть.
>т.е. "вводить непосредственно" необязательно.

Каким боком кэш поможет решить задачу ? ИМХО, только усложнит т.к. добавит проблему постинга "порциями", вконец путающими порядок "бумажных" записей

>во вторых, даже если бы изменения и вводятся в базу, что с того (это даже хорошо если мы этот >порядок хотим сохранять)? это же был бы только индекс по дополнительному, ни к чему не >обязывающему, в остальных аспектах, полю ...
>оригинальный, ваш горячо любимый, порядок ввода сохранился бы, хотя он то как раз в базах >НИЧЕГО не значит. значат только данные по которым можно упорядочивать.

Ага, а что делать при вводе другой "бумаги" со свом "порядковым номером" ? Добавить еще одно "служебное" поле "Номер бумаги", а затем еще "номер талмуда" или чего-то-там-еще ?

>с чего это не будет совпадать, если мы его ОТОБРАЗИМ в этом порядке (поле со значениями >порядка "по бумаге" есть). включили нужный индекс/сортировку/ордер в запрос и будет нужный, >не нужен - выключили, нужен другой? - включаем второй индекс.

Еще раз объясняю: "бумаги" могут быть РАЗНЫМИ по сути. Всех одной гребенкой не пригребешь - отсюда и ОТОБРАЗИТЬ правильно не сможешь.

>а по моему все предельно ясно...
>берем вопрос автора "чистый" от его понимания реализации т.е.
>что тут невнятного?
>и ответ, полностью на него отвечающий.
>> [1] заведи поле для упорядочивания, потом меняй значения

Ключевое слово "по моему". А допустить что бывает еще по-другому религия очевидно не дает :)

>а вот позвольте с вами не согласится... имхо такое.

Да на здоровье. Тем более, что ты "только развлекаешься" :)


 
sniknik ©   (2009-03-17 17:03) [53]

> Каким боком кэш поможет решить задачу ?
а каким боком ее решает стринггрид? это же ему взамен предлагали эту альтернативу.

> Добавить еще одно "служебное" поле "Номер бумаги"
если нужно деление записей на "порции" то да. многие системы поддерживают понятие "документ".

> Еще раз объясняю: "бумаги" могут быть РАЗНЫМИ по сути.
еще раз. не плоди сущностей. пока в вопросе не фигурирует ничего из того что ты навоображал. и это не помогает пониманию...
автор не может разобраться и с "не увешанным деталями минимумом", а ты его еще всякой фигней "грузишь", ну и делай тогда все за него, он теперь на тебя надеется... ;)

> А допустить что бывает еще по-другому религия очевидно не дает :)
не религия. вопрос.


 
Mishechka ©   (2009-03-17 18:05) [54]


> Mishechka ©   (16.03.09 18:49) [42]
>
> Ребята!
> Я сделал сортированное поле для упорядочивания, меняя значения
> этого поля - меняю порядок расположения записей, поставил
> на форму две кнопки "Вверх" и "Вниз" - думаю, так Марьванне
> будет проще передвигать записи.
>
> Подскажите с кодом для кнопок, пожалуйста. Спасибо.

В данный момент я уже кое-как отсортировал с помощью этого поля, выставляя в нём значения вручную, но как это делать программно не знаю. В DataSource на событие OnDataChange написал обработчик:

procedure TfmProv.SourceProvDataChange(Sender: TObject; Field: TField);
begin
 if UpBtn.Enabled = False then UpBtn.Enabled := True;
 if not Prov.Bof then UpBtn.Enabled := True;
 if Prov.Bof then UpBtn.Enabled := False;
 if DownBtn.Enabled = False then DownBtn.Enabled := True;
 if not Prov.Eof then DownBtn.Enabled := True;
 if Prov.Eof then DownBtn.Enabled := False;
end;

Теперь при достижении курсором начальной или конечной записи соответствующие кнопки отключаются. Также, при добавлении новой записи, в это поле ставится её номер. Для этого я написал следующий обработчик:

procedure TfmProv.ProvBeforePost(DataSet: TDataSet);
begin
 if Prov.State = dsInsert then
  begin
   ProvPNo.Value := Prov.RecordCount +1;
  end;
end;

Не знаю правильно или нет, но пока всё работает. А вот для кнопок пытаюсь сделать примерно так:

procedure TfmProv.UpBtnClick(Sender: TObject);
begin
 Prov.Edit;
 ProvPNo.Value := ProvPNo.Value -1;
 Prov.Post;
end;

procedure TfmProv.DownBtnClick(Sender: TObject);
begin
 Prov.Edit;
 ProvPNo.Value := ProvPNo.Value +1;
 Prov.Post;
end;

Номер текущей записи я увеличиваю или уменьшаю на 1, но одновременно с этим я должен уменьшить или увеличить номер предыдущей или следующей записи, иначе они не поменяются местами, а как это сделать не знаю.
Прошу помочь. Спасибо.


 
Онотоле   (2009-03-17 19:02) [55]

пишешь метод Exchange(SrcNo, DestNo: integer);
там два Locate(лучше Seek с индексом) получаешь 2 нужные записи и меняешь  в них значения поля с номером местами.

Потом этот метод можно прикрутить либо к драгдропу, либо к кнопочкам, либо к еще чему захочешь


 
Онотоле   (2009-03-17 19:04) [56]

или два sql Update запроса, что предпочтительней


 
Mishechka ©   (2009-03-17 22:27) [57]


> Германн ©   (11.03.09 00:33) [8]
>
> Я когда-то делал именно так как в [1]. А справа от DBGrid
> поместил две красивые кнопочки со стрелками "вверх" и "вниз".
>  Пользователи не жаловались на неудобства.
>


> clickmaker ©   (11.03.09 13:17) [14]
>
> заведи в таблице поле OrdNumber
> пронумеруй записи
> при выборке добавь сортировку по OrdNumber
> при нажатии кнопки вверх - переставляй значения у текущей
> и предыдущей записи
> при нажатии кнопки вниз - соотв. у текущей и следующей записи
>


> MsGuns ©   (12.03.09 21:56) [28]
>
> Можно я одын  умный вещь скажу ? Спасибо.

А что там с кодом на кнопки? У меня уже закрадываются смутные подозрения, а уж не прав ли

> Германн ©   (13.03.09 00:51) [29]
>
> Это либо враньё, либо "отмазка".
>

??? Спасибо.


 
sniknik ©   (2009-03-17 22:29) [58]

> procedure TfmProv.SourceProvDataChange(Sender: TObject; Field: TField);
> begin
>  if UpBtn.Enabled = False then UpBtn.Enabled := True;
>  if not Prov.Bof then UpBtn.Enabled := True;
>  if Prov.Bof then UpBtn.Enabled := False;
>  if DownBtn.Enabled = False then DownBtn.Enabled := True;
>  if not Prov.Eof then DownBtn.Enabled := True;
>  if Prov.Eof then DownBtn.Enabled := False;
> end;
впечатлён... переписал чтобы крыша не съехала...

procedure TForm1.ADODataSet1BeforePost(DataSet: TDataSet);
begin
 with ADODataSet1 do
   if State = dsInsert then
     fSort.AsInteger:= RecordCount + 1;
end;

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
 with ADODataSet1 do begin
   Button1.Enabled:= (RecNo > 1) and not Bof;
   Button2.Enabled:= (RecNo < RecordCount) and not Eof;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 SavePos: TBookmark;
 S1Value, S2Value: integer;
begin
 with ADODataSet1 do
   if RecNo > 1 then begin
     DisableControls;
     try
       SavePos:= GetBookmark;
       try
         S1Value:= fSort.AsInteger;
         Prior;
         S2Value:= fSort.AsInteger;
         Edit;
         fSort.AsInteger:= S1Value;
         Post;
         GotoBookmark(SavePos);
         Edit;
         fSort.AsInteger:= S2Value;
         Post;
       finally
         FreeBookmark(SavePos);
       end;
     finally
       EnableControls;
     end;
   end;
end;


 
MsGuns ©   (2009-03-18 00:46) [59]

>sniknik ©   (17.03.09 22:29) [58]

Во-во ! Скоко танцев - то возле костра да с бубном !
А со стрингридом-то на порядок прощее



 
Германн ©   (2009-03-18 01:27) [60]


> Mishechka ©   (17.03.09 22:27) [57]
>
> > Германн ©   (13.03.09 00:51) [29]
> >
> > Это либо враньё, либо "отмазка".
> >
>
> ??? Спасибо.
>

Да не за что.
Ну не надо "придумывать" некие ситуации, которые, по твоему мнению, должны дать реальный пример для твоей задачи. Лучше привести саму задачу.


 
девушка   (2009-03-18 07:40) [61]

Вопрос в догонку:
Может быть кто-то решал подобную задачу для cxGrid?
Может быть там уже есть своя нумерация строк?


 
sniknik ©   (2009-03-18 08:07) [62]

> А со стрингридом-то на порядок прощее
перенос туда, ручной апдейт оттуда, решение проблем с тормозами на даже не очень большом(по меркам рекордсета) количестве данных, отказ(или переписывание) от сортировок/фильтров/детайлов,  работа с числами/датами/мемо/... через "Ж" т.е. через текстовое представление,  и все ради того чтобы при обмене записей на пару строк меньше. а по сути тоже самое, написать?

да проще. но только со знаком наоборот.

> Может быть кто-то решал подобную задачу для cxGrid?
еще один... ты почитай все сначала. грид тут совсем не при чем...


 
MsGuns ©   (2009-03-18 09:19) [63]

>sniknik ©   (18.03.09 08:07) [62]
>перенос туда, ручной апдейт оттуда,

Чевой-чевой ? Ты почитай внимательно-то :)

>решение проблем с тормозами на даже не очень большом(по меркам рекордсета) количестве данных,

Кхмм..  "пакетная" запись параметрическими запросами в контексте одной транзакции тормознутее одиночных апдейтов с каждоразной перечиткой ? Ну-ну
И что за "тормоза" от стрингрида на сотне-другой записей (больше "ручной" документ обычно не содержит)

>отказ(или переписывание) от сортировок/фильтров/детайлов,  

Причем тут сортровки/фильтры и откуда появился "детайл" - фантазируем помаленьку ?

>работа с числами/датами/мемо/...

И что за трабла ? Тот же самый пирог, что и в BeforePost для датасета. Не вижу разницы.
А мемо <80  Ты б еще картинки или оле сюда б приплел, ей-богу пожалей мой живот :)

>через "Ж" т.е. через текстовое представление,  и все ради того чтобы при обмене записей на >пару строк меньше. а по сути тоже самое, написать?

Дело не в том, что "на пару строк" меньше, а в том, что сам ввод с проверками и пр. "идет" мимо датасетной оболонки, совершенно не напрягая ни ее, ни движок, ни сервер. При этом интерфейс ввода реализуется без какой бы то ни было привязки к СУБД - отсюда полная ненужность каких-то непонятных "спецполей" и полная свобода манипуляций - при этом "сервер" просто отдыхает.

Хотя довольно - спор ИМХО уже давно вышел за рамки сабжа
:)


 
sniknik ©   (2009-03-18 11:06) [64]

> Чевой-чевой ? Ты почитай внимательно-то :)
по моему мы уже выяснили, что я гораздо более внимательнее тебя...
вот напиши сохранение в базу со стринггрида. а в варианте с кешированным датасетом это просто вызов ApplyUpdates (для BDE или аналог для другого движка).

> Кхмм..  "пакетная" запись параметрическими запросами в контексте одной транзакции тормознутее одиночных апдейтов с каждоразной перечиткой ? Ну-ну
действительно, ну-ну... у меня уже возникают сомнения что вообще с базами работал...
итак, уже упомянутый ApplyUpdates vs ""пакетная" запись параметрическими запросами в контексте одной транзакции" со стринггрида...
предлагай реализацию и мерь скорость выполнения. а да, реализация желательно должна быть проще ;), т.к. "А со стрингридом-то на порядок прощее", твои слова.

> Причем тут сортровки/фильтры и откуда появился "детайл" - фантазируем помаленьку ?
обработка данных, еще с ->
sniknik ©   (10.03.09 22:44) [6]
>> Я  бы заполнил какой-нибудь СтрингГрид, или ЛистВью Значениями, потом тасовал их
> а в чем будет разница? кроме того, что в датасете с данными работать было бы удобнее.

> ты б еще картинки или оле сюда б приплел, ей-богу пожалей мой живот :)
примечание к записи в виде мемо это для тебя что то невероятное? странно, а у меня это почти стандарт. нужна будет картинка буду добавлять картинку.

> совершенно не напрягая ни ее, ни движок, ни сервер.
а ты вообще с базами работал? ответь кого "напрягает" "оторванный/кешированный" рекордсет?

> отсюда полная ненужность каких-то непонятных "спецполей" и полная свобода манипуляций - при этом "сервер" просто отдыхает.
а как ты будешь порядок сохранять?????.... в чем тогда смысл? без непонятных "спецполей". или у тебя это только на момент ввода? тогда раскрою тебе один секрет (судя по незнанию других аспектов работы с базами это для тебя секрет), порядок ввода в рекордсет не меняется на момент ввода, т.е. твой вариант, это вариант когда НИЧЕГО делать не надо... т.е. ВООБЩЕ. ни сортировок ни полей, НИЧЕГО.
а менять порядок на момент ввода тогда можно простым копированием данных между записями (аналогично как со стринггридом, там же меняются значения между строками). и все. но это будет жестокой бессмысленностью... заставлять вводить в строгом порядке, и "профукать" этот самый с трудом обретенный порядок.
.... это уже ламеризм в логике.

> Хотя довольно - спор ИМХО уже давно вышел за рамки сабжа
действительно. и чего это я так долго с ламером... надеялся на лучшее.


 
Mishechka ©   (2009-03-18 12:34) [65]

sniknik ©   (17.03.09 22:29) [58]
Спасибо, сейчас попробую. Только мне не ясно, что это - ADODataSet, этот код для ADO? У меня BDE, Paradox, D7.


 
sniknik ©   (2009-03-18 12:43) [66]

> Только мне не ясно, что это - ADODataSet, этот код для ADO? У меня BDE, Paradox, D7.
а это чтобы не расслаблялся... не копипастил тупо. и там еще по той же причине нет кода для второй кнопки (хотя принципиально он не отличается...).


 
Mishechka ©   (2009-03-18 15:42) [67]


> а это чтобы не расслаблялся... не копипастил тупо. и там
> еще по той же причине нет кода для второй кнопки (хотя принципиально
> он не отличается...).
>

Видимо малость отличается. Всё работает за исключением одного момента:
когда курсор становится на первую запись, сразу включается кнопка "Вниз", но при переходе на одну запись вниз, сразу включается кнопка "Вверх" и зацикливает - можно менять местами только эти первые две записи.


 
sniknik ©   (2009-03-18 17:42) [68]

> Всё работает за исключением одного момента: ...
как наисправлял то и получил...


 
Mishechka ©   (2009-03-18 18:42) [69]


> как наисправлял то и получил...


Я почти ничего не наисправлял, кроме подчёркнутых строк...

procedure TForm1.Button2Click(Sender: TObject);
var
SavePos: TBookmark;
S1Value, S2Value: integer;
begin
with ADODataSet1 do
  if RecNo < RecordCount then begin
    DisableControls;
    try
      SavePos:= GetBookmark;
      try
        S1Value:= fSort.AsInteger;
        Next;
        S2Value:= fSort.AsInteger;
        Edit;
        fSort.AsInteger:= S1Value;
        Post;
        GotoBookmark(SavePos);
        Edit;
        fSort.AsInteger:= S2Value;
        Post;
      finally
        FreeBookmark(SavePos);
      end;
    finally
      EnableControls;
    end;
  end;
end;


 
MsGuns ©   (2009-03-18 21:27) [70]

>sniknik ©   (18.03.09 11:06) [64]
>действительно, ну-ну... у меня уже возникают сомнения что вообще с >базами работал...

Эгеж, я вообще только позавчера родился ;)))

Спор продолжать бессмысленно, т.к. ты, похоже, считаешь что есть только два мнения - твое и неправильное ;)

На сем позволь отклаянться ;)


 
sniknik ©   (2009-03-18 22:53) [71]

> Я почти ничего не наисправлял, кроме подчёркнутых строк...
чудно... а покажи где в данной процедуре "включается кнопка "Вниз"", или "Вверх", на что жалоба, и отчего "можно менять местами только эти первые две записи."


 
Германн ©   (2009-03-19 01:39) [72]


> sniknik ©   (18.03.09 22:53) [71]
>
> > Я почти ничего не наисправлял, кроме подчёркнутых строк.
> ..

Имхо, партизан вставил в код твою гранату, Но эта граната оказалась "не той системы". :)


 
sniknik ©   (2009-03-19 02:15) [73]

> Имхо, партизан вставил в код твою гранату, Но эта граната оказалась "не той системы". :)
граната там всегда была... это существование реальной позиции в файловых таблицах. при включенном индексе эти позиции "поплыли". а там сравнение по ним, которое он судя по всему перенес как дано... хотя разобраться, что там зачем и переделать под себя это ему было "домашнее задание".
блин, ведь в условии нужно сделать всего одну замену... а он даже не нашел место где, не говоря о как.


 
Германн ©   (2009-03-19 02:42) [74]


> граната там всегда была... это существование реальной позиции
> в файловых таблицах.

А автор сказал, что у него "BDE, Paradox, D7."
:)


 
Mishechka ©   (2009-03-19 20:57) [75]


> при включенном индексе эти позиции "поплыли". а там сравнение
> по ним


Я это понял, когда отключил ключ. Может просветишь, что это такое? А то я вроде доковырял, но больше интуитивно. Глянь что получилось:

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
with ADODataSet1 do begin
  Button1.Enabled:= not Bof;
  Button2.Enabled:= not Eof;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
SavePos: TBookmark;
S1Value, S2Value: integer;
begin
with ADODataSet1 do
  if not Bof then begin
    DisableControls;
    try
      SavePos:= GetBookmark;
      try
        S1Value:= fSort.AsInteger;
        Prior;
        S2Value:= fSort.AsInteger;
        Edit;
        fSort.AsInteger:= S1Value;
        Post;
        GotoBookmark(SavePos);
        Edit;
        fSort.AsInteger:= S2Value;
        Post;
      finally
        FreeBookmark(SavePos);
      end;
    finally
      EnableControls;
    end;
  end;
end;

Если неправильно, то укажи где, буду благодарен.


 
sniknik ©   (2009-03-19 21:20) [76]

> Я это понял, когда отключил ключ.
машина не заводится и поэтому я слил бензин... отличное, правильное решение! но только... ты вроде хотел ехать?  

> А то я вроде доковырял, но больше интуитивно.  
бросай интуицию и начинай книжки читать.

> Глянь что получилось:
даже если бы не отключил сортировку, получилось полная бессмыслица в условиях... ни одно не сработает, можешь смело выкидывать.
полностью это
with ADODataSet1 do begin
 Button1.Enabled:= not Bof;
 Button2.Enabled:= not Eof;
end;
и это
if not Bof then
... ты сделал им "кастрацию".

и кстати хорошо конечно что перешел на ADO, но тогда какой смысл было коверкать мой код? мой как раз под ADO рабочий на 100%.


 
Mishechka ©   (2009-03-20 11:22) [77]

Ты меня не понял. Я отключал ключ, когда искал причину, потом снова включил, иначе какой смысл?
На ADO я не переходил, просто чтобы тебя не сбивать, показывал свои действия на твоём же коде, а вместо ADODataSet1 я ссылаюсь на свою таблицу, и мой код другой:

procedure TfmProv.SourceProvDataChange(Sender: TObject; Field: TField);
begin
with Prov do begin
  UpBtn.Enabled:= not Bof;
  DownBtn.Enabled:= not Eof;
end;
end;

procedure TfmProv.UpBtnClick(Sender: TObject);
var
SavePos: TBookmark;
S1Value, S2Value: integer;
begin
with Prov do
  if not Bof then begin
    DisableControls;
    try
      SavePos:= GetBookmark;
      try
        S1Value:= ProvPNo.AsInteger;
        Prior;
        S2Value:= ProvPNo.AsInteger;
        Edit;
        ProvPNo.AsInteger:= S1Value;
        Post;
        GotoBookmark(SavePos);
        Edit;
        ProvPNo.AsInteger:= S2Value;
        Post;
      finally
        FreeBookmark(SavePos);
      end;
    finally
      EnableControls;
    end;
  end;
  DBGridProv.SetFocus;
end;

procedure TfmProv.DownBtnClick(Sender: TObject);
var
SavePos: TBookmark;
S1Value, S2Value: integer;
begin
with Prov do
  if not Eof then begin
    DisableControls;
    try
      SavePos:= GetBookmark;
      try
        S1Value:= ProvPNo.AsInteger;
        Next;
        S2Value:= ProvPNo.AsInteger;
        Edit;
        ProvPNo.AsInteger:= S1Value;
        Post;
        GotoBookmark(SavePos);
        Edit;
        ProvPNo.AsInteger:= S2Value;
        Post;
      finally
        FreeBookmark(SavePos);
      end;
    finally
      EnableControls;
    end;
  end;
  DBGridProv.SetFocus;
end;

Вообще-то, о коде я тоже хотел спросить. В книжках учат писать так:

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
 if Button1.Enabled = False then
   Button1.Enabled := True;
 if not Table1.Bof then
   Button1.Enabled := True;
 if Table1.Bof then
   Button1.Enabled := False;
 if Button2.Enabled = False then
   Button2.Enabled := True;
 if not Table1.Eof then
   Button2.Enabled := True;
 if Table1.Eof then
   Button2.Enabled := False;
end;

Если ADODataSet1 заменить на Table1, то у тебя было бы так:

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
with Table1 do begin
  Button1.Enabled:= (RecNo > 1) and not Bof;
  Button2.Enabled:= (RecNo < RecordCount) and not Eof;
end;
end;

Как правильно писать и где об этом почитать? Мне кажется, что сколько людей напишут, столько и будет вариантов, а как всё-таки правильно?


 
MsGuns ©   (2009-03-20 13:04) [78]

Что же Вам еще писать - уже столько понаписано :)
Есть два (упрощенно) способа

Первый (Sniknik) - все делать с помощью датасета, "привязанного" к БД с возможностью отложеннных (кэшированых) изменений. Для  расположения записей (как старых, так и добавленных в сеансе) в нужном порядке надо использовать возможности датасета, т.е. сортировки, индексы и т.д. в том числе и варианты с добавлением в саму ТАБЛИЦУ БД специальных полей.
Для  того, чтобы это сделать, нужно почитать о работе с АДО-ми компонентами (TADODataSet например) и НАУЧИТЬСЯ.

Второй (msguns) - это "оторванность" вводимых в сеансе данных вообще от каких бы то ни было датасетов, например с помощью стрингрида. В этом случае вы можете тасовать в гриде записи совершенно произвольным образом, а переносить их в БД спец.командой (кнопкой). После чего перечитывать НД из базы. При этом никаких доп. полей в БД не требуется, но порядок следования записей в датасете будет уже тот, который обеспечавается его содержимым (полями таблицы), т.е. скорее всего не будет совпадать с тем порядком, который был в стрингиде при вводе.

Какой способ выбрать - Вам решать, однако реализовывать его придется также Вам самому и если Вы ждете, что кто-то здесь за Вас нарисует готовый код, то сильно заблуждаетесь :)


 
sniknik ©   (2009-03-20 13:58) [79]

> просто чтобы тебя не сбивать
доктор, что то мне не хорошо... и чтобы вас не сбивать, осмотрите моего брата (он уже у вас и вы знакомы), и скажите что со мной не так?
?????????

> и мой код другой:
неважно, как уже сказал условия бессмысленные  (на самом деле эта добавка вида not Bof у меня была ради единственного состояния - пустого рекордсета, все остальное что ты выкинул как раз основное, рабочее. и думать тебе нужно над ним, а не над "пустышкой вставленной на всякий случай")

> В книжках учат писать так:
это в каких книжках? библия дельфи глазами хакера? ... в нормальных учат так НЕ писать.

> а как всё-таки правильно?
как работает так и правильно. если конечно правильно работает...

> что кто-то здесь за Вас нарисует готовый код, то сильно заблуждаетесь :)
блин, да мой код и есть готовый... различия для подстройки под BDE минимальны, ни одной строчки кода добавлять не нужно, только исправить то что есть (пройтись отладчиком, посмотреть на значения в обоих состояниях, и исправить...).

а можно выкинуть условия. вообще...  ну не будут кнопки дизейблиться, но основной то вопрос ветки уже решен...


 
Mishechka ©   (2009-03-20 18:06) [80]


> нужно почитать о работе с АДО-ми компонентами (TADODataSet
> например) и НАУЧИТЬСЯ.


Согласен, почитать и научиться нужно, но пока у меня BDE, Paradox и способ (Sniknik), который, кроме добавления в талицу одного поля, ничего не требует. Второй способ (msguns) более трудоёмкий, хотя результат будет тот же.


> но порядок следования записей в датасете будет уже тот,
> который обеспечавается его содержимым (полями таблицы),
> т.е. скорее всего не будет совпадать с тем порядком, который
> был в стрингиде при вводе.


В таблице порядок следования записей не меняется, в этом не трудно убедиться с помощью Database Desktop. Это всё работает только в DBGrid в момент заноса данных, что и требовалось.


> если Вы ждете, что кто-то здесь за Вас нарисует готовый
> код, то сильно заблуждаетесь :)
>


Я этого и не ждал, просто словеса желательно подтверждать примером, хотя бы фрагментом кода. Вы музыку слушаете или достаточно ноты почитать? Лично я, книги по Delphi, если там нет демонстрации того, что написано, читать бы не смог, всё-таки не комиксы. Когда в ответ на простой вопрос переходят к сущностям, то сразу напрашивается аналогия с нашими депутатами, а значит, ответа не жди. Помните? - "Вы хочете песен? Их есть у меня!", так для сущностей у меня есть: Шопенгауэр, Монтень и вам советую, полезно даже программистам.


> а можно выкинуть условия. вообще...  ну не будут кнопки
> дизейблиться, но основной то вопрос ветки уже решен...
>


Если пользователь увидит, что кнопка не светится, то и нажимать её не станет. За пользователя ОБЯЗАН! думать программист, а иначе можно было и кнопки не ставить, пусть шастает по сетке, я же не могу опуститься до его уровня. Так вот я могу, потому, что я не программист и знаю, какими идиотскими программами забит интернет, если из сотни найдёшь одну нормальную, то повезло, а ведь программистам, которые их создавали, они явно нравятся. Я буду, либо делать удобно и надёжно, либо не буду делать ничего.


> это в каких книжках? библия дельфи глазами хакера? ... в
> нормальных учат так НЕ писать.
>


Нет, выше я писал в каких. Недавно скачал книгу Архангельского, ему-то хоть можно доверять? Я её бегло пролистнул и думаю, что он если не самый, то один из лучших.

sniknik, с кодом я ещё не закончил, думаю, он ещё требует внимания.



Страницы: 1 2 вся ветка

Текущий архив: 2009.05.03;
Скачать: CL | DM;

Наверх




Память: 0.73 MB
Время: 0.02 c
15-1236070491
Ega23
2009-03-03 11:54
2009.05.03
Можно ли открыть все юниты в Project Group


2-1237450478
Elun
2009-03-19 11:14
2009.05.03
Про WordApplication


15-1235925203
kami
2009-03-01 19:33
2009.05.03
Потери скорости при соединении через несколько модемов


11-1200013102
Pilligrim
2008-01-11 03:58
2009.05.03
TreeView


15-1236071588
Анна
2009-03-03 12:13
2009.05.03
проверка запуска одного экземпляра приложения