2015-09-03 4 views
0

Это очень краткое описание того, как я ввожу данные в базу данных.скопируйте всю запись, а затем вставьте ее

procedure TMain_Form.AdvGlowButton1Click(Sender: TObject); 
begin 
MYQUERY.Close; 
MYQUERY.SQL.Clear; 
MYQUERY.SQL.Add('INSERT INTO MYTABLE (FOR_DATE,SOMETEXT) VALUES(:a1,:a2)'); 
MYQUERY.Params.ParamByName('a1').asDate :=PlannerCalendar1.Date; 
MYQUERY.Params.ParamByName('a2').Value :=cxMemo1.Lines.Text ; 
MYQUERY.ExecSQL; 
end; 

Это работает нормально.Дата вставлена. Она показана в cxGrid1.

Теперь, что я хотел бы сделать, это скопировать всю запись из этого cxGrid1 (только выбранную запись) и вставить (вставить его) на другую дату, выбранную в PlannerCalendar1.

У меня есть меню cxgridpopup, реализованное с опцией «отправить в выбранную дату», но я не знаю, как скопировать основные данные из cxGrid1.

Цель состоит в том, чтобы выбрать дату в календаре, затем перейти к cxGrid1, выбрать запись, щелкнуть правой кнопкой мыши по ней и (используя всплывающее меню), а затем вставить всю выбранную запись в новую выбранную дату. В основном клонирование записи, но на другую дату. Как я могу это сделать ?

(PlannerCalendar1 является TMS компонент)

редактировать: нашел информацию здесь https://www.devexpress.com/Support/Center/Question/Details/A302 , но не уверен, как он подходит мой случай.

EDIT: Я попробовал этот путь, и это не будет работать:

Procedure CopyTableRecord(View: TcxGridTableView; IndexToCopy : Integer); 
var i:integer; 
PlannerCalendar1:TPlannerCalendar; 
Begin 
    View.DataController.Insert; 
    For I := 0 To Pred(View.ColumnCount) Do 
    View.Columns[I].EditValue := view.DataController.Values[1, I]; 
    View.Columns[1].EditValue := PlannerCalendar1.Date; 
    View.DataController.Post(True); 
End; 

procedure TMain_Form.Sendto1Click(Sender: TObject); 
begin 
CopyTableRecord(cxGrid1DBTableView1, cxGrid1DBTableView1.DataController.FocusedRecordIndex); 
end; 

ответ

1

Я бы разделил данные и просмотр. Итак, почему бы просто не пойти по тому же пути, как при вставке новой записи?

procedure TMain_Form.Sendto1Click(Sender: TObject); 
begin 
    MYQUERY.Close; 
    MYQUERY.SQL.Clear; 
    MYQUERY.SQL.Add('INSERT INTO MYTABLE (FOR_DATE, SOMETEXT) SELECT :a1, SOMETEXT FROM MYTABLE WHERE FOR_DATE = :a2'); 
    MYQUERY.Params.ParamByName('a1').asDate :=PlannerCalendar1.Date; 
    MYQUERY.Params.ParamByName('a2').asDate := cxGrid1DBTableView1.DataController.Values[cxGrid1DBTableView1.DataController.FocusedRecordIndex,1]; 
    MYQUERY.ExecSQL; 
end; 

Примечание: Это решение должно работать, если не более, чем одна запись на определенную дату. Я предположил, что нет. Если они есть, вы не должны выбирать по дате, а в столбце первичного ключа.

+0

Ухх Рене, ты прав. я был слепым. На самом деле все, что мне нужно, это запрос на обновление даты и прохода: a2, первичный ключ, как вы предполагали. Спасибо! – user763539

0

Вы можете клонировать запись, используя свойство из cxGridTableView вы используете, как это DataController и Columns: -

Procedure CopyTableRecord(View: TcxGridTableView; IndexToCopy : Integer); 
Begin 
    View.DataController.Insert; 
    For I := 0 To Pred(View.ColumnCount) Do 
    View.Columns[I].EditValue := View.DataController.Values[IndexToCopy, I]; 
    // Modify your Date field here... 
    View.DataController.Post(True); 
End; 

Передайте FocusedRecordIndex вид сетки к описанной выше процедуре.

+0

Энди, спасибо за ваш ответ. Не уверен, однако, что вы подразумеваете под «Изменить свою дату здесь». Как мне это сделать ? – user763539

+0

Используйте 'View.Columns [<индекс вашего поля даты>]. EditValue: = <дата, в которой вы нуждаетесь>;' –

+0

См. Последнее редактирование + не понимайте это. Передайте FocusedRecordIndex вид сетки в описанную выше процедуру. – user763539

Смежные вопросы