Q&A

  • dbgrid의 저장방법.. 글을 또 올려서 죄송합니다...
초보자가 잘 안되서 또 글을 올립니다.



dbgrid내의 prn_flg 필드 값을 변경하여 goji 테이블에 저장하려합니다.

저장버튼을 이용해서 말이죠.(dbgrid내의 필드 변경은 되는데.. 저장이?..)



query1, datasourec1, dbgrid 서로 연결하고

저장 button의 onclick event에 아래와 같이 기술하였습니다.

begin

inherited;

with query1 do

begin

Close;

Sql.Clear;

Sql.Add(' update goji ');

Sql.Add(' set prn_flg = :prn_flg ');

Sql.Add(' where substring(gojinum from 1 for 4) = ''' + edit1.Text + ''' ');

Sql.Add(' and substring(gojinum from 5 for 4) = ''' + edit2.Text + ''' ');

Sql.Add(' and substring(gojinum from 9 for 3) = ''' + edit3.Text + ''' ');



ParamByName('prn_flg').AsString := DbGrid1.Columns[1].Field.asString;

ExecSQL;

Post;

Refresh;



end;

end;

참고) edit1.text := 2000

edit2.text := 1000

edit3.text := 001



gojinum 가 20001000001인 것만 select 함.

select된 dbgrid의 gojinum필드는



gojinum prn_flg

2000100000101

" 02 *

" 03

" 04 *





prn_flg 값을 변경하여 저장하니

저장이 안되데요..

'query1 : dataset not in edit or insert mode' error 가 발생하네요.





where절에 substring을 사용하면 UpdateSQL 컴퍼넌트를 사용할 수 없는지요.

있으면 그 방법좀, 아니면 다른 방법좀 알려주십시요..











4  COMMENTS
  • Profile
    이기현 2000.04.26 01:26
    > ParamByName('prn_flg').AsString := DbGrid1.Columns[1].Field.asString;

    // DbGrid1.Columns[1].Field.asString; 이부분이 Table or DataSet 이 이미 Closed 임

    니다.

    그래도 안되면 편지하세요.

  • Profile
    초보1 2000.04.27 02:50
    답변 정말 감사드립니다.

    마지막으로 염치 없지만 글을 다시 올립니다.



    query1, datasourec1, dbgrid 서로 연결하고



    query1으로 update하니 안되서, 새로 query3를 만들어 실행하여

    prn_flg필드의 값을 등록하여 저장버튼으로 update 하니,

    error가 'query3 : dataset not in edit or insert mode' 발생되는데 자료저장는 됩니다.



    수정된 자료만 저장되는 것이 아니고 dbgrid의 모든 레코드의 prn_flg 필드 값이 같게

    저장됩니다.



    등록된 prn_flg필드의 값을 지워 저장버튼으로 update 하니,

    'Record already locked by this session ' error가 발생합니다.



    전체를 한번봐주세요..

    unit m_prntch;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, DBTables, Db;



    type

    Tprntc = class(TForm)

    DataSource1: TDataSource;

    Query1: TQuery;

    Query2: TQuery;

    Query1bf_goji: TStringField;

    Query1prn_flg: TStringField;

    Query1sunap: TStringField;

    Query1gojinum: TStringField;

    Query1gojibun: TStringField;

    GroupBox1: TGroupBox;

    Label1: TLabel;

    Edit1: TEdit;

    Edit2: TEdit;

    Edit3: TEdit;

    Button1: TButton;

    Button2: TButton;

    Panel2: TPanel;

    DBGrid1: TDBGrid;

    Query3: TQuery;

    procedure Button2Click(Sender: TObject);

    procedure Edit1KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    procedure Edit2KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    procedure Edit3KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    procedure FormCreate(Sender: TObject);

    procedure Edit3Click(Sender: TObject);

    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    prntc: Tprntc;



    implementation



    {$R *.DFM}



    procedure Tprntc.Button2Click(Sender: TObject);

    begin

    Close;

    end;



    procedure Tprntc.Edit1KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if (key = Vk_Return) or (Key = Vk_Down) then

    SelectNext(Sender As TWincontrol,True,True);

    if Key = Vk_Up then

    SelectNext(Sender As TWincontrol,False,True);

    end;



    procedure Tprntc.Edit2KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if (key = Vk_Return) or (Key = Vk_Down) then

    SelectNext(Sender As TWincontrol,True,True);

    if Key = Vk_Up then

    SelectNext(Sender As TWincontrol,False,True);

    end;



    procedure Tprntc.Edit3KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    var

    len_cnt3 : string;

    begin

    if (key = Vk_Return) or (Key = Vk_Down) then // 엔터나 아래화살표

    begin

    begin

    if StrLen(pchar(edit3.text)) = 1 then

    begin

    len_cnt3 := '00'+ edit3.text;

    edit3.text := len_cnt3;

    end

    else if StrLen(pchar(edit3.text)) = 2 then

    begin

    len_cnt3 := '0'+ edit3.text;

    edit3.text := len_cnt3;

    end

    else if StrLen(pchar(edit3.text)) = 3 then

    begin

    len_cnt3 := edit3.text;

    edit3.text := len_cnt3;

    end

    else exit;

    end;



    begin

    inherited;

    with query1 do

    begin

    Close;

    Sql.Clear;

    Sql.Add(' select bf_goji,prn_flg,sunap,gojinum,gojibun');

    Sql.Add(' from goji ');

    Sql.Add(' where substring(gojinum from 1 for 4) = ''' + edit1.Text + ''' ');

    Sql.Add(' and substring(gojinum from 5 for 4) = ''' + edit2.Text + ''' ');

    Sql.Add(' and substring(gojinum from 9 for 3) = ''' + edit3.Text + ''' ');

    Prepare;

    Open;

    if RecordCount = 0 then

    begin

    showmessage('등록된 부과자료가 없습니다.');

    edit2.setfocus;

    exit;

    end;

    end;

    end;

    SelectNext(Sender As TWincontrol,True,True);

    end;

    if Key = Vk_Up then

    SelectNext(Sender As TWincontrol,False,True); //위화살표

    end;



    procedure Tprntc.FormCreate(Sender: TObject);

    var

    c_cnt : string;

    ci_cnt : integer;

    begin

    inherited;

    with query2 do

    begin

    Close;

    Sql.Clear;

    Sql.Add(' select scode ');

    Sql.Add(' from cfg ');

    Prepare;

    Open;

    if RecordCount = 0 then

    begin

    showmessage('검색한 내용이 없습니다');

    Exit;

    end;

    end;

    Edit1.text := FormatDateTime('yyyy', now);

    Edit2.Text := query2.fieldbyname('scode').asstring;

    end;

    procedure Tprntc.Edit3Click(Sender: TObject);

    begin

    edit3.text := '';

    end;



    procedure Tprntc.DBGrid1KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if Key = vk_Return then

    begin

    if DBGrid1.SelectedIndex < Pred(DBGrid1.FieldCount) then

    DBGrid1.SelectedIndex := DBGrid1.SelectedIndex + 1 // 다음 컬럼

    else

    begin // 맨 마지막 컬럼이면 다음 레코드 첫번째 컬럼으로

    DBGrid1.SelectedIndex := 0;

    DBGrid1.Perform( wm_KeyDown, vk_Down, 0 );

    end;

    end;



    end;



    procedure Tprntc.Button1Click(Sender: TObject);

    begin

    if messagebox(handle,'자료를 등록하시겠습니까?','확인',mb_iconquestion + mb_YesNo ) = idNo

    then Exit

    else

    begin

    inherited;

    with query3 do

    begin

    Close;

    Sql.Clear;

    Sql.Add(' update goji ');

    Sql.Add(' set prn_flg = :prn_flg ');

    Sql.Add(' where substring(gojinum from 1 for 4) = ''' + edit1.Text + ''' ');

    Sql.Add(' and substring(gojinum from 5 for 4) = ''' + edit2.Text + ''' ');

    Sql.Add(' and substring(gojinum from 9 for 3) = ''' + edit3.Text + ''' ');

    ParamByName('prn_flg').AsString := DbGrid1.Columns[1].Field.asString;

    ExecSQL;

    Refresh;

    end;



    end;

    end;



    procedure UpdateChange(DataSet :TBDEDataSet);

    begin



    end;

    end.





  • Profile
    이기현 2000.04.25 10:16
    Post; 이문장을 제거해보세요.

  • Profile
    초보1 2000.04.25 20:23


    답변 감사합니다.



    post 빼고 실행하니,

    'Query1 : Cannot perform this operation on a closed dataset'

    error가 발생하네요..